cloudflare/workerd をセルフホスト目的で使う
ちょっと調べたいことがあったのでそのメモ。
workerd
GitHub - cloudflare/workerd: The JavaScript / Wasm runtime that powers Cloudflare Workers
Cloudflare Workersのランタイムである`workerd`は、OSSとして公開されていて、自分でモジュールとして使えば、セルフホストもできるよってことになってる。
ビルドするならBazeliskで`bazel`を使えとか、READMEに必要なことはほとんど書いてある。
自分でビルドせずとも、プリビルトのものでよければ`npx workerd`から利用できる。
コマンド
- serve
- compile
- test
現状で利用できるコマンドはこの3つだった。
(`test`は知らないが)、`serve`と`compile`は、引数に`.capnp`の設定ファイルを渡して使う。
Cap’n Protoっていうフォーマットは初めて知ったけど、JSONよりProtobufよりすげーやつらしい。
とりあえず動かす
まずは`my-config.capnp`をこのように。
using Workerd = import "/workerd/workerd.capnp"; const config :Workerd.Config = ( services = [ (name = "main", worker = .mainWorker), ], sockets = [ ( name = "http", address = "*:8080", http = (), service = "main" ), ] ); const mainWorker :Workerd.Worker = ( modules = [ (name = "worker", esModule = embed "hello.js") ], compatibilityDate = "2023-07-17", );
で、`hello.js`はこれだけ。
export default { async fetch() { return new Response("Hello World!"); } }
そして、`npx workerd serve my-config.capnp`とすれば、`http://localhost:8080`にサービスが立って、アクセスできるようになる。
もしくは、`npx workerd compile my-config.capnp > my-worker`とすれば、実行できるバイナリも生成できる。
あとは`systemd`なんかでよしなに`serve`するように設定すれば、誰でもセルフホストできる!という感じ。
おまけ
- `.capnp`で使える定義の詳細について
- いろんなユースケースの定義例
- ほかにも引数やフラグがあるようだったが、何に使うのかはよくわからなかった