20170625-title01


また地獄を見た。

この2週間ちょい、TeraTerm上でEnterキーを叩き、ラズパイの遅さに我慢しながら画面をじっと見つめ、忘れた頃に無慈悲に表示される数々のエラーメッセージを見るたび、のけ反り阿鼻叫喚を極め、

「俺って何やってるんだろ」

を、マジ一人で声に出している自分に気付き愕然とする日々。

MySQLのインストール以来の無間地獄を垣間見たわけです。というか、MySQLの時の試行錯誤の残骸が今回の地獄を引き起こしたわけです。地獄はまだ続いていたんだ!

さて、今回はプロジェクト、チケット管理をするためのRedmineを導入します。

さぁ、地獄が始まる。

Let's go HELL with installing "Redmine" to RaspberryPi3.




Redmineで必要な環境と地獄への道標

以下、必要な環境をまとめてみた。

項目 Version
ruby 1.9.3、2.0.0、2.1、2.2、2.3
Rails 4.2
MySQL 5.0以上

上記のうち、MySQLはインストール済みなので、ruby関連をまずインストールしていきます。

またruby製のWEBフレームワークであるRailsを動かすために、gemと呼ばれるruby独特のパッケージをbundlerというパッケージマネージャ(ラズパイでいうaptコマンド、CentOSでいうyumコマンド)でインストールしていくわけで、もうこの時点で俺的には訳が分からず、三途の川を渡ってしまいそうなのですが、2週間前の自分は知る由もなし。

更にRailsをapache2で動かすためにはPassengerと呼ばれるモジュールを導入する必要があり、前回のtomcat導入時よりもruby関係に無知な自分としては、頼りにするのはGoogle先生そして広大なインターネッツの海の向こう側にいる先人たちの「知恵の大陸」にたどり着くしかないわけです。

そして多分根本的には、知識ナッシングでラズパイ上で「最新」のソフトウェア導入にこだわったせいで、jessieとstretchの両リポジトリを行き来してきたことが、地獄行き確率アップの最大の決め手となったのだなぁ、ああ、そうだなぁ、と思うわけです、しみじみと。

でも後悔はしたけど反省はしない。

「最新」を追求して何が悪いのか!否っ、悪くないっ!


【地獄回避1】gcc、g++のバージョン確認

gemやpassengerをインストールする際に、コンパイル?ライブラリ参照?が走るんです!そして失敗するんです!

error: unrecognized command line option '-fstack-protector-strong'

とかgemインストール時に平気で言ってくるわけです、ラズパイが。

passengerのインストール時も訳分からないエラー吐くわけです。

そしてgccのバージョン確認すると

$ gcc -v
Using built-in specs.
 :
 :
gcc version 4.7.3 (Raspbian 4.7.3-11+rpi1)

とか!4.7?なんなの?これは!jessieでの最新は4.9じゃなかったっけ?!ぁあ?

で、思い出してみるとMySQLをソースからコンパイル時にCMAKEでハマってgccのバージョンをごにょごにょやってバージョンダウンしたんだっけ?てへ

つ~わけで、gccを取り戻す!

ちなみにjessieからだ。間違ってstretchでgccインストールしようものならVer.6とかになって更に逝くこと間違いなし!

まずは/etc/apt/sources.listを確認してjessieを参照することになっているのを確認。

そして現在のバージョンをいったん削除してから再インストール。

$ sudo apt-get purge gcc g++
$ sudo apt-get install gcc g++
$ gcc -v
 :
 :
gcc version 4.9.2 (Raspbian 4.9.2-10)

来たぜーこらぁ!

ただし!

後述のruby2.3系をstretchリポジトリから入れた後、gccがVer.6になります!

なので、rubyやその他必要なパッケージをインストールしたら、gccのバージョンを確認する癖をつけよう。

もしgccが、現時点でver.4.9.2でなかったら、再度jessieに戻してgccやg++をpurge&installしたほうがよいでしょう。


【地獄回避2】swap領域の確保

後述するpassenger、インストール方法には2つある。

1つはaptでlibapache2-mod-passengerをインストールする方法。もう1つの方法bundlerからインストールする方法。

1つ目のインストール方法だと自分の環境ではpassengerが動かなかった。passengerどころか、passenger-statusっていうコマンドさへ動かへん。

apache2.4.25っていう最新に対してlibapache2-mod-passengerのバージョンが合っていないのか何なのか、原因は突き止めてはいないけれど、1つ目のインストール方法は却下した。

