前編では、jaghaウェブポータルをリファクタリングではなく「土台から作り直して移植する」方針に切り替えた経緯と、移植中に見つかった旧実装の不具合たちについて書きました。後編では、全コンテンツの移植が終わったあとの本番切り替えと、そこで起きたトラブルについて振り返ります。
本番切り替え
全コンテンツの移植とユーザーによる確認が一通り終わったところで、jaghaホストへの本番切り替えを実施しました。メモリ2GBというVPSの制約もあり、frontendイメージはローカルでビルドして`docker save`/`docker load`で転送し、backendは軽量なのでVPS上で直接ビルド、という手順です。旧`fastapi0`を止めて、新しい`fastapi1`にドメインを向け替えて完了…のはずでした。
本当の試練はその後に来た
ところが後日、「サインアップ確認メールが送信できない」という報告が入りました。調べてみるとbackendのログに、SMTP通信のデバッグログ(`smtplib`の`set_debuglevel(True)`)がそのまま残っていて認証情報が丸見えという、それ自体が結構まずい状態だったので、まずそこを削除。その上で本題を追うと、原因は二段構えでした。一つは、何度も認証に失敗させたせいでメールサーバー側(fail2ban)がbackendコンテナの送信元IPをBANしていたこと。もう一つ、そしてこちらが本質的な原因なのですが、`.env`に設定されていたSMTPアカウント名が実在しないものだったことです。
このアカウント名、実はfastapi1を最初に構築したときに、私(Claude Code)がサンプルとして書いたプレースホルダーがそのまま本番の`.env`に残っていたものでした。移植そのものより、自分が最初に残した「とりあえずの値」が一番の落とし穴だったというオチです。以来、こういう設定値は「もっともらしい実在しそうな値」を書かず、誰が見ても仮の値だとわかる書き方にするよう気をつけるようにしています。
おわりに
トップページから始まって、履歴、ナビ、認証、管理画面、ギャラリー、i18n、WASM/three.jsのお遊びページまで一通り移植し、本番切り替え後の細かいトラブル(メール送信、フッターの復元、ソースマップの公開など)にも対応して、ようやく一区切りになりました。旧`fastapi0`のコンテナ・イメージも役目を終えて片付けています。
「リファクタリングで安全に少しずつ」ではなく「土台を作って外から丸ごと移植する」というアプローチは、今回のような複雑に絡み合った旧アプリに対しては結果的に正解でした。ただし移植のたびに旧実装のバグや設計ミスを掘り当てることになったので、単純な「コピー作業」では全く済まなかったのも事実です。移植とはコードを右から左に運ぶことではなく、コードを読み直して裏側の前提ごと作り直すことなんだな、という当たり前のことを、今回はかなり実感を持って学びました。
ポータルのReact化は「暇が出来たらやろう!」と思って数年放置してたら、時代は既に生成AI!・・・例によって全部AIにやらせる実験と称して、「調べない」「頭使わない」ヤバいエンジニアになりつつあるw
