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環境で同様のエントリは日本語だと思いのほか少なかったので、
備忘録もかねて残しておきます。
では。