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:
- Build: Docker image oluştur ve Registry'ye yükle
- 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:
- Git push
- GitLab Runner Docker image build ediyor (~5 dakika)
- Image Registry'ye yükleniyor
- Kubernetes yeni pod'ları başlatıyor
- Eski pod'lar kapatılıyor (zero-downtime)
- 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 startyerinenode server.jskullanmak 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.