【移行・設計】centos7からalmalinuxへの移行Tips

※2024/1/5時点の記載を更新

## 初めに
QOLを上げるため、自宅内にプライベートサーバを構築しています。
個人利用を目的としているため、自宅のWindowsPC上にVMWareをインストールし、仮想サーバ（LinuxOS）を構築できる環境があることを前提としています。
この記事で紹介している内容は、構築方法となります。

* 各種ソフトウェアのインストール
* テーブル移行のポイント
　（テーブル設計）

 要件や設計に関しては、別記事に記載しています。

---

## 背景
プライベートオンリーの日記および家計の状況分析と可視化を目的とした統合管理サーバ（自称ですが・・・）を、自宅用PC内の仮想マシン（centos7.6）として構築していました。（下記方法で構築）

https://qiita.com/trkrcafeaulate/items/0015ad11de452f55cc35

今後も使用継続していきたいところでしたが、
利用していたcentos7.6が2024年6月30日にサポート期限が終了し、移行しないとセキュリティアップデートができなくなる懸念がありました。

そこで、よりセキュリティアップデートが期待できるOSにするため、新しいosへの入れ替えを検討・構築を行いました。

---

## 検討内容
### OSのディストリビューション検討
RockyLinux9.0とalmalinux8.4とで検討しました。
リリース後の修正対応の速さを重視するため、AlmaLinuxを採用しました。

https://atmarkit.itmedia.co.jp/ait/articles/2110/07/news006.html

https://zenn.dev/en2enzo2/articles/baf0718ca71919

https://blog.apar.jp/linux/15640/#toc1

---

## 移行前後の構成

移行前後でソフトウェアの構成が変わりましたので、そのノウハウを備忘で記載しました。
移行前と移行後の構成は下記の通りです。
基本的には変わらないのですが、細かいところで差異があります。

＊ サーバアーキテクチャのそれぞれの設計観点は別の記事で記載を予定しています。

---

* 移行前
    ```plantuml
    @startuml
    
    title 移行前
    skinparam linetype ortho
    skinparam rectangle {
    BackgroundColor White
    BorderColor DarkBlue
    }
    
    circle "AllowedUsers"
    circle "InvalidUser"
    rectangle "firewall_Router"
    rectangle "OS(CentOS7)" #White {
        rectangle "Apache" #Pink
        rectangle "Bash Scripts" #LightGreen
        rectangle "Metabase" #LightGreen
        rectangle "WordPress" #LightGreen
        database "PostgreSQLMaster"
        database "PostgreSQLSlave"
        package "PostgreSQLSnapshot" #LightBlue
    }
    "AllowedUsers"-[hidden]r--"Apache"
    "InvalidUser"-[hidden]r--"firewall_Router"
    rectangle "Datas" {
        rectangle "Websitesdata" {
            package "stock"
            package "documents"
            package "news"
            "stock"-[hidden]d-"documents"
            "documents"-[hidden]d-"news"
        }
        rectangle "PersonalDatas" {
            package "Pictures"
            package "Logs"
            package "Stats"
            package "receipt"
            "Pictures"-[hidden]d-"Logs"
            "Logs"-[hidden]d-"Stats"
            "Stats"-[hidden]d-"receipt"
        }
        "Websitesdata"-[hidden]r-"PersonalDatas"
    }
    rectangle "Prohibited"
    "OS(CentOS7)"-[hidden]r--"Datas"
    "AllowedUsers"-[hidden]u--"firewall_Router"
    "AllowedUsers"-r->"Apache"
    "InvalidUser"-r->"firewall_Router"
    "firewall_Router"--r-"Prohibited"
    "Prohibited"---"Apache"
    "Apache"-->"Metabase"
    "Apache"-->"WordPress"
    "Apache"-->"Bash Scripts"
    "Metabase"-[hidden]r-"WordPress"
    "WordPress"-[hidden]r-"Bash Scripts"
    "Bash Scripts"-->"PostgreSQLMaster"
    "WordPress"-->"PostgreSQLMaster"
    "Metabase"-->"PostgreSQLMaster"
    "Metabase"-->"PostgreSQLSlave"
    "PostgreSQLSlave"-->"PostgreSQLSnapshot"
    "Datas"--r->"PostgreSQLMaster"
    @enduml
    
    ```
元の図：
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/e8107650-62db-1343-f914-1242a5194f54.png

---

