{ pkgs ? (import ./nixpkgs.nix {}).pkgs }: let haskellPackages = pkgs.haskellPackages; postgresSchema = pkgs.writeText "schema.sql" '' CREATE USER uniworx WITH SUPERUSER; CREATE DATABASE uniworx_test; GRANT ALL ON DATABASE uniworx_test TO uniworx; CREATE DATABASE uniworx; GRANT ALL ON DATABASE uniworx TO uniworx; ''; postgresHba = pkgs.writeText "hba_file" '' local all all trust ''; develop = pkgs.writeScriptBin "develop" '' #!${pkgs.zsh}/bin/zsh cleanup() { set +e -x type cleanup_postgres &>/dev/null && cleanup_postgres type cleanup_widget_memcached &>/dev/null && cleanup_widget_memcached type cleanup_session_memcached &>/dev/null && cleanup_session_memcached type cleanup_cache_memcached &>/dev/null && cleanup_cache_memcached type cleanup_minio &>/dev/null && cleanup_minio [ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env" set +x } trap cleanup EXIT basePath=$(pwd) echo "" > ''${basePath}/.develop.env PORT_OFFSET=$(((16#$(whoami | sha256sum | head -c 16)) % 1000)) echo "PORT_OFFSET=''${PORT_OFFSET}" >> ''${basePath}/.develop.env if [[ -z "$PGHOST" ]]; then set -xe pgDir=$(mktemp -d) pgSockDir=$(mktemp -d) pgLogFile=$(mktemp) initdb --no-locale -D ''${pgDir} pg_ctl start -D ''${pgDir} -l ''${pgLogFile} -w -o "-k ''${pgSockDir} -c listen_addresses=''' -c hba_file='${postgresHba}' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c auto_explain.log_min_duration=100ms" psql -h ''${pgSockDir} -f ${postgresSchema} postgres printf "Postgres logfile is %s\nPostgres socket directory is %s\n" ''${pgLogFile} ''${pgSockDir} cleanup_postgres() { set +e -x pg_ctl stop -D ''${pgDir} rm -rvf ''${pgDir} ''${pgSockDir} ''${pgLogFile} set +x } set +xe fi echo "PGHOST=''${pgSockDir}" >> ''${basePath}/.develop.env echo "PGLOG=''${pgLogFile}" >> ''${basePath}/.develop.env if [[ -z "$WIDGET_MEMCACHED_HOST" ]]; then set -xe memcached -l localhost -p $(($PORT_OFFSET + 11211)) &>/dev/null & widget_memcached_pid=$! cleanup_widget_memcached() { [[ -n "$widget_memcached_pid" ]] && kill $widget_memcached_pid } set +xe fi echo "WIDGET_MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env echo "WIDGET_MEMCACHED_PORT=$(($PORT_OFFSET + 11211))" >> ''${basePath}/.develop.env echo "PGLOG=''${PGLOG}" >> ''${basePath}/.develop.env if [[ -z "$SESSION_MEMCACHED_HOST" ]]; then set -xe memcached -l localhost -p $(($PORT_OFFSET + 11212)) &>/dev/null & session_memcached_pid=$! cleanup_session_memcached() { [[ -n "$session_memcached_pid" ]] && kill $session_memcached_pid } set +xe fi echo "SESSION_MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env echo "SESSION_MEMCACHED_PORT=$(($PORT_OFFSET + 11212))" >> ''${basePath}/.develop.env if [[ -z "$MEMCACHED_HOST" ]]; then set -xe memcached -l localhost -p $(($PORT_OFFSET + 11213)) &>/dev/null & memcached_pid=$! cleanup_session_memcached() { [[ -n "$memcached_pid" ]] && kill $memcached_pid } set +xe fi echo "MEMCACHED_HOST=localhost" >> ''${basePath}/.develop.env echo "MEMCACHED_PORT=$(($PORT_OFFSET + 11212))" >> ''${basePath}/.develop.env if [[ -z "$UPLOAD_S3_HOST" ]]; then set -xe cleanup_minio() { [[ -n "$minio_pid" ]] && kill $minio_pid [[ -n "''${MINIO_DIR}" ]] && rm -rvf ''${MINIO_DIR} [[ -n "''${MINIO_LOGFILE}" ]] && rm -rvf ''${MINIO_LOGFILE} } MINIO_DIR=$(mktemp -d) MINIO_LOGFILE=$(mktemp --tmpdir minio.XXXXXX.log) MINIO_ACCESS_KEY=$(${pkgs.pwgen}/bin/pwgen -s 16 1) MINIO_SECRET_KEY=$(${pkgs.pwgen}/bin/pwgen -s 32 1) minio server --address localhost:$(($PORT_OFFSET + 9000)) ''${MINIO_DIR} &>''${MINIO_LOGFILE} & minio_pid=$! sleep 1 set +xe fi echo "MINIO_DIR=''${MINIO_DIR}" >> ''${basePath}/.develop.env echo "MINIO_LOGFILE=''${MINIO_LOGFILE}" >> ''${basePath}/.develop.env echo "UPLOAD_S3_HOST=localhost" >> ''${basePath}/.develop.env echo "UPLOAD_S3_PORT=$(($PORT_OFFSET + 9000))" >> ''${basePath}/.develop.env echo "UPLOAD_S3_SSL=false" >> ''${basePath}/.develop.env echo "UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}" >> ''${basePath}/.develop.env echo "UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}" >> ''${basePath}/.develop.env if [ -n "$ZSH_VERSION" ]; then autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit fi eval "$(stack --bash-completion-script stack)" $(getent passwd $USER | cut -d: -f 7) ''; in pkgs.mkShell { name = "uni2work"; nativeBuildInputs = [develop] ++ (with pkgs; [ nodejs-14_x postgresql_12 openldap google-chrome exiftool memcached minio minio-client ]) ++ (with pkgs.haskellPackages; [ stack yesod-bin hlint cabal-install weeder profiteur ]); }