homura Docs App | Posts About Login
Ctrl+K

既存 Sinatra → Cloudflare Workers 移行

homura 本体(app/app.rb + app/routes/canonical_all.rb)が実際に踏んでいるパターンに基づきます。誇張せず、このスタックで動作確認済みの範囲だけを書きます。

対象と非対象

向いているもの

厳しいもの(早期に見送り判断)

6 ステップ(推奨順)

  1. Gemfile: opal-homurarequire: 'opal')、homura-runtimesinatra-homura を追加。D1 を使うなら sequel-d1 も追加します。
  2. エントリ: app.rb(またはメイン定義ファイル)の require 'sinatra'(classic)または require 'sinatra/base'(modular)はそのまま。Cloudflare 専用の require に差し替える必要はありません — sinatra-homura が Sinatra のエントリポイント上で Workers ランタイムを自動配線します。Cloudflare binding 由来の async 境界は homura build の auto-await が吸収します。
  3. ルート: 既存の get / post を可能な限りそのまま移植。Sinatra の DSL は互換パッチ側で吸収。
  4. DB: Sequel.connect(adapter: :d1, d1: d1) の形へ。ORM なしなら db.execute / db.execute_insert を使います。マイグレーションは bundle exec homura db:migrate:compile db/migrationshomura db:migrate:applysequel-d1 README 参照)。
  5. ビュー: bundle exec homura erb:compile --input views --output build/templates.rb --namespace …(プロジェクトの Rake / npm に合わせる)。
  6. Workers 向けビルド: bundle exec homura build(または --standalone)で build/worker.entrypoint.mjs を生成し、wrangler.tomlmain と一致させて wrangler deploy

よくあるハマりポイント

既存アプリを backend だけ Cloudflare 化するなら

  1. まず API 面だけ切り出す: 既存フロントはそのままにして、/api/* や webhook など「境界が明確な backend 仕事」から Workers に移します。最初から SSR 全面移行を狙わないほうが安全です。
  2. Rack / Sinatra の入口は維持: route 定義、params 処理、認証、service object はなるべく残し、Puma/Unicorn 前提の起動や filesystem 依存だけを先に剥がします。
  3. Rake を先に生やす: 既存 app でも generated app と同じく bundle exec rake build / dev / deploy を先に作り、その内部で homurawrangler を呼ぶ形に寄せると、移行後の運用が崩れません。
  4. HTML より JSON を先に通す: backend-only 移行なら ERB を急いで載せなくてよいので、まず JSON API / 認証 / queue / cron / webhook を通し、必要になった時だけ template compile を足すのが筋です。
  5. DB 境界は最後に決める: 既存 DB を温存するなら Workers から HTTP/Service Binding 経由で寄せる、D1 に寄せられるならその時点で sequel-d1 と migration compile を入れる、の二段で考えるのが現実的です。

動かない・優先度を下げる例