* 移行後

    ```plantuml
    @startuml
    
    title 移行前
    skinparam linetype ortho
    skinparam rectangle {
    BackgroundColor White
    BorderColor DarkBlue
    }
    
    circle "AllowedUsers"
    circle "InvalidUser"
    rectangle "firewall_Router"
    rectangle "OS(AlmaLinux8.4)" #White {
        rectangle "Apache" #Pink
        rectangle "Bash Scripts" #LightGreen
        rectangle "Metabase" #LightGreen
        rectangle "WordPress" #LightGreen
        database "MySQLMaster"
        database "MySQLSlave"
        database "MongoDB"
        package "MySQLSnapshot" #LightBlue
        "MySQLMaster" -[hidden]r-- "MySQLSlave"
        "MySQLSlave" -[hidden]r-- "MongoDB"
    }
    "AllowedUsers"-[hidden]r--"Apache"
    "InvalidUser"-[hidden]r--"firewall_Router"
    rectangle "Datas" {
        rectangle "Websitesdata" {
            package "stock"
            package "documents"
            package "news"
            "stock"-[hidden]d-"documents"
            "documents"-[hidden]d-"news"
        }
        rectangle "PersonalDatas" {
            package "Pictures"
            package "Logs"
            package "Stats"
            package "receipt"
            "Pictures"-[hidden]d-"Logs"
            "Logs"-[hidden]d-"Stats"
            "Stats"-[hidden]d-"receipt"
        }
        "Websitesdata"-[hidden]r-"PersonalDatas"
    }
    rectangle "Prohibited"
    "OS(AlmaLinux8.4)"-[hidden]r--"Datas"
    "AllowedUsers"-[hidden]u--"firewall_Router"
    "AllowedUsers"-r->"Apache"
    "InvalidUser"-r->"firewall_Router"
    "firewall_Router"--r-"Prohibited"
    "Prohibited"---"Apache"
    "Apache"-->"Metabase"
    "Apache"-->"WordPress"
    "Apache"-->"Bash Scripts"
    "Metabase"-[hidden]r-"WordPress"
    "WordPress"-[hidden]r-"Bash Scripts"
    "Bash Scripts"-->"MySQLMaster"
    "WordPress"-->"MySQLMaster"
    "Metabase"-->"MySQLMaster"
    "Metabase"-->"MySQLSlave"
    "MySQLSlave"-->"MySQLSnapshot"
    "Datas"--r->"MySQLMaster"
    "Datas"--r->"MongoDB"
    @enduml
    
    ```
元の図：
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/4b946611-d904-d0d0-b4c1-cbadeaec18cc.png

---

## 移行前後のバージョン差異
バージョン差異をまとめると以下の通りとなります。
総じていうと、AlmaLinuxでは、<b>一部のソフトウェア（Apache、JDK）で最新でないものがインストールされる</b>ので、注意が必要です。
（今回、移行前後でバージョンは揃えていませんが、バージョンをそろえる必要がある場合はインストール方法を検討したほうがよろしいかと思います。）

---

|ソフトウェア|移行前|移行後|やったこと|
|-|-|-|-|
|CPU|1GB（1コア）|1GB（1コア）|初期構築時に1GB（1コア）設定|
|仮想メモリ|1GB|2GB|VmwarePlayerからメモリ増設|
|ディスク|30GB|20GB|初期構築時にディスク20GB設定|
|OS|CentOS7.6|AlmaLinux8.4|イメージの選択|
|Apache|2.4.6|2.4.37|dnf install httpd|
|Wordpress|4.2.32（PG4WP：1.3.1）|6.1|wordpress6.1をwgetでDL|
|Metabase|v0.37.6|v0.36.3|Metabasev0.36.3のjarファイルをwgetでDL|
|Postgresql|9.2.24|mysqlへ移行|dnf install mariadb|
|mongoDB|※未使用||dnf install mongod|
|java（JDK）|1.8.0_332|1.8.0_342|dnf install java|
|php|忘れた|1.8.0_342|dnf install php|
|接続方式|http接続|https接続|ApacheのSSL証明書作成|

参考：https://qiita.com/zakuroishikuro/items/f33929eab9d55c5bd073

---

#### CPU
1GB、1コアで変更なしとなります。

---

#### 仮想メモリ
移行前はそれほど、メモリを使用していなかったのですが、
mysqlとmetabaseを移行したところ、
SQLクエリ実行時、javaでメモリを大量消費してしまう事象が発生し、swapが大量に発生してしまいした。
そのため、1GBから2GBに増やしています。

---

##### ■■■移行前■■■
<pre>
●Metabaseにログイン中の状態
[root@homeserver_org metabase]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        742M         69M         38M        161M         60M
Swap:          4.0G         69M        3.9G
[root@homeserver_org metabase]#
</pre>

---

