AWSのUbuntu12.0.4 LTSインスタンスにApache(Passenger)+Redmine+Gitを構築した記録

    UP事業部の里山です。
    今年も宜しくお願いいたします。
    年末年始ですが、家にいる時間は特に見たいテレビもなく、
    暇を持て余すのもアレだったので調べ物をしていました。

    諸事情によりGitの構築が必要になったので、
    AWSのマイクロインスタンスを使って試してみましたので、ログを共有します。

    Ubuntuで構築したのでRetHat系OSとは違う方言がいくつかありますが、
    基本的な流れは同じではないかと思います。
    以下長文となりますが、これから試そうとしている方は参考にしてみてください。

    【前提条件】
    ■ホスティング
    ・AWSのt1.microインスタンス(Ubuntu 12.0.4 LTSパッケージ)

    ■ソフトウェア構成
    ・OS:Ubuntu 12.0.4 LTS
    ・Webサーバー:Apache(Passenger)
    ・DB:MySQL
    ・BTSとリポジトリ:Redmine + Git
    ■その他特記事項
    ・Redmine、MySQL、Gitは全て同一サーバー上での構築
    ・GitへのPush/Clone等はhttpプロトコルでのRedmineアカウントでの認証とする
    ・URL構成は以下のようになることを想定
     Redmine:http://domain.com/redmine/projectname
     Git:http://domain.com/git/projectname
    ・公開ディレクトリは/home/projects/以下とする(ここにRedmineとGitのサブディレクトリを作成)
    ・httpsはとりあえず無しなのでSSL周りの作業は省略
    ・Redmineで添付ファイルを使うことは考慮しない
    ・構築時の利用ユーザーはubuntuユーザー(AWSでUbuntuインスタンスを立ち上げた時のデフォルト)とし、
    ルートユーザーや他ユーザーで操作する場合は全てsudoを利用

    【主な手順】
    インスタンス立ち上げ(省略) -> Redmineの構築 -> Gitの構築 -> RedmineとGitの連携

    【Redmineの構築】
    ■準備

    とりあえずアップデート。

    $ sudo apt-get update
    $ sudo apt-get upgrade
    

    ■依存関係があるパッケージのインストール

    apt-getでインストール。
    Postfixで聞かれてくるconfigrationはとりあえずinternet site(デフォルト)で設定しました。

    $ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev postfix
    

    ■Ruby1.9のインストール(1.8はとりあえず削除)

    Ruby1.8より1.9の方が色々良いらしい(速さとか?)のでインストール。
    Ruby2.0でも良いそうですが、試してません。
    http://www.redmine.org/projects/redmine/wiki/RedmineInstall

    $ sudo apt-get remove ruby1.8
    $ mkdir /tmp/ruby && cd /tmp/ruby
    $ curl --progress http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p429.tar.gz | tar xz
    $ cd ruby-1.9.3-p429
    $ ./configure
    $ make
    $ sudo make install
    $ sudo gem install bundler
    

    ■apache、Mysql、phpのインストール

    apt-getでインストールするだけ。

    $ sudo apt-get install -y apache2 mysql-server mysql-client libmysqlclient-dev php5-mysql php5 php5-cgi libapache2-mod-php5 php5-common php-pear
    

    ■MySQL関係の設定

    設定ファイルを編集する。

    $ cd /etc/mysql/conf.d/
    $ sudo vi characterset.cnf
    

    キャラセットの設定です。UTF-8で。

    [client]
    default-character-set=utf8
    [mysqld]
    character-set-server=utf8
    

    確認。

    $ sudo service mysql restart$ mysql -u root -p
    $ show variables like 'character_set%';
    

    Redmine用のデータベースとユーザー作成。

    $ create database redminedb default character set utf8;
    $ grant all privileges on redminedb.* to redmineuser@localhost identified by 'redmine';
    

    ■Redmineのダウンロードとインストール

    以下の例では、バージョンアップで対応しやすいように
    /home/redmine以下に各バージョンのモジュール一式を丸ごと格納。
    その後、公開ディレクトリからシンボリックリンクで参照するよう対応。
    (シンボリックリンクの設定は後述)

    $ mkdir /tmp/redmine && cd /tmp/redmine
    $ wget http://www.redmine.org/releases/redmine-2.4.2.tar.gz
    $ tar zxvf redmine-2.4.2.tar.gz
    $ sudo mkdir /home/redmine
    $ sudo mv redmine-2.4.2 /home/redmine/
    

    ■Redmineの設定

    データベースの接続先を設定。

    $ cd /home/redmine/redmine-2.4.2/config
    $ vi database.yml
    

    以下を追加。

    production:
      adapter: mysql2
      database: redminedb
      host: localhost
      username: redmineuser
      password: redmine
      encoding: utf8
    

    依存パッケージのインストール。

    $ cd /home/redmine/redmine-2.4.2
    $ sudo apt-get install -y libmagickwand-dev libmysqld-dev
    $ sudo bundle install --without development test postgresql sqlite
    

    マイグレートの実行して色々生成。

    $ bundle exec rake generate_secret_token
    $ RAILS_ENV=production bundle exec rake db:migrate
    

    ■Passengerのインストールと設定

    Passenger本体とApache用のモジュールをインストール。

    $ sudo gem install passenger --no-rdoc --no-ri
    $ sudo apt-get install -y apache2-threaded-dev libapr1-dev libaprutil1-dev
    $ sudo a2enmod headers
    $ sudo passenger-install-apache2-module
    

    ちなみに、今回使った環境(AWS/t1.microのスペックの問題?)だと、swap領域が云々の警告が出たため、
    passenger-install-apache2-moduleを一度中断して、以下を実行しました。

    $ sudo dd if=/dev/zero of=/swap bs=1M count=1024
    $ sudo mkswap /swap
    $ sudo swapon /swap
    

    その後、passenger-install-apache2-moduleを再実行。

    ■apache関係の設定(Passenger)

    ドキュメントルート等の設定を変更(/home/projects/)。
    UbuntuのApacheでは、以下がhttpd.confに該当するらしいです。

    $ sudo vi /etc/apache2/sites-available/default
    

    Redmine用の設定ファイルを作成。

    $ sudo vi /etc/apache2/sites-available/redmine
    

    以下内容を追加。

    # Passengerの基本設定
    LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-4.0.31/buildout/apache2/mod_passenger.so
    PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-4.0.31
    PassengerDefaultRuby /usr/local/bin/ruby
    
    # サブディレクトリで公開する場合、ベースとなるURIの作成
    RailsBaseURI /redmine
    

    上記設定のうち、最初の3項目は環境によって異なります。
    以下コマンドを実行すると、設定すべき内容が表示されます。

    $ sudo /usr/local/bin/passenger-install-apache2-module --snippet
    

    site-availableに入っているredmineの設定を有効にする。

    $ sudo a2ensite redmine
    

    公開ディレクトリを作成し、Redmineに対してシンボリックリンクを張る。

    $ sudo mkdir /home/projects
    $ sudo ln -s /home/redmine/redmine-2.4.2/public /home/projects/redmine
    

    公開ディレクトリのパーミッションを設定。
    UbuntuのApache実行ユーザーはwww-dataというユーザーになります。
    (RedHat系だとapacheですかね)

    $ sudo adduser ubuntu www-data
    $ sudo chown -R www-data:www-data /home/projects
    $ sudo chmod -R g+rw /home/projects
    

    configtestで設定確認を行い、Syntax OKなら再起動する。

    $ apachectl configtest
    $ sudo service apache2 restart
    

    以上でRedmineの設定は完了です。
    うまくできていれば、http://domain.com/redmineでアクセスできるようになっているはずです。

    【Gitの構築】

    ■Gitのインストール

    apt-getでインストールするだけ。

    $ sudo apt-get install -y git-core git-daemon-run
    

    ■公開用ディレクトリ(リポジトリ)の設定

    httpでRedmine認証してアクセスするので、
    Apacheユーザーであるwww-dataを所持者にして作成後、権限を調整する。

    $ sudo -u www-data mkdir /home/projects/git
    $ sudo -u www-data chmod -R go+xs .
    

    ■デーモンの設定変更と再起動

    デーモンの設定を変更する。

    $ sudo vi /etc/sv/git-daemon/run
    

    最終行を以下のように変更。

    変更前:--base-path=/var/cache /var/cache/git
    変更後:--base-path=/home/projects/git --export-all --enable=receive-pack
    

    デーモンの再起動。

    $ sudo sv restart git-daemon
    

    以上でGitのインストールは完了です。
    ただし、この時点ではRedmineと紐付られていません。

    【RedmineとGitの連携】

    ■依存関係があるライブラリのインストール

    apt-getでインストールするだけ。

    $ sudo apt-get install -y libapache2-mod-auth-mysql libdigest-sha-perl libapache-dbi-perl libdbd-mysql-perl
    

    ■redmine.pmのインストール

    インストールといいつつも、実際はシンボリックリンクで設定しているだけ。
    Redmineのバージョンアップに対応しやすいように。
    redmine.pmはRedmineに含まれており、GitやSubversionでRedmine認証する場合に使うモジュールです。
    Perlから参照される為、Perlの各種ライブラリを格納するディレクトリから張る。

    $ sudo mkdir -p /usr/lib/perl5/Apache/Authn
    $ sudo ln -s /home/redmine/redmine-2.4.2/extra/svn/Redmine.pm /usr/lib/perl5/Apache/Authn/Redmine.pm
    

    ■Apacheの設定(Git用)

    Git用の設定ファイルを作成。

    $ sudo vi /etc/apache2/sites-available/gitrepo
    

    以下設定を追記。

    PerlLoadModule Apache::Authn::Redmine
    
    SetEnv GIT_PROJECT_ROOT /home/projects/git
    SetEnv GIT_HTTP_EXPORT_ALL
    ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
    
    <directory /usr/lib/git-core/>
      <files "git-http-backend">
        Options +ExecCGI
      </files>
    </directory>
    
    <LocationMatch /git>
      Order allow,deny
      Allow from all
    
      PerlAccessHandler Apache::Authn::Redmine::access_handler
      PerlAuthenHandler Apache::Authn::Redmine::authen_handler
      AuthType Basic
      AuthName Git
      AuthUserFile /dev/null
      Options +Indexes -ExecCGI -Includes
    
      Require valid-user
    
      # for Redmine Authentication
      RedmineDSN "DBI:mysql:database=dbredmine;host=localhost"
      RedmineDbUser "userredmine"
      RedmineDbPass "redmine"
      RedmineGitSmartHttp yes
    </LocationMatch>
    

    モジュールとconfの有効化してApacheを再起動する。

    $ sudo a2enmod auth_mysql
    $ sudo a2ensite gitrepo
    $ sudo apache2ctl configtest
    $ sudo service apache2 restart
    

    ■Gitリポジトリの作成

    以下のように作成。
    Redmineのプロジェクト識別子と同じ名前にすること(多分) 。

    $ sudo -u www-data mkdir /home/projects/git/test
    $ cd /home/projects/git/test
    $ sudo -u www-data git init --bare --shared
    $ sudo -u www-data git config http.receivepack true
    $ sudo -u www-data git update-server-info
    $ sudo -u www-data chmod -R go+xs .
    

    上記作業後にRedmineプロジェクト側からGitリポジトリとの関連づけ設定を行う。
    識別子は任意で、リポジトリのパスは/home/projects/git/test(サーバー内のフルパスを指定)のように指定。

    ■クライアント側からgitへの接続(ローカルにファイルを作ってPushまで)

    普通にローカルリポジトリを作成してpushとかcloneをする。

    $ git init
    $ touch README
    $ git add README
    $ git commit -m 'Initial commit'
    $ git remote add origin http://domain.com/git/test
    $ git push origin master
    

    以上でRedmineとGitの連携設定は完了です。
    うまくできていれば、http://domain.com/git/testにリクエストするとRedmineのID/PASSによる認証が走り、
    cloneやpushができ、Redmine側からコミットログも参照できるはずです。

    長々と書きましたが(残っていたメモのコピペですが)、
    一般的なサーバー構築の知識があれば大してハマるポイントは無いです。

    僕みたいな無知な人間がやった結果、
    pushするときにRedmine認証が何故かhttp 500エラーを返す問題に悩まされ、
    原因としてはgit-http-backendのCGI実行権限が無かったという、
    どうしようもない所でハマりました。
    (何故かこれの解決方法がWebにほとんどなく2日ほどハマりました)

    Unicorn+Nginx環境でRedmine+Gitを構築するエントリはちらほらありますが、
    Apache環境で同様のエントリは日本語だと思いのほか少なかったので、
    備忘録もかねて残しておきます。

    では。