で、2つ目のインストール方法を選択するとgcc使うわけで、そこでエラー吐きまくるわけだけどぉ、そこは適切なgcc(現時点でgcc ver.4.9.2)が入っていればコンパイル通るんですがぁ、メモリっていうかswap領域足りなくて落ちるわけです堕ちるわけです地獄に。すげぇ時間かけてコンパイルした結果がエラーなわけです。

なので、事前にswap領域確保です。

まずは現在のswap領域の容量どうなってんの?

$ sudo swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            102396  0       -1

Sizeを見る限り、どうやら100M。

とりあえず無難に2GBにする。あとswapファイルの場所をMicroSDカード上でなくUSBメモリ上の/dataの下にする。

$ sudo service dphys-swapfile stop
$ sudo vim /etc/dphys-swapfile
 
#CONF_SWAPFILE=/var/swap
CONF_SWAPFILE=/data/swap
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=2048
 
$ sudo service dphys-swapfile start
$ sudo swapon -s
Filename                                Type            Size    Used    Priority
/data/swap                              file            2097148 0       -1

あとはapacheでRails動かすためにpassengerだっけ?これとImageMagickだっけ?なんかRedmineの機能を使用するのに必要らしいのでインストールする。


ruby関連のインストール

まずはリポジトリをjessieからstretchに変更してupdateする。

$ sudo vim /etc/apt/sources.list
 
#deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
deb http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-free
 
$ sudo apt-get update

そんでもってインストール前にstretchリポ上のruby、ruby-dev、bundlerのバージョンを確認。

$ sudo apt-cache policy ruby
ruby:
  インストールされているバージョン: (なし)
  候補:               1:2.3.3
  バージョンテーブル:
     1:2.3.3 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
 
$ sudo apt-cache policy ruby-dev
ruby-dev:
  インストールされているバージョン: (なし)
  候補:               1:2.3.3
  バージョンテーブル:
     1:2.3.3 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
 
$ sudo apt-cache policy bundler
bundler:
  インストールされているバージョン: (なし)
  候補:               1.13.6-2
  バージョンテーブル:
     1.13.6-2 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages

よし、2.3系です。最新は2.4らしいけど、まぁ良いんじゃないでしょうか。つ~かRedmineはRuby2.3までのサポートなので、これが俺の求める最新だ。インストールしようぜ。

$ sudo apt-get install -y ruby ruby-dev bundler


その他必要なソフトのインストール

参考サイトで必要と言われているソフトが既に入っているかどうか、バージョンを確認。

$ sudo apt-cache policy imagemagick
imagemagick:
  インストールされているバージョン: (なし)
  候補:               8:6.9.7.4+dfsg-10
  バージョンテーブル:
     8:6.9.7.4+dfsg-10 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libmagick++-dev
libmagick++-dev:
  インストールされているバージョン: (なし)
  候補:               8:6.9.7.4+dfsg-10
  バージョンテーブル:
     8:6.9.7.4+dfsg-10 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libmysqlclient-dev
libmysqlclient-dev:
  インストールされているバージョン: 5.7.18-1
  候補:               5.7.18-1
  バージョンテーブル:
 *** 5.7.18-1 0
        100 /var/lib/dpkg/status
     5.6.30-1+b1 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libmagickcore-dev
libmagickcore-dev:
  インストールされているバージョン: (なし)
  候補:               8:6.9.7.4+dfsg-10
  バージョンテーブル:
     8:6.9.7.4+dfsg-10 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libmagickwand-dev
libmagickwand-dev:
  インストールされているバージョン: (なし)
  候補:               8:6.9.7.4+dfsg-10
  バージョンテーブル:
     8:6.9.7.4+dfsg-10 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy apache2-dev
apache2-dev:
  インストールされているバージョン: (なし)
  候補:               2.4.25-3
  バージョンテーブル:
     2.4.25-3 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libcurl4-openssl-dev
libcurl4-openssl-dev:
  インストールされているバージョン: (なし)
  候補:               7.52.1-5
  バージョンテーブル:
     7.52.1-5 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libapr1-dev
libapr1-dev:
  インストールされているバージョン: (なし)
  候補:               1.5.2-5
  バージョンテーブル:
     1.5.2-5 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages
$ sudo apt-cache policy libaprutil1-dev
libaprutil1-dev:
  インストールされているバージョン: (なし)
  候補:               1.5.4-3
  バージョンテーブル:
     1.5.4-3 0
        500 http://mirrordirector.raspbian.org/raspbian/ stretch/main armhf Packages

