/ kyokomi note / blog

個人開発のWebアプリをPixel Tabletで動かしている

October 11, 2026 #個人開発 #Cloudflare #Android

家族で使う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少額で動かせそう。月額を払う候補として検討した
格安VPSNode.jsとDBをまとめて動かせるが、固定費がかかる
Cloud RunWebSocket接続中の課金を考える必要がある

自宅で動かすならラズパイもありかと思って調べたけど、思ったより高くて見送った。

そこで、Linuxの環境で動けばいいならAndroidでもいけるのでは? と気づいた。自宅にはドックに置いてあるPixel Tabletがあるので、Termuxで動かしてみることにした。

Pixel TabletとCloudflareの構成

Pixel TabletにTermuxを入れて、その中でNode.js、PostgreSQL、cloudflaredを動かしている。今回のTermux環境ではDockerを使わず、それぞれ直接起動する形にした。

ブラウザからCloudflare AccessとTunnelを経由し、Pixel Tablet上のNestJSとPostgreSQLを利用する構成

家族で使う規模なので、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は実行だけ担当する形にした。

普段の更新はこんな流れ。

  1. Macでshared・API・フロントをビルドする
  2. ビルド結果と依存関係の定義をrsyncでTabletに送る
  3. 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がデプロイ先になったのは面白かった。小さい個人開発のアプリなら、こういう置き場所もありだな〜と思う。

last modified 10月 11, 2026