97f397d2dd
Step-by-step instructions for the production deploy that has to happen in the admin.kovaksoft.com UI (Coolify doesn't expose a clean CLI for creating resources). Covers DNS A record, Coolify resource setup, ENV mapping, domain + SSL, Gitea webhook for auto-deploy, and a verification cookbook. Troubleshooting section includes the Node 26 / node-appwrite patch already shipped in repo.
136 lines
5.5 KiB
Markdown
136 lines
5.5 KiB
Markdown
# 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: <https://admin.kovaksoft.com>
|
||
- 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.
|