notes: 2.3.0 -> 2.3.1 (#352950)
[NixPkgs.git] / nixos / tests / searx.nix
blob0008424f068b2eee02dcec560d0e1dd72895ecb5
1 { pkgs, ... }:
4   name = "searx";
5   meta = with pkgs.lib.maintainers; {
6     maintainers = [ rnhmjoj ];
7   };
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         '';
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       };
38     };
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";
49         runInUwsgi = true;
50         uwsgiConfig = {
51           # serve using the uwsgi protocol
52           socket = "/run/searx/uwsgi.sock";
53           chmod-socket = "660";
55           # use /searx as url "mountpoint"
56           mount = "/searx=searx.webapp:application";
57           module = "";
58           manage-script-name = true;
59         };
60       };
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       };
72       # allow nginx access to the searx socket
73       users.users.nginx.extraGroups = [ "searx" ];
75     };
77   testScript = ''
78     base.start()
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"
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")
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()
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   '';