2021年4月12日月曜日

Redmineのサーバー移行(4.0→4.1.2)とGoogle認証プラグイン

サーバー移転したとき苦労したので、備忘録として残しておきます。

Redmime 利用しているGoogle認証プラグインは、「Redmine Omniauth Google plugin」に対して

の修正版を施したものです。こちらは、redmine 4.1.2 でも動作します。

移転先は、さくら VPS(CentOS Stream8)です。


関連情報


STEP 1. 新サーバーに Redmine 4.1.2 を新規導入


とても長い道のりがあります。
基本的には上記サイトの通りにセットアップするとよいです。
  1. DB: MariaDB 10.3.x
  2. Perl: perl 5.26
  3. Ruby :  2.6.x 
  4. Unicorn(自動起動)
  5. Nginx 1.18(非暗号, 自動起動)
ここまでうまくいけば、次に Let's Encrypt を使った常時SSLで redmine を動かしたいと思うはず。

STEP 2. 通知のためにメールサーバ(postfix)を導入しよう


Let's Encrypt の証明書通知のために、メールが送信できる環境が必要です。今回は他のメールサーバーを使わず、自前で完結することを想定しています。そのため postfix をインストールします。postfixをインストールしたなら、mailコマンドも使えるようにしておくとなにかと便利です。

dnf install postfix
dnf install mailx

上記2つコマンドで mailコマンドと postfixをインストールします。
今回は完全にローカルでしか使わないので、外部からの 25/tcp を許可する必要はありません。IPv4 のみで良い場合、下記のように inet_protocols を ipv4 にしておくとよいです。

/etc/postfix/main.cf を編集

inet_protocols = ipv4
myhostname = ホスト名(FQDN)
mydomain = ホスト名(FQDN)

上記3つを設定したら、

service postfix start
systemctl enable postfix

で自動起動しておけばよいです。
かりにホストが、hogehoge.example.com であるなら

echo test  | mail -s 'test'  自分のメールアドレス

として自分にメールしてみましょう。
たとえば root ユーザーで実行すると

root@hogehoge.example.com からメールが届くはずです。

また /etc/aliases を編集し
root: サーバーのシステム通知をうけるメールアドレス

をいれて
newaliases
にて、エイリアスデーターベースを更新しておきましょう。このあたりはサーバー管理の問題なので、詳細は割愛します。

STEP 3. Redmine を Let's Encrypt を使った常時SSL化してみよう



証明書発行に、certbot を利用する場合、

http://ホスト名(FQDN)

が外部からアクセスできる状況が必要です。実際には Let's Encrypt 側から http://ホスト名/.well-known/ 以下にアクセスができる必要があります。 

さくらVPSであれば、コントロールパネルのパケットフィルターから一時的に 80/tcp を外部から許可しましょう。なお 443/tcp (https://)については、IP制限をかけるなど限定接続可能なら、そのほうが安全です。

nginx の場合の Let's Encrpyt 設定方法

の設定が終わっているとします。

SSLサイト:https://hoge.sample.com 

とする場合、

https://hoge.sample.com/.well-known 以下に対するアクセス権限が必要です。常時SSLサイトにしているなら、上記フォルダ以外を https へ転送すればよいです。

server {
    listen 80;
    server_name hoge.sample.com;
 
    location /.well-known {
      root /var/www/certbot/;
    }
 
    location / {
      return 301 https://$host$request_uri;
    }
}

上記のように、http://hoge.sample.com/.well-known 専用の root ディレクトリを指定して、実際にそのディレクトリを作成してください。ここは certbot コマンドによって、一時的に証明書関連のデータが保存されます。実行完了後、データは削除されます。

また
/etc/letsencrypt/renewal/hoge.sample.com.conf の
[[webroot_map]]
hoge.sample.com = /var/www/certbot/

のように webroot_map を上記 http://hoge.sample.com/.well-known で指定したルートディレクトリにしておきましょう。

設定がうまくいっていれば、

/etc/cron.d/letsencrypt で設定されている コマンド
  • certbot renew --post-hook "systemctl restart nginx"
を実行して、うまく更新されていることを確認しましょう。

次に
を参考に nginx の設定を変更します。
 redmine 用の設定
/etc/nginx/conf.d/redmine.conf を上記リンク先にあるように編集します。

ただし、後ほどインストールする Google 認証プラグインのため、下記の赤部分を追加してください。これを追加することで redmine の back_url が http:// から https:// に切り替わってくれます。

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://unicorn;
    }
    
これで、
https://ホスト名(FQDN)

としてアクセスできたら成功です。

STEP 4. Redmine データの移行


を参考に、元サーバーから
  1. files フォルダ
  2. themes フォルダ内の利用テーマフォルダ
  3. plugins フォルダ内の利用プラグインフォルダ
  4. redmine 用データベース
をバックアップしましょう。

新規インストールしたのと同じデータベース名(上記例だと redmine)にすると、
私の場合にはエラーがでたので
redmine2 など別のデータベースを作成して、そちらにインポートするのがよいと思います。

DBをインポートする、変更した場合にはその都度
redmine のトップフォルダで

bundle exec rails db:migrate RAILS_ENV=production
bundle exec rails redmine:plugins:migrate RAILS_ENV=production

をすること。

プラグインは個別に移行が必要かもしれないので、細かいところは省きます。
プラグインを出し入れした場合

redmine のトップフォルダで

bundle install
systemctl start redmine-unicorn
systemctl status redmine-unicorn

をしましょう。これで unicorn が fail になるようなら、そのプラグインが新しい redmine に対応していないことになります。それをフォルダから外すなりして、上記コマンドを実行しなおしてください。

files はそのまま入れ替えてください。

テーマ内の利用テーマフォルダもそのまま入れ替えてもいいですが、新しいバージョンが出ているなら更新することも検討すればよいです。

Google Developer Console にログインして、

https://ホスト名(FQDN)

を追加しておく必要があります。

今回ハマったのは、
  • proxy_set_header X-Forwarded-Proto $scheme;
の設定をいれていなくて

https://ホスト名(FQDN)/oauth_google?back_url=http%3A%2F%2Fホスト名(FQDN)%2F

のように back_urlが http なので、Google認証できないというものでした。

2021年7月2日 更新
2021年4月12日 @kimipooh

0 件のコメント:

コメントを投稿