vercel で Deno を使う

vercel がコンテナサポートをしたので極端なことを言えば何でも動く環境に変わった。
今回は、Denoをランタイムとして、vercel上で動かしてみる。

参考

導入

シンプルなサーバーのデプロイ

ドキュメントを参考にして、Dockerfile.vercel deno.json main.tsを作成する。

Dockerfile.vercel
1
2
3
4
5
6
7
8
FROM denoland/deno:2.9.1

WORKDIR /app
COPY main.ts .
COPY deno.json .

USER deno
CMD ["deno", "run", "--allow-net", "--allow-env", "main.ts"]
deno.json
1
2
3
4
5
6
7
8
{
"tasks": {
"dev": "deno run --watch --allow-net main.ts"
},
"imports": {
}
}

main.ts
1
2
3
4
5
6
const port = parseInt(Deno.env.get("PORT") ?? "3000");

console.log(`Listening on port ${port}...`);

Deno.serve({ port }, () => new Response("Hello Deno"));

ここまで作成し、一旦Pushする。
続けて、vercel にログインしプロジェクトを作成、リポジトリを連携する。

これだけでデプロイ完了する。
非常に簡単。

Fresh をデプロイ

続けてFresh をデプロイしてみます。

まず、セットアップ。

1
$ deno run -Ar jsr:@fresh/init

Dockerfile.vercel は次のように書き換える。

Dockerfile.vercel
1
2
3
4
5
6
7
8
9
10
11
12
13
FROM denoland/deno:2.9.1

WORKDIR /app

COPY deno.json deno.lock ./
RUN deno install

COPY . .

RUN deno task build

USER deno
CMD ["sh", "-c", "deno serve -REN --port=${PORT:-80} _fresh/server.js"]

これでvercel上にFreshをデプロイできる。


Vercel で Deno を使うことができた。
Deno Deploy と比べれば、Deno KVは無いので、その問題はある。
しかし、Servicesの機能を使えばいくつかのコンテナをまとめることができる。
この点は Deno Deploy ではできず、個別に用意していた部分であり利点もある。

視点として、Deno Deploy を多用していた視点から見たバイアスはある。
だがしかし、Deno Deploy 上のDeno KVが無料だと1つしか作れなくなったりしているので、見直すタイミングが訪れたとも感じられた。

今後は、(予算の問題というのは多分にあるだろうが)バックフロント統合のものはdeno deploy、バックフロント分離のものはvercel、という使い分けを検討する可能性がある。

vervel初見で使ったが、なんとなくは触れたので良かった。
知らなかったのだが、StorageとしてUpstashやTursoの直結もできるようになっていたので、この点も良さそうであった。

では。