さくら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