Skip to content

Commit 90cadb1

Browse files
committed
Fix PostgreSQL setup broken when running as root
Replace $SUDO -u postgres with sudo -u postgres in all psql commands. When SSH user is root, $SUDO is empty, causing -u postgres psql to fail with "bash: -u: command not found". User-switching requires sudo even as root. Also add TCP connection configuration (listen_addresses, pg_hba.conf) and SSH keepalive options.
1 parent e97749d commit 90cadb1

1 file changed

Lines changed: 34 additions & 10 deletions

File tree

lib/database.sh

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ setup_postgresql() {
1212

1313
info "Setting up PostgreSQL..."
1414

15-
ssh -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" \
15+
ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5 -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" \
1616
DB_NAME="$DB_NAME" \
1717
DB_USER="$DB_USER" \
1818
DB_PASSWORD="$DB_PASSWORD" \
@@ -38,27 +38,51 @@ setup_postgresql() {
3838
$SUDO systemctl start postgresql
3939
$SUDO systemctl enable postgresql
4040
41+
# Configure PostgreSQL to accept TCP connections on localhost
42+
echo "Configuring PostgreSQL for TCP connections..."
43+
44+
# Find postgresql.conf path
45+
PG_VERSION=$(sudo -u postgres psql -t -c "SHOW server_version;" | cut -d. -f1 | tr -d ' ')
46+
PG_CONF="/etc/postgresql/$PG_VERSION/main/postgresql.conf"
47+
PG_HBA="/etc/postgresql/$PG_VERSION/main/pg_hba.conf"
48+
49+
# Set listen_addresses if not already configured
50+
if ! $SUDO grep -q "^listen_addresses.*localhost" "$PG_CONF"; then
51+
echo "Enabling TCP listener on localhost..."
52+
$SUDO sed -i "s/^#*listen_addresses.*/listen_addresses = 'localhost'/" "$PG_CONF"
53+
fi
54+
55+
# Add TCP connection rule to pg_hba.conf if not present
56+
if ! $SUDO grep -q "host.*all.*all.*127.0.0.1/32.*md5" "$PG_HBA"; then
57+
echo "Adding TCP authentication rule..."
58+
$SUDO bash -c "echo 'host all all 127.0.0.1/32 md5' >> '$PG_HBA'"
59+
fi
60+
61+
# Restart PostgreSQL to apply changes
62+
echo "Restarting PostgreSQL..."
63+
$SUDO systemctl restart postgresql
64+
4165
# Create database and user
4266
echo "Creating database '$DB_NAME' and user '$DB_USER'..."
4367
4468
# Create database if it doesn't exist
45-
$SUDO -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'" | grep -q 1 || \
46-
$SUDO -u postgres psql -c "CREATE DATABASE \"$DB_NAME\";"
69+
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'" | grep -q 1 || \
70+
sudo -u postgres psql -c "CREATE DATABASE \"$DB_NAME\";"
4771
4872
# Create user if it doesn't exist
49-
$SUDO -u postgres psql -tc "SELECT 1 FROM pg_user WHERE usename = '$DB_USER'" | grep -q 1 || \
50-
$SUDO -u postgres psql -c "CREATE USER \"$DB_USER\" WITH PASSWORD '$DB_PASSWORD';"
73+
sudo -u postgres psql -tc "SELECT 1 FROM pg_user WHERE usename = '$DB_USER'" | grep -q 1 || \
74+
sudo -u postgres psql -c "CREATE USER \"$DB_USER\" WITH PASSWORD '$DB_PASSWORD';"
5175
5276
# Update password if user already exists
53-
$SUDO -u postgres psql -c "ALTER USER \"$DB_USER\" WITH PASSWORD '$DB_PASSWORD';"
77+
sudo -u postgres psql -c "ALTER USER \"$DB_USER\" WITH PASSWORD '$DB_PASSWORD';"
5478
5579
# Grant privileges
56-
$SUDO -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" TO \"$DB_USER\";"
80+
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" TO \"$DB_USER\";"
5781
5882
# For PostgreSQL 15+, grant schema privileges
59-
$SUDO -u postgres psql -d "$DB_NAME" -c "GRANT ALL ON SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
60-
$SUDO -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
61-
$SUDO -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
83+
sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL ON SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
84+
sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
85+
sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"$DB_USER\";" 2>/dev/null || true
6286
6387
echo "PostgreSQL setup complete. Database '$DB_NAME' is ready."
6488
echo "Connection string: postgresql://$DB_USER:[REDACTED]@localhost:5432/$DB_NAME"

0 commit comments

Comments
 (0)