aboutsummaryrefslogtreecommitdiff
path: root/nixops/modules/websites/chloe/chloe.nix
blob: e2381d83e92ba44f932b42b81c315c7fc913f2e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{ stdenv, lib, fetchzip, fetchurl, fetchedGitPrivate, sassc }:
let
  chloe = { config }: rec {
    environment = config.environment;
    phpFpm = rec {
      serviceDeps = [ "mysql.service" ];
      socket = "/var/run/phpfpm/chloe-${environment}.sock";
      pool = ''
        listen = ${socket}
        user = ${apache.user}
        group = ${apache.group}
        listen.owner = ${apache.user}
        listen.group = ${apache.group}
        php_admin_value[upload_max_filesize] = 20M
        php_admin_value[post_max_size] = 20M
        ;php_admin_flag[log_errors] = on
        php_admin_value[open_basedir] = "${../commons/spip/spip_mes_options.php}:${configDir}:${webRoot}:${varDir}:/tmp"
        php_admin_value[session.save_path] = "${varDir}/phpSessions"
        ${if environment == "dev" then ''
        pm = ondemand
        pm.max_children = 5
        pm.process_idle_timeout = 60
        '' else ''
        pm = dynamic
        pm.max_children = 20
        pm.start_servers = 2
        pm.min_spare_servers = 1
        pm.max_spare_servers = 3
        ''}'';
    };
    keys = [{
      dest = "webapps/${environment}-chloe";
      user = apache.user;
      group = apache.group;
      permissions = "0400";
      text = ''
        SetEnv SPIP_CONFIG_DIR     "${configDir}"
        SetEnv SPIP_VAR_DIR        "${varDir}"
        SetEnv SPIP_SITE           "chloe-${environment}"
        SetEnv SPIP_LDAP_BASE      "dc=immae,dc=eu"
        SetEnv SPIP_LDAP_HOST      "ldaps://ldap.immae.eu"
        SetEnv SPIP_LDAP_SEARCH_DN "${config.ldap.dn}"
        SetEnv SPIP_LDAP_SEARCH_PW "${config.ldap.password}"
        SetEnv SPIP_LDAP_SEARCH    "${config.ldap.search}"
        SetEnv SPIP_MYSQL_HOST     "${config.mysql.host}"
        SetEnv SPIP_MYSQL_PORT     "${config.mysql.port}"
        SetEnv SPIP_MYSQL_DB       "${config.mysql.name}"
        SetEnv SPIP_MYSQL_USER     "${config.mysql.user}"
        SetEnv SPIP_MYSQL_PASSWORD "${config.mysql.password}"
      '';
    }];
    apache = rec {
      user = "wwwrun";
      group = "wwwrun";
      modules = [ "proxy_fcgi" ];
      webappName = "chloe_${environment}";
      root = "/run/current-system/webapps/${webappName}";
      vhostConf = ''
        Include /var/secrets/webapps/${environment}-chloe

        RewriteEngine On
        ${if environment == "prod" then ''
        RewriteRule ^/news.rss  /spip.php?page=backend&id_rubrique=1
        '' else ""}

        <FilesMatch "\.php$">
          SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
        </FilesMatch>

        <Directory ${root}>
          DirectoryIndex index.php index.htm index.html
          Options -Indexes +FollowSymLinks +MultiViews +Includes
          Include ${root}/htaccess.txt

          AllowOverride AuthConfig FileInfo Limit
          Require all granted
        </Directory>

        <DirectoryMatch "${root}/squelettes">
          Require all denied
        </DirectoryMatch>

        <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
          Require all denied
        </FilesMatch>

        ${if environment == "dev" then ''
        <Location />
          Use LDAPConnect
          Require ldap-group cn=chloe.immae.eu,cn=httpd,ou=services,dc=immae,dc=eu
          ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://osteopathe-cc.fr\"></html>"
        </Location>
        '' else ''
        Use Stats osteopathe-cc.fr
        ''}
        '';
    };
    activationScript = {
      deps = [ "wrappers" ];
      text = ''
        install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} ${varDir}/IMG ${varDir}/tmp ${varDir}/local
        install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
      '';
    };
    configDir = ./chloe_config_ + environment;
    varDir = "/var/lib/chloe_${environment}";
    siteDir = stdenv.mkDerivation (fetchedGitPrivate ./chloe.json // rec {
      buildPhase = ''
        make
        '';
      installPhase = ''
        cp -a . $out
        '';
      buildInputs = [ sassc ];
    });
    webRoot = stdenv.mkDerivation rec {
      name = "chloe-${environment}-spip-${version}";
      version = "3.2.3";
      src = fetchzip {
        url = "https://files.spip.net/spip/archives/SPIP-v${version}.zip";
        sha256 = "1r1mjvsnrp6mvkgjakvi3x4ms8m8k5mp93micbbg8r99fj7qlfkq";
      };
      paches = [ ../commons/spip/spip_ldap_patch.patch ];
      buildPhase = ''
        rm -rf IMG local tmp config/remove.txt
        ln -sf ${../commons/spip/spip_mes_options.php} config/mes_options.php
        echo "Require all denied" > "config/.htaccess"
        ln -sf ${varDir}/{IMG,local} .
      '';
      installPhase = ''
        cp -a . $out
        cp -a ${siteDir}/* $out
      '';
    };
  };
in
  chloe