{ self }: final: prev: with prev.lib; let mkUniworxDocker = { isDemo }: prev.dockerTools.buildImage { name = "uniworx${optionalString isDemo "-demo"}"; tag = let versionFile = if isDemo then ./demo-version.json else ./version.json; in (builtins.fromJSON (prev.lib.readFile versionFile)).version; created = let fromDate = builtins.readFile (prev.runCommand "date" { nativeBuildInputs = with final; [ coreutils ]; } '' printf '%s' $(date -Is -d '@${toString self.lastModified}') > $out ''); in if self ? lastModified then fromDate else "1970-01-01T00:00:01Z"; contents = with final; [ uniworx.uniworx.components.exes.uniworx prev.dockerTools.binSh ] ++ optionals isDemo [ postgresql_12 memcached ]; runAsRoot = '' #!${final.stdenv.shell} ${prev.dockerTools.shadowSetup} mkdir -p /var/lib groupadd -r uniworx useradd -r -g uniworx -d /var/lib/uniworx -M uniworx install -d -g uniworx -o uniworx -m 0750 /var/lib/uniworx mkdir -p /var/log install -d -g uniworx -o uniworx -m 0755 /var/log/uniworx ${optionalString isDemo '' groupadd -r postgres useradd -r -g postgres -d /var/lib/postgres -M postgres install -d -g postgres -o postgres -m 0750 /var/lib/postgres groupadd -r memcached useradd -r -g memcached -d /var/lib/memcached -M memcached install -d -g memcached -o memcached -m 0750 /var/lib/memcached gpasswd -a uniworx postgres install -d -g postgres -o postgres -m 0755 /var/log/postgres install -d -g memcached -o memcached -m 0755 /var/log/memcached mkdir -p /run install -d -g postgres -o postgres -m 0755 /run/postgres ''} ''; config = let entrypoint = prev.writeScriptBin "uniworx-entrypoint" '' #!${final.zsh}/bin/zsh -xe export PATH=${final.su}/bin:${final.findutils}/bin:${final.coreutils}/bin:/bin cTime=$(date -Is) ${optionalString isDemo '' pgDir=/var/lib/postgres pgSockDir=/run/postgres pgLogFile=/var/log/postgres/''${cTime}.log export PGHOST=''${pgSockDir} export PGLOG=''${pgLogFile} pgNew= if [[ -n "$(find ''${pgDir} -maxdepth 0 -type d -empty 2>/dev/null)" ]]; then pgNew=1 fi [[ -z "''${pgNew}" ]] || su postgres -c "initdb --no-locale --encoding=UTF8 -D ''${pgDir}" su postgres -c "pg_ctl start -D ''${pgDir} -l ''${pgLogFile} -w -o '-k ''${pgSockDir} -c listen_addresses= -c hba_file=${postgresHba} -c unix_socket_permissions=0777 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c auto_explain.log_min_duration=100ms'" [[ -z "''${pgNew}" ]] || psql -f ${postgresSchema} postgres postgres su memcached -c "cd /var/lib/memcached; memcached -p 11212" &>/var/log/memcached/''${cTime}.log & export SESSION_MEMCACHED_HOST=localhost export SESSION_MEMCACHED_PORT=11212 ''} export LOGDEST=/var/log/uniworx/''${cTime}.log typeset -a configs configs=() configDir=''${CONFIG_DIR-/cfg} if [[ -d "''${configDir}" ]]; then while IFS= read -d $'\0' cfg; do configs+=("''${(q)cfg}") done < <(find "''${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz) fi configs+=('${uniworxConfig}') exec -- su uniworx -c "cd /var/lib/uniworx; uniworx ''${configs}" ''; postgresSchema = prev.writeText "schema.sql" '' CREATE USER uniworx WITH SUPERUSER; CREATE DATABASE uniworx; GRANT ALL ON DATABASE uniworx TO uniworx; ''; postgresHba = prev.writeText "hba_file" '' local all all trust ''; uniworxConfig = prev.writeText "uni2work.yml" '' port: 8080 approot: "_env:APPROOT:http://localhost:8080" ''; in { Cmd = [ "${entrypoint}/bin/uniworx-entrypoint" ]; ExposedPorts = { "8080/tcp" = {}; }; Volumes = { "/var/lib/uniworx" = {}; "/var/log" = {}; } // optionalAttrs isDemo { "/var/lib/postgres" = {}; }; }; }; in mapAttrs (_name: mkUniworxDocker) { uniworxDemoDocker = { isDemo = true; }; uniworxDocker = { isDemo = false; }; }