Otomasyon Rehberi: GitHub Actions 🤖
Sürekli sunucuya girip git pull, docker compose up -d yapmaktan yoruldunuz mu?
GitHub Actions ile "Push to Deploy" (Kodu at, sunucu güncellensin) yapısını kuralım.
1. Mantık Nedir?
- Bilgisayarınızda kodu düzenler ve
git pushyaparsınız. - GitHub bunu görür ve Action (işçi) başlatır.
- GitHub'ın işçisi, sizin sunucunuza SSH ile bağlanır.
- Belirlediğiniz komutları (örn:
deploy.sh) çalıştırır.
2. Hazırlık (Secrets) 🔐
Sunucu şifrenizi kodun içine (yml dosyasına) ASLA yazmayın. GitHub'ın "Secrets" kasasını kullanın.
- GitHub Reponuz -> Settings -> Secrets and variables -> Actions -> New repository secret.
- Şu bilgileri ekleyin:
| Secret Adı | Değer (Örnek) | Açıklama |
|---|---|---|
HOST_IP |
1.2.3.4 |
Sunucunuzun IP adresi. |
SSH_USER |
deployer |
Bağlanacak kullanıcı (root kullanmayın). |
SSH_KEY |
-----BEGIN OPENSSH... |
Private Key'inizin (id_ed25519) tamamı. |
İpucu: Private Key'i almak için:
cat ~/.ssh/id_ed25519(Kendi bilgisayarınızdaki değil, sunucuya erişimi olan bir key olmalı. Genelde yeni bir key pair üretilip Public olan sunucuya, Private olan GitHub'a verilir.)
3. Workflow Dosyası (.yml) 📄
Reponuzda .github/workflows/deploy.yml dosyasını oluşturun ve yapıştırın:
name: Deploy to Server 🚀
# Ne zaman çalışsın? (Sadece main branch'e push gelince)
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Pre-Flight Check (Uçuş Öncesi Kontrol) 🛡️
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
port: 2222
script: |
# 1. Disk Dolu mu? (>%90 ise Dur)
if [ $(df / | awk 'NR==2 {print $5}' | tr -d %) -gt 90 ]; then
echo "❌ DISK DOLU! Deploy iptal ediliyor."
exit 1
fi
# 2. Docker çalışıyor mu?
if ! systemctl is-active --quiet docker; then
echo "❌ Docker çalışmıyor!"
exit 1
fi
echo "✅ Sistem deploy için uygun."
- name: Copy Files via SCP (Dosyaları Yükle)
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
port: 2222
source: "."
target: "/home/${{ secrets.SSH_USER }}/app"
- name: Execute Remote SSH (Komut Çalıştır)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
port: 2222
script: |
echo "🚀 Deployment Basliyor..."
cd /home/${{ secrets.SSH_USER }}/app
# Scriptlere izin ver
chmod +x docs/scripts/library/*.sh
# Docker containerlari yenile (Ornek)
# docker compose down && docker compose up -d --build
# Bakım scriptini çalıştır
./docs/scripts/library/maintenance.sh
echo "✅ Deployment Tamamlandi!"
4. Kritik: Ne Yapılır, Ne Yapılmaz? (Do's & Don'ts) 🛑
GitHub Actions çok güçlüdür ama yanlış kullanılırsa sunucuyu patlatır.
✅ YAPILMASI GEREKENLER (Do's)
- Idempotent Scriptler Yazın: Scriptiniz 100 kere de çalışsa hata vermemeli.
- Kötü:
mkdir /app(Klasör varsa hata verir, CI durur). - İyi:
mkdir -p /app(Varsa geçer, yoksa kurar). - Önce Staging: Ana sunucuya (
mainbranch) yollamadan önce, test sunucusunda (devbranch) deneyin. - SSH Timeout: Bağlantı koparsa ne olacağını planlayın (
timeoutkomutları kullanın).
❌ YAPILMAMASI GEREKENLER (Don'ts)
- Root Kullanmak: Asla
rootile bağlanmayın. Bir hata tüm sunucuyu siler. - Hassas Veri:
.envdosyasını repoya atmayın. Onu sunucuda elle oluşturun veya GitHub Secrets ile enjekte edin. - Database Migration: Otomatik yapmayın! Veri kaybı riski vardır. DB işlerini manuel ve yedekli yapın.
5. Güvenlik Uyarısı ⚠️
Bu yöntemde GitHub'a (Microsoft'a) sunucunuzun anahtarını veriyorsunuz.
- Risk: GitHub hacklenirse veya hesabınız çalınırsa sunucunuza girebilirler.
- Önlem 1: GitHub hesabınızda 2FA (İki Aşamalı Doğrulama) mutlaka açık olsun.
- Önlem 2: Kullandığınız SSH Key'i sunucuda
rootyetkisine boğmayın. Sadece deploy yapabilen kısıtlı bir kullanıcı (deployer) kullanın.
6. Özet
Bu yapı kurulduktan sonra:
- Kodda değişiklik yap.
git push origin mainde.- Arkanı yaslan, GitHub 1 dakika içinde sunucunu güncellesin. ☕