20 周年を目前にした個人サービスのシステムリプレイス
2005 年に作られたらしい(自分でも記憶が不確かな)サービスをシステムリプレイスした。
もともとの構成
確か、リリース当初は掲示板向けのスクリプトを改造して Vanilla PHP + MySQL (on XREA) で作られていたはず。
その後、2008 年頃の CakePHP の流行に乗って CakePHP (on CORESERVER) 化。
CakePHP 2.x のアップデートには追従していったものの、2015 年の CakePHP 3.0 の登場により後方互換がほとんどなくなってしまったためバージョンアップできなくなっていた。
2018 年頃には Laravel 化を検討し、XREA / CORESERVER で Laravel を試してみたり していたのだけれども、その頃は本業で Ruby on Rails ばかり書いていたので、PHP で書き直すのも芸がないし、Rails で書き直して Heroku にデプロイしようかなとかゴチャゴチャと考えているうちに時が経ってしまった。
2020 年には PHP 8 がリリースされ、CakePHP 2 はもちろん PHP 8 をサポートしていないので、もはや動かせる環境がなくなるかも(そもそも公式サポートが切れているフレームワークを使い続けるのがよろしくない)と思いつつも、CakePHP 2 を PHP 8 で動かせるように野良メンテナンスをしてくれているポーランドの Kamil Wylegala さんのおかげで PHP 8 化した。
Next.js の新しい構成
2021 年頃から仕事で Next.js を触るようになり、なるほどこれはデファクトスタンダードになるフレームワークだなという感触を得た上で 2022 年の App Router のベータ版の登場を目の当たりにする。
App Router はサーバーサイド出身の人間にとってはかなり書きやすく、Laravel や Rails は候補から外して App Router 化の検討を本格的に始めた。
2023 年には App Router が stable になると同時に、Vercel Postgres もベータ版ながらも登場し、CGM サービスに必要なデータベースも(一個までなら)Vercel 内で無料で使えるようになった。
この時点で、サービスのページビューはかなり低迷しており Google Adsense によって得られる収益はほとんどゼロになっていたので、なるべくホスティングが無料のところにデプロイしたいと思っていたのでこれはありがたい。
「よし、じゃあ Next.js App Router で書き直すか!」と気合いを入れてリポジトリを作りコードを書いて、コンテンツを表示するところまでは良かった。
問題なのは投稿機能である。
この時点でサービスの投稿機能は二~三年使われておらず、これほどまでに使われていない投稿フォームの実装のモチベーションが上がらなかったのである。
大抵のサービスは表示機能の実装は簡単でも、投稿機能はバリデーションなど考慮することが多くて大変だ。
「もうこれは投稿機能をなくして表示だけでもいいかな… でもそうなると CGM サービスとは言えない、ただのアーカイブになってしまうな」などと考えているうちに、完全に Nex.js App Router 化計画は停滞してしまった。
そこから一年ほど経った頃、ふとひらめく。
「別にデータベース使わなくてもいいじゃん」
別のいくつかの個人サービスはデータベースを使わずに、データをすべて JSON で書いていた。
なぜならそのサービスのデータを編集するのは俺だけだから、データベースなんて大層なものを使わなくてもそれで事足りる。
同様にこのサービスも、ほとんど投稿がないのだし、投稿されたデータを(ほとんど)全部表示するだけなのだから、メールなどで送ってもらったテキストを JSON にコピペすればデータベースなしでも成り立つのである。
データベースを使うのは再びこのサービスの投稿が増えてからでいい。
思いついてからの動きは早い。
最終コミットが一年前のリポジトリを開き、package.json から Prisma を取り除き、データベース内のデータを JSON に変換するスクリプトを書いて二日ほどで Next.js App Router 化を完了した。
最初は投稿をメールで受け取るようにしていたが「投稿に必要な項目は多いし、さすがにメールはないよなあ…」と思って Jotform を代わりに使うようにした。(Google Forms は以前に使ったときに使い方難しかったのと、昨今の漏洩事件を見て、なるべくシンプルに運用できるものにした)
CakePHP のバージョンアップに追従できなくなってから 10 年ほどずっと考えていたシステムリプレイスはついに完了した。
いつまでこの構成がもつのかはわからないが、これで再びあと何年かはこのサービスを続けられそうだ。
変わったところのまとめ
- CakePHP (on CORESERVER) から Next.js App Router (on Vercel) になった
- 投稿フォームとデータベースを廃止して、SaaS のフォームと JSON で管理するようにした
- 低解像度な時代に作られた画像がずっと残っていたので、favicon 以外の画像をすべて廃止した
- ページングを廃止した(なぜなら作るのが面倒なので)
- Google Adsense を廃止した(Vercel の無料プランである都合と、そもそもほとんど利益がなかったので)
- sitemap.xml やフィードがなかったのでついでに追加した(ほぼ 100% のページがインデックスに乗った)
あわせて読みたい
Discussion