torutkのブログ

ソフトウェア・エンジニアのブログ

さくらVPSのOSをCentOS 8に更新、さらにRedmineを4.1に更新

さくらVPSのOSをCentOS 8に、Redmineを4.1に更新

まとまった休みが取れたので、さくらVPSのサーバーのOSをCentOS 7から8に上げて、合わせてRedmineを3.4から4.1に上げる作業を実施しています。更新作業中はRedmineにコンテンツを挙げられないので、はてなに経過をメモすることにします。

CentOS 8への更新

さくらVPSが提供するOSインストール機能で、CentOS 8に上げます。さくらVPSサーバのバージョンはv3なので、標準OSのインストールではCentOS 8は選べません。カスタムOSのインストールでCentOS 8を入れます。

パーティションの設定

仮想ゲストでディスク(イメージファイル)を増やすこともないので、LVMは使用せず、/boot はext4、/はxfs、それとswapの3つのパーティションを作成しました。

マウントポイント 容量(MB) ファイルシステム
/boot 1024 ext4
swap 4096 swap
/ 残り xfs4

インストール時のトラブル

CentOS 8のインストーラーが起動し、Minimal Install でインストールを開始したところ、途中でエラー停止してしまいました。 もう1回インストールをやり直したところエラーにはならなかったので原因はよく分かりません。 なお、同じエラーメッセージが出たとのブログを見つけました。

https://www.softel.co.jp/blogs/tech/archives/6114www.softel.co.jp

このブログによると、Minimalインストールではchronyパッケージがないのでchrony関係設定を使用としてエラーになるとの分析です。

インストール後の設定

さくらVPSでインストールすると、その時点の最新パッケージがインストールされます。さくらVPSで独自のKickstartが提供されているようです。Minumalでインストールしたのですが、chronyやgccなどもインストールされていたので、さくらVPSの設定からの依存関係で追加インストールされた模様です。

気付いた点としては、chronyによる時刻同期設定済み、ネットワークはデバイス名がeth0、IPv6有効、固定IPアドレス(v4、v6)付与済み、ネームサーバ設定済み、カーネルのシリアルコンソールが有効、SELinuxは有効、などでした。

セキュリティ上、SSHのポート番号を変更、SSHでのrootログイン禁止、管理グループ以外のアカウントからのsu禁止、などを設定しました。

Redmine 4.1の稼働にむけて

MariaDBのインストールと設定

# dnf module install mariadb/server

MariaDBは、10.3がインストールされました。設定ファイルには文字コード(最近はutf8mb4を指定)、パフォーマンス設定を記述します。

/etc/my.cnf.d/mariadb-server.cnf
パラメータ名 デフォルト値 設定値
character_set_server latin1 utf8mb4
innodb_buffer_pool_size 128MB 256MB
innodb_log_file_size 48MB 64MB
innodb_flush_method fsync O_DIRECT

VPSはメモリ2GBです。Redmine(Ruby on Railsアプリケーション)はメモリ喰いなので1GBほど割いておきます。残り1GBをOS、標準サービスとMariaDBとで共用するので、MariaDBはせいぜい512MBメモリを使えればいいでしょう。 そこで、innodb_buffer_pool_sizeはその半分の256MBを割り当てます。innodb_log_file_sizeは最近のバージョンでデフォルト値が増えましたが、ここは過去の設定値の64MBを流用します。 innodb_flush_methodはO_DIRECTを指定することでデータファイルを開くときにOSのディスクキャッシュが使われないのでOS全体のメモリ使用が減ります。その分Redmineにメモリが割当てられます。

/etc/my.cnf.d/mysql-client.cnf
[mysql]
default_character_set = utf8mb4
show-warnings
サービスの登録と起動
# systemctl enable --now mariadb
セキュアな初期設定(mysql_secure_installation)

MariaDBのデフォルト設定で作られるrootアカウントにパスワードを設定、リモートからのrootログイン禁止、匿名アカウントの削除、testデータベースの削除を行います。手作業ではちょっと大変ですが、スクリプト mysql_secure_installationが用意されているのでこれを実行して設定します。

# mysql_sequre_installation
# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
Redmineから接続するアカウントの作成

MariaDB上にRedmineのデータベースと接続するアカウントを作成します。

