rbenv と Redmine 2.4.3 更新
2014/2/8 に Redmine 2.4.3 がリリースされたので更新してみる。せっかくなので Ruby のほうも最新の安定版を入れることにした。
対象環境はさくらのVPS 2GB プラン。これまで Ruby は checkinstall
で RPM 化したものを利用してきたが今回から rbenv で管理してみる。環境構築についてはシリーズ過去記事を参照のこと。最後の記事は 2012/6 だが Ruby 周りはそのままである。
既存 Ruby 環境をアンインストール
これから入れる Ruby と干渉すると思われるため、さくらのVPS を改めて使いはじめる 9 - Ruby、Redmine、Subversion でインストールした Ruby をアンインストールする。
作業中に Redmine を操作されたら困るので非公開にしておく。私はシンボリック リンク経由で公開しているため、これを消す。メンテナンス用ページがあるならそこへ案内してもよいだろう。
$ sudo rm -rf /var/www/html/projects
Ruby 上で動作する gem を消す。もし gem と他のソフトウェアで連携している設定があれば、それも対象になる。現在は Phusion Passenger を利用して Apache 連携しているため、これも含む。
$ sudo /usr/local/bin/gem uninstall passenger
Remove executables:
passenger, passenger-install-apache2-module, passenger-install-nginx-module, passenger-config, passenger-status, passenger-memory-stats, passenger-make-enterprisey
in addition to the gem? [Yn] Y
Removing passenger
Removing passenger-install-apache2-module
Removing passenger-install-nginx-module
Removing passenger-config
Removing passenger-status
Removing passenger-memory-stats
Removing passenger-make-enterprisey
Successfully uninstalled passenger-3.0.12
gem を PATH に通しておくのを忘れてたので sudo
から実行はフルパスで指定してる。アンインストール時のメッセージにも表示されているが依存するモジュールも一緒に消してくれている。
つぎに Apache の conf から Passenger 関連を消す。私の環境では passenger.conf というファイルにくくり出しているので、これを削除して Apache を再起動。削除した後に apachectl configtest で設定が壊れていないことを確認してからとしている。
$ sudo rm /etc/httpd/conf.d/passenger.conf
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
他の gem は特に連携などをおこなっていないため一挙に消す。以下の記事を参考にコマンドを実行してみる。
$ sudo /usr/local/bin/gem uni $(gem li --no-versions)
Select gem to uninstall:
1. actionmailer-2.3.14
2. actionmailer-3.2.3
3. actionmailer-3.2.5
4. actionmailer-3.2.8
5. actionmailer-3.2.9
6. actionmailer-3.2.13
7. All versions
> 7
この方法だと gem ごとにアンインストール用メニューが表示されて対話形式で進行してゆく。削除対象のバージョンを聞かれたら All versions
の番号、作業の継続を Yn で問い合わせられたら Y
を入力。対話なしで一括実行する方法もありそうだけど今回はこれでゆく。
ひととおり消し終わったら改めてコマンド実行してみる。残っているものがあればそれらのアンインストールが実行される。なにもなければ以下のように、その旨を示すエラーが表示される。
$ sudo /usr/local/bin/gem uni $(gem li --no-versions)
ERROR: While executing gem ... (Gem::CommandLineError)
Please specify at least one gem name (e.g. gem build GEMNAME)
gem を消したら次は Ruby 本体を消す。私は CheckInstall によって RPM 化したものをインストールしたのでこれが対象となる。
まずは Ruby のパッケージ名を確認。rpm
コマンドに -qa
オプションを指定することで全パッケージを表示できる。その中から Ruby 関連を絞り込む。
$ rpm -qa | grep ruby
ruby-1.9.3-p194-1.x86_64
パッケージ名を確認したので、それを指定してアンインストール。
$ sudo rpm -e ruby-1.9.3-p194-1.x86_64
改めてパッケージ確認してみると何も表示されない。また ruby
コマンドが存在しない状態になるはず。これで既存 Ruby 環境のアンインストールは完了。
rbenv と ruby-build のインストール
rbenv
とは、Ruby の環境を管理するためのツールである。Ruby + Environment で rbenv なのだろうか?名が体を表していてわかりやすい。
GitHub の README がリファレンスを兼ねており、ここを読むだけで十分な情報を得られる。日本語で読めるものだと以下の記事がわかりやすい。今回の作業でも参考にさせていただいた。
- rbenvをシステムワイドにインストールする
- rbenv, ruby-buildを使って さくらのVPSにRubyをインストール
- Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで)
まず rbenv
の利用に必要なパッケージを入れる。過去に Ruby と Redmine が動作する環境を構築していたなら大半はインストール済みだろう。パッケージの数が多いので参考にした uehatsu 氏の記事と同様にコマンドを分割掲載しておく。
$ sudo yum install gcc gcc-c++ make git openssl-devel readline-devel zlib-devel
$ sudo yum install libcurl-devel ImageMagick ImageMagick-devel ipa-gothic-fonts
$ sudo yum install ipa-mincho-fonts ipa-pgothic-fonts.noarch ipa-pmincho-fonts.noarch
次に sudo
経由で rbenv
を実行するための設定をおこなう。参考にした「つくば日記(仮)」には背景も含めた説明があるのでこのあたりは割愛。visudo
で設定ファイルを新規作成。
$ sudo visudo -f /etc/sudoers.d/00_base
以下を記述して保存。
Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"
設定ファイルに記述した環境変数を追加。
$ export RBENV_ROOT=/usr/local/rbenv
$ export PATH=${RBENV_ROOT}/bin:${PATH}
この環境変数を利用して GitHub のリポジトリから rbenv
と ruby-build
を clone。
$ sudo git clone https://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
$ sudo git clone https://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build
rbenv
初期化。コマンドを実行すると export された環境変数などが表示される。
$ sudo rbenv init -
export PATH="/usr/local/rbenv/shims:${PATH}"
export RBENV_SHELL=sudo
rbenv rehash 2>/dev/null
rbenv() {
local command
command="$1"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "`rbenv "sh-$command" "$@"`";;
*)
command rbenv "$command" "$@";;
esac
}
現在のユーザーで rbenv
を利用するために .bash_profile
へ設定を追加する。
$ vi .bash_profile
以下を追記して保存。
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
保存された設定を反映するため .bash_profile
を読み直す。
$ source ~/.bash_profile
これで PATH
が通ったはず。試しに rbenv
コマンドをオプション指定なしで実行してみるとバージョンやオプションなどが表示される。
$ rbenv
rbenv 0.4.0-89-g14bc162
Usage: rbenv <command> [<args>]
Some useful rbenv commands are:
commands List all available rbenv commands
local Set or show the local application-specific Ruby version
global Set or show the global Ruby version
shell Set or show the shell-specific Ruby version
install Install a Ruby version using ruby-build
uninstall Uninstall a specific Ruby version
rehash Rehash rbenv shims (run this after installing executables)
version Show the current Ruby version and its origin
versions List all Ruby versions available to rbenv
which Display the full path to an executable
whence List all Ruby versions that contain the given executable
See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
rbenv と ruby-build がインストールされると rbenv install
で呼び出せるようになる。動作確認のため、インストール可能な Ruby のバージョン一覧を表示してみる。
$ rbenv install -l
Available versions:
1.8.6-p383
1.8.6-p420
... 以下、略
ばっちり。これで Ruby 環境の管理ツールが準備できた。次は Ruby 関連をインストールする。
Ruby 関連のインストール
ここからは Ruby と gem
をインストールしてゆく。今回の最終目標は Redmine を動作させることなので、公式のインストール説明ページから動作環境を確認する。
現時点で最新の Redmine 2.4.3 では Ruby 2.0 系までサポートしているようだ。ちなみに Ruby 安定版の最新は 2.1。
リリースノートを読むと深刻な非互換はないそうなので 2.1 系を試して問題がありそうなら 2.0 系へ切り替える。rbenv
は複数バージョンの Ruby を柔軟に切り替えられるのだ。この便利さも採用動機である。
というわけで 2.1 系をインストール。rbenv install
の後に -l
オプションで表示されたバージョン名を指定する。2.1 系はいくつかあるが安定版はサフィックスなしの 2.1.0 になるようだ。インストールにはけっこう時間がかかる。私の環境では 6 分ぐらい待たされた。
$ sudo rbenv install 2.1.0
Downloading ruby-2.1.0.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9e6386d53f5200a3e7069107405b93f7
Installing ruby-2.1.0...
Installed ruby-2.1.0 to /usr/local/rbenv/versions/2.1.0
Ruby をインストールしたらシステム全体で利用できるようにする。rbenv global
の後に利用する Ruby のバージョンを指定することでそれがグローバルになる。rbenv rehash
を実行することで変更を反映できる。
$ sudo rbenv global 2.1.0
$ sudo rbenv rehash
試しに sudo なしで Ruby のバージョンを確認してみよう。
$ ruby --version
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
ばっちり。Ruby を複数インストールしておいて後から簡単に切り替えられるというわけだ。実に便利。
Ruby がインストールできたので今度は gem
を追加してみよう。グローバルにした Ruby で利用するなら sudo
経由で gem install
を実行することで Ruby 環境全体に追加される。これも Ruby のバージョンごとに住み分けられるようだ。よくできてる。
今回は Redmine 用に Bundler と Passenger を入れる。まずは Bundler。
$ sudo gem install bundler --no-rdoc --no-ri
Fetching: bundler-1.5.3.gem (100%)
Successfully installed bundler-1.5.3
1 gem installed
次は Passenger。これを使って Apache や Nginx 上で Rails アプリを動かす。
$ sudo gem install passenger --no-rdoc --no-ri
Fetching: daemon_controller-1.1.8.gem (100%)
Successfully installed daemon_controller-1.1.8
Fetching: rack-1.5.2.gem (100%)
Successfully installed rack-1.5.2
Fetching: passenger-4.0.37.gem (100%)
Building native extensions. This could take a while...
Successfully installed passenger-4.0.37
3 gems installed
グローバルな Ruby 環境に gem をインストールしたので rbenv
をリフレッシュ。
$ sudo rbenv rehash
Passenger の Apache 用モジュールをインストール。
余談。この作業の途中で連携対象となる言語を Ruby や Python などから選択することになるのだけど、この入力は矢印キーを受けつけている。しかも縦に移動するようになっているため CUI なのに GUI 的な操作ができる。コマンドライン ツールの UI といえばせいぜい文字入力で Yn
や数値でモード選択ぐらいだと思っていたので感心させられた。
$ sudo passenger-install-apache2-module
...中略
--------------------------------------------
Almost there!
Please edit your Apache configuration file, and add these lines:
LoadModule passenger_module /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37
PassengerDefaultRuby /usr/local/rbenv/versions/2.1.0/bin/ruby
</IfModule>
After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!
Press ENTER to continue.
--------------------------------------------
Deploying a web application: an example
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
</Directory>
</VirtualHost>
And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:
/usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/doc/Users guide Apache.html
http://www.modrails.com/documentation/Users%20guide%20Apache.html
Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com
Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
最後の方に Apache 用の設定が表示されるのでメモ必ずしておくこと。この内容は Apache の httpd.conf
本体に書くのではなく専用ファイルを用意する。前に環境構築した時と同様に passenger.conf
という名前で作成する。
$ sudo vi /etc/httpd/conf.d/passenger.conf
passenger.conf
にさきほどの Apache 用設定を記述してついでに Redmine を公開するときのディレクトリ設定も加えて保存。今回は http://ホスト名/projects
に公開するので以下のようになる。パスを見ると gem のバージョンが含まれているため rbenv でバージョンを切り替える場合はここも変更する必要あり。
これらをうまく変数化できるとよいのだけど難しいかな。簡単に対応するとしたらひとつの passenger.conf
に複数バージョンの設定を定義しておきカレントではないものをコメントアウトすることになるだろうか。
LoadModule passenger_module /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37
PassengerDefaultRuby /usr/local/rbenv/versions/2.1.0/bin/ruby
</IfModule>
RailsBaseURI /projects
Apache の設定チェックと再起動をおこない、passenger.conf を読ませる。
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
これで Ruby 関連の動作環境が整った。次は Redmine を更新。
Redmine 更新
Redmine を更新する。新規・更新ともに さくらのVPS を改めて使いはじめる 9 - Ruby、Redmine、Subversion で書いた手順からそれほど変わらないと思うのでそのまま参考にする。
以前だと RubyForge の Redmine から最新版をダウンロードしていたのだが現在は Redmine のサイトで公開しているようだ。ここのリンク URL から wget コマンドでユーザー HOME にダウンロードして展開。その後 /var/lib/redmine-new
へ移動。
$ cd
$ wget http://www.redmine.org/releases/redmine-2.4.3.tar.gz
$ tar zxvf redmine-2.4.3.tar.gz
$ sudo mv redmine-2.4.3 /var/lib/redmine-new
$ rm -rf redmine-2.4.3.tar.gz
これで /var/lib
以下に現行の redmine
と最新の redmine-new
が格納された状態になったので設定を引き継ぐ。プラグインを追加していたなら redmine
直下の plugins
もコピーしておく。重複するものが多いので plugins
ディレクトリではなく、その中のプラグインを個別でコピーしたほうが古いもので上書きする危険がなくて安全。あとテーマは public/themes
になっているので注意する。
$ cd /var/lib
$ cp redmine/config/database.yml redmine-new/config/database.yml
$ cp -r redmine/config/email.yml redmine-new/config/email.yml
$ cp -r redmine/files/ redmine-new/
引き継ぎが完了したらディレクトリ名を以下のように変更。
$ cd /var/lib
$ sudo mv redmine redmine-old
$ sudo mv redmine-new redmine
/var/lib/redmine/public
内に plugin_assets
ディレクトリが存在しないと、Redmine の管理画面の情報に表示される「Plugin assetsディレクトリに書き込み可能」がエラーになるので作成しておく。
$ cd /var/lib/redmine/public
$ mkdir plugin_assets
Redmine のインストール ディレクトリに移動して必要な Gem を Bundler で一括インストール。これは rbenv 管轄ではなく Redmine 専用となる。
$ cd /var/lib/redmine
$ bundle install --without development test postgresql sqlite
Your Gemfile lists the gem activerecord-jdbcmysql-adapter (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of just one of them later.
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.9)
Installing multi_json (1.8.4)
Installing activesupport (3.2.16)
Installing builder (3.0.0)
Installing activemodel (3.2.16)
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.16)
Installing mime-types (1.25.1)
Installing polyglot (0.3.3)
Installing treetop (1.4.15)
Installing mail (2.5.4)
Installing actionmailer (3.2.16)
Installing arel (3.0.3)
Installing tzinfo (0.3.38)
Installing activerecord (3.2.16)
Installing activeresource (3.2.16)
Using bundler (1.5.3)
Installing coderay (1.1.0)
Installing rack-ssl (1.3.3)
Using json (1.8.1)
Installing rdoc (3.12.2)
Installing thor (0.18.1)
Installing railties (3.2.16)
Installing jquery-rails (2.0.3)
Installing mysql (2.8.1)
Installing mysql2 (0.3.15)
Installing net-ldap (0.3.1)
Installing pg (0.17.1)
Installing ruby-openid (2.3.0)
Installing rack-openid (1.4.2)
Installing rails (3.2.16)
Installing rmagick (2.13.2)
Installing sqlite3 (1.3.8)
Your bundle is complete!
Gems in the groups development, test, postgresql and sqlite were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:
<= 1.8.6 : unsupported
= 1.8.7 : gem install rdoc-data; rdoc-data --install
= 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
セッション管理用の鍵を初期化してからデータベースをマイグレート。
$ cd /var/lib/redmine
$ rake generate_secret_token
$ rake db:migrate RAILS_ENV="production"
$ rake db:migrate:upgrade_plugin_migrations RAILS_ENV=production
$ rake db:migrate_plugins RAILS_ENV=production
$ rake tmp:cache:clear
$ rake tmp:sessions:clear
更新完了。シンボリックリンクを張り直して Redmine を再公開する。
$ sudo ln -s /var/lib/redmine/public /var/www/html/projects
Redmine にログインしてバージョンなどを確認。
ばっちり!というわけで作業完了。