スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/2GB・3コア → 4GB・4コア/Ubuntu 26.04 LTS

⑰ Supervisor(最終回)

全17工程の最後は、これまで作ってきたPython・Node.jsの常駐プロセスをSupervisorでまとめる回。 環境の置き場所が変わった影響がここに集約して出てきた一方、最後はNode.jsのバージョンの壁という、 今回の移設全体を象徴するような形の課題で締めくくることになった。

作業端末: iPad mini(Termius)

MIGRATION ROADMAP — 全17工程 完了
  1. ① SSH、ユーザー追加
  2. ② IPv4/IPv6追加、netplan、ufw
  3. ③ Apache2
  4. ④ Let's Encrypt
  5. ⑤ PHP
  6. ⑥ MariaDB
  7. ⑦ WordPress
  8. ⑧ Dovecot、Postfix
  9. ⑨ Vsftpd
  10. ⑩ Python
  11. ⑪ llama.cpp、ChromaDB
  12. ⑫ Anaconda、Keras、TensorFlow
  13. ⑬ Node.js
  14. ⑭ MongoDB
  15. ⑮ Mosquitto
  16. ⑯ RabbitMQ
  17. ⑰ Supervisor

01インストールと構成

login-user@新サーバー
$ sudo apt install supervisor -y $ sudo systemctl enable supervisor $ sudo systemctl start supervisor

旧サーバーの/etc/supervisor/conf.d/配下の設定ファイルを1つずつ確認しながら、これまでの各回で環境の置き場所が変わったものを反映していった。

02環境パスの反映

プロセス旧新
mnist_consumeralpha-user / Anaconda 3.13login-userユーザー / /home/login-user/env3.13
mnist_producerlogin-user / env3.14変更なし
w2v_enginelogin-user / env3.12そのままenv3.12として作成(env-gensimという別名は使わず)
rag_consumer / rag_producerlogin-user / env3.14変更なし、ただしHF_TOKENの追加が必要だった

rag_consumerは⑪で.bashrcに設定したHF_TOKENが、Supervisor経由(ログインシェルを介さない)では読み込まれない。confファイルに直接追記して対応した。

/etc/supervisor/conf.d/rag.conf
[program:rag_consumer] command=/home/login-user/env3.14/bin/python /home/login-user/py/rag/consumer.py directory=/home/login-user/py/rag user=login-user autostart=true autorestart=true environment=HF_TOKEN="(実際のトークン値)"

03mnist_producer:ホスト名のハードコードが招いた起動失敗

mnist_producerがOSError: could not bind on any addressで起動失敗。原因はスクリプト内のWEBSOCKET_HOSTが"www.iseeit.jp"というホスト名で、旧サーバーの公開IPへ名前解決されていたため、新サーバーには存在しないアドレスにbindしようとしていた。

調べると、このWebSocketサーバーは実際には外部非公開で、ApacheがRewriteRuleでリバースプロキシしている構成だった(login-user.tokyoの/rag/と同じパターン)。であればDNS解決に依存する理由はなく、ループバックへ固定するのが最も安全だった。

producer.py
WEBSOCKET_HOST = "127.0.0.1" WEBSOCKET_PORT = 8770

Apache側のRewriteRuleも旧サーバーの公開IP宛からwss://127.0.0.1:8770へ修正。バックエンドが自己署名証明書(/etc/ssl/local/local.crt、gwaw.jpとは別のもの)を使っていたため、SSLProxyVerify none等のSSLProxy系設定がiseeit.jp側にも必要だった。

04MeCab辞書は再構築

w2v_mecabが辞書未検出で起動失敗。mecab-ipadic-neologd辞書はバイナリ形式のため、⑪・⑬のネイティブアドオンと同じ理由でコピーではなく新サーバー上でのビルドが必要だった。

login-user@新サーバー
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git $ cd mecab-ipadic-neologd $ sudo ./bin/install-mecab-ipadic-neologd -n -y

05PHPログシステムにAPCu拡張が漏れていた

5サイト共通ログシステム(page530g-log.php)でapcu_fetch()が未定義エラーに。⑤の拡張リストにAPCuを含めていなかったための漏れだった。

login-user@新サーバー
$ sudo pecl install apcu $ echo "extension=apcu.so" | sudo tee /etc/php/8.5/mods-available/apcu.ini $ sudo phpenmod apcu $ sudo systemctl restart php8.5-fpm

06Node.js版MNISTツール:Node.jsのバージョンの壁

iseeit.jpの係数シリーズ関連(pr_consumer他)はNode.js製で、@tensorflow/tfjs-nodeを使用。⑬で導入したNode.js v24.16.0で実行すると TypeError: (0, util_1.isNullOrUndefined) is not a functionで即クラッシュした。

原因:Node.js本体から削除されたAPI util.isNullOrUndefined()はNode.js v22.0.0で「Runtime非推奨」となった後、その後のメジャーバージョンで完全に削除された。 メンテナンスが停滞気味の@tensorflow/tfjs-nodeがこの削除済みAPIに依存したままになっており、v24系では動作しない。

旧サーバーの設定ファイルに、実は動作実績のあるv22.14.0への切り替えがコメントアウトで残されていた。一度v24.14.0への変更を試して失敗し、確認しないままコメントアウトで元に戻す記録ミスがあったと判明。 最終的にこのv22.14.0に合わせることで解決した。

login-user@新サーバー
$ nvm install 22.14.0 $ nvm which 22.14.0
/etc/supervisor/conf.d/pr_consumer.conf
[program:pr_consumer] command=/home/login-user/.nvm/versions/node/v22.14.0/bin/node /home/login-user/node/mnist/pr_consumer.js directory=/home/login-user/node/mnist user=login-user autostart=true autorestart=true

07最終確認

全サイト移行完了 5サイトすべての表示、各種ウェブツールの動作、そして③で権限設計を詰めたWordPressの画像アップロード(XML-RPC経由)まで、すべて問題なく確認できた。

08ここまでの状態

  • Supervisorで全常駐プロセスを管理下に。旧サーバーからの環境パス変更をすべて反映
  • mnist_producerのホスト名ハードコード問題を、ループバック固定+Apacheリバースプロキシへの統一で解消
  • MeCab辞書の再構築、APCu拡張の追加漏れを解消
  • Node.js版MNISTツールは、tfjs-nodeがNode.js側で削除されたAPIに依存しているためv22系への固定が必要と判明
  • 5サイトの表示・機能、WordPress画像アップロードまで含めて全面的に動作確認完了
MIGRATION COMPLETE

2GB RAM・3コアの旧サーバーから、4GB RAM・4コアの新サーバー(Ubuntu 26.04 LTS)へ。 SSHの鍵運用からはじまり、ネットワーク、Web、メール、データベース、各種言語環境、メッセージング、 そして常駐プロセス管理まで、全17工程を通じて2021年以前の設定を洗い出し、見直しながらの移設となった。 途中、バージョン間の非互換や既知のバグ、単純な設定ミスなど数多くの壁にぶつかったが、 その一つひとつが今後同じ状況に立つ自分(あるいは同じ壁にぶつかった誰か)への記録として残った。

← 前回: ⑯ RabbitMQ
ConoHa VPS移設記 全17回 完

『ConoHa VPS移設記 ⑰ Supervisor(最終回)』を公開しました。