ALMInium

Redmine、DVCS(Git/VMercurial)、Backlogs、コードレビュープラグインなど、開発に必要な環境を簡単にセットアップできるもの。

Portal

http://alminium.github.io/alminium/

https://github.com/alminium/alminium

CentOS7にインストールする方法

ここを参考にさせて頂きましたが、CentOS7だと、いろいろ問題があります。
http://little-braver.com/346/

課題1 MySQLからmariadbに変更になっている

MySQLとmariadbは、ほぼ互換なのだけれど、サービス起動の名前が違っていたりして、smeltスクリプトでデーモンの起動が失敗する。
そのため、smelt実行前に予め起動しておく。

#service mariadb start

課題2 SELinuxの設定の無効化/ファイウォールの無効化

起動の仕様がinit/upstartからsystemdに変更になっているからなのか、
smeltスクリプトでデーモンの起動や、設定が失敗する。

インストール時には、ファイアフォールは解除しておく。後で80だけ許可しましょう(その手順は後述)。

#iptables -F

ちなみに、CentOS7は、iptablesじゃなくて、firewalldに変更になっているので、
これまでのやりかたではダメ。

課題3 mod_perlがApache2.4に対応していないので、インストールできない

これが一番の問題。mod_perlが足りなくて、apacheが起動できない。
なので、mod_perlを使う設定を外すんだけど・・・
外しちゃうと、svn連携やgit連携が出来なくなると思う。
mod_perlがいつ対応してくれるのかも不明。もう1年ぐらい更新されていない。

ALMiniumインストール後(smelt実行後)に、以下を実施する。

#vi /etc/opt/alminium/alminium.conf

- Include /etc/opt/alminium/vcs.conf
+ #Include /etc/opt/alminium/vcs.conf

以上の対応で、httpdは起動できる。

#service httpd start

課題4 ブラウザでアクセスしても、httpsにReWriteされる

localhost以外でアクセス(IP直打ちとか)すると、

/etc/httpd/conf.d/welcome.conf

に設定されているページが優先されて表示されてしまう。

# vi /etc/opt/alminium/redmine.conf
-   RewriteEngine On
+   RewriteEngine Off

で、解決する。

インストール手順

SELinuxを無効にする

SELinuxが有効だと、細かい設定が大変なので無効にします。

vi /etc/sysconfig/selinux

「enforcing」を「disabled」へ変更します。

- SELINUX=enforcing
+ SELINUX=disabled

再起動後、「getenforce」コマンドで「Disabled」になっていることを確認します。

# getenforce
Disabled

ポートの開放

firewalldで80のポートを追加します。

現在のゾーン(デフォルトはpublic)に、http(80番ポート)の通信を許可する。

ゾーンの確認

# firewall-cmd --list-all

httpポート解放の設定

# firewall-cmd --add-service=http --zone=public --permanent

定期の反映

# firewall-cmd --reload

yumでいろいろインストール

# yum groupinstall "Development Tools"
# yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel
# yum install httpd httpd-devel
# yum install ImageMagick ImageMagick-devel ipa-pgothic-fonts
# yum install wget git
# yum install mariadb-server mariadb-libs mariadb-devel mariadb
# yum install ruby ruby-devel ruby-libs rubygem

bundlerのインストール

# gem install bundler --no-rdoc --no-ri

Passengerのインストール

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

ALMiniumのインストール

GitHubからALMiniumを取得します。

# git clone https://github.com/alminium/alminium.git

「git checkout dev」コマンドで開発中の最新バージョンをチェックアウトします。

# cd alminium
# git checkout dev

「smelt」を実行し、ホスト名などのオプションを選択します。

# bash ./smelt

以下を前提に、動作確認しています。
* SSLのサポート→しない
* セキュリティの設定→する(SE Linuxの無効化をする)
* Jenkinsインストール→しない
* SE Linux →設定する

