aboutsummaryrefslogtreecommitdiff
path: root/virtual/modules/websites/aten/aten.nix
blob: d67f7b7c8587eb64b657641eb0a23ef3dcc5f43d (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
{ lib, checkEnv, writeText, fetchedGitPrivate, stdenv, php, git, cacert, phpPackages, yarn }:
let
  aten = { environment ? "dev" }: rec {
    varPrefix = "ATEN";
    varDir = "/var/lib/aten_${environment}";
    envName= lib.strings.toUpper environment;
    phpFpm = rec {
      socket = "/var/run/phpfpm/aten-${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] = "${webappDir}:${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
        env[SYMFONY_DEBUG_MODE] = "yes"
        '' else ''
        pm = dynamic
        pm.max_children = 20
        pm.start_servers = 2
        pm.min_spare_servers = 1
        pm.max_spare_servers = 3
        ''}'';
    };
    apache = {
      user = "wwwrun";
      group = "wwwrun";
      modules = [ "proxy_fcgi" ];
      vhostConf =
        assert checkEnv "NIXOPS_${varPrefix}_${envName}_SECRET";
        assert checkEnv "NIXOPS_${varPrefix}_${envName}_PSQL_URL";
      ''
      <FilesMatch "\.php$">
        SetHandler "proxy:unix:${phpFpm.socket}|fcgi://localhost"
      </FilesMatch>

      SetEnv APP_ENV      "${environment}"
      SetEnv APP_SECRET   "${builtins.getEnv "NIXOPS_${varPrefix}_${envName}_SECRET"}
      SetEnv DATABASE_URL "${builtins.getEnv "NIXOPS_${varPrefix}_${envName}_PSQL_URL"}

      ${if environment == "dev" then ''
      <Location />
        Use LDAPConnect
        Require ldap-group   cn=dev.aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
        ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
      </Location>

      <Location /backend>
        Use LDAPConnect
        Require ldap-group   cn=dev.aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
        ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
      </Location>
      '' else ''
      Use Stats aten.pro

      <Location /backend>
        Use LDAPConnect
        Require ldap-group   cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
        ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
      </Location>
      ''}

      <Directory ${webRoot}>
        Options Indexes FollowSymLinks MultiViews Includes
        AllowOverride All
        Require all granted
        DirectoryIndex index.php
        FallbackResource /index.php
      </Directory>
      '';
    };
    activationScript = {
      deps = [ "wrappers" ];
      text = ''
      install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
      if [ ! -f "${varDir}/currentWebappDir" -o \
          "${webappDir}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ]; then
        pushd ${webappDir} > /dev/null
        $wrapperDir/sudo -u wwwrun APP_ENV=${environment} ./bin/console --env=${environment} cache:clear --no-warmup
        popd > /dev/null
        echo -n "${webappDir}" > ${varDir}/currentWebappDir
      fi
      '';
    };
    webappDir = stdenv.mkDerivation (fetchedGitPrivate ./aten.json // rec {
      # FIXME: can we do better than symlink?
      # FIXME: initial sync
      # FIXME: backup
      # FIXME: usage statistics
      buildPhase = ''
        export GIT_SSL_CAINFO=${cacert}/etc/ssl/certs/ca-bundle.crt
        export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
        export APP_ENV="${environment}"
        export DATABASE_URL="${builtins.getEnv "NIXOPS_${varPrefix}_${envName}_PSQL_URL"}"
        export APP_SECRET="${builtins.getEnv "NIXOPS_${varPrefix}_${envName}_SECRET"}"

        ${if environment == "dev" then ''
          composer install
        '' else ''
          SYMFONY_ENV=prod composer install --no-dev
        ''}
        yarn install
        yarn run encore production
        rm -rf var
        ln -sf ../../../../../${varDir} var
        '';
      installPhase = ''
        cp -a . $out
        '';
      buildInputs = [
        php git cacert phpPackages.composer yarn
      ];
    });
    webRoot = "${webappDir}/public";
  };
in
  aten