# Source release dan lisensi ```sh node --test deploy/tests/*.test.mjs node scripts/release-package.mjs /private/releases/bereaware-source.tar.gz ``` Arsip memuat direktori `bereaware/`, manifest tiap file dengan SHA-256, sidecar `.sha256`, `.manifest.json` dan `.licenses.json`. Inventaris yang sama disertakan sebagai `LICENSE-ASSET-INVENTORY.json` di dalam arsip. Daftar source masuk ditentukan eksplisit pada script, bukan arsip seluruh working directory. Baca manifest sebelum publikasi dan pastikan tidak ada berkas organisasi yang ditambahkan ke direktori source yang diizinkan. Scanner pola secret membantu mendeteksi beberapa jenis key; ia tidak menjamin ketiadaan data sensitif. Review manual source, perubahan dependensi dan hak aset tetap diperlukan. Tidak disertakan: `.env`, Git history, database/dump/backup, direktori data, korpus Alkitab, paket demo/editorial, media GPdI, folder build/cache/dependency, konfigurasi signing/native credentials, dan symlink. Folder `.source-downloads`, `open-source/downloads` serta arsip/sidecar rilis sebelumnya dikecualikan agar paket tidak memuat dirinya sendiri. Command seed/demo lokal tidak diikutkan. Backend API/migrasi/server serta tes tetap ada. `public/gpdi-logo.png` pada arsip adalah PNG satu piksel sintetis yang dihasilkan tool dan boleh digunakan bebas; ini mempertahankan path fixture yang dipakai tes tanpa menyalin logo gereja. PNG launcher/favicon bawaan scaffold Flutter juga diganti hanya di dalam arsip dengan placeholder polos sintetis berdimensi sama, berlisensi MIT. Source `member_app` dan aplikasi staging yang berjalan tidak diubah oleh proses ini. Notice BSD Flutter SDK disertakan untuk source scaffold; binary Gradle wrapper dan dependensi yang belum mempunyai bukti lisensi lengkap tetap ditandai untuk review dalam inventaris. Instalasi harus mengunggah identitas gerejanya sendiri. Rilis bersih tidak memberi hak penggunaan nama/foto/logo gereja. File Flutter hasil generate yang memuat path mesin tidak disertakan: `.flutter-plugins-dependencies`, iOS `Generated.xcconfig`/`flutter_export_environment.sh`/folder Flutter `ephemeral`, serta generated plugin registrants iOS/Android. `Debug.xcconfig`, `Release.xcconfig`, `AppFrameworkInfo.plist` dan seluruh source Dart tetap masuk paket. Setelah mengekstrak source, jalankan `flutter pub get --enforce-lockfile` dari `member_app`, lalu build platform yang dipilih; Flutter membentuk kembali metadata/plugin dan konfigurasi lokal sesuai SDK. File hasil generate dari mesin pengembang tidak diperlukan untuk distribusi source. Kode asli mengikuti MIT (`LICENSE`). Font Inter tetap membawa SIL OFL dan README dalam `public/fonts/inter/`. Dependensi Node/Go/Dart tunduk lisensi masing-masing; lockfile dimasukkan agar versi dapat diaudit. Flutter/Gradle wrapper dan asset bawaan mengikuti ketentuan upstream. Inventaris mencatat path/hash aset, notice yang ikut paket, deklarasi lisensi dari package-lock, serta versi modul Go dan paket Dart dari lockfile. Lisensi yang tidak memiliki bukti ditandai `null`, disertai sumber pemeriksaan; jangan membacanya sebagai persetujuan lisensi. Inventaris bukan penilaian hukum atau audit seluruh lisensi transitif. Tinjau lisensi saat dependensi berubah. Korpus LAI tidak dibundel. AYT dan World English Bible juga tidak disertakan pada source package ini; operator bertanggung jawab memperoleh paket terpisah dengan hak dan atribusi yang sesuai, lalu memakai import CLI. Jangan menjadikan contoh isi ayat berhak cipta sebagai fixture terbuka. Workflow CI mendefinisikan pengujian source Node/Go/Flutter, batas gateway dan packaging, validasi Compose serta image build. Keberadaan workflow bukan bukti suatu run sudah lulus. Restore dan browser/device/UAT tetap membutuhkan environment terisolasi dengan bukti tersendiri. Repository upstream belum dipublikasikan. Portal dapat menyediakan source snapshot staging yang benar-benar dipasang operator; tombol unduh hanya aktif jika arsip, checksum yang cocok dengan manifest, dan inventaris tersedia. Ini tidak menyatakan rilis stabil, audit lengkap, atau UAT selesai. Rujukan teknis: [Compose services](https://docs.docker.com/reference/compose-file/services/), [Flutter SDK archive](https://docs.flutter.dev/install/archive), [Flutter source](https://github.com/flutter/flutter/tree/db50e20168db8fee486b9abf32fc912de3bc5b6a). ## Menyediakan unduhan portal Siapkan direktori versi baru di luar source dan di luar direktori download yang sedang dilayani. Contoh di bawah memakai path operator; parent harus sudah tersedia: ```sh node scripts/release-package.mjs /absolute/new-reviewed-package/bereaware-source.tar.gz (cd /absolute/new-reviewed-package && sha256sum --check bereaware-source.tar.gz.sha256) tar -tzf /absolute/new-reviewed-package/bereaware-source.tar.gz ``` Periksa manifest dan `bereaware-source.tar.gz.licenses.json`, jalankan tes dari source hasil ekstrak, lalu set direktori itu 0755 dan tepat empat berkas output 0644 agar user `node` container dapat membacanya. Jangan taruh backup, env, log atau file privat lain di direktori itu. Tetapkan `SOURCE_DOWNLOAD_DIR=/absolute/new-reviewed-package` pada env deployment privat. Default Compose adalah folder kosong `.source-downloads` pada release; unduhan tetap nonaktif sampai paket lengkap dipasang. Mount hanya ada pada service `open-source`, bersifat read-only dengan target `/srv/downloads`. Jemaat dan API tidak menerima mount, dan gateway mereka menolak `/downloads` secara eksplisit. Gateway portal hanya melayani empat nama tetap di bawah; tidak ada daftar direktori, symlink, unggahan atau penghapusan lewat HTTP: - `/downloads/bereaware-source.tar.gz` - `/downloads/bereaware-source.tar.gz.sha256` - `/downloads/bereaware-source.tar.gz.manifest.json` - `/downloads/bereaware-source.tar.gz.licenses.json` Untuk memasang perubahan kode gateway/portal, operator membangun image gateway dari release yang sudah ditinjau, lalu merekreasi portal saja dengan env yang menunjuk direktori versi baru: ```sh docker compose --env-file "$ENV_FILE" -f compose.staging.yaml config --quiet docker compose --env-file "$ENV_FILE" -f compose.staging.yaml build api-public docker compose --env-file "$ENV_FILE" -f compose.staging.yaml up -d --no-deps open-source ``` `ENV_FILE` harus berisi path absolut konfigurasi instalasi yang benar. Service `api-public` di atas adalah pemilik build image gateway bersama; perintah build tidak merekreasi container API. Periksa mount read-only dan health portal setelah recreate. Lakukan GET dari origin HTTPS portal yang sudah Anda konfigurasi dan verifikasi SHA-256 atas byte yang benar-benar diunduh. HEAD/metadata saja tidak membuktikan isi unduhan. Jangan menimpa arsip yang sedang dilayani; gunakan direktori versi baru, lalu ganti mount dengan recreate portal. Parent DNS/Caddy, database dan layanan lain tidak perlu diubah untuk memasang paket.