Files

96 lines
4.1 KiB
Bash
Raw Permalink Normal View History

2026-10-09 02:35:14 +07:00
#!/bin/bash
# =============================================================================
# eBdesk SiCABE — PostgreSQL Multi-Database Init
# =============================================================================
# Script ini dijalankan OTOMATIS oleh PostgreSQL Docker entrypoint pada
# FIRST STARTUP saja (saat volume data masih kosong).
#
# Membuat database dan user terpisah untuk setiap komponen SiCABE:
# - keycloak → Governance (IAM)
# - nessie → Storage (Metadata Catalog: Iceberg REST + version store)
# - airflow → Ingestion (Orchestrator)
# - openmetadata_db → Governance (Metadata Platform)
#
# Variable environment yang harus tersedia (di-pass ke container postgres):
# POSTGRES_USER, POSTGRES_PASSWORD (superuser — sudah built-in)
# KEYCLOAK_DB_PASSWORD, NESSIE_DB_PASSWORD
# AIRFLOW_DB_PASSWORD, OPENMETADATA_DB_PASSWORD
# =============================================================================
set -e
# ─── Fungsi: Buat database, user, dan grant schema permissions ────────────
create_service_db() {
local db_name="$1"
local db_user="$2"
local db_pass="$3"
echo "[SiCABE] Creating database '${db_name}' with user '${db_user}'..."
# Create user (if not exists) — connect to POSTGRES_DB (keycloak)
psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" <<-EOSQL
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${db_user}') THEN
CREATE ROLE ${db_user} LOGIN PASSWORD '${db_pass}';
END IF;
END
\$\$;
EOSQL
# Create database (if not exists) with owner
psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" <<-EOSQL
SELECT 'CREATE DATABASE ${db_name} OWNER ${db_user}'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${db_name}')\gexec
EOSQL
# Grant all privileges on the database
psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" --dbname "${db_name}" <<-EOSQL
GRANT ALL ON SCHEMA public TO ${db_user};
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ${db_user};
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ${db_user};
ALTER SCHEMA public OWNER TO ${db_user};
EOSQL
echo "[SiCABE] ✓ Database '${db_name}' siap."
}
# ─── Validasi env vars ─────────────────────────────────────────────────────
if [[ -z "${POSTGRES_USER}" ]]; then
echo "[SiCABE] ERROR: POSTGRES_USER tidak terdefinisi!"
exit 1
fi
# ─── Buat database & user untuk setiap service ─────────────────────────────
# Urutan: sesuai fase deployment
# Phase 1 — Governance (IAM)
create_service_db "keycloak" "keycloak" "${KEYCLOAK_DB_PASSWORD}"
# Phase 2 — Storage (Metadata Catalog)
create_service_db "nessie" "nessie" "${NESSIE_DB_PASSWORD}"
# Nessie (JDBC2 version store) membutuhkan schema dibuat lebih dulu.
# Tabel-tabel Nessie akan di-auto-create oleh server saat startup.
psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" --dbname "nessie" <<-EOSQL
CREATE SCHEMA IF NOT EXISTS nessie AUTHORIZATION nessie;
EOSQL
# Phase 5 — Ingestion (Orchestrator)
create_service_db "airflow" "airflow" "${AIRFLOW_DB_PASSWORD}"
# Phase 6 — Governance (Metadata Platform)
create_service_db "openmetadata_db" "openmetadata" "${OPENMETADATA_DB_PASSWORD}"
# Pipeline — database SUMBER contoh untuk DAG `sicabe_batch_daily`
# (task `ingest_to_bronze` membaca public.orders via Sling). Dimiliki superuser
# (POSTGRES_USER) sehingga tidak perlu role tambahan. Tabel + 6 baris contoh
# diisi oleh `scripts/seed-source-postgres.sh` (dipanggil bootstrap step 6).
psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" <<-EOSQL
SELECT 'CREATE DATABASE sicabe_data OWNER ${POSTGRES_USER}'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'sicabe_data')\gexec
EOSQL
echo "[SiCABE] ✓ Database 'sicabe_data' siap (sumber contoh pipeline)."
echo "[SiCABE] ✅ Semua database dan user berhasil dibuat."