Bu yazıda, salt okunur bir SVN (subversion) yansısı oluşturulması ve periyodik senkronizasyon yapacak şekilde konfigüre edilmesi anlatılmıştır.
SVN, versiyon kontrol sistemi olarak yazılım projelerinde oldukça kabul görmüş bir araçtır. Dağıtık olmayan yapısı nedeniyle geliştiricilerin yaptıkları değişiklikleri merkezi bir sunucuya göndermeleri kaçınılmazdır. Ancak SVN ambarlarının (repository) salt okunur yansıları oluşturularak aşağıdaki faydalar sağlanabilir:
- Merkezi sunucunun yoğun iş yükü altında kalmadan salt okunur şekilde çok sayıda kullanıcının kullanımına açılabilir. Böylece, örneğin açık kaynak projelerin kodlarının geniş kitleler tarafından çekilebileceği bir platform oluşturulmuş olur.
- Ana sunucu ağ üzerinde güvenli bir noktaya alınırken yansılar Internet üzerinden erişime açılabilir. Böylece ana sunucu ve üzerindeki ambarda tutulan dosyalar saldırılara karşı güvenceye alınmış olur.
- Ana sunucuda tutulan dosyalar bu yolla yedeklenebilir.
Şimdi şöyle bir senaryo düşünelim. 2 sunucu makinası var. Üzerlerinde Debian Linux dağıtımı çalışır durumda. Bunlardan birisi ana SVN sunucusu, diğeri ise yansısı olacak.
- Ana (kaynak) sunucunun alan adı main-site.x.y.z olsun.
- Yansı (hedef) sunucunun alan adı mirror-site.x.y.z olsun.
Öncelikle ana SVN sunucusunda yansı alma amaçlı erişim verilecek bir kullanıcı tanımlanmalı ve bu kullanıcıya salt okunur erişim yetkisi verilmelidir. Bu amaçla ana ambar dizininde (örneğimizde
/home/svn/main-repo), "
conf/authz" dosyasında aşağıdaki gibi bir tanımlama olmalıdır:
[/]
svn = r
"
conf/svnserve.conf" dosyasında da doğrulanmış (authenticated) kullanıcılara en azından okuma hakkı verilmiş olmalıdır:
auth-access = read
Yansı sunucusunda öncelikle SVN sunucusu kurulur:
apt-get install subversion
Örneğimizde yansının hizmet verme biçimi olarak
inetd süper sunucusu tercih edildi. Bunun için aşağıdaki satır
/etc/inetd.conf dosyasına eklenir:
svn stream tcp nowait svn /usr/bin/svnserve svnserve -i -r /home/svn
inetd süper sunucusu yeniden başlatılır:
/etc/init.d/inetutils-inetd restart
veya
/etc/init.d/openbsd-inetd restart
Yansı alınacak ambar oluşturulur:
su - svn
svnadmin create mirror-repo
cd mirror-repo
Senkronizasyon işlemlerini ele alacak betik (hook script) oluşturulur:
touch hooks/pre-revprop-change
chmod u+x hooks/pre-revprop-change
Aşağıdaki içerik betiğe konulur. Burada, "
svn" ana sunucuda salt okunur erişecek şekilde ayarladığımız kullanıcıyı ifade etmektedir.
#!/bin/sh
if [ "$3" = "svn" ]; then exit 0; fi
echo "Only the - svn - user may edit revision properties through svnsync" >&2
exit 1
Ana sunucu ve yansı sunucuları arasında, özellikle de aynı güvenli ağ içinde değillerse, güvenli bağlantı tercih edilmelidir. Bu amaçla yansı sunucusu tarafında gizli ve açık anahtar ikilisi üretilir:
su - svn
cd ~/.ssh
ssh-keygen -t dsa -b 1024 -f mirror-site.key
Böylece
.ssh dizininde "
mirror-site.key" adlı gizli anahtar ve buna karşılık gelen "
mirror-site.key.pub" adlı açık anahtar dosyası üretilmiş olur. Bu açık anahtar dosyasının içeriği, ana sunucudaki "svn" kullanıcısının "
.ssh/authorized_keys" dosyasına eklenir.
Yansı sunucusunda
svn kullanıcısı ile linux oturumu açılır:
su - svn
SVN_SSH ortam değişkeni aşağıdaki gibi ayarlanır:
export SVN_SSH="ssh -i /home/svn/.ssh/mirror-site.key"
Yansı sunucusu aşağıdaki gibi ilklendirilir:
svnsync init file:///home/svn/mirror-repo svn+ssh://svn@main-site.x.y.z/home/svn/main-repo
İlk senkronizasyon başlatılır:
svnsync sync file:///home/svn/mirror-repo
Senkronizasyon işlemlerini zamanlanmış görev haline getirmek için
crontab ayarlaması yapılır:
crontab -e
Açılan editör ekranına ağıdaki satır eklenir. Bu örnekte her saat başında senkronizasyon operasyonu başlatılacaktır.
0 * * * * (export SVN_SSH="ssh -i /home/svn/.ssh/mirror-site.key"; svnsync sync file:///home/svn/mirror-repo)
Bu otomasyon yansı sunucusunu en fazla bir saat gecikmeyle ana sunucu ile senkron tutacaktır. Yarıda kalan senkronizasyon işlemleri nedeniyle yansı ambarı kilitlenir ve senkronize edilemez hale gelirse aşağıdaki komut yansıyı kilitli durumdan kurtaracaktır:
svn propdel svn:sync-lock --revprop -r 0 file:///home/svn/mirror-repo
Hepsi bu kadar.