48 lines
1.5 KiB
Bash
Executable File
48 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Configure PostgreSQL 18 for c-relay-pg using peer authentication.
|
|
# Idempotent: safe to run multiple times.
|
|
|
|
set -euo pipefail
|
|
|
|
PG_VERSION="18"
|
|
PG_HBA="/etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
|
|
RELAY_ROLE="c-relay-pg"
|
|
RELAY_DB="crelay"
|
|
|
|
if ! command -v psql >/dev/null 2>&1; then
|
|
echo "ERROR: psql not found. Install postgresql-18 first."
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$PG_HBA" ]; then
|
|
echo "ERROR: pg_hba.conf not found at $PG_HBA"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Ensuring PostgreSQL role exists: $RELAY_ROLE"
|
|
sudo -u postgres psql -v ON_ERROR_STOP=1 -tAc "SELECT 1 FROM pg_roles WHERE rolname='${RELAY_ROLE}'" | grep -q 1 || \
|
|
sudo -u postgres psql -v ON_ERROR_STOP=1 -c "CREATE ROLE \"${RELAY_ROLE}\" LOGIN"
|
|
|
|
echo "Ensuring PostgreSQL database exists: $RELAY_DB"
|
|
sudo -u postgres psql -v ON_ERROR_STOP=1 -tAc "SELECT 1 FROM pg_database WHERE datname='${RELAY_DB}'" | grep -q 1 || \
|
|
sudo -u postgres createdb --owner="${RELAY_ROLE}" "${RELAY_DB}"
|
|
|
|
echo "Ensuring owner on database: $RELAY_DB"
|
|
sudo -u postgres psql -v ON_ERROR_STOP=1 -c "ALTER DATABASE \"${RELAY_DB}\" OWNER TO \"${RELAY_ROLE}\""
|
|
|
|
PEER_RULE="local ${RELAY_DB} ${RELAY_ROLE} peer"
|
|
if ! grep -Eq "^local[[:space:]]+${RELAY_DB}[[:space:]]+${RELAY_ROLE}[[:space:]]+peer$" "$PG_HBA"; then
|
|
echo "Adding explicit peer auth rule to $PG_HBA"
|
|
TMP_FILE=$(mktemp)
|
|
{
|
|
echo "$PEER_RULE"
|
|
cat "$PG_HBA"
|
|
} > "$TMP_FILE"
|
|
sudo cp "$TMP_FILE" "$PG_HBA"
|
|
rm -f "$TMP_FILE"
|
|
sudo systemctl restart postgresql
|
|
fi
|
|
|
|
echo "PostgreSQL setup complete"
|