Amazon Ücretsiz Sunucuları ( Bölüm 2: HTTPS destekli Apache Web Sunucu üzerinde SVN Kurulumu)

Serinin önceki bölümünde sürekli emrimize amade ve elektrik kesintisi derdi olmayan bir sunucuyu nasıl bir yıllık ücretsiz kullanmak üzere alabileceğimizi ve sonra bu sunucuya nasıl erişeceğimizden bahsetmiştim. Bu sunucu çok zayıf özellikli olmakla birlikte bazı basit işler için gayet yeterli. Bunlardan biri de az kullanılıcılı bir SVN sunucusu olarak kullanmak.

Subversion öncülü CVS (Concurrent Versioning System) gibi kodlarımızın geçmişini tutup istediğimizde erişilebilir kılmak, kodun bir kısmının ne zaman ve nasıl değiştirildiğini kıyaslayarak göstermek ya da hangi programcıların ne değişiklikler yaptıklarını görmek gibi ihtiyaçları karşılamak amacıyla ama CVS'in de bazı eksiklerini gidererek bunu yapması amacıyla çıkmıştı 2000 lerin ortalarında. Öncülü CVS'te bir geliştirme için birden fazla dosyada değişiklik yaptıysak bunları geçmiş kaydında tek bir girdi olarak gösteremeyebiliyorduk yani commitler atomic değildi. Çünkü çok dosyayı commit etmek istediğimizde işlemin ortasında bir sorun olduğunda o ana kadar commitlenenler sunucuya gitmiş oluyordu ve kalanları ayrıca commitliyorduk. Bu da bir özellik için neler değişti diye sorgulamayı zorlaştırıyordu. Ayrıca kodun bir andaki halinin kopyasını alıp başka bir yoldan devam ettirmek yani branch ya da tag açmak istediğimizde repositorynin boyutu adeta katlanıyordu. Resimler gibi binary dosyaları commitlediğimizde dikkat etmediğimiz takdirde içinde tesadüfen geçen satır sonu karakterleri değiştirilip dosya bozulabiliyordu. Bir dosyanın adını ya da yerini değiştirdiğimizde sürüm bilgisini kaybediyorduk. İşte CVS'in bunun gibi kötü yanlarından kurtulmak amacıyla tercih edilen SVN, her ne kadar bugünlerde yerini Linux için geliştirilip kısa sürede yaygınlaşan Git'e bıraksa da bazı durumlarda Git'e tercih edilebilecek özellikleriyle hala oldukça güçlü bir açık kaynaklı sürüm yönetimi sistemidir.

SVN sunucumuz uzakta olduğu için aradaki haberleşmenin güvenli olması önem taşıyor. Elbette bir kullanıcı adı ve şifre gerekmeli ama bu şifreyi de açık olarak gönderirsek yine de dosyalarımızı checkout ederken gönderdiğimiz şifreyi araya giren bir başkası çalıp aynı şifre ile kendisi dosyalarımıza erişebilir. İşte bu yüzden bağlantı ssl şifrelemesi ile sağlanmalıdır. SVN bir Apache Software Foundation (ASF) projesi olduğu için bekleneceği üzere apache web sunucusu ile gayet uyumlu şekilde çalışabilmektedir. Bu özelliklere sahip bir web sunucusunu ayarlamayı anlatacağım şimdi de.

Amazon sunucumuzda kurulu olan Ubuntu 14.04 işletim sistemi ile gelen apache 2.4 sürümü ile önceki 2.2 sürümüne göre kurulum ve kullanım açısından bazı farklar bulunuyor. Örneğin modüller ve ayarlar önce available dizinine konup sonra enabled dizininden bunlara ln -s komutu ile bir sembolik bağlantı oluşturularak kullanım sağlanıyor.

SVN Kurulumu ise apache sürümünden bağımsız olacaktır.

1) Öncelikle repository den svn ve apache için gerekli paketlerimizi kuruyoruz:

($ komut satırında promptu gösteriyor)
$ sudo apt-get install apache2 apache2-utils subversion libapache2-svn

(en son Y ve enter ile onaylamak gerekebilir)

2) SVN repository sinin yer alacağı yeni bir dizin oluşturuyoruz

$ sudo mkdir -p /svn/repos/ (-p aradaki dizinleri de oluşturuyor)

3) Yeni dizinimizin içine repo1 adında bir svn repository si oluşturuyoruz

$ sudo svnadmin create /svn/repos/repo1

4) SVN dizinin yetkileri sadece apachenin kullanıcısına göre ayarlanıyor

