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}