-{ lib, checkEnv, writeText, fetchedGitPrivate, stdenv, php, git, cacert, phpPackages, yarn }:
+{ lib, writeText, fetchedGitPrivate, stdenv, composerEnv, fetchurl, fetchgit, binutils, python, nodejs, libsass, yarn2nix }:
let
- aten = { environment ? "dev" }: rec {
- varPrefix = "ATEN";
+ aten = { config }: rec {
+ environment = config.environment;
varDir = "/var/lib/aten_${environment}";
- envName= lib.strings.toUpper environment;
phpFpm = rec {
socket = "/var/run/phpfpm/aten-${environment}.sock";
pool = ''
user = "wwwrun";
group = "wwwrun";
modules = [ "proxy_fcgi" ];
- vhostConf =
- assert checkEnv "NIXOPS_${varPrefix}_${envName}_SECRET";
- assert checkEnv "NIXOPS_${varPrefix}_${envName}_PSQL_URL";
- ''
+ vhostConf = ''
<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"}
+ SetEnv APP_SECRET "${config.secret}"
+ SetEnv DATABASE_URL "${config.psql_url}"
${if environment == "dev" then ''
<Location />
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
- ];
- });
+ yarnModules = let
+ info = fetchedGitPrivate ./aten.json;
+ in
+ yarn2nix.mkYarnModules {
+ name = "aten-yarn-modules";
+ packageJSON = "${info.src}/package.json";
+ yarnLock = "${info.src}/yarn.lock";
+ pkgConfig = {
+ node-sass = {
+ buildInputs = [ binutils libsass python ];
+ postInstall = let
+ nodeHeaders = fetchurl {
+ url = "https://nodejs.org/download/release/v${nodejs.version}/node-v${nodejs.version}-headers.tar.gz";
+ sha256 = "12zzsf8my43b8qnlacp871ih5vqafl2vlpqp51xp6h3gckn2frwy";
+ };
+ in
+ ''
+ export AR=${binutils.bintools}/bin/ar
+ node scripts/build.js --tarball=${nodeHeaders}
+ '';
+ };
+ };
+ };
+ webappDir = composerEnv.buildPackage (
+ import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
+ fetchedGitPrivate ./aten.json //
+ rec {
+ noDev = (environment == "prod");
+ preInstall = ''
+ export SYMFONY_ENV="${environment}"
+ export APP_ENV="${environment}"
+ export DATABASE_URL="${config.psql_url}"
+ export APP_SECRET="${config.secret}"
+ '';
+ postInstall = ''
+ cd $out
+ ln -sf ${yarnModules}/node_modules .
+ yarn run --offline encore production
+ rm -rf var/{log,cache}
+ ln -sf ../../../../../../../${varDir}/{log,cache} var/
+ '';
+ buildInputs = [ yarn2nix.yarn ];
+ });
webRoot = "${webappDir}/public";
};
in