write ahead log

ロールフォワード用

CentOS7にRedmineを構築する

個人的には機能が多すぎると思うのだけど,それでもRedmineは便利な道具です.

CentOS7が用意出来たので、設定してみます.

ちなみに大筋Redmine公式の通りでよいのですが えらくハマるポイントがあって試行錯誤した結果が以下になります.

最も困ったのがRubyのOpenSSL設定. こんなにハマるとは...

あと、下記方法ではSELinuxが無効なので,外部に公開するサーバなんかの場合はきちんと設定したほうが良いかと思います.

まずはアカウントを作成

adduser redmine

ネットワーク設定

現状のネットワーク設定の確認

$ nmcli dev
Device    type      STATE         Connection
eth0      ethernet  disconnected  ---
lo        loopback  unmanaged     ---

$ nmcli con
NAME  UUID                                  Type            Device
eth0  94d762a4-ec7c-40c0-bd0c-ef78cfb8e094  802-3-ethernet  ------

一度古いコネクションを削除

$ nmcli con delete eth0

コネクションを追加・設定

# nmcli con add type eth ifname eth0(<-ここはnmcli devで確認したデバイス名) con-name eth0
# nmcli con mod eth0 ipv4.method manual ipv4.addresses "[IPアドレス]/サブネットの桁数" ipv4.dns [DNSサーバのIP] ipv4.gateway [デフォルトゲートウェイのIP]
# nmcli c down eth0
# nmcli c up eth0

この時点でSSHが接続できる.

基本設定

パッケージアップデート

$ yum check-update
$ yum update

sudoの設定

# visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
redmine ALL=(ALL)       ALL    #<- 追記

SELinux無効化

/etc/sysconfig/selinuxを編集

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled

rebootする

httpをファイアーウォールで許可する

