CentOS 8からRocky Linux 9への移行の思い出

CentOS8のサポート終了は2021年12月31日。2025年元旦に再構築・移行を決意し、途中発熱で中断したものの1月12日に対応が完了したため思い出を残す。

1.移行先の選定

サービスは、過去困っていなかったので同じさくらのVPS(v5) 1G IK01のプランを選んだ。

OSはCentOS8の後継としてはAlmaLinuxとRockyLinuxが有力だったが、結果的に選んだのはRockyLinuxである。どちらも甲乙つけがたい素晴らしいOSなため、RockyLinuxが優れていたから選んだということではない。ただ、趣味のサーバーであり、直前にAlmaLinuxを使っていたから今回はRockyLinuxにしようという程度の選定理由である。

AlmaLinux と RockyLinuxの比較参考: https://blog.apar.jp/linux/15640/

2.ホストネットワーキング

ホストネットワーキングとは、Dockerの仮想ネットワークと違うという意味でホストを付けている。特別難しいことはせず、さくらVPSの機能で一部プロトコルのポート開放を行い、公開鍵認証方式のみ許可するようありがちな設定を適用した。

特筆すべき点で言えば、鍵への拘り。さすがに今の時代RSAはなぁということで、ecdsa_nistp521の鍵を使うことにした。

更にiPadで『https://it.sifr.me/study/operate-your-ssh-server-with-buffer-editor/』の設定を適用した。これで、出先でサーバーを操作したいと思った場合はiPadから操作する環境が整った。

2.Docker CEのインストール

CentOSよりひと手間入るという程度で、上のリンク先に従えばすんなり入る。簡単だった。

問題は、過去インストール版との違いで、3点Dockerの違いに悩まされた。

2.1.docker compose

昔は docker 本体とは分けて docker-compose コマンドを使っていたが、最近は統合されたらしい。

docker-compose と書いていた部分を全て docker compose (ハイフン→半スぺ)に変更する。

2.2.docker-compose.yml の services:

docker-compose.yml の最初に services: から始めないと動作しない。具体例としては以下が一目瞭然なのだが、全部のdocker-compose.ymlにこれを足していくのは大変手間だったぞ。

2.3.docker-compose.yml の networks:

docker は初期とネットワークのコンセプトが変わっている。多分セキュリティ確保のため『デフォルトでは他のコンテナ同士で連携させない』ようにしていて、コンテナ間で通信をするにはネットワークを明示してドメイン名解決&通信させるのが◎である。

この違いを考慮していないと『host not found in upstream “$server_name”…』のエラーが出力されることとなる。

※2025年1月時点、Dockerのネットワークの仕様については『Dockerネットワークを理解したい #docker-compose – Qiita』が詳しい

実際の対策としては以下のようにネットワーク設定を設けておき、

docker network create mainnetwork

以下のように docker-compose.yml にネットワーク情報を載せると管理し易い。

3.コンテナの最新化

ここからは個別のコンテナ移行を取り扱う。権限を維持したままデータをコピーしておくのは前提として、引っかかった部分を説明する。

3.1.openldapの延命措置

別記事にまとめた『https://it.sifr.me/study/extending-the-life-of-osixia-openldap-container/』の通り。

osixia/openldapを使い続けるには調査と工夫が必要だった。

3.2.php-fpm

一気に最新版にするぞと PHP8.4にするつもりで php:8.4-fpm-alpine で構築を進めたが、結果的に8.2に落ち着いた。理由は2つある。

