UbuntuにRedmine2.5をインストールする手順

Vagrant 上の Ubuntu 13.10 に Redmine をインストールしたので手順をメモしておきます。

redmine.org で紹介されているインストール方法を参考にしています。
RedmineInstall

導入バージョン

  • Ruby 1.9.3
  • Redmine 2.5 (Stable)
  • Rails 3.2
  • Apache 2.4.6
  • Passenger 4.0.46

更新可能な全パッケージを更新しておく

sudo apt-get update 
sudo apt-get upgrade

必要な関連パッケージをインストール

ImageMagick はガントチャートの表示やエクスポートで使用されます。

sudo apt-get install imagemagick libmagickwand-dev
sudo apt-get install subversion
sudo apt-get install git-core git
sudo apt-get install ruby1.9.3

MySQL もインストールされていなければしておきます。途中で root のパスワードを聞かれると思います。

sudo apt-get install mysql-server mysql-client

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

MySQL にログインして作成します。

mysql -uroot -p

CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;

Redmine 本体のダウンロードと配置

今回は /var/www/redmine に展開します。

cd /var/www
wget http://www.redmine.org/releases/redmine-2.5.2.tar.gz
tar zxvf redmine-2.5.2.tar.gz
mv redmine-2.5.2 redmine
rm redmine-2.5.2.tar.gz

Redmine の動作に必要な関連パッケージをまとめてインストール

Bundler がインストールされていなければしておきます。

gem install bundler

Redmine を展開した先のアプリケーションルートディレクトリに Gemfile があるので、これを使って Bundler でまとめてインストールします。

cd /var/www/redmine
bundle install --without development test

色々インストールされていきます。

Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.1.1
Installing i18n 0.6.11
Installing multi_json 1.10.1
Installing activesupport 3.2.19
Installing builder 3.0.0
Installing activemodel 3.2.19
Installing erubis 2.7.0
Installing journey 1.0.4
Installing rack 1.4.5
Installing rack-cache 1.2
Installing rack-test 0.6.2
Installing hike 1.2.3
Installing tilt 1.4.1
Installing sprockets 2.2.2
Installing actionpack 3.2.19
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing treetop 1.4.15
Installing mail 2.5.4
Installing actionmailer 3.2.19
Installing arel 3.0.3
Installing tzinfo 0.3.40
Installing activerecord 3.2.19
Installing activeresource 3.2.19
Installing awesome_nested_set 2.1.6
Using bundler 1.6.3
Installing coderay 1.1.0
Installing rack-ssl 1.3.4
Installing json 1.8.1
Installing rdoc 3.12.2
Installing thor 0.19.1
Installing railties 3.2.19
Installing jquery-rails 2.0.3
Installing mysql2 0.3.16
Installing net-ldap 0.3.1
Installing ruby-openid 2.3.0
Installing rack-openid 1.4.2
Installing rails 3.2.19
Installing redcarpet 2.3.0

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

production の接続先設定を環境に合わせて設定します。

cp /var/www/redmine/config/database.yml.example /var/www/redmine/config/database.yml
vim /var/www/redmine/config/database.yml

セッションのシークレットトークンを生成

cd /var/www/redmine
rake generate_secret_token

初期テーブルを作成

テーブルを作成します。

cd /var/www/redmine
RAILS_ENV=production rake db:migrate

作成したテーブルに初期データをロードします。どの言語でデータをロードを聞かれると思います。

RAILS_ENV=production rake redmine:load_default_data

WebAP のファイルシステムのパーミッションを設定

chmod -R 777 files
chmod -R 777 log
chmod -R 777 tmp
chmod -R 777 public/plugin_assets

WEBrick で Redmine が正しくインストールされたか確認する

WeBrick を起動します。

ruby script/rails server webrick -e production

3000 ポートの URL にアクセスして Redmine が表示されることを確認します。

URLの例: http://localhost:3000/

ID は admin、パスワードも admin でログインできると思います。

Passenger をインストール

Rails を動作させるためのサーバの用意をしていきます。

gem install passenger

Passenger の Apache モジュールをインストール

次に Apache2 用の Passenger モジュールをインストールします。

passenger-install-apache2-module

上記コマンド実行後の最初の案内は enter で進みます。その次に「Which languages are you interested in?」ということを聞かれるのでそのまま enter で進みます。その後、インストールに必要なものが全てインストールされているかチェックされます。

Checking for required software...

<ul>
<li>Checking for C compiler...
  Found: yes
  Location: /usr/bin/cc</li>
<li>Checking for C++ compiler...
  Found: yes
  Location: /usr/bin/c++</li>
<li>Checking for Curl development headers with SSL support...
  Found: no
  Error: Cannot find the <code>curl-config</code> command.</li>
<li>Checking for OpenSSL development headers...
  Found: yes
  Location: /usr/include/openssl/ssl.h</li>
<li>Checking for Zlib development headers...
  Found: yes
  Location: /usr/include/zlib.h</li>
<li>Checking for Apache 2...
  Found: yes
  Location of httpd: /usr/sbin/apache2
  Apache version: 2.4.6</li>
