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

https://kervanhosting.com/bilgi-bankasi/makale/git-ile-siteyi-sunucuya-otomatik-dagitma-push-to-deploy

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](https://kervanhosting.com/bilgi-bankasi/makale/linux-dosya-izinleri-chmod-chown-rakamlari-ve-sorunlari).

## 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 deploy@203.0.113.10:/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ı](https://kervanhosting.com/bilgi-bankasi/makale/ssh-anahtari-nedir-parola-yerine-nasil-kullanirim) `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](https://kervanhosting.com/bilgi-bankasi/makale/pm2-ile-node-js-uygulamasini-arka-planda-calistirma-ve-otomatik-baslatma). Python için: [Gunicorn ve systemd](https://kervanhosting.com/bilgi-bankasi/makale/python-flask-django-uygulamasini-gunicorn-ve-systemd-ile-yayinlama).

## Ö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ı](https://kervanhosting.com/bilgi-bankasi/makale/ssh-permission-denied-publickey-ve-too-many-authentication-failures).
- **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](https://kervanhosting.com/bilgi-bankasi/makale/hosting-paketime-dosya-yukleme-ftp). Sunucu: [Linux VDS](https://kervanhosting.com/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?](https://kervanhosting.com/bilgi-bankasi/makale/ssh-anahtari-nedir-parola-yerine-nasil-kullanirim)
- [Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?](https://kervanhosting.com/bilgi-bankasi/makale/node-js-veya-python-uygulamami-sunucuda-nasil-yayinlarim)
- [Linux dosya izinleri: chmod, chown ve 755, 644 rakamlarının anlamı](https://kervanhosting.com/bilgi-bankasi/makale/linux-dosya-izinleri-chmod-chown-rakamlari-ve-sorunlari)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
