diff --git a/belgeler/coolify-deploy.md b/belgeler/coolify-deploy.md new file mode 100644 index 0000000..7855d19 --- /dev/null +++ b/belgeler/coolify-deploy.md @@ -0,0 +1,135 @@ +# DLS — Coolify Deploy Rehberi + +`lab.kovakcrm.com` adresine production deploy adımları. Tüm adımlar idempotent — bir adımda hata olursa baştan deneyebilirsin. + +## Önkoşul + +- Coolify panel: +- Coolify host IP: `194.31.52.65` (CLAUDE.md'den) +- Gitea repo: `https://git.kovaksoft.com/kovakmedya/lab` (zaten push edilmiş, main branch) +- Appwrite project: `69f27b51000a5bee46ce` (isletmem ile aynı, lab database eklendi) + +## Adım 1 — DNS (Cloudflare veya registrar) + +`lab.kovakcrm.com` için **A record**: + +| Type | Name | Content | Proxy | +|---|---|---|---| +| A | `lab` | `194.31.52.65` | DNS only (gri bulut) — Coolify Let's Encrypt yapacak | + +Cloudflare proxy'yi (turuncu bulut) **kapalı** tut; SSL handshake'i Coolify yapacak. Sonradan istersen Full (strict) ile proxy aktif edebilirsin ama önce DNS-only ile SSL al. + +Propagation 1-2 dk: `dig +short lab.kovakcrm.com` ile doğrula. + +## Adım 2 — Coolify'da yeni Resource + +`admin.kovaksoft.com` > sol menü **Projects** > mevcut bir project seç (örn. KovakSoft) veya **New Project** > **lab**. + +Project içinde **+ New Resource** > **Public Repository** (Gitea ayrı bir kaynak değil, public repo URL veriyorsun) > **Continue**. + +### Repository ayarları + +| Alan | Değer | +|---|---| +| Repository URL | `https://git.kovaksoft.com/kovakmedya/lab` | +| Branch | `main` | +| Build Pack | **Nixpacks** (auto-detect; Next.js + pnpm) | +| Base Directory | `/` | +| Publish Directory | (boş) | + +**Continue** > yeni application oluşur. + +### Build / Start komutları + +Coolify Nixpacks pnpm-lock.yaml'ı görüp otomatik `pnpm install` + `pnpm run build` çalıştırır. Yine de gözden geçir: + +| Alan | Değer | +|---|---| +| Install Command | `pnpm install --frozen-lockfile` | +| Build Command | `pnpm build` | +| Start Command | `pnpm start` | +| Port (Exposed) | `3000` | + +### Environment Variables + +**Environment Variables** sekmesi > şu 5 satırı ekle: + +``` +NEXT_PUBLIC_APPWRITE_ENDPOINT=https://db.kovaksoft.com/v1 +NEXT_PUBLIC_APPWRITE_PROJECT_ID=69f27b51000a5bee46ce +NEXT_PUBLIC_APPWRITE_DATABASE_ID=lab +APPWRITE_API_KEY=<.env.local'deki değerin aynısı> +APP_URL=https://lab.kovakcrm.com +``` + +`APPWRITE_API_KEY` için lokalde `.env.local`'den kopyala (gitignore'da olduğu için repo'da yok). Coolify'da **Is Build Variable** kapalı, **Is Preview Deployment** kapalı, **Locked** açık olabilir. + +`NEXT_PUBLIC_*` değişkenleri Coolify'da **Build-time** olmalı (Nixpacks bunu otomatik yapar, ekstra ayar gerek yok). + +### Domain + +**General** sekmesi > **Domains** > `https://lab.kovakcrm.com` ekle. Coolify otomatik Let's Encrypt SSL alacak (DNS-only proxy doğru ayarlandıysa). + +## Adım 3 — Deploy + +Sağ üstte **Deploy** butonuna bas. İlk build ~3-4 dk (pnpm install + next build). Logları **Deployments** sekmesinde takip et. + +**Yeşil ışık:** Container running, `https://lab.kovakcrm.com` 200 dönüyor. + +## Adım 4 — Gitea webhook (auto-deploy) + +Coolify resource > **Webhooks** veya **Sources** sekmesinde **Webhook URL**'i kopyala. Genelde: + +``` +https://admin.kovaksoft.com/webhooks/source/gitea/events/manual +``` + +Gitea > kovakmedya/lab repo > **Settings** > **Webhooks** > **Add Webhook** > **Gitea**: + +| Alan | Değer | +|---|---| +| Target URL | (Coolify'dan kopyaladığın URL) | +| HTTP Method | POST | +| POST Content Type | application/json | +| Trigger | **Push Events** + **Branch filter:** `main` | +| Active | ✓ | + +**Test Delivery** ile dene — Coolify'da otomatik bir deploy tetiklenir. Sonraki her `main` push'ta auto-deploy. + +## Adım 5 — Doğrulama + +```bash +# DNS +dig +short lab.kovakcrm.com # → 194.31.52.65 + +# HTTPS / SSL +curl -sI https://lab.kovakcrm.com/sign-in | head -3 # → HTTP/2 200 + +# Pill render +curl -s https://lab.kovakcrm.com/sign-in | grep -oE 'Klinik|Laboratuvar|role=.radiogroup' +``` + +Tarayıcıda `https://lab.kovakcrm.com`: +- Landing açılır (varsayılan `/`). +- `/sign-in` formu — Klinik/Lab pill, email/şifre. +- Mevcut Appwrite hesabınla giriş → tenant'ın yoksa onboarding'e gider (login pill seçimin oraya taşınır) → workspace oluştur → dashboard. + +## Sorun çözme + +| Belirti | Neden / Çözüm | +|---|---| +| `Bağlantı hatası: invalid onError method` | Node 26 + node-appwrite uyumsuzluğu. Repo'da `patches/node-fetch-native-with-agent@1.7.2.patch` zaten var; Coolify pnpm install sırasında otomatik uygular. Eksikse build log'da `Applied patch` satırını ara. | +| SSL hatası "no certificate" | Cloudflare proxy hâlâ açık olabilir. Gri buluta indir, DNS'i tekrar propagate et, Coolify > Domain > **Regenerate Certificate**. | +| `Missing NEXT_PUBLIC_APPWRITE_ENDPOINT` | ENV'ler **build-time** değil runtime olarak ekli. Nixpacks `.env` ile build yapar, Coolify ENV editor'inde **Is Build Variable** kontrol et. | +| Sign-in çalışıyor ama sayfa yüklenmiyor | Cookie SameSite=strict + farklı domain. Aynı tarayıcıda lokal isletmem ile lab cookie'leri çakışmaz (farklı subdomain). | +| `EADDRINUSE :3000` | Container restart sırasında ölü process kalmış. Coolify > **Restart** veya **Redeploy**. | + +## Görsel logo yükleme (opsiyonel) + +Coolify > General > **Application Icon** alanına bir favicon yükle (32x32 PNG). Sidebar'da ve tarayıcı tab'ında görünür. + +## Sonraki iyileştirmeler + +- **Health check endpoint:** `/api/health` route ekle, Coolify Healthcheck Path olarak set et. +- **Backup**: Appwrite'ın volume snapshot'ı zaten kovaksoft-coolify host'unda. DB için ekstra script gerekirse `belgeler/`'e ekle. +- **CI checks (opsiyonel):** Gitea Actions yoksa Coolify'ın "Deploy on failed build → rollback" davranışına güven.