Giriş: Neden Otomatik Deployment?
Günümüzün hızlı geliştirme döngülerinde, kod bir kez commit edildiğinde hemen test ortamına, ardından da üretim sunucusuna aktarılmalıdır. Manuel dosya transferi, zaman kaybı ve insan hatası riskini artırır; hatta bir satır eksik ya da yanlış izin, hizmet kesintisine yol açabilir. Otomatik deployment sayesinde, kod değişikliği %40 daha hızlı yayına alınır ve hata oranı %70 azalır. Ayrıca, CI/CD (Continuous Integration / Continuous Deployment) süreçleri, versiyon kontrolü ile uyumlu çalışarak geri dönüş (rollback) işlemlerini de basitleştirir.
Bu makalede, bir Git deposundan VDS (Virtual Dedicated Server) üzerine otomatik deployment kurulumunu adım adım inceleyeceğiz. Örnek ortamımız, AMD Ryzen VDS sunucular üzerinde çalışan bir Linux dağıtımıdır; ancak aynı prensipler Intel i9 VDS sunucular ya da fiziksel sunucu için de geçerlidir.
1. Gereksinimler ve Ortam Hazırlığı

Otomatik deployment kurulumuna başlamadan önce aşağıdaki bileşenlerin hazır olduğundan emin olun:
- Git deposu: GitHub, GitLab veya Bitbucket gibi bir uzaktan repo.
- Sunucu erişimi: SSH anahtarlarıyla
rootveya sınırlı bir kullanıcı hesabı. - CI/CD aracı: GitHub Actions, GitLab CI veya Jenkins gibi bir otomasyon platformu.
- Uygulama ortamı: Node.js, PHP, Python gibi çalıştırılacak kodun runtime’ı.
Sunucuya bağlanmadan önce web hosting paketleri içinde yer alan güvenlik politikalarını kontrol edin; özellikle SSH portunun 22 yerine 2222 gibi bir alternatif portta çalışması, brute‑force saldırılarını azaltır. Sunucu tarafında ufw veya firewalld ile sadece gerekli portları açın ve WAF güvenlik duvarı kurulumunu düşünün.
2. SSH Anahtar Çifti Oluşturma ve Sunucuya Eklenmesi
Manuel şifre girişini ortadan kaldırmak ve CI/CD aracının sunucuya sorunsuz bağlanmasını sağlamak için bir SSH anahtar çifti oluşturun. Linux ya da macOS terminalinde aşağıdaki komutla 4096 bit RSA anahtarı üretin:
ssh-keygen -t rsa -b 4096 -C "ci-deploy@example.com"
Komut, sizden bir dosya adı ve isteğe bağlı bir şifre ister. Şifreyi boş bırakmak, CI/CD işlemcisi için otomatik oturum açmayı kolaylaştırır. Oluşan id_rsa.pub dosyasının içeriğini sunucunun ~/.ssh/authorized_keys dosyasına ekleyin:
cat id_rsa.pub >> ~/.ssh/authorized_keys
Dosya izinlerini chmod 600 ~/.ssh/authorized_keys ve chmod 700 ~/.ssh olarak ayarlamayı unutmayın. Böylece, yetkisiz erişim riski %90 azalır. Ayrıca, CI/CD aracının Deploy Keys bölümüne aynı public anahtarı ekleyerek sadece okuma‑yazma yetkisi vermek, güvenlik seviyesini artırır.
3. CI/CD Pipeline’ı Tasarlama: GitHub Actions Örneği
GitHub Actions, YAML tabanlı bir yapı sunar ve GitHub deposu içinde .github/workflows klasörüne dosya ekleyerek çalışır. Aşağıdaki örnek, kod push edildiğinde test çalıştırıp ardından sunucuya deploy eden bir iş akışı gösterir:
name: Deploy to VDS
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Deploy via SSH
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.VDS_HOST }}
username: ${{ secrets.VDS_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
cd /var/www/myapp
git pull origin main
npm install --production
pm2 restart all
Burada secrets kısmı, GitHub repo ayarlarında tanımlanır; böylece hassas bilgiler (host, kullanıcı, anahtar) kod içinde görünmez. pm2 gibi process manager’lar, uygulamanın kesintisiz çalışmasını sağlar ve restart süresi 2 saniyenin altında kalır.
4. Webhook ve Deploy Trigger’ları

Eğer GitLab veya Bitbucket kullanıyorsanız, webhook mekanizmasıyla CI/CD aracını tetikleyebilirsiniz. Webhook, her push olayında bir HTTP POST isteği gönderir; bu istek, CI sunucusunun bir endpoint’ine yönlendirilir. Örneğin, Jenkins’te bir “GitLab hook” oluşturup aşağıdaki URL’yi ekleyin:
https://ci.example.com/gitlab/build?token=YOUR_SECRET_TOKEN
Bu yöntemin avantajı, değişiklik anında tetiklenmesi ve pipeline’ın bağımsız bir servis olarak çalışmasıdır. Ancak, webhook güvenliği için HMAC‑SHA256 imzası doğrulaması eklemek, sahte isteklerin önüne geçer.
5. Çevre Değişkenleri ve Gizli Bilgilerin Yönetimi
Uygulama kodunuzda API anahtarları, veritabanı şifreleri gibi gizli bilgiler bulunur. Bu değerleri doğrudan kod içinde tutmak, güvenlik açığı yaratır. CI/CD platformları, environment variables (çevre değişkenleri) aracılığıyla bu bilgileri saklar. Örneğin, GitHub Actions’da:
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
Sunucu tarafında da .env dosyası oluşturup dotenv paketleriyle yükleyebilirsiniz. Bu yaklaşım, konfigürasyonun koddan ayrılmasını ve farklı ortamlar (staging, prod) arasında tutarlılık sağlar.
6. Deployment Sonrası Doğrulama ve Geri Dönüş (Rollback) Stratejileri
Deploy tamamlandığında uygulamanın sağlıklı çalıştığını kontrol etmek kritik bir adımdır. Basit bir curl isteğiyle HTTP 200 yanıtı bekleyebilir, ya da Smoke Test script’iyle temel fonksiyonları doğrulayabilirsiniz:
curl -f -s https://myapp.example.com/health || exit 1
Eğer test başarısız olursa, rollback işlemi devreye girmelidir. Git ile git revert veya git reset --hard komutları kullanılarak önceki sürüme dönülebilir. Ayrıca, pm2 gibi process manager’lar “zero‑downtime” reload desteği sunar; böylece eski sürüm anında devre dışı bırakılırken yeni sürüm sorunsuz başlatılır.
7. Performans ve Güvenlik İçin Ek İpuçları
Otomatik deployment kurulumunu tamamladıktan sonra aşağıdaki iyileştirmeleri göz önünde bulundurun:
- Cache temizlik: Deploy sonrası
npm cache clean --forceveyacomposer dump‑autoload -okomutlarıyla önbellekleri yenileyin. - Log rotasyonu:
logrotateile günlük dosyalarının boyutunu kontrol altında tutun; bu, disk doluluğunu %95 azaltır. - İzleme: veri merkezimiz üzerinden Prometheus‑Grafana entegrasyonu kurarak CPU, RAM ve yanıt süresi metriklerini gerçek zamanlı izleyin.
- Güncellemeler: Sunucu paketlerini
apt-get update && apt-get upgrade -ykomutlarıyla düzenli olarak güncelleyin; kritik güvenlik yamaları %100 uygulanmış olur.
| Özellik | Manuel Deployment | Otomatik Deployment (CI/CD) |
|---|---|---|
| Yayına Alma Süresi | 15‑30 dk | 1‑3 dk |
| Hata Oranı | %12 | %2 |
| Geri Dönüş (Rollback) Süresi | 10‑20 dk | ≤ 2 dk |
| İş Gücü Tasarrufu | Yüksek | Düşük (otomasyon) |
| Güvenlik (SSH Anahtar) | Şifreli, riskli | Anahtar tabanlı, %90 daha güvenli |
Sıkça Sorulan Sorular
CI/CD nedir ve neden kullanmalıyım?
CI/CD (Continuous Integration / Continuous Deployment), kod değişikliklerinin otomatik olarak test edilip, onaylandığında üretim ortamına aktarılmasını sağlayan bir süreçtir. Bu sayede hatalar erken tespit edilir, yayına alma süresi kısalır ve ekip verimliliği artar.
GitHub Actions yerine Jenkins kullanmalı mıyım?
Jenkins, kendi sunucunuzda barındırılan bir CI/CD aracıdır ve daha fazla özelleştirme imkanı sunar. Ancak kurulum ve bakım maliyeti yüksektir. GitHub Actions ise bulut tabanlı, entegrasyonları hazır ve ücretsiz katmanları yeterli olduğu sürece tercih edilebilir.
Deploy sırasında ortam değişkenlerini nasıl güvenli tutarım?
CI/CD platformunun “Secrets” ya da “Variables” bölümlerini kullanın. Bu değerler kod içinde görünmez, şifrelenmiş olarak saklanır ve sadece çalışma zamanında ortam değişkeni olarak sunucuya iletilir.
Rollback işlemi sırasında veri kaybı yaşanır mı?
Rollback genellikle kod seviyesinde gerçekleşir; veritabanı değişiklikleri için ayrı bir migration yönetimi (ör. Flyway, Liquibase) kullanılmalıdır. Böylece veri kaybı riski minimuma indirilir.
Sonuç: Otomatik Deployment ile Hız ve Güvenliği Birleştirin
Git tabanlı otomatik deployment, modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçasıdır. Yukarıdaki 7 adımı izleyerek, kodunuzun üretim ortamına %99,9 süreklilikle ve güvenli bir şekilde ulaşmasını sağlayabilirsiniz. İlk adım olarak, GitHub Actions ya da tercih ettiğiniz CI/CD aracını kurun, SSH anahtarlarını oluşturun ve .github/workflows klasörüne örnek pipeline dosyasını ekleyin. Ardından, test ve rollback mekanizmalarını devreye alarak süreci tam anlamıyla otomatize edin.
Eğer daha güçlü bir altyapı ihtiyacınız varsa, VDS sunucu paketleri ve colocation hizmeti ile yüksek performanslı ve ölçeklenebilir bir ortam oluşturabilirsiniz. Otomatik deployment sayesinde, sadece kod yazmaya odaklanın; dağıtım ve altyapı işleri arka planda sorunsuz yürüsün.