27 Mart 2012 Salı

Redmine & Gitosis

Redmine , Ruby on Rails çatısı(framework) kullanılarak yazılmış bir proje takip sistemidir. Redmine bir çok özelliğinin yanı sıra svn, git gibi sürüm kontrol sistemleri ile birlikte çalışabilmektedir. Burada Ubuntu 10.04 server üzerinde Redmine ile bir Github klonu oluşturmayı  anlatacağım.

Ön hazırlıklar:

** İlk olarak sunucunun hostname'ini kontrol ediyoruz.
    /etc/hosts dosyasının ilk satırlarında şunlar olmalı

127.0.0.1       localhost
127.0.1.1       projetakip  (sunucuya projetakip ismini verdim)

   ya da   /etc/hostname dosyasına

 projetakip

   yazarak sunucuya bir FQDN (Fully Qualified Domain Name) vermiş oluyoruz.

   Değişikliklerin uygulanması için:
sudo hostname -F /etc/hostname

   komutunu çalıştırıyoruz.

   Ayarları tekrar kontrol etmekte fayda var:

ping projetakip

** Sunucuya yerel ağdan erişmek için öncelikle yerelde static ip tanımlayıp daha  sonra, /etc/hosts sonuna
192.168.1.241      projetakip
yazıyoruz. Bunu yapmamızın sebebi, Redmine gitosis eklentisinde kodun içinde direk sunucunun ip'sini yazmak yerine projetakip yazmaktır.

Bunu şu şekilde gerçekleştirmenizi öneririm:

echo 192.168.1.241 projetakip | sudo tee -a /etc/hosts > /dev/null

** sudo yapılandırması
sudo visudo
Komutunu kullanarak sudoers dosyasını açıp en sonuna şu satırı ekliyoruz:

%admin ALL=(ALL) ALL
Root olmayan bir sistem kullanıcısına sudo hakkı vermek için bu kullanıcıyı admin grubuna ekliyoruz.

** Gerekli paketler
sudo apt-get update
sudo apt-get install apache2 mysql-server git-core python-setuptools git-core build-essential acl

** ACL mount seçenekleri
Acl yapılandırmasını yapmamızın sabebi, Redmine ve Git aralarında haberleşirken erişim izinlerinden kaynaklanan sorunlar ile karşılaşmamaktır.

Eğer Redmine'ın kurulacağı /opt dizini root klasörüyle aynı diskte ise  /etc/fstab dosyasının içeriğini aşağıdaki gibi düzenliyoruz.

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/mapper/projetakip-root /               ext4    acl,errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=24f32992-b428-42a1-b632-fd68c77f5470 /boot           ext2    acl,errors=remount-ro        0       2
#/dev/mapper/projetakip-swap_1 none            swap    sw              0       0
/dev/mapper/cryptswap1 none swap sw 0 0

Bunu yaptıktan sonra sunucuyu yeniden başlatmak gerekiyor.
Eğer /opt klasörü başka bir diskte ise:

mount -o remount,acl /opt

komutuna benzer bir komut kullanmamız gerekir.


Eğer,
mount | grep acl
komutunun çıktısı   
/dev/sda1 on / type ext4 (rw,acl,errors=remount-ro)
ise yapılandırmayı doğru yaptığımızı anlıyoruz.

** Python Paketleri
  Python paketlerini indirmenin en kolay yolu bence pip aracıdır.
  sudo apt-get install pip
  ile kuruyoruz.

  Daha sonra pip ile virtualenv paketini kuruyoruz.
  sudo pip install virtualenv
  Virtualenv farklı python sürümlerini kullanabilmemize olanak verir.

Redmine Kurulumu:

** Redmine kullanıcısını oluşturuyoruz,
sudo adduser --system --shell /bin/bash --gecos 'Redmine Administrator' --group --disabled-password --home /opt/redmine redmine

** Bitnami Redmine Stack kurulumu
Önce mysql ve apache'nin kapalı olduğundan emin olmamız gerekiyor:

sudo /etc/init.d/apache2 stop && sudo /etc/init.d/mysql stop

Bitname Redmine Stack installer'ı indiriyoruz.

wget http://bitnami.org/files/stacks/redmine/0.9.3-0/bitnami-redmine-0.9.3-0-linux-installer.bin
 
chmod 755 bitnami-redmine-0.9.3-0-linux-installer.bin
 
sudo -u redmine ./bitnami-redmine-0.9.3-0-linux-installer.bin 

komutuyla kurulumu gerçekleştiriyoruz.

Redmine kurulumu tamamlandı, http://server-address:8080/redmine/
şeklinde Redmine'a erişebiliriz.