一つはpecl imagemagick が8.4で破棄された関数を使っているためコンパイルに失敗するから(参考:https://github.com/Imagick/imagick/issues/689)。

もう一つはNextCloud Version30が8.4に対応しておらず、31から8.4対応となっているから(参考:https://github.com/nextcloud/server/wiki/Releases-and-PHP-versions)である。

3.2.1.Alpine Linuxでの標準ライブラリの変化

昔は phar, iconv をインストールする場合は明示していたが、これらはAlpine Linuxでは標準で入るようになった(外したい場合にコマンドで明示するようになった)。Dockerfileのインストールコマンドからこれらを外す必要がある。

なお、インストール可能な項目を調べたところ以下項目が有効だった。

bcmath, bz2, calendar, ctype, curl, dba, dl_test, dom, enchant, exif, ffi, fileinfo, filter, ftp, gd, gettext, gmp, hash, iconv, intl, json, ldap, mbstring, mysqli, odbc, opcache, pcntl, pdo, pdo_dblib, pdo_firebird, pdo_mysql, pdo_odbc, pdo_pgsql, pdo_sqlite, pgsql, phar, posix, random, readline, reflection, session, shmop, simplexml, snmp, soap, sockets, sodium, spl, standard, sysvmsg, sysvsem, sysvshm, tidy, tokenizer, xml, xmlreader, xmlwriter, xsl, zend_test, zip

3.2.2.メモリ不足

opcache, redis のようにコンパイルに時間のかかるインストールはいつも途中で止まる。原因は見出しの通りメモリ不足。昔は同じプランのさくらVPSでフリーズすることなく一発で出来ていたから、Docker CEのビルドはメモリ使用量が昔より増えてると思った方が良さそうだ。

SWAPで解決できるのでさくらVPSのプランを上げる必要はない。

3.2.3.CLIでの処理の取り扱い変化

昔はPHP-FPMでCLIが使えた。例えばNextCloudでコマンドラインでのアップグレードがしたいのであれば『php occ upgrade』のコマンド実行で済んでいたのだが、現在は『php –define memory_limit=1024M –define apc.enable_cli=1 occ upgrade』とメモリ不足対策やAPCuの設定を入力しないと動作しない。実際に昔のアップグレードコマンドを実行すると以下の通りエラーとなる。

Copilot先生に聞いたところでは、PHPは通常のPHP処理とCLIで設定を分けるようになった。そしてPHP-FPMはCLIで使うタイプのものではないようで、PHP-FPMにapc.enable_cli=1の設定を入れると起動が出来ない。なのでCLIで実行したい時は都度パラメータを渡してほしいということだった。

Copilotが嘘を言っているんじゃないかとか、ちょっと違和感感じてしまうところだけれど動けば良い派だからよしとする。

3.3.nginx proxy <-> letsencrypt の仕様変更

皆大好きな nginx proxy とLet’s Encryptで自動的に連携出来るミドルウェア構築の強い味方コンボだが、BASIC認証を含むサイトを設置すると、nginx proxy が立ち上がらないことに気づいた。

https://github.com/jwilder/docker-letsencrypt-nginx-proxy-companion

どうやら、BASIC認証がかかっている場合は直接アクセスが出来ないため『自分が所有者です本物です』という証が要るようで、ログを見ると『/.well-known/acme-challenge/』配下のURLへアクセスが来るのが分かる。

以下のように当該URL配下へのアクセスをBASIC認証対象外にしておけばnginx proxy が落ちるのは回避出来た。

3.4.NextCloud

地味に困ったのが、『NextCloudアップグレード途中、工程5の間にメモリ不足エラーになってしまい止まってしまった』件である。メモリ不足エラーは『php –define memory_limit=1024M –define apc.enable_cli=1 occ upgrade』の1024Mのようにメモリ指定をして実行すれば解決できるのだが、途中まで進めてしまった状況は再度アップグレードコマンドを実行しても『Step 5 is currently in process. Please call this command later.』と応答が来るだけで解決出来ない。

3.4.1.Step 5の途中扱いをリセットして再試行

ステップを中断した場合は、前のステップが終わったところまで戻せば進められる。

具体的には <NEXTCLOUD_ROOT>/updater-ocflfrurabky/.step を編集し、{“state”:“start”,“step”:5} の記載を {“state”:“end”,“step”:4} に書き換えてから『php –define memory_limit=1024M –define apc.enable_cli=1 occ upgrade』を再実行すれば良い。以下URLが参考となる。

https://help.nextcloud.com/t/stuck-on-update-process-step-5-is-currently-in-process-please-reload-this-page-later/58371/8

3.4.2.既に最新版と言われる

明らかに最新版でないのに、『php –define memory_limit=1024M –define apc.enable_cli=1 occ upgrade』を実行すると既に最新版と言われる可能性がある。

これは何をしたくてこの表現にしたのか理解に苦しむが、実態としては『アップグレード準備が完了しましたわ』な状態で、アップグレードの適用まで至っていない状態。

以下コマンドで適用すると、次のメジャーバージョンアップグレードの処理を進められる。

↓ 調査に役立ったURL

https://help.nextcloud.com/t/nextcloud-is-already-the-latest-version/156063

結果的にアップグレードに使うと◎なコマンドを載せておく。

osixia/openldap dockerコンテナの延命措置

2025年1月吉日時点、以下のosixia/openldapコンテナで認証環境を作った人は大変だ。このコンテナは高機能で中々代替は効かないのに、メンテが行わらず小手先の技では正常動作しなくなってしまったから。

https://github.com/osixia/docker-openldap

しかし調査と試行錯誤の結果延命措置が出来たので、その方法を説明する。ただし、サポート切れのOSイメージを使うことになるので、特に『自己責任』である点に注意すべきである。

1.アップデート元リポジトリの更新

OSイメージのリポジトリがなくなっているから新しいリポジトリに置き換える必要がある。

具体的対策としては /etc/apt/sources.list を置き換えれば良い。

sources.list

2.リポジトリの公開鍵取り込み

「1」のリポジトリは安心して使っても良いですよと示すため、公開鍵取り込みが要る。

具体的にはビルド処理を実行すればログにリポジトリの公開鍵情報が載る。このリポジトリの公開鍵を以下のコマンドのように対象公開鍵件数分取り込めば良い。

apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 0E98404D386FA1D9

※0E98404D386FA1D9の部分が公開鍵

ログは以下のように出力される。このエラー行では『6ED0E7B82643E131』と『605C66F00D6C9793』を取り込めば良いと判断できる。

build例

以下のようにDockerfileを作り docker build すれば処理が通った。

参考URL:

apt-get updateでthe public key is not available: NO_PUBKEY

Buffer Editorを用いたiPadのSSH端末利用

Buffer Editor はコード編集やSSH端末処理が出来るiPhone, iPadのアプリである。当記事はiPad AirでLinuxに公開鍵認証でSSH接続し、ターミナル利用するまでの特記事項を残した。

アプリのインストール

Buffer Editor – Code Editor

iPad であれば ↑ のリンク先でダウンロードして支払いをすれば良い感じに使える。2025年1月吉日時点で1500円。開発の幅が広がると考えればリーズナブルな印象だ。

公開鍵認証方式キーペアについて

キーペアの生成・設定については留意事項がある

1.暗号化方式

RSA, DSS, ECDSA_256, ECDSA_384, ECDSA_521, ED25519 の方式をサポートしている。

⇒それ以外はサポートしていない

2.秘密鍵ファイル形式

opensshのファイル形式で保存すること。

つまり、秘密鍵ファイルの頭が『—–BEGIN OPENSSH PRIVATE KEY—–』で始まる形式ならば合っている。

⇒Puttyの.ppk形式やssh.comの形式は使えない

3.ファイルの配置場所

Buffer Editor起動時、サイドメニューにある『Local files』より下層にフォルダ・ファイルを配置し、フォルダを指定すること。

例えば、以下の通り private.key を配置したとする。

Local files/keys/MyServer/private.key

この場合接続先情報を設定する『Keys path』には『/keys/MyServer』の値を設定すれば良い。なお、MyServerフォルダの中には private.key 以外にファイルを置かないよう留意すること。

ターミナル利用

サーバーに接続してから上図の①~②を辿りターミナルを表示する。

その後③の接続先を確認し、④の箇所でコマンド入力をすれば端末利用出来る。