smeltの実行が終わったら、前述の「課題3」と「課題4」を実施。

インストール完了

ブラウザに

http://[ipアドレス]

とか

http://localhost

と入力して表示されればOK!

ほっとくとログが肥大していくので切り替える設定をする

logrotateを利用する。logrotateの細かい仕様の話はググってもらうとして、結局のところ、CentOS7では、

/etc/logrotate.d

配下に設定ファイル(ファイル名任意)を作ればよい。

# cd /etc/logrotate.d
# vi redmine

+ /opt/alminium/log/production.log {
+   weekly
+   rotate 4
+   dateext
+   copytruncate
+   missingok
+ }

ファイルを作ったらテストしてみる。以下のコマンドを叩く。
-dオプションだと、実際にログの切替は発生しない。エラーが出なかったら、とりあえずOK。

# logrotate -dv /etc/logrotate.d/redmine 
reading config file /etc/logrotate.d/redmine

Handling 1 logs

rotating pattern: /opt/alminium/log/production.log  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /opt/alminium/log/production.log
  log does not need rotating

本当にこれで動いてくれるかは、ログ切替タイミングでログ出力先を確認してみよう。
(環境に依存するが、おそらく日曜日の朝に切り替えになる。 その後、 /opt/alminium/log の中を確認してみること。cronのログを確認するのもいいと思う。)
ちなみに強制実行は、

# logrotate -f /etc/logrotate.d/redmine 

これで即時切替する。

MariaDB(MySQL)の文字コードをutf8mb4にする

utf8の4Byte文字に対応するよう文字コードを変更しておく。
初期状態では、4byte文字を入力するとおかしなことになる。
以下を参考にして実施。

Dig that groovy! - Redmine構築後のDBの文字コードをutf8mb4に変換して絵文字に対応する
http://zappy.hatenablog.jp/entry/2015/05/19/015044

1.DBのバックアップ

念のためにしておく

2.my.cnfの変更

# vi /etc/my.cnf.d/server.cnf

以下を[mysqld]セクションへ追記。

[mysqld]
character-set-server = utf8mb4
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

3.Mariadbを再起動

# service mariadb restart

DB情報を変数にあらかじめ追加する

4.DB情報を変数にあらかじめ追加する

# MYSQL_DB=alminium
# MYSQL_USER=alminium
# MYSQL_PASS=alminium
# CONVERT_SCRIPT_FILE=convert_script

5.文字コード変換用スクリプトの作成

# (echo 'alter database `'"$MYSQL_DB"'` default character set utf8mb4;'; mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "show tables" --batch --skip-column-names | xargs -I{} echo -e 'alter table `'{}'` ROW_FORMAT=DYNAMIC;\nalter table `'{}'` convert to character set utf8mb4;') > $CONVERT_SCRIPT_FILE

めっちゃ助かりました。クポさん、ありがとうございます。

6.スクリプトの実行

# mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB < $CONVERT_SCRIPT_FILE

7.RedmineのDB設定の変更

# vi /opt/alminium/config/database.yml
- encoding: utf8
+ encoding: utf8mb4

8.Apache再起動

# service httpd restart

その他

httpsでアクセスしたい

# vi /etc/opt/alminium/alminium.conf

コメントアウトを外す

- #Include /etc/opt/alminium/redmine-ssl.conf
+ Include /etc/opt/alminium/redmine-ssl.conf

バックアップ&リストア

バックアップ

dbは、alminium配下だけでも、リストア対象としては、十分です。
私は、リストア時に設定ファイルの差分を確認したいので、丸ごともバックアップしています。

# mysqldump -u root alminium        > /tmp/backup_20150101_mariadb_alminium.dmp
# mysqldump -u root --all-databases > /tmp/backup_20150101_mariadb_all.dmp

tarは、/opt/alminium/files配下だけでも、リストア対象としては、十分です。
私は、リストア時に設定ファイルの差分を確認したいので、丸ごとバックアップしています。