$ sudo chown www-data:www-data /svn/repos

5) Apache'nin gerekli kütüphaneleri kullanıma açılıyor

Bunun için apache dizin yapısından bahsetmem gerekiyor. Bu dizin yapısı sürümden sürüme fark edebiliyor. Örneğin daha önce Ubuntu 12.04'te kullandığım Apache 2.2 sürümünde conf-enabled ve conf-available dizinleri yoktu ama Apache'nin 2.4 sürümü ile birlikte gelmişler.

apache sürümümüzü öğrenmek için:

$ apache2 -version
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Jul 22 2014 14:36:39

$ ls -l /etc/apache2/
total 88
-rw-r--r-- 1 root root  7115 Jan  7  2014 apache2.conf
drwxr-xr-x 2 root root  4096 Sep  9 13:31 conf-available
drwxr-xr-x 2 root root  4096 Sep  9 13:34 conf-enabled
-rw-r--r-- 1 root root  1782 Jan  3  2014 envvars
-rw-r--r-- 1 root root 31063 Jan  3  2014 magic
drwxr-xr-x 2 root root 12288 Sep  9 13:28 mods-available
drwxr-xr-x 2 root root  4096 Sep  9 13:47 mods-enabled
-rw-r--r-- 1 root root   320 Jan  7  2014 ports.conf
drwxr-xr-x 2 root root  4096 Sep  9 13:28 sites-available
drwxr-xr-x 2 root root  4096 Sep  9 12:50 sites-enabled

bu komutu çalıştırdığınızda yukarıdakine benzer bir liste elde edeceğiz.

a) Yapmamız gereken aktifleştirmek istediğimiz özellikleri available klasörleri arasında bulup veya yoksa ekleyip sonra da ilgili enabled klasörü altında bunlara link koymak.

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/rewrite.load rewrite.load
$ sudo ln -s ../mods-available/ssl.load ssl.load
$ sudo ln -s ../mods-available/ssl.conf ssl.conf
$ sudo ln -s ../mods-available/socache_shmcb.load socache_shmcb.load

Bu noktaya geldiğimizde ssl özelliğini, sonrasında http isteklerin otomatik olarak https e yönlendirilmeleri için rewrite özelliğini etkinleştirmiş olduk. socache_shmcb ise ssl için gerekli.

şöyle bir görünüm elde etmiş olmalıyız:



b) SSL için kullanacağımız public private key ikisilisini oluşturuyoruz (Ben zaten sunucu bir yıl geçerli olacak diye 365 gün verdim sertifika geçerlilik süresini ama siz daha da uzatabilirsiniz geçerlilik süresini):

$ sudo mkdir /etc/apache2/ssl

Burada dikkat edilmesi gereken nokta sertifikayı oluştururken yazdığımız Common Name (CN) alanı ile aşağıda svn.conf dosyasındaki serverName değerlerinin aynı olması gerekli

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/svn.key -out /etc/apache2/ssl/svn.crt

Bu arada CA onaylı sertifika edinmek için de ticari amaçlı sitelerde https://letsencrypt.org/getting-started/ ya da kişisel siteniz için https://www.startssl.com/Validate adresini kullanabilirsiniz

Bu şekilde biri crt biri de key uzantılı iki dosya oluşturmuş olduk. Bu dosyalar ilk oluşturulduklarında varsayılan erişim yetkilerine sahiptir ve apache buna kızıp açılmayabilir. Çünkü key dosyamızı ele geçiren birisi kendisini biz olarak tanıtabilir ve bizi taklit edebilir. O yüzden yetkilerini kısıyoruz ki sadece apache erişebilir olsun.

