dput-ng: fix eval (#364540)
[NixPkgs.git] / nixos / modules / services / web-apps / selfoss.nix
blob81701f2cc001b0913046e2b6f91cc9009573c989
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 with lib;
8 let
9   cfg = config.services.selfoss;
11   poolName = "selfoss_pool";
13   dataDir = "/var/lib/selfoss";
15   selfoss-config =
16     let
17       db_type = cfg.database.type;
18       default_port = if (db_type == "mysql") then 3306 else 5342;
19     in
20     pkgs.writeText "selfoss-config.ini" ''
21       [globals]
22       ${lib.optionalString (db_type != "sqlite") ''
23         db_type=${db_type}
24         db_host=${cfg.database.host}
25         db_database=${cfg.database.name}
26         db_username=${cfg.database.user}
27         db_password=${cfg.database.password}
28         db_port=${toString (if (cfg.database.port != null) then cfg.database.port else default_port)}
29       ''}
30       ${cfg.extraConfig}
31     '';
34   options = {
35     services.selfoss = {
36       enable = mkEnableOption "selfoss";
38       user = mkOption {
39         type = types.str;
40         default = "nginx";
41         description = ''
42           User account under which both the service and the web-application run.
43         '';
44       };
46       pool = mkOption {
47         type = types.str;
48         default = "${poolName}";
49         description = ''
50           Name of existing phpfpm pool that is used to run web-application.
51           If not specified a pool will be created automatically with
52           default values.
53         '';
54       };
56       database = {
57         type = mkOption {
58           type = types.enum [
59             "pgsql"
60             "mysql"
61             "sqlite"
62           ];
63           default = "sqlite";
64           description = ''
65             Database to store feeds. Supported are sqlite, pgsql and mysql.
66           '';
67         };
69         host = mkOption {
70           type = types.str;
71           default = "localhost";
72           description = ''
73             Host of the database (has no effect if type is "sqlite").
74           '';
75         };
77         name = mkOption {
78           type = types.str;
79           default = "tt_rss";
80           description = ''
81             Name of the existing database (has no effect if type is "sqlite").
82           '';
83         };
85         user = mkOption {
86           type = types.str;
87           default = "tt_rss";
88           description = ''
89             The database user. The user must exist and has access to
90             the specified database (has no effect if type is "sqlite").
91           '';
92         };
94         password = mkOption {
95           type = types.nullOr types.str;
96           default = null;
97           description = ''
98             The database user's password (has no effect if type is "sqlite").
99           '';
100         };
102         port = mkOption {
103           type = types.nullOr types.int;
104           default = null;
105           description = ''
106             The database's port. If not set, the default ports will be
107             provided (5432 and 3306 for pgsql and mysql respectively)
108             (has no effect if type is "sqlite").
109           '';
110         };
111       };
112       extraConfig = mkOption {
113         type = types.lines;
114         default = "";
115         description = ''
116           Extra configuration added to config.ini
117         '';
118       };
119     };
120   };
122   config = mkIf cfg.enable {
123     services.phpfpm.pools = mkIf (cfg.pool == "${poolName}") {
124       ${poolName} = {
125         user = "nginx";
126         settings = mapAttrs (name: mkDefault) {
127           "listen.owner" = "nginx";
128           "listen.group" = "nginx";
129           "listen.mode" = "0600";
130           "pm" = "dynamic";
131           "pm.max_children" = 75;
132           "pm.start_servers" = 10;
133           "pm.min_spare_servers" = 5;
134           "pm.max_spare_servers" = 20;
135           "pm.max_requests" = 500;
136           "catch_workers_output" = 1;
137         };
138       };
139     };
141     systemd.services.selfoss-config = {
142       serviceConfig.Type = "oneshot";
143       script = ''
144         mkdir -m 755 -p ${dataDir}
145         cd ${dataDir}
147         # Delete all but the "data" folder
148         ls | grep -v data | while read line; do rm -rf $line; done || true
150         # Create the files
151         cp -r "${pkgs.selfoss}/"* "${dataDir}"
152         ln -sf "${selfoss-config}" "${dataDir}/config.ini"
153         chown -R "${cfg.user}" "${dataDir}"
154         chmod -R 755 "${dataDir}"
155       '';
156       wantedBy = [ "multi-user.target" ];
157     };
159     systemd.services.selfoss-update = {
160       serviceConfig = {
161         ExecStart = "${pkgs.php}/bin/php ${dataDir}/cliupdate.php";
162         User = "${cfg.user}";
163       };
164       startAt = "hourly";
165       after = [ "selfoss-config.service" ];
166       wantedBy = [ "multi-user.target" ];
168     };
170   };