# Rollback β€” Merge Eksperimen `airflow332` ke `deploy/` (BATCH B / review R18) > **Dibuat**: 2026-10-01 Β· **Oleh**: langkah **B1** dari `reviews/sicabe-18-merge-airflow332-plan.md` > **Status**: 🟒 **Backup siap & TERBUKTI DAPAT DIPULIHKAN.** BATCH B **belum dijalankan**. > ⚠️ **Berkas ini adalah satu-satunya jalan pulang** untuk langkah B4 (migrasi OpenMetadata > bersifat **satu arah** β€” lihat `docs/sicabe-install-phases-detail.md` Β§8.11.2). --- ## 1. Keadaan yang dibekukan (baseline sebelum BATCH B) | Item | Nilai | |---|---| | Tanggal baseline | 2026-10-01 | | Airflow | **3.3.1** (`sicabe/airflow:3.3.1-om202`) | | OpenMetadata | **2.0.2** (`openmetadata/server:2.0.2`) | | OpenSearch | `opensearchproject/opensearch:3.8.0` | | Gate `test-verification.sh` | **60 PASS / 0 FAIL / 2 SKIP** | | Container produksi | 20 (Airflow webserver/scheduler/dag-processor, OM, OpenSearch, dst) | --- ## 2. Berkas backup Lokasi: `deploy/output/merge-airflow332-backup/` β€” **gitignored** (berisi data produksi). | Berkas | Isi | Ukuran | MD5 | |---|---|---|---| | `openmetadata_db.dump` | dump `openmetadata_db` (format `-Fc`) | 1.9 MB | `a8495339165cfbc286ea7e90490c12bb` | | `airflow.dump` | dump `airflow` (format `-Fc`) | 248 KB | `4a834cc43307b296b58c250909749d2a` | | `environment.defaults.sh.before-B` | salinan `deploy/config/environment.defaults.sh` | 22 KB | `2d341e008af43a7b` | Ukuran DB saat baseline: `openmetadata_db` = **36 MB**, `airflow` = **12 MB**. --- ## 3. Bukti backup DAPAT DIPULIHKAN (dua kali diuji) | Uji | Hasil | |---|---| | Restore `openmetadata_db` β†’ DB coretan `_restorecheck_om` | **204 tabel** asli = **204 tabel** hasil restore βœ… | | Restore `airflow` β†’ DB coretan `_restorecheck_af` | **5 DAG** asli = **5 DAG** hasil restore βœ… | | DB coretan setelah uji | dihapus βœ… (produksi tidak tersentuh: 20 container, OM HTTP 200) | Perintah yang dipakai (nilai persis): ```bash # contoh untuk openmetadata_db docker exec -e PGPASSWORD= sicabe-postgres \ psql -U sicabe_admin -d postgres -c "CREATE DATABASE _restorecheck_om OWNER openmetadata;" docker cp deploy/output/merge-airflow332-backup/openmetadata_db.dump sicabe-postgres:/tmp/check.dump docker exec -e PGPASSWORD=<…> sicabe-postgres \ pg_restore -U sicabe_admin -d _restorecheck_om --no-owner --no-privileges /tmp/check.dump docker exec -e PGPASSWORD=<…> sicabe-postgres \ psql -U sicabe_admin -d postgres -c "DROP DATABASE _restorecheck_om;" ``` --- ## 4. Digest image (untuk kembali ke versi lama) | Image | Image ID (sha256, dipotong) | |---|---| | `sicabe/airflow:3.3.1-om202` (produksi saat ini) | `afc0421a0490…` | | `sicabe/airflow:3.3.1-om202-presqlalchemy` (tag rollback A1) | `afc0421a0490…` (identik β€” A1 tidak rebuild) | | **`sicabe/airflow:3.3.2-om203`** (target BATCH B β€” Python 3.11, hasil B2 revisi) | `a02620e1d0a8…` (3.2 GB) | | ~~`sicabe/airflow:3.3.2-om203-py313`~~ β€” **DITOLAK** di B3 (dbt mati di Python 3.13) | `33990a6c2b88…` (tidak dipakai) | | `openmetadata/server:2.0.2` | `3b6f52aeb30f…` | | `openmetadata/server:2.0.3` (target BATCH B) | `5f4d52bca2d7…` | | `opensearchproject/opensearch:3.8.0` | `fafe3fc35870…` | --- ## 5. PROSEDUR ROLLBACK ### 5.1 Kasus paling umum β€” B4/B5 gagal, skema OM masih sehat Cukup kembalikan versi, tanpa menyentuh DB: ```bash cd /home/broto/sicabe-doc/deploy # (1) kembalikan versi ke baseline # AIRFLOW_IMAGE -> sicabe/airflow:3.3.1-om202 # OPENMETADATA_VERSION -> 2.0.2 # (atau pulihkan berkas utuh: cp output/merge-airflow332-backup/environment.defaults.sh.before-B \ # config/environment.defaults.sh) # (2) jalankan ulang docker compose up -d airflow-webserver airflow-scheduler airflow-dag-processor \ openmetadata-server openmetadata-migrate # (3) verifikasi ./test-verification.sh # harapan: 60 PASS / 0 FAIL / 2 SKIP ``` ### 5.2 Kasus berat β€” migrasi OM 2.0.3 merusak skema ⚠️ **Urutannya penting**: OM produksi harus **berhenti** dulu sebelum restore, kalau tidak koneksi aktif akan mengganggu `DROP/CREATE DATABASE`. ```bash cd /home/broto/sicabe-doc/deploy # (1) HENTIKAN OpenMetadata (wajib, sebelum menyentuh DB-nya) docker stop sicabe-openmetadata # (2) pulihkan versi image di config (OPENMETADATA_VERSION=2.0.2) cp output/merge-airflow332-backup/environment.defaults.sh.before-B config/environment.defaults.sh # (3) restore openmetadata_db dari dump docker exec -e PGPASSWORD= sicabe-postgres \ psql -U sicabe_admin -d postgres -c "DROP DATABASE IF EXISTS openmetadata_db;" docker exec -e PGPASSWORD=<…> sicabe-postgres \ psql -U sicabe_admin -d postgres -c "CREATE DATABASE openmetadata_db OWNER openmetadata;" docker cp output/merge-airflow332-backup/openmetadata_db.dump sicabe-postgres:/tmp/om.dump docker exec -e PGPASSWORD=<…> sicabe-postgres \ pg_restore -U sicabe_admin -d openmetadata_db --no-owner --no-privileges /tmp/om.dump # (4) mulai ulang dengan image LAMA docker compose up -d openmetadata-server # (5) verifikasi curl -s http://localhost:12085/api/v1/system/version # harapan: {"version":"2.0.2",...} ``` ### 5.3 Bila metadata Airflow perlu dipulihkan (mis. migrasi DB Airflow bermasalah) ```bash docker stop sicabe-airflow-webserver sicabe-airflow-scheduler sicabe-airflow-dag-processor docker exec -e PGPASSWORD=<…> sicabe-postgres psql -U sicabe_admin -d postgres \ -c "DROP DATABASE IF EXISTS airflow;" -c "CREATE DATABASE airflow OWNER airflow;" docker cp output/merge-airflow332-backup/airflow.dump sicabe-postgres:/tmp/af.dump docker exec -e PGPASSWORD=<…> sicabe-postgres \ pg_restore -U sicabe_admin -d airflow --no-owner --no-privileges /tmp/af.dump docker compose up -d airflow-webserver airflow-scheduler airflow-dag-processor ``` ### 5.4 Yang TIDAK perlu di-rollback - **OpenSearch** β€” indeksnya **derived**: OM membangun ulang isinya. Tidak ada dump khusus untuk itu, dan itu memang disengaja. - **`deploy-legacy/`** β€” di luar lingkup (K6). - **Image** β€” tidak dihapus; dua versi hidup berdampingan, jadi rollback hanya soal menunjuk tag lama. --- ## 6. Setelah rollback 1. Catat penyebab kegagalan di berkas ini (bagian bawah) atau di `reviews/sicabe-18…`. 2. Jangan jalankan B4 lagi sebelum penyebabnya dipahami. 3. Indeks/tabel OM hasil migrasi yang tertinggal **tidak** dibiarkan: pastikan restore benar-benar menggantikan `openmetadata_db` (bukan menumpuk). --- ## 7. Catatan keamanan ⚠️ Berkas dump berisi **data produksi** (termasuk baris `user_entity` β€” hash kredensial, dan mungkin data pribadi). Perlakuan: - **gitignored** (`deploy/output/merge-airflow332-backup/`) β€” jangan pernah di-commit; - hapus setelah BATCH B dinyatakan stabil (dan simpan hanya bila memang diperlukan sebagai arsip, di lokasi terbatas akses). --- ## Riwayat | Tanggal | Kejadian | |---|---| | 2026-10-01 | B1 dijalankan: dump dibuat, **diuji pulih (204=204 tabel; 5=5 DAG)**, digest & config dicatat, dokumen ini dibuat. BATCH B belum dimulai. | | 2026-10-01 | **B2** dijalankan: image `sicabe/airflow:3.3.2-om203-py313` dibangun **dari `deploy/`** (berdampingan β€” `Dockerfile.332` + `requirements.332.{in,lock}`), ID `33990a6c2b88…`. Seluruh verifikasi fatal lolos: 5 klien DB, `mysqlclient` benar-benar termuat, `sqlalchemy 2.0.54` (pin A1), **plugin OM dapat dimuat**, `pip check` bersih. Produksi **tetap** `3.3.1-om202` β€” belum tersentuh. | | 2026-10-01 | **B3 (go/no-go) = NO-GO** untuk Python 3.13: `dbt debug`/`dbt compile` gagal (mashumaro β†’ `Annotated.__class_getitem__`). Tidak ada versi `mashumaro` yang memenuhi batas dependensi kita **dan** berfungsi di 3.13. Bukti: `b3-hasil-uji.md` | | 2026-10-01 | **B2 revisi**: base dikembalikan ke **Python 3.11**; lock di-resolve ulang dengan lock 3.3.1 sebagai constraint **tersaring** (`^apache-airflow`, `^openmetadata-`, `^collate-` dibuang) β†’ hanya **44 baris** berbeda dari produksi. Image baru: **`sicabe/airflow:3.3.2-om203`** ID `a02620e1d0a8…` (3.2 GB) | | 2026-10-01 | **B3 ULANG = GO** 🟒: `dbt debug` **"All checks passed"**, `dbt compile` OK, DAG produksi impor bersih, plugin `/pluginsv2/` **200**, Trino/MinIO/MySQL OK, OPA utuh. Bukti: `b3r-hasil-uji.md`. Produksi tetap `3.3.1-om202` β€” siap untuk **B4** | | 2026-10-02 | **B4 dijalankan (produksi naik)**: migrasi OM 2.0.3 **exit 0**; `airflow-init` (DB migrate 3.3.2) **exit 0**; OM server + 3 service Airflow di-recreate ke versi baru β€” semuanya **healthy**. Image: `sicabe/airflow:3.3.2-om203`, `openmetadata/server:2.0.3` | | 2026-10-02 | **B5 verifikasi = LOLOS** βœ…: `airflow version` **3.3.2**; OM API **2.0.3**; plugin `/pluginsv2/…health-auth` **200**; **0 error impor** DAG; `MySQLdb` + provider mysql tersedia di produksi; **GATE 60 PASS / 0 FAIL / 2 SKIP** (identik baseline). **B6 (rollback) tidak diperlukan.** | | β€” | ⚠️ **Dump DISIMPAN** sampai dinyatakan stabil. Bila beberapa hari produksi berjalan normal: hapus `deploy/output/merge-airflow332-backup/` (Β§7) β€” atau arsipkan di lokasi terbatas akses |