Files
kakeibo/docs/DEPLOY.md
T
suphicakir a2b4119f3e docs(dağıtım): Dokploy kurulumu ve ilk canlı yayın; Faz 3 tamamlandı
- DEPLOY.md: Dokploy uygulama ayarları, sık hatalar, ilk yayın kontrolü
- Canlı: https://kakeibo.ta1sph.website (health ok, Let's Encrypt)
- Yedekleme ertelendi (açık konu: Faz 5 bitmeden)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 02:48:23 +03:00

6.2 KiB
Raw Blame History

🚀 Canlıya Alma (Atlas Homeserver + Dokploy)

Durum: ✅ Yayında — https://kakeibo.ta1sph.website (2026-11-12) · Yedekleme ⏳ (Faz 5 bitmeden)

1. Mimari

İnternet ──HTTPS──▶ Traefik (Dokploy) ──▶ kakeibo konteyneri :8080 ──▶ MongoDB (rs0)
                                          ├─ /api/*  → Rust (Axum) API
                                          └─ diğer   → derlenmiş arayüz (React)
  • Tek imaj, tek servis, tek alan adı → CORS yok, cookie aynı origin'de.
  • İmaj: çok aşamalı Dockerfile (Node → arayüz derlemesi, Rust → release derleme, debian:trixie-slim çalışma imajı, root olmayan kullanıcı kakeibo, ~175 MB).
  • Sağlık kontrolü: GET /api/health → 200 {"status":"ok","db":"ok"}; veritabanı yoksa 503.
  • Kapanış: SIGTERM gelince süren istekler bitirilir, sonra kapanır.

2. Ortam değişkenleri

Değişken Zorunlu Örnek / varsayılan Açıklama
MONGODB_URI ✅ mongodb://kakeibo_app:<şifre>@<host>:27017/kakeibo?authSource=kakeibo&replicaSet=rs0 Ayrı, yalnızca kakeibo DB'sinde readWrite yetkili kullanıcı
JWT_SECRET ✅ openssl rand -hex 32 çıktısı En az 32 karakter. Değişirse tüm oturumlar kapanır
APP_URL ✅ https://kakeibo.<alan-adı> https:// ile başlarsa cookie Secure olur
REGISTRATION – invite_only invite_only: ilk hane serbest, sonra yalnızca davet · open: herkes
RUST_LOG – kakeibo=info,tower_http=info Log seviyesi
PORT – 8080 İmajda ayarlı, değiştirmeyin
STATIC_DIR – /app/static İmajda ayarlı, değiştirmeyin

3. Yerelde imajı deneme

docker build -t kakeibo .
# Yerel MongoDB (27020) ile, geliştirme sunucusuyla çakışmasın diye 8090'da:
docker run --rm --network host --env-file .env -e PORT=8090 kakeibo
# → http://localhost:8090

Kontrol listesi (Faz 3 – Adım 1'de doğrulandı):

  • / ve /defter → index.html (Cache-Control: no-cache)
  • /assets/*.js → brotli/gzip, max-age=31536000, immutable
  • /api/health → db: ok; bilinmeyen /api/... → JSON 404
  • Docker HEALTHCHECK → healthy; süreç kakeibo kullanıcısıyla çalışır
  • docker stop → düzgün kapanış logu

4. Canlı MongoDB

  • Dokploy'da ayrı MongoDB servisi (Bütçem'in veritabanı paylaşılmaz): proje Kakeibo → Database → MongoDB kakeibo-mongo.
  • Servis (iç ağ) adı: kakeibo-kakeibomongo-fibzhc, imaj mongo:7, ağ dokploy-network, volume kakeibo-kakeibomongo-fibzhc-data → /data/db.
  • Replica set: rs0, üye kakeibo-kakeibomongo-fibzhc:27017 (Dokploy "Replica Sets" açık).
  • Kullanıcılar: kakeibo_root (admin, root) · kakeibo_app (kakeibo DB, yalnızca readWrite). Şifreler 2026-11-12'de yenilendi (eskileri açığa çıkmıştı).
  • Dış erişim: docker service inspect … .Endpoint.Ports → null (port yayınlanmıyor) ✅. External Port alanı boş kalmalı.
  • Bağlantı:
    mongodb://kakeibo_app:<APP_ŞİFRESİ>@kakeibo-kakeibomongo-fibzhc:27017/kakeibo?authSource=kakeibo&replicaSet=rs0
    

⚠️ Açık konu: MongoDB kimlik doğrulaması kapalı

Dokploy'un replica set betiği mongod --replSet rs0 --bind_ip_all ile başlatıyor (--keyFile yok) ve her deploy'da Advanced → Command/Args'ı yok sayıp kendi betiğini yazıyor. Sonuç: kullanıcılar tanımlı ama şifre zorunlu değil; dokploy-network'teki herhangi bir konteyner erişebilir. İnternetten erişim yok. Çözüm adayları (ileride): Dokploy'un MongoDB'si yerine Compose servisi (kendi komutumuzla --keyFile) ya da Dokploy'da keyFile desteği. Uygulama zaten kullanıcı/şifreyle bağlandığı için auth açıldığında uygulamada değişiklik gerekmez.

Şifre girerken dikkat

  • mongosh içinde passwordPrompt()'a yapıştırmayın (terminal görünmez karakter ekleyebiliyor → U_STRINGPREP_PROHIBITED_ERROR). Bunun yerine: const p = require('crypto').randomBytes(24).toString('hex'); db.changeUserPassword("kakeibo_app", p); print(p)
  • Şifreyi komuta düz yazmayın; sonra rm -f /root/.mongodb/mongosh/mongosh_repl_history.
  • "Rebuild Database" veriyi siler ve Dokploy betiği yeni root şifresini servis ayarına düz metin yazar.

5. Dokploy kurulumu

Proje Kakeibo → Create Service → Application kakeibo-app (iç ad: kakeibo-kakeiboapp-nd5kek).

Bölüm Ayar
General → Provider Gitea sekmesi (varsayılan GitHub sekmesi seçili kalırsa: Github Provider not found) → repo suphicakir/kakeibo, branch main, Build Path / → Save
General → Build Type Dockerfile, dosya Dockerfile, context .
Environment §2'deki değişkenler (MONGODB_URI, JWT_SECRET, APP_URL=https://kakeibo.ta1sph.website, REGISTRATION=invite_only, RUST_LOG)
Domains Host kakeibo.ta1sph.website, Path /, Container Port 8080, HTTPS açık, Let's Encrypt
Auto Deploy Açık → Gitea'ya push = otomatik yayın

Notlar:

  • İlk derleme ~6–10 dk (Rust bağımlılıkları); sonrakiler katman önbelleğiyle daha hızlı.
  • Derleme hatası Deployments → ilgili deploy logunda görünür; Logs sekmesi yalnızca çalışan konteyneri gösterir.
  • Dokploy, Gitea'daki son commit'i derler → değişiklikler önce push edilmeli.
  • Geri dönüş (rollback): Deployments listesinden önceki başarılı deploy seçilerek yeniden yayınlanır.
  • DNS: kakeibo.ta1sph.website → ev dış IP'si; modemde 80/443 → Atlas yönlendirmesi Let's Encrypt için gerekli.
  • Sade metin 404 page not found + "Not secure" = Traefik'in kendi yanıtı (bu host için router yok): domain eklenip Redeploy yapılmamış ya da konteyner çalışmıyor demektir.

İlk yayın kontrolü (2026-11-12) ✅

  • /api/health → {"status":"ok","db":"ok"}, servis 1/1 healthy, migration v1 + indeksler canlı DB'de oluştu.
  • TLS: Let's Encrypt (otomatik yenileme), /kayit doğrudan açılıyor (SPA).
  • İlk hesap açıldı → GET /api/auth/registration = new_household_allowed: false (yalnızca davet).

6. Yedekleme ve geri yükleme

Faz 3 – Adım 5'te doldurulacak (günlük mongodump, son 14 yedek).