diff --git a/.gitea/workflows/setup-db.yml b/.gitea/workflows/setup-db.yml new file mode 100644 index 0000000..0e9b1f6 --- /dev/null +++ b/.gitea/workflows/setup-db.yml @@ -0,0 +1,41 @@ +name: Database Setup Automation + +on: + # Trigger the workflow manually from the Gitea UI + workflow_dispatch: + +jobs: + create_db_and_user: + # Use a standard Linux runner environment + runs-on: ubuntu-latest + + # NOTE: The job will run inside a Docker image with the psql client. + container: + image: postgres:15-alpine + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Configure and Create PostgreSQL Resources + # Set environment variables from the Gitea Secrets + env: + POSTGRES_HOST: ${{ secrets.POSTGRES_HOST }} + POSTGRES_PORT: ${{ secrets.POSTGRES_PORT }} + POSTGRES_ADMIN_USER: ${{ secrets.POSTGRES_ADMIN_USER }} + POSTGRES_ADMIN_PASSWORD: ${{ secrets.POSTGRES_ADMIN_PASSWORD }} + NEW_DB_NAME: ${{ secrets.NEW_DB_NAME }} + NEW_DB_USER: ${{ secrets.NEW_DB_USER }} + NEW_DB_PASSWORD: ${{ secrets.NEW_DB_PASSWORD }} + + run: | + echo "Running database creation script..." + + # Export the admin password so psql can use it automatically + export PGPASSWORD=$POSTGRES_ADMIN_PASSWORD + + # Execute the script + ./scripts/create_db_user.sh + + # Unset the password variable for security + unset PGPASSWORD diff --git a/scripts/create_db_user.sh b/scripts/create_db_user.sh new file mode 100644 index 0000000..fbf6453 --- /dev/null +++ b/scripts/create_db_user.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -e # Exit immediately if a command exits with a non-zero status. + +# --- 1. Set up Connection Variables --- +HOST=$POSTGRES_HOST +PORT=$POSTGRES_PORT +DB_NAME=$NEW_DB_NAME +DB_USER=$NEW_DB_USER +DB_PASSWORD=$NEW_DB_PASSWORD + +# --- 2. Build the SQL Commands --- +# NOTE: The IF NOT EXISTS ensures the script can be run safely multiple times. +SQL_COMMANDS=$(cat <<-END_SQL + -- Create user role with login and password + DO + \$body\$ + BEGIN + IF NOT EXISTS ( + SELECT + FROM pg_catalog.pg_user + WHERE usename = '$DB_USER') THEN + CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASSWORD'; + END IF; + END + \$body\$; + + -- Create database owned by the new user (if it doesn't exist) + SELECT 'CREATE DATABASE $DB_NAME OWNER $DB_USER' + WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$DB_NAME')\gexec +END_SQL +) + +# --- 3. Execute the SQL Commands --- +echo "Attempting to connect to $HOST to execute SQL..." +echo "$SQL_COMMANDS" | psql \ + --host=$HOST \ + --port=$PORT \ + --username=$POSTGRES_ADMIN_USER \ + --dbname=postgres \ + --set ON_ERROR_STOP=on + +echo "PostgreSQL database '$DB_NAME' and user '$DB_USER' created/verified successfully."