# cd /opt
# tar cvfj /tmp/backup_20150101_opt_alminium.tar.bz2 alminium

リストア

# service httpd stop
# cd /opt/alminium
# tar xvfj /tmp/backup_20150101_opt_alminium.tar.bz2

前提として、alminiumのdatabaseがからで存在すれば、バックアップ時に取得したダンプデータを使ってデータを投入できます。

# mysql -u root alminium < /tmp/backup_20150101_mariadb_alminium.dmp

databaseがなんにもなかったら、これでいけるんじゃないかな・・・

# mysql -u root alminium < /tmp/backup_20150101_mariadb_all.dmp

wikiの生データ抽出(自作ツール)

以下のシェルスクリプトで、wikiの加工前(MarkDown記法そのまま)のデータを取得できます。
別の環境に移行する時や、うっかりwikiだけ消してしまった時の復旧などに便利。

実行するとカレントディレクトリにwiki毎にテキストファイルを吐くので、実行する場所は注意してください。wikiの記事数によるけど、いっぱいファイルが吐かれるよ!

getRedmineWiki.sh

#!/bin/bash

# Redmineのwikiをそのままダンプするシェルスクリプト ver 0.2
# 2016.9.18 kanata

# 環境に合わせて書き換えてね ----------
URL="https://raintrees.net" 
PROJECTID="a-painter-and-a-black-cat"
ID="xxxxxxxxxx"
PASS="xxxxxxxxxx"
#--------------------------------------

LIST=`curl -s -b cookie.txt -c cookie.txt ${URL}/projects/${PROJECTID}/wiki/index|grep "^<li><a"|grep wiki|grep -v "wiki selected"|grep "^<li><a"|grep wiki|grep -v "wiki selected"|cut -d'/' -f5|cut -d"\"" -f1`

#########
# login #
#########
echo "login start"

while :
do
  TOKEN=`curl -s -b cookie.txt -c cookie.txt  ${URL}/login|grep authenticity_token|cut -d "\"" -f20|tail -1`
  RESULT=`curl -s -b cookie.txt -c cookie.txt -d "utf8=&#x2713;" -d "authenticity_token=${TOKEN}" -d "username=${ID}" -d "password=${PASS}" "${URL}/login"|grep errorExplanation`

  if echo ${RESULT} |grep errorExplanation
  then
    echo "login error. Retrying.."
  else
    break
  fi
done

echo "logged in"

######################
# wikidata get start #
######################
echo "wiki data get start"

for WIKI in ${LIST}
do
  echo "- ${WIKI}"
  curl -s -L -b cookie.txt -c cookie.txt "${URL}/projects/${PROJECTID}/wiki/${WIKI}/edit" -o ${WIKI}.tmp
  #どうやらcurlがファイルにflashするのに時間差があるようなので、少し待つ
  sleep 1

  #なんちゃってスクレイピング
  echo -n "" > ${WIKI}.txt
  FLAG="0"
  while read LINE
  do
    if echo ${LINE}|fgrep "<textarea " > /dev/null
    then
      FLAG="1"
    fi
    if echo ${LINE}|fgrep "</textarea>" > /dev/null
    then
      echo "${LINE}" |sed 's/<\/textarea>//g' >> ${WIKI}.txt
      FLAG="0"
    fi
    if [ ${FLAG} = "2" ]
    then
      echo "${LINE}" >> ${WIKI}.txt
    fi
    if [ ${FLAG} = "1" ]
    then
      FLAG="2"
    fi
  done < ${WIKI}.tmp
  rm ${WIKI}.tmp
done

# クッキーは消さない方が吉(初回のログイン処理の動作が安定しないので)
#rm cookie.txt
echo "wiki data get finish"

exit 0

ログイン処理に失敗したりする。何度か実行すると成功する。なんでだ。。

クリップボードから画像を追加 (サイズの上限: 100 MB)