Panduan Self-Hosting
Nibomo mendukung dua jalur yang berbeda: lingkungan pengembangan lokal dan deployment produksi di AWS. Docker Compose menjalankan PostgreSQL dan migrasi untuk pengembangan lokal; Docker Compose bukan metode deployment produksi.
Persyaratan pengembangan lokal
- Git
- Bash
- GNU Make
- Docker dengan Docker Compose
- Node.js 24
- npm
Berkas Docker Compose yang disediakan saat ini menjalankan PostgreSQL 18.4. Anda tidak perlu memasang PostgreSQL lokal secara terpisah.
Mulai cepat secara lokal
git clone https://github.com/kirill-markin/flashcards-open-source-app.git
cd flashcards-open-source-app
cp .env.example .env
make db-up
npm install --prefix api
npm install --prefix apps/auth
npm install --prefix apps/backend
npm install --prefix apps/web
npm install --prefix apps/admin
make db-up menjalankan PostgreSQL dan mengeksekusi scripts/deploy/migrate.sh melalui kontainer migrasi. Dengan kata sandi default yang disalin dari .env.example, migrasi menyiapkan koneksi runtime lokal berikut:
- backend:
postgresql://backend_app:backend_app@localhost:5432/flashcards - auth:
postgresql://auth_app:auth_app@localhost:5432/flashcards - reporting:
postgresql://reporting_readonly:reporting_readonly@localhost:5432/flashcards
Jika Anda mengubah BACKEND_DB_PASSWORD, AUTH_DB_PASSWORD, atau REPORTING_DB_PASSWORD di .env, gunakan kata sandi yang sudah diubah itu juga di URL koneksi yang bersesuaian.
Mulai cepat khusus lokal
Target Make backend tidak memuat .env di root. Berikan pengaturan lokal yang dibutuhkannya secara eksplisit:
AUTH_MODE=none \
ALLOW_INSECURE_LOCAL_AUTH=true \
DATABASE_URL=postgresql://backend_app:backend_app@localhost:5432/flashcards \
REPORTING_DATABASE_URL=postgresql://reporting_readonly:reporting_readonly@localhost:5432/flashcards \
make backend-dev
Jalankan klien di terminal terpisah:
make web-dev
make admin-dev
Jalur ini sengaja tidak menjalankan make auth-dev. AUTH_MODE=none adalah mode khusus localhost yang secara eksplisit tidak aman; jangan pernah memakainya di lingkungan yang sudah di-deploy.
Jalur ini mencakup pengembangan backend inti, discovery Agent API publik, web, dan admin, tetapi Chat V2 tidak tersedia di jalur ini.
Alur Cognito lokal lengkap
Target auth memuat .env di root, sedangkan target backend tidak. Pertama, ganti DATABASE_URL lama di .env hasil salinan dengan URL peran auth dan tambahkan nilai Cognito Anda yang sebenarnya:
DATABASE_URL=postgresql://auth_app:auth_app@localhost:5432/flashcards
AUTH_MODE=cognito
COGNITO_USER_POOL_ID=<your-user-pool-id>
COGNITO_CLIENT_ID=<your-client-id>
COGNITO_REGION=<your-aws-region>
SESSION_ENCRYPTION_KEY=<64-character-hex-value>
Jalankan auth:
make auth-dev
Di terminal backend, muat .env secara eksplisit, lalu timpa URL database auth-nya dengan URL peran backend untuk proses tersebut:
set -a
source .env
set +a
DATABASE_URL=postgresql://backend_app:backend_app@localhost:5432/flashcards \
make backend-dev
Jalankan make web-dev dan make admin-dev di terminal masing-masing. Kedua target memuat .env di root.
Layanan memakai alamat lokal berikut:
| Layanan | Alamat |
|---|---|
| PostgreSQL | localhost:5432 |
| Auth, jika dikonfigurasi | http://localhost:8081 |
| API backend | http://localhost:8080/v1 |
| Aplikasi web | http://localhost:3000 |
| Aplikasi admin | http://localhost:3001 |
Hentikan PostgreSQL dan kontainer migrasi dengan:
make db-down
Konfigurasi lokal
Mulailah dari .env.example; berkas ini mendokumentasikan variabel yang tersedia dan nilai mana yang khusus lokal. Ganti DATABASE_URL lama di dalamnya sebelum menjalankan auth, seperti ditunjukkan di atas.
Pengaturan lokal utama adalah:
MIGRATION_DATABASE_URLuntuk migrasi skema di dalam DockerDATABASE_URLyang diatur ke peranauth_appdi.envroot untukmake auth-devDATABASE_URLyang diberikan sebagai peranbackend_appuntukmake backend-devAUTH_MODEdanALLOW_INSECURE_LOCAL_AUTHuntuk autentikasi backendBACKEND_ALLOWED_ORIGINSuntuk origin web dan admin lokalALLOWED_REDIRECT_URISdanCOOKIE_DOMAINuntuk autentikasi peramban- nilai Cognito dan enkripsi sesi saat menguji OTP sungguhan
Agent API adalah bagian dari backend. Dokumen discovery lokal publiknya tersedia di http://localhost:8080/v1/agent setelah backend berjalan. Operasi Agent yang dilindungi memerlukan autentikasi ApiKey dan tidak tersedia di jalur AUTH_MODE=none.
Cakupan AI per jalur
Perintah lokal di atas tidak menjalankan worker obrolan asinkron. Jalur cepat juga memakai AUTH_MODE=none, yang ditolak oleh Chat V2; menambahkan kunci OpenAI atau kuota tamu tidak membuat jalur itu mendukung AI. Alur Cognito lokal lengkap menyediakan transport autentikasi yang didukung, tetapi tetap tidak menjalankan worker.
Deployment AWS CDK membuat Lambda worker dan mengonfigurasi backend untuk memanggilnya. Kredensial penyedia seperti OPENAI_API_KEY mengaktifkan panggilan model untuk permintaan terautentikasi yang didukung. GUEST_AI_WEIGHTED_MONTHLY_TOKEN_CAP secara terpisah mengaktifkan dan membatasi AI untuk tamu; variabel ini tidak mengatur AI untuk pengguna yang sudah masuk atau yang diautentikasi dengan bearer. Pengaturan Langfuse adalah konfigurasi tracing opsional.
Klien native
Repositori yang sama berisi klien iOS dan Android, tetapi perintah web/server lokal tidak membangun atau mendistribusikannya.
Proyek iOS membaca host API dan auth lokal dari:
apps/ios/Flashcards/Config/Local.xcconfig
Buat berkas itu dari contoh bila diperlukan:
cp apps/ios/Flashcards/Config/Local.xcconfig.example apps/ios/Flashcards/Config/Local.xcconfig
Lihat README iOS dan README Android di repositori untuk alur build dan pengujian masing-masing yang terpisah.
Produksi memakai AWS CDK
Deployment produksi yang didukung adalah stack AWS CDK yang disertakan. Stack ini berbasis AWS, bukan netral vendor, dan mencakup:
- VPC dan subnet privat
- PostgreSQL 18 di Amazon RDS
- OTP email tanpa kata sandi dari Amazon Cognito
- API Gateway dan Lambda untuk layanan backend, auth, dan MCP
- Lambda worker obrolan asinkron dan Lambda pengirim email kustom Cognito
- S3 dan CloudFront untuk aplikasi web dan admin
- Secrets Manager untuk kredensial database, sesi, email, pemantauan, dan AI opsional
- alarm CloudWatch, notifikasi SNS, dan rencana backup RDS
- peran deployment OIDC GitHub Actions
- skrip penyiapan Cloudflare untuk domain publik
Deployment ini mengekspos app.<domain>, admin.<domain>, api.<domain>, auth.<domain>, dan mcp.<domain>. Deployment ini juga dapat membuat pengalihan apex jika domain root tidak dipakai untuk hal lain.
Jalankan helper produksi dari mesin operator dengan:
- Node.js 24 dan npm
- Bash dan GNU Make
- Docker yang sedang berjalan
- AWS CLI yang sudah diautentikasi ke akun deployment
- GitHub CLI yang sudah diautentikasi ke repositori target
curl,jq, dan Python 3
Sebelum melakukan deployment, konfigurasikan nilai operator di .env root. Nilai yang wajib diisi mencakup region AWS, domain, email peringatan, repositori GitHub, kredensial Cloudflare, kredensial Resend, dan konfigurasi Sentry backend. Kredensial OpenAI dan Langfuse bersifat opsional.
Perintah deployment pertama yang disarankan dari root repositori adalah:
npm ci --prefix apps/auth
bash scripts/deploy/first-deploy.sh \
--region eu-central-1 \
--domain example.com \
--alert-email alerts@example.com
Saat memulai dari checkout yang bersih, auth saat ini perlu dipasang secara eksplisit karena helper deployment membundel paket tersebut tetapi tidak memasangnya. Helper ini membuat atau mengubah sumber daya AWS, Cloudflare, dan GitHub yang nyata. Tinjau dokumentasi deployment di repositori dan biaya cloud sebelum menjalankannya. Helper ini melakukan bootstrap CDK, men-deploy infrastruktur, menjalankan migrasi, mengunggah aset web dan admin, mengonfigurasi record DNS publik app, admin, api, auth, dan mcp kecuali dilewati, serta mengisi konfigurasi GitHub Actions yang belum ada.
Setelah deployment:
-
Konfirmasi langganan SNS yang dikirim ke kotak masuk
ALERT_EMAIL. -
Konfigurasikan dan verifikasi record DNS domain pengirim Resend yang terpisah:
bash scripts/setup/setup-resend-domain.sh \ --domain example.com \ --subdomain mail
first-deploy.sh secara default menjalankan scripts/cloudflare/setup-dns.sh untuk domain aplikasi publik. Skrip ini tidak menjalankan setup-resend-domain.sh; skrip yang disebut terakhir membuat record pengirim email untuk mail.<domain> dan memverifikasi domain tersebut dengan Resend. Jika Anda melakukan deployment dengan --skip-dns, konfigurasikan record publik secara terpisah seperti yang didokumentasikan dalam panduan AWS CDK.
Portabilitas data
Impor dan ekspor paket ruang kerja hanya memindahkan kartu, tag-nya, dan media terkait. Fitur ini tidak memindahkan riwayat tinjauan, status penjadwal FSRS, pengaturan ruang kerja, struktur dek lengkap, atau data akun.
Perlakukan paket sebagai pemindahan konten, bukan sebagai migrasi lengkap dari terkelola ke self-hosted atau sebagai backup pemulihan bencana. Operator bertanggung jawab mencadangkan dan memulihkan database PostgreSQL yang di-deploy beserta penyimpanan media.
Tanggung jawab operator
Self-hosting berarti Anda menyediakan dan memelihara:
- infrastruktur AWS dan biayanya
- DNS Cloudflare dan konfigurasi domain
- kredensial pengiriman email Resend dan record domain
- konfigurasi pemantauan Sentry yang wajib
- kredensial penyedia AI dan Langfuse yang opsional
- secret, upgrade, migrasi, peringatan, backup, dan pengujian pemulihan
- build dan distribusi aplikasi seluler native jika Anda menginginkan rilis iOS atau Android sendiri
Stack ini menyertakan otomatisasi untuk banyak sistem tersebut, tetapi tetap membutuhkan operator. Docker Compose tidak menggantikan arsitektur produksi ini.