Bitnami use_redmine adında bir script sunar. Bu script  ile Redmine yönetimi sağlanır

cd ~redmine
sudo -H -u redmine ./use_redmine

bu komut ile bir shell açılır. Herhangi bir Redmine yönetimi işleminden önce bu komut çalıştırılmalıdır.

Ayrıca Redmine stack servislerini yönetmek için ~redmine/ctlscript.sh  scripti kullanılır. Tabi ki bu da
sudo -H -u redmine ./use_redmine
komutuyla shell e düştükten sonra çalıştırılır.

** Redmine'ı sistem servislerini kullanacak şekilde yapılandırmak

Öncelikle şuan çalışmakta olan tüm Bitnami stack servislerini kapatın. 

sudo -H -u redmine /opt/redmine/use_redmine
./ctlscript.sh stop
exit 

Redmine veri tabanını Mysql kullanarak oluşturuyoruz:

sudo /etc/init.d/mysql start
mysqladmin --user=root --host=localhost create redmine

Redmine veritabanı yapılandırmalarını tekrar düzenlemek gerekiyor.
 ~redmine/apps/redmine/config/database.yml dosyasının "production" bölümünü şu şekilde düzenliyoruz:

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: root     //mysql kullanıcı adı
  password:          // mysql kullanıcı parolası
  socket: /var/run/mysqld/mysqld.sock
Daha sonra rake aracıyla veritabanını göç ettiriyoruz. Bunu yapmadan önce  ~redmine/apps/redmine/ dizinine gitmek gerekiyor. Şu komutları çalıştırıyoruz:
 
sudo -H -u redmine ./use_redmine
cd apps/redmine
rake db:migrate RAILS_ENV=production
exit 

Apache2 nin Mongrel Cluster'a erişebilmesi için  ~redmine/apps/redmine/conf/redmine.conf dosyasında
 
ProxyPass /redmine balancer://redminecluster
ProxyPassReverse /redmine balancer://redminecluster

<Proxy balancer://redminecluster>
  BalancerMember http://127.0.0.1:3001/redmine
  BalancerMember http://127.0.0.1:3002/redmine
  Order deny,allow
  Allow from all
</Proxy>
şeklinde değişiklik yapmak gerekmektedir.

Apache2 sunucusunun yapılandırılması:
 
sudo a2enmod proxy*
echo Include /opt/redmine/apps/redmine/conf/redmine.conf | sudo tee /etc/apache2/conf.d/redmine > /dev/null

sudo /etc/init.d/apache2 start
sudo -H -u redmine ./use_redmine
./ctlscript.sh start redmine


Böylece Redmine, Apache2 ve Mysql ile çalışabilecek şekilde kurulmuş olur.


** Öntanımlı Redmine yapılandırmalarının yüklenmesi:
http://<server-fqdn>/redmine/ adresinden Redmine'nın web arayüzüne erişerek admin kullanıcı bilgileriye giriş yapıp öntanımlı yapılandırmalar yüklenmelidir.


** Redmine ve Gmail ayarlanması
 Redmine'nın, projelerdeki her değişikliği mail ile gönderebilmesi için email ayarlarının yapılması gerekmektedir. Bunu sunucuda ek bir servis çalıştırmak yerine Gmail kullanarak yapacağız. Sunucumuzun domain name'i bir mail hesabı olduğunu düşünelim. Google'ın Smtp sunucuları authentication için TLS tipini kullanmaktadır. Redmine'da bunun için bir eklenti mevcut. Öncelikle bu eklentiyi kuruyoruz:

sudo -H -u redmine ./use_redmine
cd ~/apps/redmine
script/plugin install git://github.com/collectiveidea/action_mailer_optional_tls.git


Sonra ~redmine/apps/redmine/config/email.yml dosyasını oluşturuyoruz.

Bu dosyanın içeriğini:

production:
  delivery_method: :smtp
  smtp_settings:
    tls: true
    address: "smtp.gmail.com"
    port: 587
    domain: "gmail.com"
    authentication: :plain
    user_name: "projetakip@gmail.com"
    password: "XXXXXXXX" 
 şeklinde düzenliyoruz.

Redmine'ı yeniden başlatıyoruz:

cd ~ 
./ctlscript.sh restart redmine 

Gitosis Kurulumu:
 Gitosis, Git depolarına erişimi yöneten küçük bir yazılımdır.
** Git kullanıcısının oluşturulması:
 
sudo adduser --system --shell /bin/bash --gecos 'Git Administrator' --group  --disabled-password --home /opt/gitosis git