MariaDB [(none)]> CREATE DATABASE redmine;
Query OK, 1 row affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY 'tiger' WITH GRANT OPTION;
Query OK, 0 rows affected (0.001 sec)
  • IDENTIFIED BY の後ろにアカウントのパスワードを記述します(ここでは例示のため 'tiger'を指定)。
MariaDB開発パッケージのインストール
# dnf install mariadb-devel

Rubyのインストール

CentOS 8では、パッケージにモジュールという概念が導入されており(MariaDBもモジュール)、Rubyをモジュールでインストールします。 モジュールでは複数バージョンを制御してインストールすることができます。

# dnf module list ruby
CentOS-8 - AppStream                            4.2 kB/s | 4.3 kB     00:01
CentOS-8 - Base                                 4.9 kB/s | 3.9 kB     00:00
CentOS-8 - Extras                               2.6 kB/s | 1.5 kB     00:00
CentOS-8 - AppStream
Name  Stream   Profiles    Summary
ruby  2.5 [d]  common [d]  An interpreter of object-oriented scripting language
ruby  2.6      common      An interpreter of object-oriented scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled

現在のCentOS 8では、Rubyは2.5と2.6がモジュールとして提供されています。デフォルトは2.5ですが、ここでは2.6をインストールします。 なお、Redmine 4.0.1でRuby 2.6に対応しています(https://www.redmine.org/issues/30118)。

# dnf module enable ruby:2.6
# dnf module install ruby/common

ruby-develはインストールされないので、個別にインストールします。また、rubyのbundlerもパッケージが用意されているので個別にインストールします。 パッケージの情報を見ると、次のように ruby-2.6に対応したパッケージとなっています。

# dnf info ruby-devel rubygem-bundler
名前         : ruby-devel
バージョン   : 2.6.3
リリース     : 106.module_el8.1.0+249+93480f15
Arch         : x86_64
サイズ       : 243 k
ソース       : ruby-2.6.3-106.module_el8.1.0+249+93480f15.src.rpm
リポジトリー : AppStream
概要         : A Ruby development environment
URL          : http://ruby-lang.org/
ライセンス   : (Ruby or BSD) and Public Domain and MIT and CC0 and zlib and UCD
説明         : Header files and libraries for building an extension library for
             : the Ruby or an application embedding Ruby.

名前         : rubygem-bundler
バージョン   : 1.17.2
リリース     : 106.module_el8.1.0+249+93480f15
Arch         : noarch
サイズ       : 354 k
ソース       : ruby-2.6.3-106.module_el8.1.0+249+93480f15.src.rpm
リポジトリー : AppStream
概要         : Library and utilities to manage a Ruby application's gem
             : dependencies
URL          : http://ruby-lang.org/
ライセンス   : MIT
説明         : Bundler manages an application's dependencies through its entire
             : life, across many machines, systematically and repeatably.
# dnf install ruby-devel rubygem-bundler

Redmineのインストール

Redmineアプリケーションの実行ユーザーはroot権限ではなく専用のユーザーとします。

redmineアカウントの作成
# useradd redmine
# passwd redmine
ユーザー redmine のパスワードを変更。
新しいパスワード:************
新しいパスワードを再入力してください:************
passwd: すべての認証トークンが正しく更新できました。
redmineをリポジトリからクローン

Redmineのバージョンアップに追従しやすくするため、Redmineのインストールは tarballを展開するのではなく、リポジトリのクローンを展開します。Redmineの公式リポジトリはSubversionですが、最近はgitの方が管理・操作が容易となっているので、Redmineのgitミラーリポジトリからクローンします。ブランチは、リリースブランチを指定します。

# cd /var/lib
# git clone -b 4.1-stable https://github.com/redmine/redmine.git redmine-4.1-stable
# chown -R redmine:redmine redmine-4.1-stable/
データベース設定

redmineのconfig/database.yml を作成します。

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: xxxxxxxx
  encoding: utf8mb4

パーミッションを厳しくしておきます。

$ chmod 0600 /var/lib/redmine-4.1-stable/config/database.yml
メール通知その他の設定

今回はメール配信環境、ImageMagick(互換)環境を用意していないので、configuration.ymlの設定は省略します。 後日必要が生じたら設定を行います。

移行前のデータベースを復元

バックアップしていたMariaDBのRedmineデータベースを新しいデータベースへインポートします。

$ mysql -uredmine -p redmine < redmine_mysql_www.torutk.com-20200424.dump
Redmineが使用するrubyモジュール群のインストール

Redmineが使用するrubyのモジュール群をインストールします。rubyモジュールのインストールには、rubyのbundlerを使用します。 Redmineのインストールディレクトリ下のvender/bundlerを指定し、そこへインストールします。

ユーザーredmineで以下を実行します。

$ cd /var/lib/redmine-4.1-stable
$ bundle install --path vendor/bundler --without development test rmagick
  :
Gems in the groups development, test and rmagick were not installed.
Bundled gems are installed into `./vendor/bundler`
セッションデータ暗号化の鍵生成
$ bundle exec rails generate_secret_token
データベーススキーマの更新

現時点でMariaDBのreadmineデータベースに格納されているデータは、旧Redmine 3.4のデータを復元したものです。 そこで、Redmine 4.1のスキーマに更新する必要があります。

$ bundle exec rails db:migrate RAILS_ENV=production
== 20170723112801 RenameCommentsToContent: migrating ==========================
-- rename_column(:comments, :comments, :content)
   -> 0.0073s
== 20170723112801 RenameCommentsToContent: migrated (0.0076s) =================

== 20180501132547 AddAuthorIdToTimeEntries: migrating =========================
-- add_column(:time_entries, :author_id, :integer, {:default=>nil, :after=>:project_id})
   -> 0.0335s
== 20180501132547 AddAuthorIdToTimeEntries: migrated (0.0485s) ================

== 20180913072918 AddVerifyPeerToAuthSources: migrating =======================
-- change_table(:auth_sources)
   -> 0.0025s
== 20180913072918 AddVerifyPeerToAuthSources: migrated (0.0026s) ==============

== 20180923082945 ChangeSqliteBooleansTo0And1: migrating ======================
== 20180923082945 ChangeSqliteBooleansTo0And1: migrated (0.0000s) =============

== 20180923091603 ChangeSqliteBooleansDefault: migrating ======================
== 20180923091603 ChangeSqliteBooleansDefault: migrated (0.0000s) =============

== 20190315094151 ChangeCustomValuesValueLimit: migrating =====================
-- change_column(:custom_values, :value, :text, {:limit=>16777216})
   -> 0.0289s
== 20190315094151 ChangeCustomValuesValueLimit: migrated (0.0291s) ============

== 20190315102101 AddTrackersDescription: migrating ===========================
-- add_column(:trackers, :description, :string, {:after=>:name})
   -> 0.0201s
== 20190315102101 AddTrackersDescription: migrated (0.0203s) ==================

== 20190510070108 AddUniqueIdToImportItems: migrating =========================
-- change_table(:import_items)
   -> 0.0098s
== 20190510070108 AddUniqueIdToImportItems: migrated (0.0100s) ================

== 20190620135549 ChangeRolesNameLimit: migrating =============================
-- change_column(:roles, :name, :string, {:limit=>255, :default=>""})
   -> 0.0182s
== 20190620135549 ChangeRolesNameLimit: migrated (0.0184s) ====================
一度動作確認を(WEBrick)

ここで、いったん動作確認をします。Redmine(Ruby on Rails)同梱のWebアプリケーションサーバー WEBrick でRedmineの動作確認をします。

一時的にポート3000を開き、WEBrickサーバーを動かしRedmineが動いているかを確認します。

# firewall-cmd --add-port=3000/tcp
success
$ bundle exec rails server -e production
=> Booting WEBrick
=> Rails 5.2.4.2 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2020-04-24 23:25:39] INFO  WEBrick 1.4.2
[2020-04-24 23:25:39] INFO  ruby 2.6.3 (2019-04-16) [x86_64-linux]
[2020-04-24 23:25:39] INFO  WEBrick::HTTPServer#start: pid=31266 port=3000

ここでブラウザからポート3000へアクセスします。Redmine画面が表示されたらOKです。 この時点ではまだRedmineのプラグインを入れていないので、プラグインの動作については確認できません。

この後は、Unicorn、Nginxを入れて一通り動作が完了した後にRedmineのプラグインを入れることとします。

本日の作業はここまでとし、一時的に開けたポート3000を閉じます。

# firewall-cmd --reload