Bu Siteyi Nasıl Deploy Ettim?

Giriş

Merhaba! Kişisel websitem safademirdag.com'u modern DevOps pratikleriyle production'a aldım. Bu yazıda teknik detaylara girmeden, hangi teknolojileri kullandığımı ve deployment sürecini nasıl kurduğumu anlatacağım.


Kullandığım Teknolojiler

Uygulama

  • Next.js 14 + TypeScript
  • Docker

Altyapı

  • 3 Sunucu (Master, Worker, Runner)
  • Kubernetes (RKE2)
  • GitLab CI/CD
  • NGINX Ingress + Let's Encrypt

Mimari

Üç sunucu kullandım:

  • Master Node: Kubernetes'in beyni, tüm kararları burada veriliyor
  • Worker Node: Uygulamam burada çalışıyor
  • Runner Node: GitLab CI/CD pipeline'ları burada çalışıyor

Deployment Süreci

1. Dockerfile Hazırlama

Next.js'i multi-stage build ile küçük bir Docker image'ına çevirdim. next.config.js'de output: 'standalone' ayarı ile sadece gerekli dosyalar production'a gidiyor.

2. Kubernetes Manifest'leri

Üç YAML dosyası oluşturdum:

  • Deployment: Uygulamanın 2 kopyasını çalıştırıyor
  • Service: Pod'lara iç ağdan erişim sağlıyor
  • Ingress: safademirdag.com domain'ini uygulamaya yönlendiriyor

3. GitLab CI/CD Pipeline

Her git push yaptığımda otomatik çalışan iki aşama:

  1. Build: Docker image oluştur ve Registry'ye yükle
  2. Deploy: Kubernetes'e yeni image'ı deploy et

4. DNS ve SSL

  • DNS A kaydı: safademirdag.com → Master Node IP
  • cert-manager + Let's Encrypt: Otomatik SSL sertifikası

Akış

Kod değişikliği yaptığımda:

  1. Git push
  2. GitLab Runner Docker image build ediyor (~5 dakika)
  3. Image Registry'ye yükleniyor
  4. Kubernetes yeni pod'ları başlatıyor
  5. Eski pod'lar kapatılıyor (zero-downtime)
  6. Site yeni versiyonla yayında..

Tüm süreç 7-10 dakika ve tamamen otomatik.


Öğrendiklerim

Best Practices

  • Multi-stage Docker build ile küçük image'lar
  • Kubernetes namespace'leri ile izolasyon
  • Health check'ler ile otomatik restart
  • Rolling update ile kesintisiz deployment

Karşılaştığım Sorunlar

  • Dockerfile'da npm start yerine node server.js kullanmak gerekiyor
  • GitLab Registry için imagePullSecret oluşturmak gerekiyor
  • Runner'ın master node'a erişimi için kubeconfig IP ayarı

Sonuç

Artık tek tuşla production'a deployment yapabiliyorum. Kubernetes, CI/CD ve containerization sayesinde:

  • Otomatik deployment
  • Zero-downtime updates
  • Kolayca scale edilebilir
  • Infrastructure as Code

Kod yazmaya odaklanıyorum, deployment endişesi yok.


DevOps