** Ssh key pair:
    Gitosis erişimi public/private anahtar ikilisi ile yönetilmektedir. Her kullanıcı kendi ssh public/private anahtarını oluşturur. Bir git işlemi yapılacağı zaman bu anahtar çiftleri ile yetkilendirme yapılır. Gitosis authorized_keys'e bakarak public anahtara izin verir ya da engeller.
   Öncelikle gitosis için ana anahtar ikilisini oluşturmamız gerekmektedir:
sudo -H -u git ssh-keygen -t dsa
   
** Virtualenv oluşturma:
    Bunu yapmamızın sebebi sistemdeki mevcut python yapısını bozmadan gitosis için uygun python ortamının oluşturulması.
sudo -u git virtualenv ~git/virtualenv
** Gitosis kurulumu:
        sudo -u git ~git/virtualenv/bin/pip install git+git://eagain.net/gitosis.git 
        echo "source \$HOME/virtualenv/bin/activate" | sudo -u git tee -a ~git/.bashrc > /dev/null
** Gitosis deposunu oluşturmak:
sudo -u git cat ~git/.ssh/id_dsa.pub | sudo -H -u git ~git/virtualenv/bin/gitosis-init


Redmine Gitosis Eklentisi Kurulumu:
 **
 sudo -H -u redmine ~redmine/use_redmine
 gem install lockfile inifile
 cd ~/apps/redmine
 script/plugin install git://github.com/rocket-rentals/redmine-gitosis.git
 ** Gitosis yapılandırması:
    *  ~redmine/apps/redmine/vendor/plugins/redmine-gitosis/lib/gitosis.rb dosyasını şu şekilde düzenliyoruz:
      require 'lockfile'
      require 'inifile'
      require 'net/ssh'
      
      module Gitosis
     
     # server config  
   
      GITOSIS_URI = 'git@projetakip:gitosis-admin.git'
      GITOSIS_BASE_PATH = '/opt/gitosis/repositories/'
     
      # commands
      
      ENV['GIT_SSH'] = SSH_WITH_IDENTITY_FILE = File.join(RAILS_ROOT, 'vendor/plugins/redmine-gitosis/extra/ssh_with_identity_file.sh')

 GITISIS_URI , GITOSIS_BASE_PATH ve ENV['GIT_SSH'] değişiklik istemektedir.
*     ~redmine/apps/redmine/vendor/plugins/redmine-gitosis/extra/ssh_with_identity_file.sh dosyasının içeriği ide şu şekilde olmalı:
#!/bin/bash
LD_LIBRARY_PATH=""
exec ssh -i `dirname $0`/ssh/private_key "$@"
*
sudo -H -u redmine ~redmine/use_redmine
ssh projetakip 
Dedikten sonra projetakip'i knowhosts'ta eklemek gerekiyor. Parola sorma kısmına geldiğinde ctrl+c deyip çıkıyoruz.

* Migrate Plugin
sudo -H -u redmine ~redmine/use_redmine
rake db:migrate_plugins RAILS_ENV=production
cd
./ctlscript.sh restart redmine
exit 
* 
sudo -u redmine rm ~redmine/apps/redmine/vendor/plugins/redmine-gitosis/extra/ssh/private_key
sudo -u redmine ln -s ~git/.ssh/id_dsa ~redmine/apps/redmine/vendor/plugins/redmine-gitosis/extra/ssh/private_key
sudo setfacl -m user:redmine:r-x,mask:r-x ~git/.ssh
sudo setfacl -m user:redmine:r--,mask:r-- ~git/.ssh/id_dsa
  
 Daha sonra,
sudo -u redmine cat ~redmine/apps/redmine/vendor/plugins/redmine-gitosis/extra/ssh/private_key
 komutunun çıktısı:
  
-----BEGIN DSA PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
-----END DSA PRIVATE KEY-----
gibi olmalıdır.

Son olarak,

        sudo setfacl -m default:user::rwx,default:group::r-x,default:other:---,default:user:redmine:rwx,default:mask:rwx ~git/repositories

komutunu çalıştırıyoruz.

Redmine'a admin kullanıcısıyla giriş yapıldıktan sonra redmine_gitosis eklentisinin aktif olduğundan emin olun.

Redmine & Gitosis kurulumu bu şekilde tamamlanmış oluyor.

Ancak Redmine Mongrel Cluster kullanıldığı zaman daha hızlı çalışmakta. Bunun için yukarıda anlatılanlara ek olarak [1] adresinden faydalanılabilir.

Kaynak: 
http://xdissent.com/2010/05/04/github-clone-with-redmine/