Tuesday, 10 December 2013

Git Projemizi Apache ile Yönetelim (OSX)

Arayış

github veya başka bir sunucu kullanmak istemiyorum, ihtiyacım o ölçüde değil ama iki üç kişi projemizi de yönetelim istiyorum. Yani git'i local olarak kullanmak işimi çözmüyor. SSH ile yönetim de hoşuma gitmiyor, yok işletim sistemi üzerinde kullanıcı yaratmalar, falanlar, filanlar. Araştırdım, aradım, taradım bilgiyi http://www.pkgbox.org/wordpress/2011/08/setting-up-a-git-server-on-macos-x-lion/ burada buldum. Fakat şimdi baktım, bu yazı da yerinde yok. Neyse ben bilgileri kurtardım. Özetle apache server ile git projelerimizi yönetebileceğiz.

Bir Kereye Mahsus

apache server OS X üzerinde zaten kurulu geliyor. Yani ohhhh mis.

htpasswd Dosyası

git projelerimize erişim için kullanıcılar kullanacağız, bunun için bir adet kullanıcı şifreleri dosyası lazım olacak, oluşturalım: 

sudo touch /etc/apache2/other/htpasswd-git

Kullanıcı Grup Dosyası

Kullanıcı gruplarımız için de bir dosyaya ihtiyacımız olacak, onu da oluşturalım: 

sudo touch /etc/apache2/other/htgroup-git

DavLock

git projelerimizi sadece okumayacağız, ayrıca yazma da yapacağız, bunun için DavLock sistemi kullanılacak, onun için aşağıdaki komutları çalıştırmalıyız: 

sudo mkdir -p /var/www/DavLock
sudo chown _www:_www /var/www/DavLock

İlk satırda klasör yaratıyoruz, ikinci satırda klasörün haklarını veriyoruz. 

Apache Config Dosyası

Apache'nin git projelerimizi anlamasını sağlamamız için de bir dosyaya ihtiyacımız var. Haydi, onu da yaratalım:

sudo touch /etc/apache2/other/gitrepo.conf

Sonra bu dosyanın içine ilk tanımlamamızı yapmamız gerekiyor. Ben projelerimi

/Library/WebServer/Documents/repo

altında tutuyorum. Dolayısı ile repo klasörü için bir tanımlama yapmam gerekli, ayrıca DavLock sistemi için de bir satır ekliyoruz: (Bu arada ben vim kullanıyorum, siz elbette istediğiniz text editörü kullanmakta özgürsünüz, yani istediğiniz sorudan başlayabilirsiniz)

DavLockDB "/var/www/DavLock/Lock"
  
  <Directory /Library/WebServer/Documents/repo>
      DAV On
      Deny from all
      AuthType Basic
      AuthName "Area51 git repositories"
      AuthUserFile /etc/apache2/other/htpasswd-git
      AuthGroupFile /etc/apache2/other/htgroup-git
  </Directory>

Bir Aşamanın Sonu

Evet, bir kereye mahsus yaptığımız işlemlerimiz bitti. Ancak işletim sistemini yeniden kurarsanız falan apache'yi yeniden yapılandırmanız gerekecektir, o zaman bu aşamayı tekrar yaparsınız. Artık gelelim git projemizi oluşturmaya :)

git Projemizi Yaratalım

Proje klasörünü yaratıyoruz. Örnek proje ismi olarak myproject kullanıyorum.

cd /Library/WebServer/Documents/
sudo mkdir -p repo/myproject.git

Git ile projeyi oluşturuyoruz:

cd repo/myproject.git/
sudo git init --bare

Şu anda projemiz oluştu. Fakat bu hali ile web server üzerinden sadece okuma yapabilir durumda. Biz server üzerinden yazma da yapmak istiyoruz. Yani commit yapacağız, push yapacağız v.b.. Bunun için post-update hook özelliğini açmamız gerekiyor. 

sudo mv hooks/post-update.sample hooks/post-update 
sudo chown -R _www:_www /Library/WebServer/Documents/repo/myproject.git 
sudo -u _www hooks/post-update 

Sadece okuma yapabilecek ve hem okuma hem de yazma yapabilecek iki kullanıcı yaratıyoruz.

sudo htpasswd /etc/apache2/other/htpasswd-git just_read
sudo htpasswd /etc/apache2/other/htpasswd-git read_and_write

Kullanıcı grubu dosyamıza da kim sadece okuma yapacak, kim hem okuma hem yazma yapacak belirtiryoruz.

sudo vim /etc/apache2/other/htgroup-git

dosyayı açtık içine aşağıdaki satırları ekleyelim:

myproject-reader:just_read read_and_write
myproject-writer:read_and_write

Geldik Apache configuration ayarlarını yapmaya.

sudo vim /etc/apache2/other/gitrepo.conf 

Dosyayı açtık, şimdi içine projemiz için gereken satırları ekliyoruz:
  
<Directory /Library/WebServer/Documents/repo/myproject.git>
    Allow from all
    Order allow,deny
    <Limit GET>
        Require group myproject-reader
    </Limit>
    <Limit GET PUT POST DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
        Require group myproject-writer
    </Limit>
</Directory>

İşlemlerimiz bitti. Şimdi Apache'yi yeniden başlatabiliriz. Öncelikle System Preferences altından Sharing kısmına gidip Web Sharing'in seçili olduğundan emin oluyoruz. Daha sonra

sudo apachectl restart 

komutu ile Apache'yi yeniden başlatıyoruz. Artık sistemimiz kullanıma hazır.  İstemci tarafına gidelim.

git clone http://read_and_write@localhost/repo/myproject.git

Tahmın edersiniz localhost yerine makine ismi (mesela osman.local) veya ip adresi gelebilir.

Mutlu Kodlamalar :)


Not: Ben bu yazıyı uzun zaman önce yazmıştım ama yayınlamamıştım, şimdi baĞzı değişiklikler yaptım ve tahmin edersiniz test edemedim, bir terslik olursa lütfen küfür etmeyin, buraya yazın, hallederiz :)

Volkan Özyılmaz