<li>Checking for Apache 2 development headers...
  Found: no</li>
<li>Checking for Rake (associated with /usr/bin/ruby1.9.1)...
  Found: yes
  Location: /usr/bin/ruby1.9.1 /usr/local/bin/rake</li>
<li>Checking for OpenSSL support for Ruby...
  Found: yes</li>
<li>Checking for RubyGems...
  Found: yes</li>
<li>Checking for Ruby development headers...
  Found: yes
  Location: /usr/include/ruby-1.9.1/ruby.h</li>
<li>Checking for rack...
  Found: yes</li>
<li>Checking for Apache Portable Runtime (APR) development headers...
  Found: no</li>
<li>Checking for Apache Portable Runtime Utility (APU) development headers...
  Found: no</li>
</ul>

Some required software is not installed.
But don't worry, this installer will tell you how to install them.
Press Enter to continue, or Ctrl-C to abort.

もし足りないものがあり「Some required software is not installed.」というようなことを言われたら案内に従って必要な物をインストールします。

環境によって違うと思いますが、今回は以下のパッケージが足りなかったのでインストールしました。

apt-get install libcurl4-openssl-dev
apt-get install apache2-threaded-dev
apt-get install libapr1-dev
apt-get install libaprutil1-dev

全て揃えたら再チャレンジします。

passenger-install-apache2-module

インストール成功後に表示される以下の部分をメモしておきます。後の Apache の設定で使用します。

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.46/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.46
     PassengerDefaultRuby /usr/bin/ruby1.9.1
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!
Suppose you have a web application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

<VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
         # Uncomment this if you're on Apache >= 2.4:
         #Require all granted
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and

Apache の設定をする

Passenger モジュールのロードを行う設定ファイルを追加します。

vim /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-4.0.46/buildout/apache2/mod_passenger.so

モジュールの設定を行う設定ファイルを追加します。

vim /etc/apache2/mods-available/passenger.conf
<IfModule mod_passenger.c>
    PassengerRoot /var/lib/gems/1.9.1/gems/passenger-4.0.46
    PassengerDefaultRuby /usr/bin/ruby1.9.1
</IfModule>

上記2つの設定ファイルを有効にします。

cd /etc/apache2/mods-enabled/
ln -s ../mods-available/passenger.conf passenger.conf
ln -s ../mods-available/passenger.load passenger.load

バーチャルホストの設定を行います。

vim /etc/apache2/sites-available/redmine.vagrant.conf
<VirtualHost *:10080>
    ServerName redmine.vagrant
    DocumentRoot /var/www/html/redmine/public
    RailsBaseURI /redmine
</VirtualHost>

バーチャルホストの設定を有効にします。

cd /etc/apache2/sites-enabled/
ln -s ../sites-available/redmine.vagrant.conf redmine.vagrant.conf

設定ファイルを読み込みます。

service apache2 graceful

ブラウザでアクセスして admin アカウントでログインできることを確認できれば完了です!
http://redmine.vagrant/

MySQL::diffでデプロイ時のDBスキーマ更新を自動化!

前回のエントリ DBテーブルの差分を出力するMySQL::diffをインストールする の続きです。

前回のおさらいを少しすると、 MySQL::diff は二つのデータベーススキーマを比較して差分の ALTER SQL を出力してくれる perl 製スクリプトツールです。

例として以下のコマンドは、database1 データベースを database2 データベースのスキーマに追従する ALTER SQL が生成されます。DB スキーマの更新に便利です。

mysqldiff -u user -p password -i database1 database2

このツールのメリットはフレームワークに依存しないスタンドアロンなスクリプトであることだと思います。デメリットは最近の MySQL の機能に対応していなかったりすることだと思います。例えば PARTITION には対応していません。中身は perl で書かれているので、数箇所ソースをいじってメンテナンスしつつ運用しています、、。perl を読めると役立つことがあるかも。

GUI で差分を生成したいならこのツールよりも MySQL Workbench の方が便利です。

MySQL::diff の事例紹介

今回は、現在携わっているプロジェクトで実際に MySQL::diff を migration ツールとして利用したので事例を紹介します。

前提として、WebAP と DB は二つで一つで、両方が噛み合っていないとシステムに不具合が生じるため、同じリポジトリでバージョン管理しています。また更新は WebServer 上のシェルスクリプトで行います。

  • /var/www/sousaku-memo.net: gitで管理しているディレクトリ
  • /var/www/sousaku-memo.net/web: ドキュメントルート (WebAP)
  • /var/www/sousaku-memo.net/database: DDL SQLを配置 (DB)

デプロイ用のシェルスクリプト例です。おおまかな流れとしては、このようなことをやっています。

  1. git から最新の WebAP と DDL を取得
  2. 最新の DDL を使って一時的な比較用 DB を作成
  3. 現行の古い DB を最新の DB に追従する ALTER SQL 生成
  4. ALTER SQL を実行
#!/bin/sh -eu

<h1>バックアップ</h1>

cp -rfpv "/var/www/sousaku-memo.net" "/var/www/sousaku-memo.net_$(date '+%Y%m%d_%H%M')"