[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent
success

[root@localhost ~]# firewall-cmd --reload
success

[root@localhost ~]# firewall-cmd --zone=public --list-services
dhcpv6-client http ssh

インストール

開発ツール(Cコンパイラとか)のインストール

[root@localhost ~]# yum -y groupinstall "Development Tools"

RubyとPassengerのビルドに必要なヘッダ等のインストール

yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel libffi-devel

PostgreSQLとヘッダファイルのインストール

yum -y install postgresql-server postgresql-devel

Apacheとヘッダファイルのインストール

yum -y install httpd httpd-devel

ImageMagickとヘッダファイル・日本語フォントのインストール

yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts

rubyをリビルドする必要があるのでruby-develパッケージを入れる

yum -y install ruby-devel

Rubyをダウンロードしてビルド・インストール

curl -O https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz

tar xvf ruby-2.2.3.tar.gz
cd ruby-2.2.3
./configure --disable-install-doc
make
make install
cd ..

当初は上述までのRubyのインストールだけで進めていた. しかしSSLエラーが多発する.(GemやBundlerで) 一時しのぎのために以下のように gem source -a http://rubygems.org/ gem source -r https://rubygems.org/ とするなどして,https通信を避けることで逃げていたが, もちろんそれで最後までうまくいくわけもない そこで下記設定を行うハメになった.

このままじゃ動かないので以下の工程で再ビルドする

cd ruby-2.2.3
./configure
cd ruby-2.2.3/ext/openssl/
ruby extconf.rb --with-openssl-dir=/usr/lib64/openssl/ --enable-shared
make
make install

PostgreSQLの設定

postgresql-setup initdb

RedmineからPostgreSQLに接続するための設定を追加 /var/lib/pgsql/data/pg_hba.confを編集

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   redmine         redmine                                 ident
local   all             all                                     peer
# IPv4 local connections:
host    redmine         redmine         127.0.0.1/32            md5
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    redmine         redmine         ::1/128                 md5
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident

PostgreSQLの起動および自動起動の設定

systemctl start postgresql.service
systemctl enable postgresql

PostgreSQLのディレクトリに移動

cd /var/lib/pgsql

Redmine用ユーザーの作成

sudo -u postgres createuser -P redmine
Enter password for new role: (PostgreSQLの redmine用ユーザーに設定するパスワードを入力)
Enter it again: (パスワード再入力)

Redmine用データベースの作成

sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine

Redmineのインストール

svn co http://svn.redmine.org/redmine/branches/3.2-stable /var/lib/redmine

DB設定

[root@localhost ~]# cd /var/lib/redmine/
[root@localhost redmine]# ls
CONTRIBUTING.md  Rakefile      bin        db     files  plugins  test
Gemfile          app           config     doc    lib    public   tmp
README.rdoc      appveyor.yml  config.ru  extra  log    script   vendor
[root@localhost redmine]# cp config/database.yml.example config/database.yml
[root@localhost redmine]# vi config/database.yml #以下に変更する
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: [ここにPostgresのパスワードを入れる]
  encoding: utf8

Redmineのインストールディレクトリへ移動

cd /var/lib/redmine

gemパッケージのインストール パッケージ入れる

bundle install --without development test --path vendor/bundle

エラーが出る. 使う予定もないのにmysqlとnokogiriがいると言う. (ActiveRecordが依存してるっぽい.Redmine内部でもnokogiriとか使ってるのかね?)

入れる

yum -y install mysql-devel
yum -y install libxml2-devel
yum -y install libxslt-devel

システムライブラリを利用するよう設定

bundle config build.nokogiri --use-system-libraries

セッション改ざん防止用秘密鍵の作成

bundle exec rake generate_secret_token

DBテーブル作成

RAILS_ENV=production bundle exec rake db:migrate

デフォルトデータの登録

RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

Passengerのインストール

gem install passenger --no-rdoc --no-ri

PassengerのApache用モジュールのインストール(公式では--autoオプションを利用していたが,それでは動かなかった)

passenger-install-apache2-module

画面指示に従うと最後に以下のような内容が示されるので記録しておく.

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

   LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.25/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.25
     PassengerDefaultRuby /usr/local/bin/ruby
   </IfModule>

Apache用設定内容の確認

下記コマンドを実行するとApacheに追加すべき設定が表示される. この情報はこの後Apacheの設定を行うときに使用する.(記録した内容と同じはず)

passenger-install-apache2-module --snippet

出力結果はこんな感じ

# passenger-install-apache2-module --snippet
LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.25/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.25
  PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>

Apacheの設定

以下の内容で /etc/httpd/conf.d/redmine.conf を作成してください。

# Redmineの画像ファイル・CSSファイル等へのアクセスを許可する設定。
# Apache 2.4のデフォルトではサーバ上の全ファイルへのアクセスが禁止されている。
<Directory "/var/lib/redmine/public">
  Require all granted
</Directory>

# Passengerの基本設定。
# passenger-install-apache2-module --snippet で表示された設定を記述。
# 環境によって設定値が異なるため以下の3行はそのまま転記せず、必ず
# passenger-install-apache2-module --snippet で表示されたものを使用すること。
#
LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.21/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.21
  PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>

# Passengerが追加するHTTPヘッダを削除するための設定(任意)。
#
Header always unset "X-Powered-By"
Header always unset "X-Runtime"

# 必要に応じてPassengerのチューニングのための設定を追加(任意)。
# 詳しくはPhusion Passenger users guide(https://www.phusionpassenger.com/library/config/apache/reference/)参照。
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 864000
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerSpawnMethod smart
PassengerFriendlyErrorPages off

Apache起動

systemctl start httpd
systemctl enable httpd

Apache上のPassengerでRedmineを実行するための設定

redmine配置ディレクトリを読み書きできるように権限変更

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

httpd.confを編集

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

Apache再起動

systemctl restart httpd

起動エラーの時はDB接続エラーやデフォルトデータのロードに失敗している可能性が高い. 実際, Postgresの認証が通っていないことに気づかず,上述の設定値ロードを1度やり直した.

バックアップの設定

ftpを入れる

yum install -y ftp

redmineユーザでバックアップコマンドが動くことを確認

/usr/bin/pg_dump -U <username> -Fc --file=redmine.sqlc <redmine_database>

カレントディレクトリにredmine.sqlcができる.一旦削除.

/home/redmineにバックアップスクリプトを配置

mkdir backup-script
backup.shをscpでコピー
ftptransport.batをscpでコピー

スクリプトの内容は以下の通り

backup.sh

BACKUP_TIME=`date '+%Y%m%d%I%M%S'`
BACKUPS_DIR=/home/redmine/backups
DIR_PATH_BASE=${BACKUPS_DIR}/${BACKUP_TIME}

rm -rf $BACKUPS_DIR

mkdir -p $DIR_PATH_BASE/files
mkdir -p $DIR_PATH_BASE/db_dump

cp -ra /var/lib/redmine/files/* $DIR_PATH_BASE/files/

/usr/bin/pg_dump -U redmine -Fc --file=$DIR_PATH_BASE/db_dump/redmine.dump redmine

cd ${BACKUPS_DIR}
tar zcvf ${BACKUP_TIME}_redmine_backup.tar.gz $BACKUP_TIME

mkdir -p ${BACKUPS_DIR}/for_transport/
cp -a ${BACKUP_TIME}_redmine_backup.tar.gz ${BACKUPS_DIR}/for_transport/

ftp -n < /home/redmine/backup-script/ftptransport.bat

ftptransport.bat

open [転送先FTPサーバのIP]
user [FTPサーバのID] [password]
bin
prompt

cd [転送先FTPサーバのディレクトリ] # リモートでcdにて移動
lcd /home/redmine/backups/for_transport/ # ローカルでcdにて移動
put *

bye

cronを設定

crontab -e
mailto="hogehoge@fugafuga.jp"
55 23 * * * /home/redmine/backup-script/backup.sh

リストアは以下でできるらしい. 実はDBはためしてない.なんかごめんなさい.

# Postgres
pg_restore -C -d postgres redmine

# Files restore
cp -ar backupdate/files/* /var/lib/redmine/files

上記までで動いた. かなり時間をかけたと思う.

ただ、時間を当てた価値はあったかなと. 最近のRedmineはMarkdownも使えるんだね,知らなかった.ちょー便利だ.