XREAでRedmineをホストする

XREAのレンタルサーバ(無料プラン)でRedmineをホストする構成について。

要件・制約・必要なもの

  • Ruby 2.3.7 + Redmine 3.4.6 :ビルドしてFTPでアップロードする
    • FastCGI対応 :ソースコードを若干修正し対応化させる
    • Linux機(CentOS 7.x) :XREAの環境(DocumentRoot)に合わせれインストールすべく、Root権限を持つLinux環境
  • Apache HTTP Server 2.4.x + mod_fcgid :すでに用意されている
    • SuExec有効 :元々有効、変更できない
    • FollowSymLinks無効 :元々無効、変更できない
    • SymLinksIfOwnerMatch有効 :元々無効、有効にできる
  • XREAレンタルサーバ + 独自ドメイン
    • XREAレンタルサーバ :借りておき、sNNNN.xrea.comのドメインはRedmine操作用のCGIをホストするのに利用
    • 独自ドメイン :Redmineへのアクセス用に利用するので、ドメインを取得しネームサーバの設定も行っておく
  • FTP転送するクライアント端末

サブドメインを作り、XREA上でデフォルトでできるものとは別のサイトを作るのがポイント。
そのため完全無料ではできず、ドメイン取得料(年100円~)+ネームサーバ利用料(ドメイン取得料すれば無料で使える場合もあり)の費用が発生する。

Redmineの準備

こちらでやった内容とほぼ一緒。
あらかじめXREAのFastCGIでやることが分かっているので、それ用の手順を先に持ってきて書き下すと以下の通り。

# XREA ID
_xreaID="YOUR_XREA_ID_HERE"                                    # HOME is "/virtual/${_xreaID}" in XREA

# 必要なOSパッケージのインストール
sudo yum install -y ruby-devel                                         # for Ruby build
sudo yum install -y openssl-devel                                      # for Ruby dependencies
sudo yum install -y rubygem-nokogiri ImageMagick-devel sqlite-devel    # for Redmine
sudo yum install -y fcgi-devel                                         # for Redmine FastCGI


# XREA Path
if [ ! -d /virtual/${_xreaID} ]
then
    sudo mkdir -p /virtual/${_xreaID}
fi


# Ruby and RubyGems
wget -O ruby-2.4.1.tar.gz https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
tar zxf ruby-2.4.1.tar.gz
pushd ruby-2.4.1
 
export CFLAGS="-fPIC"
./configure --disable-install-doc --prefix=/virtual/${_xreaID}
 
make
make install
 
popd
export PATH=${HOME}/bin${PATH:+:}${PATH}

gem install bundler
gem install fcgi

# Redmine 
wget -O redmine-3.4.6.tar.gz http://www.redmine.org/releases/redmine-3.4.6.tar.gz
tar zxf redmine-3.4.6.tar.gz
pushd redmine-3.4.6
pushd config

# Database設定
cat <<CONF > database.yml
# SQLite3 configuration
production:
  adapter: sqlite3
  database: db/redmine.sqlite3
CONF
 
# メール配信設定等
# 検証のため一旦空で作る
cat <<CONF > configuration.yml
production:
CONF

popd

# Gemfileにfcgiの追加
sed -i -e 's/^\(gem "rails".*\)/gem "fcgi"\n\1/' Gemfile

# モジュールのインストール
bundler install --without development test --path vendor/bundle

# セッション用秘密鍵の生成
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

head -n +2 public/dispatch.fcgi.example > public/dispatch.fcgi
echo 'ENV["RAILS_ENV"] = "production"' >> public/dispatch.fcgi
tail -n +2 public/dispatch.fcgi.example >> public/dispatch.fcgi
mv -fv public/dispatch.fcgi{.example,}
_replace="s/^#\\!.*/#\\!${HOME//\//\\/}\\/bin\\/ruby/"
sed -i -e ${_replace} public/dispatch.fcgi
rm -f public/dispatch.fcgi.example

cat <<HTACCESS > public/.htaccess
<Files ~ "^\.ht(access|passwd|digest)$">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

<LimitExcept GET POST>
    Order allow,deny
    Deny from all
    Satisfy all
</LimitExcept>
HTACCESS
cat public/htaccess.fcgi.example >> .htaccess
sed -i -e 's/^Options.+$/Options +SymLinksIfOwnerMatch +ExecCGI/' public/.htaccess
rm -f public/htaccess.fcgi.example

popd

