]> git.immae.eu Git - perso/Immae/Config/Nix.git/blob - modules/private/websites/nicecoop/gestion-compte_integration.nix
WIP upgrade
[perso/Immae/Config/Nix.git] / modules / private / websites / nicecoop / gestion-compte_integration.nix
1 { lib, pkgs, config, ... }:
2 let
3 secrets = config.myEnv.websites.nicecoop.gestion-compte-integration;
4 varDir = "/var/lib/nicecoop_gestion-compte_integration/var";
5 parametersPath = "/var/lib/buildbot/outputs/nicecoop/gestion/sandbox/parameters.yml";
6 app = pkgs.callPackage ./gestion-compte {
7 inherit varDir;
8 secretsPath = parametersPath;
9 };
10 cfg = config.myServices.websites.nicecoop.gestion-compte-integration;
11 in {
12 options.myServices.websites.nicecoop.gestion-compte-integration.enable = lib.mkEnableOption "enable nicecoop's gestion-compte website";
13
14 config = lib.mkIf cfg.enable {
15 services.phpfpm.pools.nicecoop_gestion-compte_integration = {
16 user = config.services.httpd.Inte.user;
17 group = config.services.httpd.Inte.group;
18 settings = {
19 "listen.owner" = config.services.httpd.Inte.user;
20 "listen.group" = config.services.httpd.Inte.group;
21 "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
22 app
23 varDir
24 parametersPath
25 "/tmp"
26 ];
27 "php_admin_value[upload_max_filesize]" = "20M";
28 "php_admin_value[post_max_size]" = "20M";
29 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
30 "pm" = "dynamic";
31 "pm.max_children" = "20";
32 "pm.start_servers" = "2";
33 "pm.min_spare_servers" = "1";
34 "pm.max_spare_servers" = "3";
35 };
36 };
37 services.cron = {
38 systemCronJobs = let
39 prefix = "${config.services.httpd.Prod.user} cd ${app} && ./bin/console --env=prod";
40 in [
41 ''
42 # generate shifts in 80 to 90 days
43 55 5 * * * ${prefix} app:shift:generate --quiet $(date -d "+80 days" +\%Y-\%m-\%d) --to $(date -d "+90 days" +\%Y-\%m-\%d)
44
45 # free pre-booked shifts
46 55 5 * * * ${prefix} app:shift:free --quiet $(date -d "+21 days" +\%Y-\%m-\%d)
47
48 # send reminder 2 days before shift
49 0 6 * * * ${prefix} app:shift:reminder --quiet $(date -d "+2 days" +\%Y-\%m-\%d)
50
51 # execute routine for cycle_end/cycle_start, everyday
52 5 6 * * * ${prefix} app:user:cycle_start --quiet
53
54 # send alert on shifts booking (low)
55 0 10 * * * ${prefix} app:shift:send_alerts --quiet --emails creneaux@nicecoop.fr $(date -d "+2 days" +\%Y-\%m-\%d) 1
56
57 # send a reminder mail to the user who generate the last code but did not validate the change.
58 45 21 * * * ${prefix} app:code:verify_change --quiet --last_run 24
59 ''
60 ];
61 };
62 system.extraSystemBuilderCmds = let
63 tarball = pkgs.runCommand "sandbox.tar.gz" {} ''
64 tar -P --transform="s@${app}@sandbox_app@" -czf $out ${app}
65 '';
66 in ''
67 mkdir -p $out/nicecoop/gestion
68 ln -s ${tarball} $out/nicecoop/gestion/sandbox.tar.gz
69 '';
70 systemd.services.phpfpm-nicecoop_gestion-compte_integration = {
71 after = lib.mkAfter ["mysql.service"];
72 wants = ["mysql.service"];
73 preStart = lib.mkAfter ''
74 /run/wrappers/bin/sudo chown wwwrun:wwwrun ${parametersPath}
75 watchFilesChanged() {
76 [ ! -f "${varDir}"/watchedFiles ] \
77 || ! sha512sum -c --status ${varDir}/watchedFiles
78 }
79 appDirChanged() {
80 [ ! -f "${varDir}/currentWebappDir" -o \
81 "${app}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ]
82 }
83 updateWatchFiles() {
84 sha512sum ${parametersPath} > ${varDir}/watchedFiles
85 }
86
87 if watchFilesChanged || appDirChanged; then
88 pushd ${app} > /dev/null
89 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
90 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:database:create -n --if-not-exists
91 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate -n
92 popd > /dev/null
93 echo -n "${app}" > ${varDir}/currentWebappDir
94 updateWatchFiles
95 fi
96 '';
97 };
98
99 system.activationScripts.nicecoop_gestion-compte_integration = {
100 deps = [];
101 text = ''
102 install -m 0700 -o wwwrun -g wwwrun -d ${varDir} ${varDir}/phpSessions ${varDir}/var
103 '';
104 };
105
106 services.filesWatcher.phpfpm-nicecoop_gestion-compte_integration = {
107 restart = true;
108 paths = [
109 parametersPath
110 ];
111 };
112
113 secrets.keys."buildbot/nicecoop/sandbox.yml" = {
114 user = "buildbot";
115 group = "buildbot";
116 permissions = "0400";
117 text = builtins.toJSON {
118 database = {
119 host = secrets.mysql.host;
120 port = secrets.mysql.port;
121 name = secrets.mysql.database;
122 user = secrets.mysql.user;
123 password = secrets.mysql.password;
124 version = config.myServices.databases.mariadb.package.mysqlVersion;
125 };
126 admipassword = secrets.adminpassword;
127 smtp = {
128 host = secrets.smtp.host;
129 port = secrets.smtp.port;
130 email = secrets.smtp.email;
131 password = secrets.smtp.password;
132 };
133 secret = secrets.secret;
134 };
135 };
136
137 services.websites.env.integration.vhostConfs.nicecoop_gestion-compte = {
138 certName = "integration";
139 addToCerts = true;
140 hosts = ["gestion-compte.nc.immae.dev"];
141 root = app.webRoot;
142 extraConfig = [
143 ''
144 <FilesMatch "\.php$">
145 SetHandler "proxy:unix:${config.services.phpfpm.pools.nicecoop_gestion-compte_integration.socket}|fcgi://localhost"
146 </FilesMatch>
147
148 <Directory ${app.webRoot}>
149 Options Indexes FollowSymLinks MultiViews Includes
150 AllowOverride All
151 Require all granted
152 </Directory>
153 ''
154 ];
155 };
156 };
157 }
158