Skip to content

Deployment ve CI/CD

Cloudflare Workers'a deploy, production yapılandırması, environment variables ve deployment best practices.

Achidemy, Cloudflare Workers üzerinde çalışır ve Wrangler CLI ile deploy edilir. Bu sayfa deployment sürecini, production yapılandırmasını ve best practices’i açıklar.

Terminal window
npm run build

İşlemler:

  • React Router build (react-router build)
  • TypeScript type checking (react-router typegen)
  • Client ve server bundle’ları oluşturulur
  • Output: build/client/ ve build/server/
Terminal window
npm run deploy
# veya
npm run build && wrangler deploy

İşlemler:

  • build/client/ static assets olarak deploy edilir
  • build/server/ worker code olarak deploy edilir
  • workers/app.ts worker entry point olarak kullanılır

Public Variables: wrangler.toml içinde [vars] bölümünde tanımlanır.

[vars]
BASE_URL = "https://achidemy.net"
BETTER_AUTH_URL = "https://achidemy.net"
GOOGLE_CLIENT_ID = "..."
BUNNY_LIBRARY_ID = "..."
# vb.

Secret Variables: CLI ile eklenir (git’e commit edilmez).

Terminal window
# Veritabanı
wrangler secret put DATABASE_URL
# Stripe
wrangler secret put STRIPE_SECRET_KEY
wrangler secret put STRIPE_WEBHOOK_SECRET
# Exchange Rate API (kur botu için)
wrangler secret put EXCHANGE_API_KEY
# Better Auth
wrangler secret put BETTER_AUTH_SECRET
# Resend (e-posta)
wrangler secret put RESEND_API_KEY
# Bunny
wrangler secret put BUNNY_API_KEY
wrangler secret put BUNNY_STORAGE_KEY
wrangler secret put BUNNY_VIDEO_SECURITY_KEY

Production: Hyperdrive ID wrangler.toml içinde tanımlıdır.

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "59c4a12da58e45d3993436576a163c85"
localConnectionString = "postgresql://..." # Sadece yerel için

Not: Production’da Hyperdrive üzerinden bağlantı sağlanır; yerel geliştirmede localConnectionString kullanılır (Neon pooler URL’si ile aynı veritabanına işaret etmelidir).

Worker, apex ve B2B wildcard için aynı uygulamayı sunar. wrangler.toml örneği:

[[routes]]
pattern = "achidemy.net/*"
zone_name = "achidemy.net"
[[routes]]
pattern = "*.achidemy.net/*"
zone_name = "achidemy.net"

DNS’te achidemy.net ve *.achidemy.net için Cloudflare proxy kayıtları bu Worker’a yönlendirilir; SSL için wildcard sertifika kullanılır.

Production: Durable Object binding’leri wrangler.toml içinde tanımlıdır.

[[durable_objects.bindings]]
name = "CHAT_ROOM"
class_name = "ChatRoom"
[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]

  • Tüm secret’lar Cloudflare’de tanımlı mı?
  • Public variable’lar wrangler.toml içinde güncel mi?
  • BASE_URL ve BETTER_AUTH_URL production URL’ine ayarlı mı?
  • Migration’lar production DB’ye uygulandı mı?
  • Hyperdrive ID doğru mu?
  • Connection string test edildi mi?
  • Production Stripe key’leri kullanılıyor mu?
  • Webhook endpoint production URL’ine ayarlı mı?
  • Webhook secret production için güncel mi?
  • npm run build hatasız çalışıyor mu?
  • TypeScript type errors yok mu?
  • React Router typegen çalışıyor mu?
  • Yerel testler geçiyor mu? (npm run start)
  • Critical path’ler test edildi mi? (login, payment, course creation)

Terminal window
npm run deploy

Adımlar:

  1. npm run build — Build işlemi
  2. wrangler deploy — Cloudflare’e deploy
Terminal window
# 1. Build
npm run build
# 2. Type check (opsiyonel ama önerilir)
npm run typecheck
# 3. Deploy
wrangler deploy
Terminal window
wrangler deploy --env preview

Kullanım: Production’a deploy etmeden önce test için.


.github/workflows/deploy.yml
name: Deploy to Cloudflare
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm run build
- run: npm run typecheck
- uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

Gereksinimler:

  • CLOUDFLARE_API_TOKEN — GitHub Secrets’a eklenmeli
  • CLOUDFLARE_ACCOUNT_ID — GitHub Secrets’a eklenmeli

Terminal window
# Son deployment'ı görüntüle
wrangler deployments list
# Belirli bir deployment'a rollback
wrangler rollback [deployment-id]

Migration geri alma:

Terminal window
# Migration dosyasını geri al
# Örnek: Drizzle migration'ı geri almak için SQL script çalıştır
psql $DATABASE_URL < rollback_script.sql

Not: Database rollback dikkatli yapılmalıdır; veri kaybına yol açabilir.


  • Workers Logs: wrangler tail veya Cloudflare Dashboard
  • Analytics: Request sayısı, error rate, response time
  • Durable Objects: Chat room sayısı, WebSocket bağlantıları

Önerilen: Sentry entegrasyonu

// Production'da error tracking aktif et
if (import.meta.env.PROD) {
Sentry.captureException(error);
}

Önerilen: UptimeRobot, Pingdom veya Cloudflare Uptime Monitoring

  • Ana sayfa: https://achidemy.net
  • Health check endpoint: /api/health (gelecekte eklenebilir)

  • Image Optimization: Bunny CDN kullanılır
  • Code Splitting: React Router otomatik code splitting yapar
  • Bundle Size: npm run build ile bundle analizi yapılabilir
  • Static Assets: Cloudflare CDN cache
  • API Responses: Cache-Control header’ları kullanılabilir
  • Database: Hyperdrive connection pooling
  • Cloudflare Cache: Static sayfalar için edge cache
  • Cache Rules: wrangler.toml veya Cloudflare Dashboard’dan yapılandırılabilir

Sorun: wrangler deploy başarısız oluyor.

Çözümler:

  1. Cloudflare API token kontrolü
  2. Account ID kontrolü
  3. wrangler.toml syntax kontrolü
  4. Build output kontrolü (build/ klasörü var mı?)

Sorun: Production’da uygulama çalışmıyor.

Çözümler:

  1. Worker logs kontrolü: wrangler tail
  2. Environment variables kontrolü: wrangler secret list
  3. Database bağlantısı kontrolü
  4. Error tracking servisine bak (Sentry vb.)

  • wrangler.toml — Worker yapılandırması
  • package.json — Build ve deploy script’leri
  • workers/app.ts — Worker entry point
  • .dev.vars — Yerel geliştirme için environment variables (git’e eklenmez)