Git ile siteyi sunucuya otomatik dağıtma: git push ile yayına alma

Linux Sunucu (SSH) 53 görüntülenme Markdown

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ı .gitignore ile dışarıda kalsın; sunucuda elle bir kez oluşturun. Denediğimiz düzenekte, depoda hiç izlenmeyen dosyalara (canlı klasördeki .env gibi) checkout -f dokunmadı; 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 HEAD yapıp tekrar push edin. Hızlı kurtarma için önceki bir sürümü git push canli HEAD~1:main --force ile 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 deploy kullanıcısına sudo yetkisi 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/bash eksiktir. Elle deneyin: sudo -u deploy /srv/git/site.git/hooks/post-receive.
  • Dosyalar güncellenmiyor: Dal adı main değil master olabilir; 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

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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.