あらやだ、libmysqlclient-devしか入っていない。

しかたない、全部インストール。

$ sudo apt-get install -y libapache2-mod-passenger imagemagick libmagick++-dev libmagickcore-dev libmagickwand-dev apache2-dev libcurl4-openssl-dev libapr1-dev libaprutil1-dev

この後、前述した「【地獄回避1】gcc、g++のバージョン確認」の章の内容を実行しておく。


Redmine3.3のインストール

redmineのtarボールをダウンロードして解凍して/usr/localへ置いてapacheのDocumentRoot(/data/htdocs)にシンボリックリンク張る。

$ wget http://www.redmine.org/releases/redmine-3.3.3.tar.gz
$ tar zxvf redmine-3.3.3.tar.gz
$ sudo mv redmine-3.3.3 /usr/local/.
$ sudo chown -R www-data:www-data /usr/local/redmine-3.3.3
$ sudo ln -s ./redmine-3.3.3/public /data/htdocs/redmine

こんだけ。 だけどwww-dataって、、、なんだ?


DB周り

MySQLにredmine用のDBを作成する。

$ mysql -u root -p
 
mysql> create database redmine_db default character set utf8;
Query OK, 1 row affected (0.03 sec)
 
mysql> grant all on redmine_db.* to redmine_user@localhost identified by 'raspberry';
Query OK, 0 rows affected, 1 warning (0.03 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.07 sec)
 
mysql> exit;
Bye

さてそんじゃ、設定ファイル書く。と言っても直すのはdatabase.ymlだけ。configuration.ymlはまた今度。

$ cd /usr/local/redmine-3.3.3/config
$ sudo -u www-data cp database.yml.example database.yml
$ sudo -u www-data cp configuration.yml.example configuration.yml
$ sudo -u www-data vim database.yml
 
production:
  adapter: mysql2
  database: redmine_db
  host: localhost
  username: redmine_user
  password: raspberry
  encoding: utf8

次。なんかgemインストールとかdbのマイグレーションとか

マジいつもココがいつも分からんいつも。何やっているのかマジ理解できてない。gemパッケージのインストール?何それ?そして長い!

$ cd /usr/local/redmine-3.3.3
$ sudo -u www-data bundle install --without development test --path vendor/bundle

ここでgccのバージョンが、現時点(2017/06/11)で4.9.2になっていないとjsonかmysql2あたりでコケるので注意!

そして更に分からん呪文を3連発。ナニコレ、DBのマイグレーション?うまいの?

$ sudo -u www-data bundle exec rake generate_secret_token
$ sudo -u www-data RAILS_ENV=production bundle exec rake db:migrate
$ sudo -u www-data RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data


最後の地獄、それはpassenger、そしてapache2周りの設定

rubyに無知な自分にとって、passengerって何?という感じなのですが、Railsアプリを動かすためには避けて通れない壁のようです。

そして前述しましたが、passengerのインストールはbundlerで行います。

以下のようにしてインストールします。

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

ここが、一番ドハマリしたわ。

そして、以下を実行することで、apache2の設定ファイルの記述する内容が表示される。

$ passenger-install-apache2-module --snippet
 
LoadModule passenger_module /var/lib/gems/2.3.0/gems/passenger-5.1.4/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /var/lib/gems/2.3.0/gems/passenger-5.1.4
  PassengerDefaultRuby /usr/bin/ruby2.3
</IfModule>

さて、上記の内容を書くべき「apache2の設定ファイル」って何か?

Redhat系を弄っている人ならhttpd.confだと思うだろ?

違うんだよ!

debian系は違うんだ!騙された!!つ~か、無知な自分が悪いんだけれども!!!

ここで地獄をかなり徘徊した。1週間以上、「passenger、動かねぇ~」って毎晩うなされた。

/etc/apache2の下のファイル、ディレクトリ構成とredmine、passengerそれぞれの設定ファイルの作成場所を以下に示す。

/etc/apache2
├─ conf-available/
│ └─ redmine.conf・・・(1)
├─ conf-enabled/
│ └─ redmine.conf -> ../conf-available/redmine.conf・・・(2)
├─ mods-available/
│ ├─ passenger.conf・・・(3)
│ └─ passenger.load・・・(4)
├─ mods-enabled/
│ ├─ passenger.conf -> ../mods-available/passenger.conf・・・(5)
│ └─ passenger.load -> ../mods-available/passenger.load・・・(6)
├─ sites-available/
│ └─ 000-default.conf・・・(7)
└─ sites-enabled/
    └─000-default.conf -> ../sites-available/000-default.conf・・・(8)