$ sudo chown www-data:www-data /etc/apache2/ssl/* (sahibi apache kullanıcısı olsun)
$ sudo chmod 400 /etc/apache2/ssl/* (sadece sahip kullanıcı o da okuyabilsin yazamasın)

O da şu şekilde bir görünüme ulaştırmalı bizi:




c) SVN için gerekli ayarları svn.conf adını verdiğimiz yeni bir dosyaya koyuyoruz

$ sudo vi /etc/apache2/conf-available/svn.conf

dedikten sonra açılan vi editöründe aşağıdaki satırları olduğu gibi eklemek için önce i ye basıyoruz (insert için i):

<VirtualHost *:80>
        RewriteEngine on
        ReWriteCond %{SERVER_PORT} !^443$
        RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</VirtualHost>

<VirtualHost *:443>
  ServerName [sunucuadı].compute.amazonaws.com
    <IfModule mod_ssl.c>
        SSLEngine ON
        SSLCertificateKeyFile /etc/apache2/ssl/svn.key
        SSLCertificateFile /etc/apache2/ssl/svn.crt
    </IfModule>

  <Location /repos>
    DAV svn
    SVNListParentPath on
    SVNParentPath /svn/repos/
    AuthType Basic
    AuthName "SVN Yetkilendirmesi"
    AuthzSVNAccessFile /svn/repos/repo1/conf/authz
    AuthUserFile /etc/auth-file-svn
    Require valid-user

  </Location>

</VirtualHost>

Bunu yapıştırdıktan sonra önce Esc ye basıp insert kipinden çıkıyorz ve iki nokta üstüste tuşuna basıp harici komut kipine geçiyoruz

:wq

yazıp entera bastığımızda w ile değişiklikler kaydedilir, q ile de çıkılır.
Vi editörüne yabancıysanız bir iki uyarım olacak:
İlk açılışta komut kipindedir ve bastığınız tuşlar komut olarak algılanır. Yazı kipine geçmek için i (insert) a (append) gibi bir tuşa basmanız gerekir. Yazı kipinde de ok tuşları çok iyi desteklenmeyebilir. Oklarla bir yere gitmek istiyorsanız önce Esc ye basıp yazı kipinden komut kipine geri dönmeniz gerekebilir. Herhangi bir hareketi komut kipinde u 'ya basarak geri alabilirsiniz. Eğer geri döndüremedi iseniz ve çok karıştı ise şu şekilde hiç bir şey kaydetmeden çıkabilirsiniz:

:q!

 [sunucuadı] yerine kendi sunucunuzun adını yazmanız önemli

Yukarıdaki VirtualHost 80 portu yani http ile bağlananları https e yönlendirir. Alttaki VirtualHost içinde ise /repos ile başlayan bütün isteklerin SVN tarafından algılanmasını sağlar. SVN parametreleri arasında SVNParentPath Repository mizin olduğu yeri gösteriyor. Require valid-user ise güvenlik için apache'de tanımlanmış kullanıcıların sadece yetkilendirileceğini söylüyor.

Son olarak bu ayar dosyasının tanınması için enabled dizini içine bir kısayol oluşturuyoruz:

$ cd /etc/apache2/conf-enabled
$ sudo ln -s ../conf-available/svn.conf svn.conf

Son olarak şöyle bir görünüme ulaşmış olmalıyız:


Şimdi her şey hazır olduğuna göre apache sunucumuzu yeniden başlatıp çalışıp çalışmadığını görebiliriz:

$ sudo service apache2 restart

Herhangi bir hata görünmüyorsa şu adrese bağlanabiliyor olmalısınız

https://[sunucuadı].compute.amazonaws.com/repos/repo1/

Tabi güvenlik için kullanıcı adı ve şifre şart koştuğumuz için yetkili kullanıcıları da henüz tanımlamadığımızdan erişim izni verilmeyecektir.

Bu noktada kullanıcı adı şifre sormuyorsa tarayıcı kurulumunuzda bir sorun olabilir. Bunu anlamak için de /var/log/apache2 dizini altındaki log dosyalarına (özellikle error.log) bakarak hatayı çözmeniz gerekli.

SVN Erişimi için Kullanıcı Yetkilendirme

1) Kullanıcıların oluşturulması:

SVN kullanıcılarımız apache üzerinden geleceği için önce apache üzerinde kullanıcılarımızı tanımlıyoruz:

$ sudo htpasswd -c /etc/auth-file-svn kullanici1 (Şifreyi soracak)

$ sudo htpasswd /etc/auth-file-svn kullanici2 (-c dosya yoksa oluştursun diyeydi)



$ sudo htpasswd /etc/auth-file-svn kullanici3
$ sudo htpasswd /etc/auth-file-svn kullanici4

Girdiğimiz şifreler /etc/auth-file-svn dosyası içinde ve şifreli olarak duracak

2) Kullanıcıların Yetkilendirilmeleri

/svn/repos/repo1/conf dizini içinde yer alan authz dosyasında kullanıcı isimlerinin yetkileri tanımlanır. Bu sayede bazı kullanıcıların bazı dizinlere erişmesi engellenebilir.

Örnek olarak şöyle bir yetkilendirme dosyasına bakalım:

[groups]

proje1_grubu = kullanici1, kullanici2
proje2_grubu = kullanici2, kullanici3


[repo1:/]
# ozellikle belirtilmediyse kimsenin genel yetkileri olmayacak 
* =

# bu gurubun tum repo uzerinde okuma yetkisi olacak
@proje1_grubu = r

# Proje1 icin bu grubun hem okuma hem yazma yetkisi olacak
# Ama diger grubun hicbir yetkisi olmayacak 
[repo1:/Proje1]
@proje1_grubu = rw


# Proje2 icin bu grubun okuma ve yazma yetkisi olacak
# ve diger grubun genel okuma yetkisi oldugundan burayi da okuyabilecek
[repo1:/Proje2]
@proje2_grubu = rw
@proje1_grubu = rw
kullanici4 = r

Bu ayarlara göre apache üzerinden temel http tanılama ile kendini tanıtan kullanıcıların yetkileri şu şekilde olacak:


Kullanici Proje1 Proje2 Tüm Repo
Kullanici1 Okuma+Yazma Okuma+Yazma Okuma
kullanici2 Okuma+Yazma Okuma+Yazma Okuma
kullanici3 Okuma Okuma+Yazma Yok
kullanici4 Yok Okuma Yok

SVN Dosya Alışverişi ve Sürüm Yönetimi

Sunucu üzerindeki tüm ayarları tamamladıktan sonra artık dosya gönderip almaya başlayabiliriz demektir. Web tarayıcı ile dosyaları çekebiliriz ama sunucuya bir şeyler göndermek için en iyisi bir SVN istemcisi kullanmak olacaktır. Bunun için Windows ortamında TortoiseSVN ve Linux için KdeSvn'i tavsiye edebilirim. Yalnız dikkat etmeniz gereken en önemli şey istemcinin sürümü sunucumuzun sürümünden ileri olmasın ki sunucunun anlayamayacağı bazı yeni komutlar göndermeye kalkmasın. Yeni sürüm sunucu ise eski istemcileri destekleyecektir. 

$ svn --version
svn, version 1.8.8 (r1568071)
   compiled Aug 13 2014, 17:12:39 on x86_64-pc-linux-gnu


İlk başta repositorymiz boş olduğu için checkout ettiğimizde yalnızca boş bir dizin gelecektir karşıdan. Sonrasında ise bu dizinin içinde yapılacak her tür değişikliği SVN sunucumuzla senkronize olurken yansıtıp saklayabiliriz. Bizim gönderdiğimiz değişiklikleri de yine kullanıcı adı ve şifresi olan başka geliştiriciler yine senkronize olurken kendi bilgisayarlarına alabilirler ve böylece kod paylaşımı ve entegrasyonu kolaylaşır. SVN bu tarz kod farklılıklarını ayırdedip gösteren ve gerektiğinde aynı dosyadaki farklı geliştiricilerin değişikliklerini birleştirebilecek araçlarla birlikte gelir. TortoiseSVN özellikle merge işleminde oldukça başarılı ise de örneğin Eclipse plugini olan m2e'nin bazen dosyaları karşılaştırırken kafası karışabilmekte. Bu durumlarda da Windows'ta Winmerge ve Linux'ta Meld uygulamarını kullanarak farkları daha net görüp sonra bir dosya üzerinde birleştirme yapmak gayet kolay alıştıktan sonra. Böylece birden çok geliştiricinin aynı dosyalar üzerinde çalışması artık kabus olmaktan çıkacak ve bir sisteme oturacaktır.

Eğer mevcut proje dosyalarınızı svn e eklemek isterseniz yapmanız gereken öncelikle proje dizininizi checkout dizini altına kopyaladıktan sonra

$ svn add * --force

diyerek bunları svn e göndermeye hazır hale getirmek gerekli. (Bu işlemi tortoise svn gibi bir grafik arayüzden de yapabilirsiniz)

Daha sonra

$ svn --username kullanici.adi -m "commit yorumunu buraya yazin" diyerek dosyalarınızı gerçekten svn sunucuya gönderebilirsiniz.


Son olarak Amazon'un bu ücretsiz hizmetinden memnun kalırsanız yaklaşık yıllık 105$ gibi bir ücret karşılığı aynı hizmeti almaya devam edebilirsiniz ücretsiz üyeliğiniz bittiğinde. Allahtan ne işletim sistemi ne web sunucusu ne de SVN ücretli. Açık kaynaklı yazılımın güzelliği burada. Amazon'un talep ettiği miktar ise aynı sunucuyu kendi evimizde kuracağımız durumda harcayacağı yıllık elektrik bedeline yakın diyebilirim. Profesyonel güvenlik ve bakım desteği de cabası.

Yorumlar

Popüler Yayınlar