vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / web-apps / flarum.nix
blob129f5a28268169eaa6bd027ad7f4a87b33848c0b
1 { pkgs, lib, config, ... }:
3 with lib;
5 let
6   cfg = config.services.flarum;
8   flarumInstallConfig = pkgs.writeText "config.json" (builtins.toJSON {
9     debug = false;
10     offline = false;
12     baseUrl = cfg.baseUrl;
13     databaseConfiguration = cfg.database;
14     adminUser = {
15       username = cfg.adminUser;
16       password = cfg.initialAdminPassword;
17       email = cfg.adminEmail;
18     };
19     settings = {
20       forum_title = cfg.forumTitle;
21     };
22   });
23 in {
24   options.services.flarum = {
25     enable = mkEnableOption "Flarum discussion platform";
27     package = mkPackageOption pkgs "flarum" { };
29     forumTitle = mkOption {
30       type = types.str;
31       default = "A Flarum Forum on NixOS";
32       description = "Title of the forum.";
33     };
35     domain = mkOption {
36       type = types.str;
37       default = "localhost";
38       example = "forum.example.com";
39       description = "Domain to serve on.";
40     };
42     baseUrl = mkOption {
43       type = types.str;
44       default = "http://localhost";
45       example = "https://forum.example.com";
46       description = "Change `domain` instead.";
47     };
49     adminUser = mkOption {
50       type = types.str;
51       default = "flarum";
52       description = "Username for first web application administrator";
53     };
55     adminEmail = mkOption {
56       type = types.str;
57       default = "admin@example.com";
58       description = "Email for first web application administrator";
59     };
61     initialAdminPassword = mkOption {
62       type = types.str;
63       default = "flarum";
64       description = "Initial password for the adminUser";
65     };
67     user = mkOption {
68       type = types.str;
69       default = "flarum";
70       description = "System user to run Flarum";
71     };
73     group = mkOption {
74       type = types.str;
75       default = "flarum";
76       description = "System group to run Flarum";
77     };
79     stateDir = mkOption {
80       type = types.path;
81       default = "/var/lib/flarum";
82       description = "Home directory for writable storage";
83     };
85     database = mkOption rec {
86       type = with types; attrsOf (oneOf [str bool int]);
87       description = "MySQL database parameters";
88       default = {
89         # the database driver; i.e. MySQL; MariaDB...
90         driver = "mysql";
91         # the host of the connection; localhost in most cases unless using an external service
92         host = "localhost";
93         # the name of the database in the instance
94         database = "flarum";
95         # database username
96         username = "flarum";
97         # database password
98         password = "";
99         # the prefix for the tables; useful if you are sharing the same database with another service
100         prefix = "";
101         # the port of the connection; defaults to 3306 with MySQL
102         port = 3306;
103         strict = false;
104       };
105     };
107     createDatabaseLocally = mkOption {
108       type = types.bool;
109       default = false;
110       description = ''
111         Create the database and database user locally, and run installation.
113         WARNING: Due to https://github.com/flarum/framework/issues/4018, this option is set
114         to false by default. The 'flarum install' command may delete existing database tables.
115         Only set this to true if you are certain you are working with a fresh, empty database.
116       '';
117     };
118   };
120   config = mkIf cfg.enable {
121     users.users.${cfg.user} = {
122       isSystemUser = true;
123       home = cfg.stateDir;
124       createHome = true;
125       homeMode = "755";
126       group = cfg.group;
127     };
128     users.groups.${cfg.group} = {};
130     services.phpfpm.pools.flarum = {
131       user = cfg.user;
132       settings = {
133         "listen.owner" = config.services.nginx.user;
134         "listen.group" = config.services.nginx.group;
135         "listen.mode" = "0600";
136         "pm" = mkDefault "dynamic";
137         "pm.max_children" = mkDefault 10;
138         "pm.max_requests" = mkDefault 500;
139         "pm.start_servers" = mkDefault 2;
140         "pm.min_spare_servers" = mkDefault 1;
141         "pm.max_spare_servers" = mkDefault 3;
142       };
143       phpOptions = ''
144         error_log = syslog
145         log_errors = on
146       '';
147     };
149     services.nginx = {
150       enable = true;
151       virtualHosts."${cfg.domain}" = {
152         root = "${cfg.stateDir}/public";
153         locations."~ \.php$".extraConfig = ''
154           fastcgi_pass unix:${config.services.phpfpm.pools.flarum.socket};
155           fastcgi_index site.php;
156         '';
157         extraConfig = ''
158           index index.php;
159           include ${cfg.package}/share/php/flarum/.nginx.conf;
160         '';
161       };
162     };
164     services.mysql = mkIf cfg.enable {
165       enable = true;
166       package = pkgs.mysql;
167       ensureDatabases = [cfg.database.database];
168       ensureUsers = [
169         {
170           name = cfg.database.username;
171           ensurePermissions = {
172             "${cfg.database.database}.*" = "ALL PRIVILEGES";
173           };
174         }
175       ];
176     };
178     assertions = [
179       {
180         assertion = !cfg.createDatabaseLocally || cfg.database.driver == "mysql";
181         message = "Flarum can only be automatically installed in MySQL/MariaDB.";
182       }
183     ];
185     systemd.services.flarum-install = {
186       description = "Flarum installation";
187       requiredBy = ["phpfpm-flarum.service"];
188       before = ["phpfpm-flarum.service"];
189       requires = ["mysql.service"];
190       after = ["mysql.service"];
191       serviceConfig = {
192         Type = "oneshot";
193         User = cfg.user;
194         Group = cfg.group;
195       };
196       path = [config.services.phpfpm.phpPackage];
197       script = ''
198         mkdir -p ${cfg.stateDir}/{extensions,public/assets/avatars}
199         mkdir -p ${cfg.stateDir}/storage/{cache,formatter,sessions,views}
200         cd ${cfg.stateDir}
201         cp -f ${cfg.package}/share/php/flarum/{extend.php,site.php,flarum} .
202         ln -sf ${cfg.package}/share/php/flarum/vendor .
203         ln -sf ${cfg.package}/share/php/flarum/public/index.php public/
204       '' + optionalString (cfg.createDatabaseLocally && cfg.database.driver == "mysql") ''
205         if [ ! -f config.php ]; then
206           php flarum install --file=${flarumInstallConfig}
207         fi
208       '' + ''
209         if [ -f config.php ]; then
210           php flarum migrate
211           php flarum cache:clear
212         fi
213       '';
214     };
215   };
217   meta.maintainers = with lib.maintainers; [ fsagbuya jasonodoom ];