上記の(7)(8)は既に存在しているわけで、(7)がapache2の設定ファイルの実体。

(8)が(7)からシンボリックリンク張ったやつで、apache2はこの(8)を参照する。

同様に'xxx-available'に設定ファイルの実体置いて、xxx-enableに実体へのシンボリックリンク置くと有効になる、って感じ。だよな、多分。

つ~わけで、悩みに悩んでやっと動いた、設定ファイル(1)~(6)を以下に示します。

(1)/etc/apache2/conf-available/redmine.confの作成

$ sudo vim /etc/apache2/conf-available/redmine.conf-available
 
<Directory "/data/htdocs/redmine">
  Require all granted
</Directory>
 
RackBaseURI /redmine

(2)/etc/apache2/conf-enabled/redmine.confの作成

$ sudo ln -s /etc/apache2/conf-available/redmine.conf /etc/apache2/conf-enabled/redmine.conf

(3)/etc/apache2/mods-available/passenger.confの作成

passenger-install-apache2-module --snippetで表示されたヤツの2行目以降を書くのだ!

あとね、あとね、PassengerResolveSymlinksInDocumentRootとかPassengerInstanceRegistryDirとかね、もうね・・・・・・・・・・涙なくして語れない成果。

・・・・・この、たった2行にたどり着くまでに、どれ程の時を重ねたことか(遠い目

$ sudo vim /etc/apache2/mods-available/passenger.conf
 
<IfModule mod_passenger.c>
  PassengerRoot /var/lib/gems/2.3.0/gems/passenger-5.1.4
  PassengerDefaultRuby /usr/bin/ruby2.3
</IfModule>
 
# Passengerの設定。これをonに設定するとPassengerがシンボリックリンクを読んでくれる。やっと読んでくれた。。。(遠い目
PassengerResolveSymlinksInDocumentRoot on
# Passengerの設定。以下ディレクトリを作成してPassengerInstanceRegistryDirに設定したらPassengerが動いてくれた。やっと動いてくれた。。。(遠い目
PassengerInstanceRegistryDir /var/run/passenger-instreg
 
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 86400
PassengerMaxPreloaderIdleTime 0

(4)/etc/apache2/mods-available/passenger.loadの作成

passenger-install-apache2-module --snippetで表示されたヤツの1行目だけを書くのだ!

$ sudo vim /etc/apache2/mods-available/passenger.load
 
LoadModule passenger_module /var/lib/gems/2.3.0/gems/passenger-5.1.4/buildout/apache2/mod_passenger.so

(5)/etc/apache2/mods-enabled/passenger.confの作成

$ sudo ln -s /etc/apache2/mods-available/passenger.conf /etc/apache2/mods-enabled/passenger.conf

(6)/etc/apache2/mods-enabled/passenger.loadの作成

$ sudo ln -s /etc/apache2/mods-available/passenger.load /etc/apache2/mods-enabled/passenger.load

これで、apache2を再起動してブラウザーからhttp://192.168.0.101/redmine/へアクセスすれば

redmine-01

まぁ、こんなもんだ(涙のガッツポーズ)。


まとめ

振り返ってみると、色々な困難(ボスキャラ?)に遭遇し、それに一度は負け、だが諦めず、また立ち上がり、困難に挑み、そして成長していく。

まるで、ロールプレイングゲームの中の主人公じゃなかろうか!この俺は!!

・・・カッコ良く書くとね。

いや待てよ、ピコピコやってて、あれ?ボス倒せね、そうだ攻略サイト見よ、でググって、よっしゃ!攻略!とか。

まるで、ロールプレイングゲームやってる俺じゃなかろうか!www

MySQLインストールがボスだ思っていたら、裏ボスいや真のボスのRedmine出てきちゃったよ、といった感じでした。


今回で、最初に考えていたものが全てインストールされたことになる、のかな。

考えてみると、手のひらに乗る四角い箱にデータベースとかWEBサーバーとか入って動いちゃっているって、すごいなぁと思うわけです。

ただ、ね。

まだ、入れただけで使っていない。果たしてパフォーマンスってどうなのか。ってところが気になるわけです。

ラズパイは使えるのか。

そのうちまたここで報告したいと思います。


参考にさせて頂いたサイト