82 lines
2.3 KiB
Nix
Executable File
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;
|
|
};
|
|
};
|
|
} |