Versiyon kontrol sistemleri olmadan yazılım geliştirmek, kör uçmak gibidir. Subversion (SVN), Git kadar popüler olmasa da kurumsal ortamlarda hala güçlü bir şekilde kullanılıyor ve bazı takımlar için mükemmel bir tercih olmaya devam ediyor. Apache HTTP Server ile SVN repository’lerini sunmak ise bu işin en temiz ve en esnek yollarından biri. Bu yazıda sıfırdan başlayarak Apache üzerinde SVN kurulumu yapacağız, kimlik doğrulama ayarlayacağız ve gerçek dünya senaryolarına göre yapılandırmalar göreceğiz.
Neden Apache ile SVN?
SVN’i doğrudan svnserve daemon’ı üzerinden de sunabilirsiniz, ancak Apache entegrasyonu size çok daha fazlasını verir.
- HTTP/HTTPS desteği: Firewall arkasındaki kullanıcılar bile erişebilir
- Merkezi kimlik doğrulama: LDAP, Active Directory veya htpasswd ile entegrasyon
- Web arayüzü: Tarayıcıdan repository içeriğine göz atma imkanı
- SSL şifreleme: Verileriniz transit sırasında korunur
- Detaylı erişim kontrolü: Dizin bazında okuma/yazma izinleri
- Log yönetimi: Apache’nin zengin loglama altyapısından faydalanma
Kurumsal bir ortamda çalışıyorsanız ve LDAP entegrasyonunuz varsa, Apache ile SVN kombinasyonu neredeyse kaçınılmaz oluyor.
Gereksinimler ve Paket Kurulumu
Bu yazıda Ubuntu/Debian tabanlı sistem kullanacağız. CentOS/RHEL kullanıcıları için paket adlarını da belirteceğim.
Ubuntu/Debian Kurulumu
sudo apt update
sudo apt install apache2 subversion libapache2-mod-svn -y
CentOS/RHEL Kurulumu
sudo yum install httpd subversion mod_dav_svn -y
# veya RHEL 8+ için
sudo dnf install httpd subversion mod_dav_svn -y
Kurulum tamamlandıktan sonra gerekli Apache modüllerini etkinleştiriyoruz:
sudo a2enmod dav
sudo a2enmod dav_svn
sudo a2enmod auth_basic
sudo systemctl restart apache2
CentOS’ta bu modüller genellikle otomatik yüklenir, ek bir adım gerekmez.
Repository Yapısını Oluşturma
Önce düzenli bir dizin yapısı oluşturalım. Ben genellikle /var/svn altında tutmayı tercih ederim:
sudo mkdir -p /var/svn/repositories
sudo svnadmin create /var/svn/repositories/proje1
sudo svnadmin create /var/svn/repositories/proje2
Standart SVN dizin yapısını oluşturalım (trunk, branches, tags):
sudo svn mkdir
file:///var/svn/repositories/proje1/trunk
file:///var/svn/repositories/proje1/branches
file:///var/svn/repositories/proje1/tags
-m "İlk dizin yapısı oluşturuldu"
Şimdi izinleri ayarlayalım. Apache’nin bu dizinlere erişebilmesi için sahipliği www-data (Ubuntu) veya apache (CentOS) kullanıcısına veriyoruz:
# Ubuntu/Debian
sudo chown -R www-data:www-data /var/svn/repositories
# CentOS/RHEL
sudo chown -R apache:apache /var/svn/repositories
sudo chmod -R 750 /var/svn/repositories
Apache Yapılandırması
Temel Yapılandırma
/etc/apache2/sites-available/svn.conf dosyasını oluşturuyoruz:
sudo nano /etc/apache2/sites-available/svn.conf
<VirtualHost *:80>
ServerName svn.sirketim.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/svn-error.log
CustomLog ${APACHE_LOG_DIR}/svn-access.log combined
<Location /svn>
DAV svn
SVNParentPath /var/svn/repositories
# Kimlik doğrulama
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /etc/apache2/svn-users
Require valid-user
# Anonim okumaya izin vermek isterseniz
# Require all granted
</Location>
</VirtualHost>
Bu yapılandırmada SVNParentPath direktifi sayesinde /var/svn/repositories altındaki tüm repository’ler otomatik olarak sunulur. http://svn.sirketim.com/svn/proje1 ve http://svn.sirketim.com/svn/proje2 şeklinde erişilebilir hale gelir.
Kullanıcı Dosyası Oluşturma
# İlk kullanıcıyı -c parametresiyle oluşturuyoruz (dosyayı sıfırdan yaratır)
sudo htpasswd -c /etc/apache2/svn-users ahmet
# Sonraki kullanıcılar için -c olmadan ekliyoruz
sudo htpasswd /etc/apache2/svn-users mehmet
sudo htpasswd /etc/apache2/svn-users fatma
# Kullanıcı listesini kontrol etmek için
cat /etc/apache2/svn-users
Güvenlik için bu dosyanın izinlerini daraltın:
sudo chmod 640 /etc/apache2/svn-users
sudo chown root:www-data /etc/apache2/svn-users
Site’ı etkinleştirip Apache’yi yeniden başlatıyoruz:
sudo a2ensite svn.conf
sudo systemctl reload apache2
Detaylı Erişim Kontrolü (authz)
Bu noktada herhangi bir authenticated kullanıcı tüm repository’lere erişebilir durumda. Gerçek dünyada ise genellikle şöyle bir senaryo olur: Geliştirme takımı kendi projesine tam erişime sahip olurken, müşteriler sadece belirli dizinleri okuyabilmeli.
/etc/apache2/svn-authz dosyasını oluşturuyoruz:
[groups]
gelistiriciler = ahmet, mehmet, fatma
yoneticiler = ali
musteri_a = musteri1
musteri_b = musteri2
# Yöneticiler her şeye erişebilir
[/]
@yoneticiler = rw
# proje1'e geliştirici erişimi
[proje1:/]
@gelistiriciler = rw
@musteri_a = r
# proje1 trunk'ına müşteri erişimi yok
[proje1:/trunk]
@gelistiriciler = rw
@musteri_a =
# proje2'ye sadece geliştirici erişimi
[proje2:/]
@gelistiriciler = rw
Boş bırakılan izin (@musteri_a =) o dizine erişimi tamamen engeller. Bu oldukça işe yarayan bir özellik.
Apache yapılandırmasına authz dosyasını ekliyoruz:
<Location /svn>
DAV svn
SVNParentPath /var/svn/repositories
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /etc/apache2/svn-users
AuthzSVNAccessFile /etc/apache2/svn-authz
Require valid-user
</Location>
sudo systemctl reload apache2
HTTPS ile Güvenli Bağlantı
Production ortamında kesinlikle HTTPS kullanmalısınız. Let’s Encrypt ile ücretsiz sertifika alabiliriz:
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d svn.sirketim.com
Certbot Apache yapılandırmanızı otomatik olarak güncelleyecek. Manuel olarak yapmak isterseniz SSL yapılandırması şöyle görünür:
<VirtualHost *:443>
ServerName svn.sirketim.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/svn.sirketim.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/svn.sirketim.com/privkey.pem
ErrorLog ${APACHE_LOG_DIR}/svn-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/svn-ssl-access.log combined
<Location /svn>
DAV svn
SVNParentPath /var/svn/repositories
AuthType Basic
AuthName "SVN Repository (Güvenli)"
AuthUserFile /etc/apache2/svn-users
AuthzSVNAccessFile /etc/apache2/svn-authz
Require valid-user
</Location>
</VirtualHost>
# HTTP'yi HTTPS'e yönlendir
<VirtualHost *:80>
ServerName svn.sirketim.com
Redirect permanent / https://svn.sirketim.com/
</VirtualHost>
Repository Yönetimi ve Bakım
Yedekleme
SVN repository’lerini yedeklemek için svnadmin dump kullanılır. Cron job olarak ayarlayabilirsiniz:
#!/bin/bash
# /usr/local/bin/svn-backup.sh
BACKUP_DIR="/backup/svn"
REPO_DIR="/var/svn/repositories"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
for repo in "$REPO_DIR"/*/; do
REPO_NAME=$(basename "$repo")
echo "Yedekleniyor: $REPO_NAME"
svnadmin dump "$repo" | gzip > "$BACKUP_DIR/${REPO_NAME}-${DATE}.dump.gz"
done
# 30 günden eski yedekleri sil
find "$BACKUP_DIR" -name "*.dump.gz" -mtime +30 -delete
echo "Yedekleme tamamlandı: $(date)"
sudo chmod +x /usr/local/bin/svn-backup.sh
# Cron'a ekle - her gece 02:00'de çalışsın
echo "0 2 * * * root /usr/local/bin/svn-backup.sh >> /var/log/svn-backup.log 2>&1" | sudo tee /etc/cron.d/svn-backup
Repository Geri Yükleme
# Yeni bir repository oluştur ve dump'ı yükle
sudo svnadmin create /var/svn/repositories/proje1-restore
sudo gunzip -c /backup/svn/proje1-20240115.dump.gz | sudo svnadmin load /var/svn/repositories/proje1-restore
sudo chown -R www-data:www-data /var/svn/repositories/proje1-restore
Repository Boyutu Optimizasyonu
Zamanla SVN repository’leri şişebilir. svnadmin pack komutu FSFS formatındaki repository’leri sıkıştırır:
sudo svnadmin pack /var/svn/repositories/proje1
sudo svnadmin verify /var/svn/repositories/proje1
Gerçek Dünya Senaryosu: Ajans Ortamı
Bir dijital ajans düşünün. Birden fazla müşteri projesi var, her müşteri kendi repository’sine erişebilmeli ama başkasının projelerini görmemeli. Geliştirici ekibi ise her şeye erişebilmeli.
Bu senaryo için yapılandırmamız şöyle olur:
# Repository'leri oluştur
sudo svnadmin create /var/svn/repositories/musteri-a-web
sudo svnadmin create /var/svn/repositories/musteri-b-mobil
sudo svnadmin create /var/svn/repositories/musteri-c-eticaret
sudo svnadmin create /var/svn/repositories/dahili-araclar
sudo chown -R www-data:www-data /var/svn/repositories
authz dosyamız:
[groups]
senior_dev = ahmet, mehmet
junior_dev = ali, veli
devops = fatma
musteri_a_ekip = musteri_a_pm, musteri_a_dev
musteri_b_ekip = musteri_b_pm
musteri_c_ekip = musteri_c_pm, musteri_c_test
# Senior devops her şeye erişebilir
[/]
@senior_dev = rw
@devops = rw
# Junior devler kendi projelerine yazabilir ama dahili araçlara sadece okuyabilir
[dahili-araclar:/]
@junior_dev = r
@senior_dev = rw
# Müşteri A projesi
[musteri-a-web:/]
@junior_dev = rw
@musteri_a_ekip = r
# Müşteri A sadece tags'i görebilsin (release versiyonları)
[musteri-a-web:/trunk]
@musteri_a_ekip =
[musteri-a-web:/branches]
@musteri_a_ekip =
[musteri-a-web:/tags]
@musteri_a_ekip = r
# Müşteri B - sadece proje yöneticisi erişebilsin
[musteri-b-mobil:/]
@junior_dev = rw
@musteri_b_ekip = r
# Müşteri C - test ekibi de okuyabilsin
[musteri-c-eticaret:/]
@junior_dev = rw
@musteri_c_ekip = r
Performans Ayarları
Büyük bir ekiple çalışırken veya büyük repository’lerle uğraşırken Apache’yi biraz optimize etmek gerekebilir.
Apache MPM Ayarları
sudo nano /etc/apache2/mods-available/mpm_prefork.conf
SVN için tipik ayarlar:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 50
MaxConnectionsPerChild 1000
</IfModule>
SVN İşlem Sınırları
Büyük repository’lerde timeout sorunları yaşıyorsanız:
<Location /svn>
DAV svn
SVNParentPath /var/svn/repositories
# Büyük dosya yüklemeleri için timeout artır
Timeout 600
# SVN delta sıkıştırma
SVNCompressionLevel 5
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /etc/apache2/svn-users
AuthzSVNAccessFile /etc/apache2/svn-authz
Require valid-user
</Location>
Sorun Giderme
Sysadmin hayatında her şey planlandığı gibi gitmez. Sık karşılaşılan sorunlar ve çözümleri:
403 Forbidden hatası alıyorsanız:
# Dizin izinlerini kontrol et
ls -la /var/svn/repositories/
sudo chown -R www-data:www-data /var/svn/repositories/
# SELinux aktifse (CentOS)
sudo setsebool -P httpd_unified 1
sudo restorecon -R /var/svn/repositories/
500 Internal Server Error:
# Apache error log'a bakın
sudo tail -f /var/log/apache2/svn-error.log
# Modüllerin yüklendiğini kontrol edin
apache2ctl -M | grep -i svn
apache2ctl -M | grep -i dav
Repository bozuldu şüphesi:
# Repository bütünlüğünü kontrol et
sudo svnadmin verify /var/svn/repositories/proje1
# Recovery deneme
sudo svnadmin recover /var/svn/repositories/proje1
Kullanıcı şifresi değiştirme:
# Mevcut kullanıcının şifresini değiştir
sudo htpasswd /etc/apache2/svn-users ahmet
# Kullanıcıyı sil
sudo htpasswd -D /etc/apache2/svn-users eski_calisan
Monitoring ve Log Analizi
Repository aktivitesini takip etmek isteyebilirsiniz:
# Son 100 commit'i göster
sudo svn log file:///var/svn/repositories/proje1 --limit 100
# Belirli bir kullanıcının commit'leri
sudo svn log file:///var/svn/repositories/proje1 | grep -A2 "ahmet"
# Apache access log'undan SVN isteklerini filtrele
sudo grep "PROPFIND|REPORT|MERGE" /var/log/apache2/svn-access.log | tail -50
# Aktif bağlantıları göster
sudo ss -tnp | grep apache2
Düzenli log rotasyonu için logrotate yapılandırması Apache’de zaten mevcut, ek bir şey yapmanıza gerek yok. Ancak özel SVN loglarınız varsa:
sudo nano /etc/logrotate.d/svn-apache
/var/log/apache2/svn-*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
/bin/kill -USR1 $(cat /var/run/apache2/apache2.pid 2>/dev/null) 2>/dev/null || true
endscript
}
Sonuç
Apache ile SVN sunmak, ilk bakışta karmaşık görünse de adım adım ilerlediğinizde oldukça sistematik bir yapı ortaya çıkıyor. Temel kurulumdan başlayıp HTTPS, granüler erişim kontrolü ve yedekleme otomasyonuna kadar her katmanı doğru yapılandırdığınızda elinizde kurumsal düzeyde, güvenilir bir versiyon kontrol altyapısı oluyor.
Git’in her ortamda birinci tercih olmadığını hatırlatmak gerekir. Binary dosyaların yoğun olduğu projeler, merkezi kontrol gerektiren kurumsal ortamlar veya onlarca yıllık SVN geçmişine sahip legacy sistemler için SVN hala güçlü bir çözüm sunuyor. Apache entegrasyonu da bu çözümü web tabanlı, güvenli ve yönetilebilir hale getiriyor.
En kritik nokta izin yapılandırması ve düzenli yedekleme. authz dosyanızı versiyon kontrolüne alın (ironic ama doğru), yedeklerinizi başka bir sunucuya taşıyın ve svnadmin verify komutunu cron’a ekleyin. Repository bozulmaları nadir ama yıkıcı olabiliyor, hazırlıklı olmak her zaman daha iyi.