Skip to content

Commit 58e9d00

Browse files
authored
Merge pull request #199 from opencrvs/postgres-optimise
fix: Move analytics user creation to on-deploy script
2 parents 4183528 + f6de3e0 commit 58e9d00

File tree

2 files changed

+35
-75
lines changed

2 files changed

+35
-75
lines changed

charts/opencrvs-services/files/postgres-on-deploy.sh

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,39 @@ set -euo pipefail
1313
: "${POSTGRES_PASSWORD:?Must set POSTGRES_PASSWORD}"
1414
: "${EVENTS_MIGRATOR_POSTGRES_PASSWORD:?Must set EVENTS_MIGRATOR_POSTGRES_PASSWORD}"
1515
: "${EVENTS_APP_POSTGRES_PASSWORD:?Must set EVENTS_APP_POSTGRES_PASSWORD}"
16+
: "${ANALYTICS_POSTGRES_PASSWORD:?Must set ANALYTICS_POSTGRES_PASSWORD}"
17+
: "${ANALYTICS_POSTGRES_USER:?Must set ANALYTICS_POSTGRES_USER}"
1618
: "${EVENTS_APP_ROLE:=events_app}"
1719
: "${EVENTS_MIGRATOR_ROLE:=events_migrator}"
20+
: "${KEEP_ALIVE_SECONDS:=0}" # Prevent Swarm from marking this task as failed due to early exit
1821
: "${TARGET_DB:=events}"
1922

2023