<h1>git から最新の WebAP と DDL を取得</h1>

cd "/var/www/sousaku-memo.net"
git fetch origin
git reset --hard origin/master
git clean -fdx

<h1>コミットにデプロイの目印をつけるためタグ付け</h1>

tag_name="deploy-$(date '+%Y%m%d-%H%M')"
git tag ${tag_name}
git push origin ${tag_name}

<h1>データベース接続情報</h1>

readonly MYSQL_USER='user'
echo "Enter password for '${MYSQL_USER}' MySQL account:"
read -s mysql_password
readonly MYSQL_COMMAND="mysql -u ${MYSQL_USER} -p${mysql_password}"
readonly MYSQL_DIFF_COMMAND="mysqldiff -u ${MYSQL_USER} -p ${mysql_password} -i"

<h1>比較用の一時データベース(temp_global)を作成</h1>

cd ~
{
  echo "NOWARNING;"
  echo "SET NAMES utf8;"
  echo "DROP DATABASE IF EXISTS temp_global;"
  echo "CREATE DATABASE temp_global DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
  echo "USE temp_global;"
  echo "SOURCE /var/www/sousaku-memo.net/database/ddl.sql;"
} >generate_temp_db.sql

${MYSQL_COMMAND} &lt;generate_temp_db.sql

<h1>作成した最新の temp_global と 稼働中の global データベースの差分をとる</h1>

<h1>alter_up_global.sql がスキーマアップグレード用クエリ</h1>

<h1>alter_down_global.sql がダウングレード用クエリ</h1>

${MYSQL_DIFF_COMMAND} global temp_global >alter_up_global.sql
${MYSQL_DIFF_COMMAND} temp_global global >alter_down_global.sql

<h1>スキーマアップグレード前確認</h1>

cat alter_up_global.sql
echo 'スキーマを最新にしてもいいですか?:'
read

<h1>スキーマアップグレード</h1>

{
  echo "NOWARNING;"
  echo "SET NAMES utf8;"
  echo "USE global;"
  echo "SOURCE alter_up_global.sql;"
} >>alter_execute.sql

${MYSQL_COMMAND} &lt;alter_execute.sql
echo '更新を完了しました'

実際はもっと細かい処理があるのですが、雰囲気こういう感じということで。

シェルスクリプトの補足説明

データベースのバックアップコマンドは省いていますが、ALTER 実行前にはやっておいた方がいいと思います。それと、ALTER SQL ファイルはデプロイの度に世代管理するようにするのがおすすめです。後でスキーマのダウングレードやアップグレードを出来るようにしておくためです。

git から最新のファイルを取得する部分は pull ではなく fetch + reset –hard でやっています。

mysqldiff コマンドは -i オプションをつけていますが、これはオートインクリメント値やデフォルト値を無視してくれるオプションです。

参考サイト

2014/01/30編集: シェルスクリプトの fetch コマンドを修正しました。

DBテーブルの差分を出力するMySQL::diffをインストールする

二つの MySQL データベースを比較し差分 ALTER SQL 文を出力してくれる perl 製ツール、MySQL::diffのインストール方法です。

このツールは、稼働中のデータベースのテーブルスキーマを最新に更新する場合など使えます。

Usage: mysqldiff [ options ] <database1> <database2>

今回はサーバデプロイ時のスキーマ更新作業を自動化するためにインストールしてみました。上手く使うと DDL のスマートなバージョン管理に一役買ってくれると思います。

コマンドラインツールなので GUI で分かりやすく差分を出力したい場合には不向きです。そういった場合はこのツールよりも MySQLWorkbench を使ったほうが便利でしょう。

MySQL::diff のインストール

MySQL::diff は mysqldiff – search.cpan.org で公開されています。

インストール先を /usr/local/mysqldiff にしました。

wget http://search.cpan.org/CPAN/authors/id/A/AS/ASPIERS/MySQL-Diff-0.43.tar.gz
tar xzvf MySQL-Diff-0.43.tar.gz
mv MySQL-Diff-0.43 /usr/local/mysqldiff

/usr/local/bin/mysqldiff にシンボリックリンクをはります。

ln -s /usr/local/mysqldiff/bin/mysqldiff /usr/local/bin/mysqldiff

これでインストール完了と言いたいところなのですが、このままだとパスが通っておらず以下のエラーが起こります。

Can't locate MySQL/Diff.pm in @INC (@INC contains: /usr/local/mysqldiff/bin /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/local/bin/mysqldiff line 112.
BEGIN failed--compilation aborted at /usr/local/bin/mysqldiff line 112.

このエラーを修正するために、ソースコードの冒頭に use lib 文を一行追記します。

vi /usr/local/mysqldiff/bin/mysqldiff
#!/usr/bin/perl -w
use lib '/usr/local/mysqldiff/lib';

=head1 NAME

また、CentOS の場合では CPAN で File::Slurp をインストールする必要がありました。

cpan
cpan > install File::Slurp

mysqldiff コマンドを空打ちしてみて、usage が表示されれば無事にインストール完了です。

次のエントリでこのツールを使って差分を出力しデプロイ自動化を試みます。CI しましょう:)