at 25.11-pre 3.2 kB view raw
1{ pkgs, ... }: 2 3{ 4 name = "searx"; 5 meta = with pkgs.lib.maintainers; { 6 maintainers = [ rnhmjoj ]; 7 }; 8 9 # basic setup: searx running the built-in webserver 10 nodes.base = 11 { ... }: 12 { 13 services.searx = { 14 enable = true; 15 environmentFile = pkgs.writeText "secrets" '' 16 WOLFRAM_API_KEY = sometoken 17 SEARX_SECRET_KEY = somesecret 18 ''; 19 20 settings.server = { 21 port = "8080"; 22 bind_address = "0.0.0.0"; 23 secret_key = "@SEARX_SECRET_KEY@"; 24 }; 25 settings.engines = [ 26 { 27 name = "wolframalpha"; 28 api_key = "@WOLFRAM_API_KEY@"; 29 engine = "wolframalpha_api"; 30 } 31 { 32 name = "startpage"; 33 shortcut = "start"; 34 } 35 ]; 36 }; 37 38 }; 39 40 # fancy setup: run in uWSGI and use nginx as proxy 41 nodes.fancy = 42 { config, ... }: 43 { 44 services.searx = { 45 enable = true; 46 # searx refuses to run if unchanged 47 settings.server.secret_key = "somesecret"; 48 49 runInUwsgi = true; 50 uwsgiConfig = { 51 # serve using the uwsgi protocol 52 socket = "/run/searx/uwsgi.sock"; 53 chmod-socket = "660"; 54 55 # use /searx as url "mountpoint" 56 mount = "/searx=searx.webapp:application"; 57 module = ""; 58 manage-script-name = true; 59 }; 60 }; 61 62 # use nginx as reverse proxy 63 services.nginx.enable = true; 64 services.nginx.virtualHosts.localhost = { 65 locations."/searx".extraConfig = '' 66 include ${pkgs.nginx}/conf/uwsgi_params; 67 uwsgi_pass unix:/run/searx/uwsgi.sock; 68 ''; 69 locations."/searx/static/".alias = "${config.services.searx.package}/share/static/"; 70 }; 71 72 # allow nginx access to the searx socket 73 users.users.nginx.extraGroups = [ "searx" ]; 74 75 }; 76 77 testScript = '' 78 base.start() 79 80 with subtest("Settings have been merged"): 81 base.wait_for_unit("searx-init") 82 base.wait_for_file("/run/searx/settings.yml") 83 output = base.succeed( 84 "${pkgs.yq-go}/bin/yq eval" 85 " '.engines[] | select(.name==\"startpage\") | .shortcut'" 86 " /run/searx/settings.yml" 87 ).strip() 88 assert output == "start", "Settings not merged" 89 90 with subtest("Environment variables have been substituted"): 91 base.succeed("grep -q somesecret /run/searx/settings.yml") 92 base.succeed("grep -q sometoken /run/searx/settings.yml") 93 base.copy_from_vm("/run/searx/settings.yml") 94 95 with subtest("Basic setup is working"): 96 base.wait_for_open_port(8080) 97 base.wait_for_unit("searx") 98 base.succeed( 99 "${pkgs.curl}/bin/curl --fail http://localhost:8080" 100 ) 101 base.shutdown() 102 103 with subtest("Nginx+uWSGI setup is working"): 104 fancy.start() 105 fancy.wait_for_open_port(80) 106 fancy.wait_for_unit("uwsgi") 107 fancy.succeed( 108 "${pkgs.curl}/bin/curl --fail http://localhost/searx >&2" 109 ) 110 fancy.succeed( 111 "${pkgs.curl}/bin/curl --fail http://localhost/searx/static/themes/simple/js/leaflet.js >&2" 112 ) 113 ''; 114}