Files
2026-03-18 22:42:33 +09:00

82 lines
2.3 KiB
Nix
Executable File

{
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 <<EOSQL > .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 <<EOSQL > .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;
};
};
}