技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

AmazonEC2 上に、Redmine 2.6.5 を構築したメモ

2017/6/15 : 流石に陳腐化したので AMI は消しました。

AMI 好きに使って

下記で作った AMI を共有しました。好きに使って。
当たり前ですが、バージョンアップとか色々あっても保証しないっすよー

ami-4001ac40

メールサーバは立ててないので、ご自分で立てて運用してください。

こいつは何よ?

普通に入れても発狂したくなる Redmine を Amazon EC2 上に構築したメモ。 教師はこれバージョンはあえて 2.6.5 を入れる。 何で今更こんな古い物を入れるのかってーと、BackLogsが 2.3.1 までしか対応していないのと、2.6.3 で動かしたという記事を見つけたため。

BackLogs は有志で 3.0.x 対応してる臭いが、公式はだんまりしてるので、とりあえず現状は動かせるもので動かそうって腹。

ベースは Amazon Linux AMI 2015.03 (HVM), SSD Volume Type を選択。一番基礎っぽいしね。
sudo yum update 直後がこんな感じ。

$ ruby --version
ruby 2.0.0p645 (2015-04-13) [x86_64-linux]
$ gem -v
2.0.14

公式 には、Redmine2.x は Ruby 2.2↑が未サポートなので、このまま使う。

周辺サーバ突っ込もうか

$ sudo yum install httpd
...
====================================================================================================================================================================================================================================
 Package                                                  アーキテクチャー                                  バージョン                                                   リポジトリー                                          容量
====================================================================================================================================================================================================================================
インストール中:
 httpd                                                    x86_64                                            2.2.29-1.5.amzn1                                             amzn-main                                            1.2 M
依存性関連でのインストールをします:
...

$ sudo yum install mysql-server mysql-devel
...
====================================================================================================================================================================================================================================
 Package                                                        アーキテクチャー                              バージョン                                                  リポジトリー                                         容量
====================================================================================================================================================================================================================================
インストール中:
 mysql-devel                                                    noarch                                        5.5-1.6.amzn1                                               amzn-main                                           2.7 k
 mysql-server                                                   noarch                                        5.5-1.6.amzn1                                               amzn-main                                           2.8 k
依存性関連でのインストールをします:

MySQL の言語はデフォでは使えないので、/etc/my.cnf 弄って

[mysqld]
# ç•¥
character-set-server=utf8

[mysql]
default-character-set=utf8

を追加。
そしたら sudo service mysqld start でサービス開始。sudo chkconfig mysqld on で自動起動も入れておく。

Redmine 用のDBアカウントも入れておく。

$ mysql -uroot
mysql> create database db_redmine default character set utf8;
mysql> grant all on db_redmine.* to user_redmine@localhost identified by 'PutYourPassword';

Redmine に使うツールを入れ始める。

$ sudo yum groupinstall "Development Tools"
$ sudo yum --enablerepo=epel install ruby-devel mysql-devel ImageMagick ImageMagick-devel ipa-gothic-fonts

ipa フォントとかは、pdf 操作で必要なんだけど、epel にしか無いのでそこから入れる。

Redmine インストール開始

$ wget http://www.redmine.org/releases/redmine-2.6.5.tar.gz
$ tar xvf redmine-2.6.5.tar.gz 
$ sudo mv redmine-2.6.5 /var/lib/redmine

で redmine 本体をデプロイ。