2124
TARGET_DB=${TARGET_DB//-/_}
2225
export PGPASSWORD="$POSTGRES_PASSWORD"
2326

27+
28+
create_or_update_role() {
29+
local role=$1
30+
local password=$2
31+
local db=$3
32+
echo "Creating or updating role '$role' with access to database '$db'..."
33+
PGPASSWORD="$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
34+
-U "$POSTGRES_USER" -d postgres <<EOSQL
35+
DO \$\$
36+
BEGIN
37+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${role}') THEN
38+
EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', '${role}', '${password}');
39+
ELSE
40+
EXECUTE format('ALTER ROLE %I WITH PASSWORD %L', '${role}', '${password}');
41+
END IF;
42+
43+
EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', '${db}', '${role}');
44+
END
45+
\$\$;
46+
EOSQL
47+
}
48+
2449
echo "Waiting for PostgreSQL to be ready at ${POSTGRES_HOST}:${POSTGRES_PORT}..."
2550
until psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
2651
-U "$POSTGRES_USER" -d postgres -c '\q' 2>/dev/null; do
@@ -35,60 +60,19 @@ DB_EXISTS=$(psql -qtAX -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
3560
-U "$POSTGRES_USER" -d postgres \
3661
-c "SELECT 1 FROM pg_database WHERE datname = '$TARGET_DB';")
3762

38-
# --- Check role existence ---
39-
MIGRATOR_ROLE_EXISTS=$(
40-
psql -qtAX -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
41-
-U "$POSTGRES_USER" -d postgres \
42-
-c "SELECT 1 FROM pg_roles WHERE rolname = '${EVENTS_MIGRATOR_ROLE}';"
43-
)
44-
APP_ROLE_EXISTS=$(
45-
psql -qtAX -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
46-
-U "$POSTGRES_USER" -d postgres \
47-
-c "SELECT 1 FROM pg_roles WHERE rolname = '${EVENTS_APP_ROLE}';"
48-
)
49-
5063
echo "[1/3] Cluster-wide setup..."
5164
if [[ "$DB_EXISTS" == "1" ]]; then
52-
echo "✅ Database '$TARGET_DB' already exists. Updating passwords."
53-
# Create roles if missing, alter password if they exist
54-
if [ "$MIGRATOR_ROLE_EXISTS" != "1" ]; then
55-
echo "Creating role ${EVENTS_MIGRATOR_ROLE}..."
56-
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
57-
-U "$POSTGRES_USER" -d postgres \
58-
-c "CREATE ROLE ${EVENTS_MIGRATOR_ROLE} WITH LOGIN PASSWORD '${EVENTS_MIGRATOR_POSTGRES_PASSWORD}';"
59-
else
60-
echo "ALTERING password for ${EVENTS_MIGRATOR_ROLE}..."
61-
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
62-
-U "$POSTGRES_USER" -d postgres \
63-
-c "ALTER ROLE ${EVENTS_MIGRATOR_ROLE} WITH PASSWORD '${EVENTS_MIGRATOR_POSTGRES_PASSWORD}';"
64-
fi
65-
66-
if [ "$APP_ROLE_EXISTS" != "1" ]; then
67-
echo "Creating role ${EVENTS_APP_ROLE}..."
68-
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
69-
-U "$POSTGRES_USER" -d postgres \
70-
-c "CREATE ROLE ${EVENTS_APP_ROLE} WITH LOGIN PASSWORD '${EVENTS_APP_POSTGRES_PASSWORD}';"
71-
else
72-
echo "ALTERING password for ${EVENTS_APP_ROLE}..."
73-
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
74-
-U "$POSTGRES_USER" -d postgres \
75-
-c "ALTER ROLE ${EVENTS_APP_ROLE} WITH PASSWORD '${EVENTS_APP_POSTGRES_PASSWORD}';"
76-
fi
77-
78-
echo "Passwords updated. Skipping initialization."
65+
echo "✅ Database '$TARGET_DB' already exists."
7966
else
8067
echo "Database '$TARGET_DB' does not exist. Proceeding with initialization."
81-
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
82-
-U "$POSTGRES_USER" -d postgres <<EOF || { echo "❌ Cluster-wide SQL failed"; exit 1; }
83-
CREATE DATABASE "$TARGET_DB";
84-
85-
CREATE ROLE ${EVENTS_MIGRATOR_ROLE} WITH LOGIN PASSWORD '${EVENTS_MIGRATOR_POSTGRES_PASSWORD}';
86-
CREATE ROLE ${EVENTS_APP_ROLE} WITH LOGIN PASSWORD '${EVENTS_APP_POSTGRES_PASSWORD}';
87-
88-
GRANT CONNECT ON DATABASE "$TARGET_DB" TO ${EVENTS_MIGRATOR_ROLE}, ${EVENTS_APP_ROLE};
89-
EOF
68+
psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d postgres \
69+
-c "CREATE DATABASE ${TARGET_DB};" || echo "❌ Cluster-wide SQL failed"; exit 1;
9070
fi
9171

72+
create_or_update_role "$EVENTS_MIGRATOR_ROLE" "$EVENTS_MIGRATOR_POSTGRES_PASSWORD" "$TARGET_DB"
73+
create_or_update_role "$EVENTS_APP_ROLE" "$EVENTS_APP_POSTGRES_PASSWORD" "$TARGET_DB"
74+
create_or_update_role "$ANALYTICS_POSTGRES_USER" "$ANALYTICS_POSTGRES_PASSWORD" "$TARGET_DB"
75+
9276
echo "Checking if schema app in DB '$TARGET_DB' exists..."
9377
SCHEMA_EXISTS=$(psql -qtAX -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
9478
-U "$POSTGRES_USER" -d $TARGET_DB \
@@ -115,4 +99,6 @@ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO ${EVENTS_APP
11599
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO ${EVENTS_APP_ROLE};
116100
EOF
117101

118-
echo "✅ PostgreSQL setup completed successfully."
102+
sleep "$KEEP_ALIVE_SECONDS"
103+
104+
echo "✅ PostgreSQL setup completed successfully."

charts/opencrvs-services/files/setup-analytics.sh

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ set -euo pipefail
66
: "${POSTGRES_PORT:=5432}"
77
: "${POSTGRES_PASSWORD:?Must set POSTGRES_PASSWORD}"
88
: "${POSTGRES_USER:?Must set POSTGRES_USER}"
9-
: "${ANALYTICS_POSTGRES_PASSWORD:?Must set ANALYTICS_POSTGRES_PASSWORD}"
109
: "${ANALYTICS_POSTGRES_USER:?Must set ANALYTICS_POSTGRES_USER}"
1110
: "${KEEP_ALIVE_SECONDS:=0}" # Prevent Swarm from marking this task as failed due to early exit
1211
: "${TARGET_DB:=events}"
@@ -19,31 +18,6 @@ until PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$POSTGRES_HOST" -p "$POSTGRES_POR
1918
sleep 2
2019
done
2120

22-
sleep "$KEEP_ALIVE_SECONDS"
23-
24-
create_or_update_role() {
25-
local role=$1
26-
local password=$2
27-
local db=$3
28-
echo "Creating or updating role '$role' with access to database '$db'..."
29-
PGPASSWORD="$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
30-
-U "$POSTGRES_USER" -d postgres <<EOSQL
31-
DO \$\$
32-
BEGIN
33-
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '${role}') THEN
34-
EXECUTE format('CREATE ROLE %I LOGIN PASSWORD %L', '${role}', '${password}');
35-
ELSE
36-
EXECUTE format('ALTER ROLE %I WITH PASSWORD %L', '${role}', '${password}');
37-
END IF;
38-
39-
EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', '${db}', '${role}');
40-
END
41-
\$\$;
42-
EOSQL
43-
}
44-
45-
create_or_update_role "$ANALYTICS_POSTGRES_USER" "$ANALYTICS_POSTGRES_PASSWORD" "$TARGET_DB"
46-
4721
# Schema + tables + grants
4822
PGPASSWORD="$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
4923
-U "$POSTGRES_USER" -d "$TARGET_DB" <<EOSQL

0 commit comments

Comments
 (0)