#!/bin/bash set -e # PostgreSQL Initialization Script # Creates databases and users for homelab applications # Runs once during initial container startup echo "🔧 Initializing PostgreSQL databases and users..." # Source environment variables if available if [ -f /run/secrets/postgres_passwords ]; then source /run/secrets/postgres_passwords fi # Default passwords (override via environment variables) : ${AUTHENTIK_DB_PASSWORD:=CHANGEME_AUTHENTIK_PASSWORD} : ${GITEA_DB_PASSWORD:=CHANGEME_GITEA_PASSWORD} # Create Authentik database and user echo "📦 Creating Authentik database..." psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL CREATE DATABASE authentik; CREATE USER authentik_user WITH PASSWORD '$AUTHENTIK_DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE authentik TO authentik_user; -- Grant schema privileges (required for PostgreSQL 15+) \c authentik GRANT ALL ON SCHEMA public TO authentik_user; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO authentik_user; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO authentik_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO authentik_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authentik_user; EOSQL # Create Gitea database and user (for future migration) echo "📦 Creating Gitea database..." psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL CREATE DATABASE gitea; CREATE USER gitea_user WITH PASSWORD '$GITEA_DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea_user; \c gitea GRANT ALL ON SCHEMA public TO gitea_user; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO gitea_user; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO gitea_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO gitea_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO gitea_user; EOSQL # Add future databases here as needed # echo "📦 Creating future_app database..." # psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL # CREATE DATABASE future_app; # CREATE USER future_user WITH PASSWORD '$FUTURE_APP_PASSWORD'; # GRANT ALL PRIVILEGES ON DATABASE future_app TO future_user; # EOSQL echo "✅ PostgreSQL initialization complete!" echo "" echo "📊 Database Summary:" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" -c '\l' echo "" echo "👥 User Summary:" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" -c '\du'