Git ile siteyi sunucuya otomatik dağıtma: git push ile yayına alma
Siteyi her değişiklikte FTP ile yüklemek hem yavaş hem hataya açıktır. Git kullanıyorsanız çok daha temiz bir yol var: sunucuda küçük bir "alıcı" depo kurar ve bilgisayarınızdan git push yaptığınız anda dosyaların kendiliğinden yayına alınmasını sağlarsınız. Bu rehberdeki adımlar bir VDS sunucuda denenmiş düzenek üzerine kuruludur (bare depo ve post-receive kancası, Git 2.43).
Nasıl çalışır?
Sunucuda iki klasör olur: Git'in kabul ettiği bare depo (/srv/git/site.git, dosya içermez, yalnızca geçmişi tutar) ve sitenin gerçekten yayınlandığı canlı klasör (/var/www/ornek.com). Siz push yapınca Git bare depoya gelenleri işler ve ardından bir kanca (hook) betiği çalıştırarak son sürümü canlı klasöre yazar.
1. Sunucuda hazırlık
sudo apt install -y git
sudo mkdir -p /srv/git/site.git /var/www/ornek.com
cd /srv/git/site.git
sudo git init --bare -b main
sudo chown -R deploy:deploy /srv/git/site.git /var/www/ornek.com
Buradaki deploy, yalnızca bu iş için açtığınız yetkisiz bir kullanıcıdır (sudo adduser deploy). root ile push yapmayın. Canlı klasör bu kullanıcıya ait olursa, web sunucusunun (www-data) dosyaları okuyabilmesi için izinleri uygun tutun (klasör 755, dosyalar 644): dosya izinleri.
2. Kanca (hook) betiği
/srv/git/site.git/hooks/post-receive dosyasını oluşturun:
#!/bin/bash
GIT_WORK_TREE=/var/www/ornek.com git checkout -f main
Çalıştırılabilir yapın: chmod +x /srv/git/site.git/hooks/post-receive. Bu betik, main dalının son halini canlı klasöre yazar. -f canlı klasördeki aynı dosyaların üzerine yazar.
3. Bilgisayarınızda uzak depo ekleyin
git remote add canli [email protected]:/srv/git/site.git
git push canli main
İlk push'ta sunucudan "remote: Already on 'main'" gibi bir çıktı görmeniz, kancanın çalıştığını gösterir. Dosyalar /var/www/ornek.com içinde belirir. Her sonraki git push canli main siteyi günceller. Parolasız push için SSH anahtarını deploy kullanıcısına ekleyin.
4. Derleme ve yeniden başlatma adımları
Kancaya push sonrası yapılacak işleri ekleyebilirsiniz:
#!/bin/bash
set -e
HEDEF=/var/www/ornek.com
GIT_WORK_TREE=$HEDEF git checkout -f main
cd $HEDEF
npm ci --omit=dev
sudo systemctl restart uygulama
Servis yeniden başlatmak için deploy kullanıcısının parolasız ama yalnızca o komutu çalıştırmasına izin verin (sudo visudo -f /etc/sudoers.d/deploy): deploy ALL=(root) NOPASSWD: /bin/systemctl restart uygulama. Geniş sudo yetkisi vermeyin. PM2 kullanıyorsanız ilgili komut pm2 restart'tır: PM2. Python için: Gunicorn ve systemd.
Önemli kurallar
- Gizli bilgileri depoya koymayın.
.env, parolalar, API anahtarları.gitignoreile dışarıda kalsın; sunucuda elle bir kez oluşturun. Denediğimiz düzenekte, depoda hiç izlenmeyen dosyalara (canlı klasördeki.envgibi)checkout -fdokunmadı; depodan sildiğiniz izlenen dosyalar ise canlı klasörden de silindi. Yani yüklenen görseller gibi kullanıcı verilerini depoya koymayın ve canlı klasörde ayrı bir yerde tutun. - Canlı klasörde elle değişiklik yapmayın. Sonraki push o değişikliklerin üzerine yazar.
- Geri alma: Hatalı sürümü geri almak için bilgisayarınızda
git revert HEADyapıp tekrar push edin. Hızlı kurtarma için önceki bir sürümügit push canli HEAD~1:main --forceile göndermek de mümkündür (dikkatli kullanın). - Test edin: Önemli sitede ilk önce ayrı bir test klasörüne dağıtıp deneyin.
- Güvenlik: Yalnızca bu iş için bir anahtar kullanın ve
deploykullanıcısınasudoyetkisi vermeyin.
Sorun giderme
- Push reddediliyor (Permission denied): SSH anahtarı ya da klasör sahipliği yanlış: publickey hatası.
- Kanca çalışmıyor: Dosya çalıştırılabilir değildir ya da ilk satırdaki
#!/bin/basheksiktir. Elle deneyin:sudo -u deploy /srv/git/site.git/hooks/post-receive. - Dosyalar güncellenmiyor: Dal adı
maindeğilmasterolabilir; kancadaki ve push komutundaki adı eşleştirin.
Hosting paketinde SSH ve Git erişimi bulunmaz; orada dosyalar FTP ile yüklenir: FTP ile yükleme. Sunucu: Linux VDS.
Sık sorulanlar
GitHub ya da GitLab Actions kullanabilir miyim?
Evet; otomasyonu orada çalıştırıp sunucuya SSH ile bağlanarak aynı git pull veya rsync komutlarını verebilirsiniz. Bu rehber ek hizmet gerektirmeyen en yalın yoldur.
bare depo ile normal depo arasındaki fark ne?
Bare depo çalışan dosyaları içermez, yalnızca Git geçmişini tutar; push kabul etmek için tasarlanmıştır. Normal depoya doğrudan push yapmak genelde reddedilir.
Aynı sunucuda birden fazla site için kurabilir miyim?
Evet; her site için ayrı bir bare depo ve kanca oluşturun, her birinin canlı klasörü farklı olsun.
İlgili makaleler
- SSH anahtarı nedir? Parola yerine nasıl kullanırım?
- Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?
- Linux dosya izinleri: chmod, chown ve 755, 644 rakamlarının anlamı
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!