first commit
This commit is contained in:
Executable
+95
@@ -0,0 +1,95 @@
|
||||
#!/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."
|
||||
Reference in New Issue
Block a user