f86cff4755
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
4.4 KiB
Markdown
78 lines
4.4 KiB
Markdown
# 🚀 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
|
||
|
||
```bash
|
||
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ı):
|
||
- [x] `/` ve `/defter` → `index.html` (`Cache-Control: no-cache`)
|
||
- [x] `/assets/*.js` → brotli/gzip, `max-age=31536000, immutable`
|
||
- [x] `/api/health` → `db: ok`; bilinmeyen `/api/...` → JSON 404
|
||
- [x] Docker `HEALTHCHECK` → healthy; süreç `kakeibo` kullanıcısıyla çalışır
|
||
- [x] `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).
|