Files
kakeibo/docs/DEPLOY.md
T
2026-11-12 02:16:00 +03:00

4.4 KiB
Raw Blame History

🚀 Canlıya Alma (Atlas Homeserver + Dokploy)

Durum: Faz 3 — Adım 1 ✅ (Docker imajı) · Adım 2–5 devam ediyor

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

Faz 3 – Adım 3'te birlikte doldurulacak.

6. Yedekleme ve geri yükleme

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