##### ■■■移行後■■■
<pre>
●Metabaseにログイン中の状態
[root@homeserver ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       990Mi       276Mi       9.0Mi       518Mi       638Mi
Swap:         2.0Gi       147Mi       1.9Gi
</pre>

---

#### ディスク
ディスク全体サイズを30GB→20GBに減らしています。
移行前は/varを使い果たしてしまう懸念があったため、
/varを10GB拡張し、合計30GBとしていましたが、
ほかのパーティション（/opt、/home、/）
をあまり使用していないため、
移行後はディスク集約し、合計20GBで構成しました。

---

##### ■■■移行前■■■
<pre>[root@homeserver_org ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  475M     0  475M    0% /dev
tmpfs                     487M     0  487M    0% /dev/shm
tmpfs                     487M  7.7M  479M    2% /run
tmpfs                     487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   7.0G  2.3G  4.8G   32% /
/dev/mapper/centos-var     13G  1.5G   12G   11% /var
/dev/mapper/centos-opt    3.0G  741M  2.3G   25% /opt
/dev/mapper/centos-home   2.0G   59M  2.0G    3% /home
/dev/sda1                1014M  163M  852M   17% /boot
tmpfs                      98M     0   98M    0% /run/user/0
[root@homeserver_org ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <29.00 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7423
  Free PE               0
  Allocated PE          7423
  PV UUID               MLSbDZ-yoIj-Q2TK-u67C-DNav-uze1-96ubHI
[root@homeserver_org ~]#
</pre>

---

##### ■■■移行後■■■
<pre>
[root@homeserver ~]# df -h
ファイルシス               サイズ  使用  残り 使用% マウント位置
devtmpfs                     873M     0  873M    0% /dev
tmpfs                        893M     0  893M    0% /dev/shm
tmpfs                        893M   17M  876M    2% /run
tmpfs                        893M     0  893M    0% /sys/fs/cgroup
/dev/mapper/almalinux-root    17G  6.4G   11G   38% /
/dev/sda1                   1014M  357M  658M   36% /boot
tmpfs                        179M     0  179M    0% /run/user/0
[root@homeserver ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               almalinux
  PV Size               <19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               ddKRKp-Cs3k-JjxL-MPYl-t38g-wznh-1ESkq9

[root@homeserver ~]#
</pre>

---

#### OS（ディストリビューション）
ディストリビューションについては、
* RHEL8
* Alma Linux8.4
* Rocky Linux9.0
のどれかで迷いましたが、

* リポジトリやクラウドへの対応がほかのOSSよりも早い点
* RHELのクローンとして開発されているので、使い勝手がよい点
* Almalinuxに関しては最も記載がある点
上記より、AlmaLinuxを採用しました。
参考：

https://almalinux.org/ja/
　　　https://www.designet.co.jp/ossinfo/almalinux/

OSのイメージファイルは下記を使っています。
* 移行前：CentOS-7-x86_64-Everything-1810
* 移行後：AlmaLinux-8.4-x86_64-dvd

---

#### Apache
デフォルトインストールをしたのですが、むしろバージョンが移行前よりも下がってしまいました。
<pre>
dnf install httpd
</pre>

とはいえ、Apache2.4のバージョン差異はほとんどないため、そのままとしています。
* ディレクティブの設定
* IP制限設定
<b>※今後、バージョンアップも検討中</b>

---

#### Wordpress
移行前は、postgresをデータベースとして、プラグイン（PG4WP：1.3.1）
を入れていたため、 wordpressのバージョンは4.2.32を使用していました。
しかし、セキュリティ脆弱性対策するにはバージョンアップが必要となり、postgreSQLへの接続プラグインが対応できない問題が発生したため、
移行後は、最新のWordpressをダウンロードし、インストールをしています。（postgre SQLは辞めて、MySQLに変更しています。）

---

#### Metabase
移行前バージョンは v0.37.6でしたが、postgre SQLからMySQLに変わったことと、v0.36.3にバージョンが下がってしまったので、JDKのインストールに応じてMetabaseのバージョンを変えています。
（バージョンは、管理者の画面からトラブルシューティングを確認しています。）

https://mebee.info/2022/03/07/post-44624/

<b>※今後、Metabaseの管理者画面からアップデートを検討中</b>でしたが、2023/12/2時点で、アップデート済みとなるため、JDK含めてアップデートを実施済の状況です。
（※別記事に記載する予定です。★）

---

#### PostgreSQL(廃止）

* 移行前はPostgreSQLを使用していました。
* 先述と同様ですが、Wordpressの最新化を行うため、PostgreSQLを使用することは難しいと判断したため、移行後は廃止しています。

https://and-engineer.com/articles/YRg9zBAAACEA4e1T#heading2-3
　　　https://www.linode.com/ja/blog/databases/choosing-a-database-mysql-or-postgresql/

---

#### MySQL
* Wordpressと相性のよいMySQLを使用しています。
* インストール方法は下記になります。

<pre>
dnf install mariadb
</pre>

---

#### mongoDB
* ※PostgreSQLはクエリを最適化する機能が充実しているため、大量のクエリや分析に向いていたので、移行前での問題は出なかったのですが、MySQLに変更したことによって、書き込み速度が遅い問題が発生しました。
* 一部の処理（ログのデータベース保存先）をmongodbに移行しています。
* サーバで発生しているエラーログ（/var/log/messages、metabaseのログ、cronの実行ログ）をデータベースに保存・蓄積する機能の代替データベースとして利用しています。
（MySQLを使用しない理由として、データを取り込みするときに大量データを挿入するのに時間がかかっていたため。）

<pre>
dnf install mongodb
</pre>

---

#### java（JDK）
javaはMetabaseを起動するのに必要なソフトウェアになります。
特に変わったことはしていないですが、JDKのインストールに応じてMetabaseのバージョンを変えています。
今回は、java-1.8.0-openjdk-1.8.0.342.b07-2.el8_6.x86_64を入れています。

<pre>
[root@homeserver ~]# ps -ef | grep metabase | grep -v grep
metabase    1015       1  4 17:05 ?        00:02:32 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-2.el8_6.x86_64/jre/bin/java -jar /opt/metabase/metabase.jar
[root@homeserver ~]#
</pre>

---

#### 接続方式

移行前はHTTP接続を使用していましたが、自宅内サーバをWi-Fiに接続し、宅内のPC端末からログインすると、Googleなどのブラウザで安全ではない接続と判定されてしまいました。
セキュリティの観点（データの盗聴・改ざん・なりすまし）でよろしくないので、移行後からHTTPS接続できるようApacheのSSL証明書を導入しています。

2023/12/2時点では、metabase、Wordpress、PythonAPIの利用はHTTPS接続を実現している状況です。

https://qiita.com/clown0082/items/551d7c081ff6b41b1717
　　　https://teratail.com/questions/pg4afpa3x57v7y

---

#### （参考）バージョン確認コマンド
各ミドルウェアの移行前後のバージョンを記載しています。

---

##### ■■■移行前■■■

* 移行前はCentOS7.5ではyumコマンドでバージョンを確認します。

<pre>
[root@homeserver_org ~]# yum list installed | grep httpd
httpd.x86_64                         2.4.6-97.el7.centos.5           @updates
httpd-tools.x86_64                   2.4.6-97.el7.centos.5           @updates
[root@homeserver_org ~]# yum list installed | grep postgresql
postgresql.x86_64                    9.2.24-7.el7_9                  @updates
postgresql-jdbc.noarch               9.2.1002-8.el7_8                @updates
postgresql-jdbc-javadoc.noarch       9.2.1002-8.el7_8                @updates
postgresql-libs.x86_64               9.2.24-7.el7_9                  @updates
postgresql-odbc.x86_64               09.03.0100-2.el7                @base
postgresql-server.x86_64             9.2.24-7.el7_9                  @updates
[root@homeserver_org ~]# 
</pre>

---

* 各ミドルウェアのバージョンを確認します。
<pre>
[root@homeserver_org ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Mar 24 2022 14:57:57
[root@homeserver_org ~]# java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
[root@homeserver_org ~]#
-bash-4.2$ psql --version
psql (PostgreSQL) 9.2.24
-bash-4.2$
</pre>

---

##### ■■■移行後■■■

* 移行後はAlmalinux8.4のため、yumではなくdnfコマンドでバージョンを確認します。
（※yumの後継がdnfになりますが、yumでも一応使えはします。）

---

* yumの場合
<pre>
[root@homeserver ~]# yum list installed | grep httpd
almalinux-logos-httpd.noarch             84.5-1.el8                                   @appstream
httpd.x86_64                             2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
httpd-filesystem.noarch                  2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
httpd-tools.x86_64                       2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
[root@homeserver ~]# yum list installed | grep mysql
php-mysqlnd.x86_64                       8.0.22-1.el8.remi                            @remi-modular
</pre>

---

* dnfの場合
<pre>
[root@homeserver ~]# dnf list --installed | grep java
java-1.8.0-openjdk.x86_64                1:1.8.0.342.b07-2.el8_6                      @appstream
java-1.8.0-openjdk-headless.x86_64       1:1.8.0.342.b07-2.el8_6                      @appstream
javapackages-filesystem.noarch           5.3.0-2.module_el8.0.0+6004+2fc32706         @appstream
tzdata-java.noarch                       2022a-1.el8                                  @appstream
[root@homeserver ~]# dnf list --installed | grep php
gd3php.x86_64                            2.3.3-8.el8.remi                             @remi-safe
oniguruma5php.x86_64                     6.9.8-1.el8.remi                             @remi-safe
php.x86_64                               8.0.22-1.el8.remi                            @remi-modular
php-cli.x86_64                           8.0.22-1.el8.remi                            @remi-modular
php-common.x86_64                        8.0.22-1.el8.remi                            @remi-modular
php-fpm.x86_64                           8.0.22-1.el8.remi                            @remi-modular
php-gd.x86_64                            8.0.22-1.el8.remi                            @remi-modular
php-intl.x86_64                          8.0.22-1.el8.remi                            @remi-modular
php-mbstring.x86_64                      8.0.22-1.el8.remi                            @remi-modular
php-mysqlnd.x86_64                       8.0.22-1.el8.remi                            @remi-modular
php-opcache.x86_64                       8.0.22-1.el8.remi                            @remi-modular
php-pdo.x86_64                           8.0.22-1.el8.remi                            @remi-modular
php-sodium.x86_64                        8.0.22-1.el8.remi                            @remi-modular
php-xml.x86_64                           8.0.22-1.el8.remi                            @remi-modular
[root@homeserver ~]# 
[root@homeserver ~]# dnf list --installed | grep httpd
almalinux-logos-httpd.noarch             84.5-1.el8                                   @appstream
httpd.x86_64                             2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
httpd-filesystem.noarch                  2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
httpd-tools.x86_64                       2.4.37-47.module_el8.6.0+2935+fb177b09.2     @appstream
[root@homeserver ~]# dnf list --installed | grep mysql
php-mysqlnd.x86_64                       8.0.22-1.el8.remi                            @remi-modular
[root@homeserver ~]#
</pre>

---

参考：

https://atmarkit.itmedia.co.jp/ait/articles/2001/09/news018.html

https://atmarkit.itmedia.co.jp/ait/articles/2001/10/news020.html

---

* 各ミドルウェアのバージョン確認
<pre>
[root@homeserver ~]# httpd -v
Server version: Apache/2.4.37 (AlmaLinux)
Server built:   Jun 22 2022 07:12:01
[root@homeserver ~]# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
[root@homeserver ~]# mysql --version
mysql  Ver 15.1 Distrib 10.3.32-MariaDB, for Linux (x86_64) using readline 5.1
[root@homeserver ~]# mongo --version
MongoDB shell version v4.4.15
Build Info: {
    "version": "4.4.15",
    "gitVersion": "bc17cf2c788c5dda2801a090ea79da5ff7d5fac9",
    "openSSLVersion": "OpenSSL 1.1.1k  FIPS 25 Mar 2021",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "rhel80",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}
[root@homeserver ~]#
</pre>
</pre>

---

## データ移行方法
* MySQLではSQL文がpostgre SQLと異なるため、インポートが難しい状況でした。そのため、専用のクライアントツール（a5m2）により、テーブル単位でCSVエクスポートし、データインポートを行いました。
* （手でのインポートなのでかなり大変でした…）
* Wordpressに登録しているデータは下記の方法で移行しました。
    * 移行前のWordpressからツール→エクスポートより、すべてのコンテンツを選択し、
　エクスポートファイルをダウンロードをする。
    * 移行後のWordpressからツール→インポートより、WordPressのインポーターの実行を実行する。

---

## 後述
* 災対環境も構築したくなりました。
　（仮想マシンをovaファイル化し、データはファイル管理していく。）
* Jenkinsによるタスク自動化やFlaskを用いたPythonAPIを利用したい。
* 2023/12/2時点でWebフレームワークが多様化かつPythonやReact.jsといったフロントエンドも経験したいというのもあり、でPythonとReact.jsでの実装シフトを検討しています。
* 機能追加が増えている面もあるため、コンテナベースのLAMPサーバを構築したくなりました。
* LinuxOSの PCに、vmvare workstation playerを入れられるようで、将来的にはWindows PCでの運用を検討中です。
   * https://zenn.dev/isi00141/articles/333de2f545a46b
   * linux版インストールにはcentos7系、メモリとしては4GB以上推奨とあるので、要件的には問題無し
   * Linux OSの PC上で、仮想サーバを起動しておく
   * 今使用しているWindows PCにはovfファイルをバックアップとして保管を検討中