{ description = "PostgreSQL"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; outputs = { self, nixpkgs, ... }@inputs: let pkgsFor = system: import nixpkgs { inherit system; }; shellHook = '' CONFIG_FILE=./config/config.yaml if [ -f "$CONFIG_FILE" ]; then DB_USER=$(yq -r ".database.user" "$CONFIG_FILE") DB_PASSWORD=$(yq -r ".database.password" "$CONFIG_FILE") DB_PORT=$(yq -r ".database.port" "$CONFIG_FILE") DB_NAME=$(yq -r ".database.database" "$CONFIG_FILE") else echo "config.yaml not found, using defaults." exit fi : "$${DB_USER:=$${USER}}" : "$${DB_PASSWORD:=password}" : "$${DB_PORT:=5432}" : "$${DB_NAME:=postgres}" export PGDATA="$PWD/postgres-data-nix" export PGHOST="$PGDATA" mkdir -p "$PGDATA" chmod 700 "$PGDATA" mkdir -p "$PWD/.log" chmod 700 "$PWD/.log" if [ ! -f "$PGDATA/PG_VERSION" ]; then echo "Initializing database..." initdb -D "$PGDATA" > .log/postgres.log 2>&1 echo "unix_socket_directories = '$PGDATA'" >> "$PGDATA/postgresql.conf" echo "listen_addresses = '127.0.0.1'" >> "$PGDATA/postgresql.conf" pg_ctl -D "$PGDATA" -l .log/postgres.log -o "-k $PGDATA -p $DB_PORT" start sleep 1 psql --dbname postgres -v ON_ERROR_STOP=1 < .log/postgres.log 2>&1 DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$DB_USER') THEN EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', '$DB_USER', '$DB_PASSWORD'); END IF; END \$\$; EOSQL psql --dbname postgres -v ON_ERROR_STOP=1 < .log/postgres.log 2>&1 CREATE DATABASE "$DB_NAME" OWNER "$DB_USER"; EOSQL else pg_ctl -D "$PGDATA" -l .log/postgres.log -o "-k $PGDATA -p $DB_PORT" start fi ''; in { devShells.x86_64-linux.default = let pkgs = pkgsFor "x86_64-linux"; in pkgs.mkShell { packages = [ pkgs.postgresql_18 pkgs.yq ]; shellHook = shellHook; }; devShells.aarch64-linux.default = let pkgs = pkgsFor "aarch64-linux"; in pkgs.mkShell { packages = [ pkgs.postgresql_18 pkgs.yq ]; shellHook = shellHook; }; }; }