#!/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."