$30 off During Our Annual Pro Sale. View Details »

自宅 PaaS でメンテナンスフリーな個人開発

自宅 PaaS でメンテナンスフリーな個人開発

#tech-midnight で発表しました。

Avatar for HORIUCHI Akihiko

HORIUCHI Akihiko

December 26, 2025
Tweet

More Decks by HORIUCHI Akihiko

Other Decks in Technology

Transcript

  1. • いくつか Ruby や Node.js で作った個人開発の Web アプリがあり、これまでは Heroku の上で動かしてきた

    ◦ 家計簿、温湿度計、フォトアルバムなど ◦ Basic Dyno ($7 / 月) + Redis Mini ($3 / 月) の組み合わせのアプリが 2 つ ◦ その他もろもろで約 $30 / 月 • しかし、円安の影響で料金がかさんできたた ◦ ミニ PC を買って Dokku を入れ、そっちに移行することにした ◦ ただし、なるべく管理は楽にして、個人開発に注力したい ▪ メンテナンスフリー (OS やランタイム / ライブラリのバージョンアップなど) ▪ ステートレス / ポータビリティ (環境が壊れてもすぐに作り直せる) Background / Motivation 3
  2. • Platform as a Service (PaaS) ◦ PaaS は、ソフトウェアを構築および稼動させるための土台となるプラットフォームを、インターネット 経由のサービスとして提供する

    ◦ 具体的には、インフラ / ミドルウェア / ユーザインタフェースなどのシステムを開発する手段となる ツールや、開発したシステムを運用するための環境など • Buildpack ◦ リポジトリに含まれる情報からランタイムやフレームワークを特定し、そのベスプラに則ってコンテナ イメージをビルドしてくれるもの ◦ Heroku が最初に開発し、その後 Pivotal も対応したが、現在は Cloud Native Buildpacks として標準 化されている • ちなみに… ◦ SDPF でも (ECL2.0 時代に) Cloud Foundry ベースの PaaS メニューがあったけど、サービス終了済み ◦ Pivotal が開発していたが VMWare に買収され、VMWare は Broadcom に買収された What is PaaS? Buildpack? 4
  3. •   Heroku ◦ 2007 年にアメリカで創業し、2010 年に Salesforce に買収された ◦

    ソフトウェアは「Dyno」と呼ばれるコンテナの上で動き、Ruby / Python / Node.js / Go などがサポー トされている ◦ 公式のアドオンとしてマネージドな Postgres / Redis などのミドルウェアがあり、ダッシュボードや CLI から 1 クリックでインストールできる ◦ 料金はコンテナやミドルウェアの性能 (プラン) と、それを使った時間で決まる ▪ 無料枠があったけど 2022 年に廃止された •   Dokku ◦ 2013 年頃に開発がはじまったオープンソースの PaaS ▪ Shell Script で実装されている (最近、Go でリライトしているらしい) ◦ ソフトウェアは Docker 上で動き、コンテナイメージは Heroku と同じく Buildpack で作られる ▪ 最近、マルチノードをサポートするために K3s (軽量な K8s) 上でも動かせるようになったけど、 試したことはない ◦ 公式のプラグインとして MySQL / Postgres / Redis / RabbitMQ などのミドルウェアがあり、CLI か ら 2 コマンド程度でインストールできる What is Heroku? Dokku? 5
  4. • ミニ PC として Minisforum の UN100D を約 3 万円で購入して、Ubuntu

    24.04 をインストール ◦ CPU: Intel N100 / メモリ: 16GB / SSD: 256GB • 外から SSH / HTTP でアクセスできるようにするために Cloudflare Tunnel を使うことにした (無料) ◦ ドメインの NS レコードを Cloudflare に向けておかないといけないけど、SSL も終端してくれる Infrastructure 6
  5. • パッケージのセキュリティアップデートを自動適用して、自動再起動もして欲しい ◦ → unattended-upgrades を使って実現する ▪ 【Ubuntu】セキュリティアップデートの自動適用 | 開発者ブログ

    | 株式会社Skrum ▪ 必要であれば 17:00 JST に再起動 (適当) • ランタイム / ライブラリを自動バージョンアップして、CI が通ったらデプロイまで欲しい ◦ → GitHub Actions で頑張る (Appendix を参照) ▪ 毎週日曜日の 09:00 JST に自動バージョンアップ • ランタイムのパッチバージョンアップ • bundle update / npm update • Pull Request を作って auto-merge を有効化 ▪ CI は 壊れたら家族に怒られる 壊れたら困るアプリだけ真面目に書く • 自分しか使わない 壊れても困らないアプリは壊れたら直す • Unit Test は RSpec + Integration Test は Newman (Postman) ▪ Pull Request がマージされたら (main に Push されたら) Dependency Graph を更新 • Trivy で SBOM を作って GitHub にアップロード • 脆弱性が出たら GitHub の Notifications で教えて貰える Maintenance Free 7
  6. • Dokku は ミドルウェア系のプラグインも豊富 だけど、Redis 以外は使わない ◦ データベースを使うと、バックアップのことを考えないといけなくなる ▪ →

    Google Spreadsheet をデータベース代わりにする • 家族も分析できるし、アプリの開発を止めてもデータは残る • 書き込みには 2 〜 3 秒かかるけど、Redis にキャッシュしているので読み込みは 1 秒くらい ▪ → 画像などのアセットは AWS S3 にアップロードする • 画質や画像サイズを工夫すれば、$1 未満に治まる • クリーンインストールできる / 羃等に環境構築できるようにしたい ◦ → Shell Script で頑張る (Appendix を参照) ▪ 個人開発に Ansible は too much なので ▪ Shell Script は 200 行ちょっとで済んだ • パッケージの最新化と OS の初期設定 (SSH や TZ など) • cloudflared と docker & dokku 、mackerel-agent のインストールと設定 Stateless / Portability 8
  7. • Pull Request が作成 / 更新されたら Review App を Dokku

    にデプロイ ◦ Heroku だと Review Apps の設定をしておくだけで、自動でできるんだけど… • Pull Request がマージされたら (main に Push されたら) アプリを Dokku にデプロイ ◦ Heroku だと GitHub Integration の設定をしておくだけで、自動でできるんだけど… • Pull Request がマージされたら Review App を削除 ◦ 以下同文 → GitHub Actions で頑張る (Appendix を参照) Continuous Delivery 9
  8. • その他にも色々と工夫していて… ◦ Ruby on Rails は使わずに Sinatra を使う (手に馴染むので)

    ◦ ログイン機能は作らない (username と secret token で認証するだけ) ◦ PWA (Progressive Web Apps) でネイティブアプリっぽく動かす ▪ CSS / JavaScript / Web フォントはプリコンパイルして端末にキャッシュしておく • 今後やってみたいこと… ◦ K3s スケジューラを使ってマルチノード化してみたい ▪ ただし、イメージレジストリを用意する必要がある ◦ ミドルウェアの自動バージョンアップもできるようにしたい ▪ dokku redis:upgrade するだけなので In addition ... / To be continued ... 10