🧊

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よりすげーやつらしい。

Cap'n Proto: Introduction

とりあえず動かす

まずは`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`するように設定すれば、誰でもセルフホストできる!という感じ。

おまけ