cd /var/lib/redmine
$ bundle install --without development test
/usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- io/console (LoadError)
    from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/vendor/thor/lib/thor/shell/basic.rb:2:in `<top (required)>'
    from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
以下略

いきなりか ruby よ。相変わらず最悪なエコシステムだなw ついでに Rails 3.2.22 を入れる(Remine 2.6.x は rails 3.2 依存のため)。

難しい所なのだが、bundler の管轄(Gemfile)の記述でバージョン問題起こすと、そもそもスタックなしでエラーが表示される。
その時は Gemfile を必死に修正する必要があるのだが、今回の様にスタックが出る場合、そもそも Gemfile に書いてないライブラリの問題。

この場合は gem コマンドで入れれば直る場合が多い(ただし、開発者が Gemfile 記述漏れとかで実はバージョン依存だと地獄を見る事もある)

gem install rails -v '3.2.22'

尚、検証して無いが、rails4.x を既に入れてしまった環境の場合、gem uninstall railties -v '4.0.0' で削除しないと、rails4 がデフォルトで動いて地獄を見るそうな。

$ gem install io-console
$ bundle install --without development test
Fetching: io-console-0.4.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed io-console-0.4.2
...以下略

よし入った。

mv config/database.yml.example config/database.yml
vi config/database.yml
production:
  adapter: mysql2
  database: db_redmine
  host: localhost
  username: user_redmine
  password: "PutYourPassword"
  encoding: utf8

同様に設定も

mv config/configuration.yml.example config/configuration.yml
vi config/configuration.yml
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25
      domain: 'example.com'

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf

まぁそのままだよね。

$ bundle exec rake generate_secret_token
Could not find gem 'mysql2 (~> 0.3.11) ruby' in any of the gem sources listed in your Gemfile or available on this machine.
Run `bundle install` to install missing gems.

DB 設定に対応したバンドルが足らねーよって言われた…

$ bundle install --without development test
Installing mysql2 0.3.18 with native extensions
ç•¥

$ bundle exec rake generate_secret_token
$

そしたらラスト

$ bundle exec rake db:migrate RAILS_ENV=production

正常終了したらOK。
失敗した時は、conf/database.xml の設定に間違いが無いか見直すと良さげ。
(自分はここで躓いてないので、何か出たとしてもわからん)

Passenger 突っ込む

Rails アプリを Apache とかのサーバ経由で動かすためのミドルウェアと思えばいい。

$ gem install passenger --no-rdoc --no-ri
$ passenger-install-apache2-module

後は画面の指示に従えば良さそう。

Installation instructions for required software

 * To install Curl development headers with SSL support:
   Please install it with yum install libcurl-devel

 * To install Apache 2 development headers:
   Please install it with yum install httpd-devel

 * To install Apache Portable Runtime (APR) development headers:
   Please install it with yum install apr-devel

 * To install Apache Portable Runtime Utility (APU) development headers:
   Please install it with yum install apr-util-devel

If the aforementioned instructions didn't solve your problem, then please take
a look at the Users Guide:

  /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13/doc/Users guide Apache.html
  https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html

こんな風に言われるので、順に実行。その上で、再度 passenger-install-apache2-module を実行すると。

Compiling Phusion Passenger works best when you have at least 1024 MB of virtual
memory. However your system only has 996 MB of total virtual memory (996 MB
RAM, 0 MB swap). It is recommended that you temporarily add more swap space
before proceeding. You can do it as follows:

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

See also https://wiki.archlinux.org/index.php/Swap for more information about
the swap file on Linux.

If you cannot activate a swap file (e.g. because you're on OpenVZ, or if you
don't have root privileges) then you should install Phusion Passenger through
DEB/RPM packages. For more information, please refer to the manual, section
"Installation":

  /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13/doc/Users guide Apache.html
  https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html

動かす前にあぶねーからスワップ作っとけと…
Ctrl + C でプロセスを一旦止めて、上記コマンドでスワップを作り、ぞの上で再チャレンジ。

スワップ作る途中で、6G がオススメだぜとか言われるが無視☆

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

   LoadModule passenger_module /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13
     PassengerDefaultRuby /usr/bin/ruby2.0
   </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 when you are done editing.

--------------------------------------------

Validating installation...

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓
 * Checking whether Apache is installed... ✓
 * Checking whether the Passenger module is correctly configured in Apache... (!)

   You did not specify 'LoadModule passenger_module' in any of your Apache
   configuration files. Please paste the configuration snippet that this
   installer printed earlier, into one of your Apache configuration files, such
   as /etc/httpd/conf/httpd.conf.


Detected 0 error(s), 1 warning(s).
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
         # 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
optimization tips, troubleshooting and other useful information:

  /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13/doc/Users guide Apache.html
  https://www.phusionpassenger.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.

と言う事で、上から順に対応。

/etc/httpd/conf.d/passenger.conf を作成して

LoadModule passenger_module /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/ec2-user/.gem/ruby/2.0/gems/passenger-5.0.13
  PassengerDefaultRuby /usr/bin/ruby2.0
</IfModule>

Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerSpawnMethod smart
RailsAppSpawnerIdleTime 86400
PassengerMaxPreloaderIdleTime 0

これで、問題なければモジュールが読み込まれる筈。

$ sudo service httpd start
$ sudo chkconfig httpd on

Passenger を apache に設定

$ sudo chown -R apache:apache /var/lib/redmine

Passenger のインストール時には、VirtualHost の設定が書かれていたが、そんな事は知らん(Redmine 専用サーバ)なので、/etc/httpd.conf を直編集。

sudo vi /etc/httpd/conf/httpd.conf で、

# DocumentRoot "/var/www/html"
DocumentRoot "/var/lib/redmine/public"

そしたら

$ /etc/init.d/httpd configtest
Syntax OK
$ service httpd restart

でとりあえず動かそうとしたわけだが、

We're sorry, but something went wrong.

We've been notified about this issue and we'll take a look at it shortly.

ブラウザ上表示される。で、何が悪いか見ようとしても、そもそも Production 動作でそんなもの見せねーよとありがたいお言葉。
仕方ないので、conf/database.xml の development に記述を入れた上、/etc/httpd/conf.d/passenger.conf にも RailsEnv development を突っ込む。

そしてでてくるエラーメッセージ。

cannot load such file -- bundler/setup

はぁ?って感じだが、どうも passenger から色々依存が解決できないらしい。

$ sudo gem install bundler --no-rdoc --no-ri
$ sudo gem install passenger --no-rdoc --no-ri
$ export ORIG_PATH="$PATH"
$ sudo -s -E
$ export PATH="$ORIG_PATH"
$ passenger-install-apache2-module

なので、各種 sudo で書き出して、パスを root ユーザにまで引き継いだ上で、モジュールビルド。

で、起動すると

It looks like Bundler could not find a gem. Maybe you didn't install all the gems that this application needs. To install your gems, please run:

bundle install

どうも読み込みパスが違うらしい。
上記のまま、ルート権限をログアウトせず(つまりパスを引き継いだまま)に

$ gem install io-console
$ bundle install --without development test
$ service httpd restart

これで動いた。

相変わらずかつての MS と等しく dll 地獄、もしくは Java の Jar 地獄をひきずるクソッタレな環境だぜい…。