XREAサーバ

サイト設定

ダッシュボードの「サイト設定」より、Redmine用のサイトを定義する。
ドメイン名: (任意)
転送設定: (空)
動機設定: しない
IPアドレス: (変更しない)
SSL: 無料SSL推奨(Redmineログインにユーザ名・パスワードを入力するのでTLSで暗号化するのが望ましいがなくても動作に問題はない)
PHP: 使わないのでそのままで
オプション: 無料プランならチェックが強制

Redmineファイル一式の転送

Redmineを準備したサーバからFTPで転送する。
lftpのmirror -Rを使うとrsync的なことがFTPでできて便利。

lftp "${xreaServerHostname}"

以下、lftp中のコマンド

set ssl:verify-certificate false
user ${_xreaID} ${_xreaPassword}

mirror -R redmine-3.4.6 ./public_html/

20分くらいかかるので、screen等をつかうのがよい。

インストール

Redmineは以下の構成で配置する。

/virtual/${_xreaID}/public_html/redmine-3.4.6           # redmine本体
                                redmine                 # redmine-3.4.6へのシンボリックリンク
                                                        # redmineのバージョンを変える場合にはこの向き先を変える
                                ${_yourDomainName}      # XREAサイト構成で定義したドメイン名(FQDN)を名前にもつ、redmine/publicへのシンボリックリンク
                                                        # これによりドメイン名でアクセスしたときにredmine/publicをドキュメントルートとすることができる

シンボリックリンクはFTPでは転送できないので、XREAでは許可されているSSH(SCP/SFTP)を使うか、CGIの内部の処理で行う。
今回は後者のCGIを利用する。
以下のインストール用CGI(install.cgi)を/public_html以下に置き、アクセスする。

#!/bin/bash

echo "Content-Type: text/html"
echo

cat <<HTML
<html>
<head><title>Install.CGI</title></head>
HTML

cat <<HTML
<body>
HTML
_domain=            # *** YOUR DOMAIN NAME HERE *** #
_id=                # *** YOUR XREA ID HERE *** #
_verRedmine=3.4.6

cat <<HTML
<h1>Param</h1>
<ul>
HTML

for key_ in ${!_*}
do
    if [ ! "key_" = "_" ]
    then
        echo "<li>${key_}<ul><li>${!key_}</li></ul></li>"
    fi
done

cat <<HTML
</ul>
HTML


cat <<HTML
<h1>Installation</h1>
<pre>
HTML

# Installation commands are here
cd /virtual/${_id}/public_html; pwd
echo OK


# Symlink creation function
function CreateSymlink() {
    local __failed=0
    local __source=${1}
    local __symlink=${2}

    if [ -e "${__symlink}" ]
    then
        if [ -f "${__symlink}" -o -L "${__symlink}" ]
        then
            rm -f "${__symlink}" || __failed=1
        elif [ -d "${__symlink}" ]
        then
            rmdir "${__symlink}" || __failed=1
        else
            __failed=1
        fi
    fi

    if [ "${__failed}" = 0 ]
    then
        ln -s "${__source}" "${__symlink}" || __failed=2
    fi

    case "${__failed}" in
    0)
        ls -l "${__symlink}"
        ;;
    1)
        echo "*** Failed to remove file '${__symlink}' ***"
        ;;
    2)
        echo "*** Failed to create symlink '${__symlink}' ***"
        ;;
    esac
}


# Symlink "public_html/redmine" is pointing to public_html/redmine-x.y.z
CreateSymlink "redmine-${_verRedmine}" "redmine"


# Symlink "public_html/${_domain}" is pointing to redmine/public
CreateSymlink "redmine/public" "${_domain}"


cat <<HTML
</pre>
<body>
<br />
</body>
</html>
HTML

大したCGIじゃないので、curlでリクエストして処理をキックする。

curl http://${_xreaID}.${_xreaServer}.xrea.com/install.cgi

処理が終わったら追加したドメインネームに対してアクセスするとRedmineが表示される。

インストールが終わったらinstall.cgiは削除しておく。

運用

Redmineをちゃんと運用することを考えると、以下の点について考慮および自動化の実装をしないといけない:

  • データベースをSQLiteにしているため、データファイルを定期的にバックアップする
  • Apache mod_fcgidでプロセスが動いているので、プラグイン追加・削除等を実施した後はRedmine再起動はdispatch.fcgiを削除+再作成して再起動させる

これらの実装は追々…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です