家族で使うWebアプリを作って、自宅のPixel Tabletで動かしている。TermuxでNode.jsとPostgreSQLを起動して、Cloudflare Tunnel経由で外からアクセスする構成。
しばらく使ってみて、環境としてはこれでいいな〜という感じになったので、デプロイ先を選んだ経緯と構成をまとめておく。
動かしたかったもの
作ったのは、保育園の連絡帳アプリに貼り付ける内容を、夫婦で下書き・共有するWebアプリ。
もともとはGoogle Docsで運用していたけど、前日の内容のコピーやテンプレート入力をサクッとできるものが欲しくて、自分で作ることにした。
いつもならサーバーはGoで書くけど、今回はTypeScript縛りで、サーバーとクライアントをモノレポにする構成を試してみたかった。なので、フロントはReact、バックエンドはNestJS + Prisma、DBはPostgreSQLにした。相手が保存した内容を反映するために、WebSocket(Socket.IO)も使っている。
デプロイ先の検討
最初はクラウドで動かすつもりだった。家族用の小さいアプリなので、ランニングコストはなるべく抑えたい。
検討した候補と、そのとき気になったところはこんな感じ。料金や無料枠の条件は変わるので、ここでは当時の選定で見ていたポイントだけ。
| 候補 | 気になったところ |
|---|---|
| Oracle Cloud Always Free | 無料で動かせるが、低負荷のインスタンスが回収対象になる条件が気になった |
| Render Free + Neon | 使っていない間にスリープするので、開いたときの復帰待ちがある |
| Fly.io + Neon | 少額で動かせそう。月額を払う候補として検討した |
| 格安VPS | Node.jsとDBをまとめて動かせるが、固定費がかかる |
| Cloud Run | WebSocket接続中の課金を考える必要がある |
自宅で動かすならラズパイもありかと思って調べたけど、思ったより高くて見送った。
そこで、Linuxの環境で動けばいいならAndroidでもいけるのでは? と気づいた。自宅にはドックに置いてあるPixel Tabletがあるので、Termuxで動かしてみることにした。
Pixel TabletとCloudflareの構成
Pixel TabletにTermuxを入れて、その中でNode.js、PostgreSQL、cloudflaredを動かしている。今回のTermux環境ではDockerを使わず、それぞれ直接起動する形にした。
![]()
家族で使う規模なので、Reactのビルド結果もNestJSから配信することにした。配信先を分けずに済むし、Tunnelの接続先も1つで済む。
外からのアクセスにはCloudflare Tunnelを使う。Tablet側のcloudflaredからCloudflareへ接続を張るので、自宅のルーターでポートを開けなくても使える。
利用者の制限はCloudflare Accessに任せて、夫婦のメールアドレスだけを許可する。アプリにログイン画面やパスワード管理を作らずに済むのは、この規模だとありがたい。
ビルドはMacでやる
使っていたTypeScript 7のコンパイラはAndroid向けのバイナリがなく、Tablet上ではビルドできなかった。Prismaも、マイグレーション用のスキーマエンジンが動かなかった。
ただ、Node.js本体と、@prisma/adapter-pg 経由で使うPrisma Clientは動く。なので、Macでビルドとマイグレーションをして、Tabletは実行だけ担当する形にした。
普段の更新はこんな流れ。
- Macでshared・API・フロントをビルドする
- ビルド結果と依存関係の定義をrsyncでTabletに送る
- Tabletで実行時の依存だけをインストールして、APIを再起動する
DBのスキーマを変えたときは、MacからSSHトンネルでTabletのPostgreSQLにつなぎ、prisma migrate deploy を実行する。DBを外部に公開する必要はない。
このあたりは deploy-tablet.sh と migrate-tablet.sh にまとめた。rsyncを使うデプロイスクリプト、懐かしいなぁ〜という感じ。
常駐させるための設定
PostgreSQL、API、cloudflaredは termux-services で管理して、落ちたら自動で再起動するようにした。ログもサービスごとに残る。
端末の再起動後は Termux:Boot からサービスを立ち上げる。あわせてTermuxのバッテリー設定を「制限なし」にして、wake lockも取る。
しばらく使ってみて
しばらく使っているけど、今のところ環境としてはこれでいいなという感じ。
もともと家にある端末を使っているので、サーバーを借りる月額は増えていない(もちろん電気代はかかる)。
自宅の回線やTabletが止まれば使えなくなるので、そこは自宅で動かす前提として割り切っている。もし今後この運用が厳しくなったら、Node.jsとPostgreSQLをVPSなどに移すつもり。TunnelとAccessを使う構成自体は、そのまま持っていける。
クラウドの候補をいろいろ見たあとに、家のTabletがデプロイ先になったのは面白かった。小さい個人開発のアプリなら、こういう置き場所もありだな〜と思う。