デプロイ
Linux ホストに systemd unit + nginx リバースプロキシ + Let's Encrypt 証明書、で本番運用を組みます。2 GB の VPS で十分余裕を持って動きます。リポジトリの packaging/ 以下に hardened な unit と LE 自動更新タイマーが置いてあります。
ユーザー作成とディレクトリ
sudo useradd -r -s /usr/sbin/nologin -d /var/lib/typress typress
sudo mkdir -p /opt/typress /var/lib/typress /etc/typress
sudo chown typress:typress /var/lib/typress
sudo chmod 0700 /var/lib/typress
sudo cp dist/typress /opt/typress/typressmaster key と env
openssl rand 32 | base64 | tr '+/' '-_' | tr -d '=' \
| sudo tee /etc/typress/master.key >/dev/null
sudo chmod 0400 /etc/typress/master.key
sudo chown root:typress /etc/typress/master.key
sudo cp packaging/typress.env.example /etc/typress/typress.env
sudoedit /etc/typress/typress.env # master key を貼って origin を編集
sudo chmod 0640 /etc/typress/typress.env
sudo chown root:typress /etc/typress/typress.envsystemd unit
packaging/typress.service には ProtectSystem=strict、PrivateTmp、RestrictNamespaces、SystemCallFilter など、Bun の JIT を壊さない範囲のハードニングがすべて入っています。
sudo cp packaging/typress.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now typress.serviceMemoryDenyWriteExecute は意図的に外してあります。Bun が同梱する JavaScriptCore JIT は W^X 領域を必要とするため、これを有効化すると起動しません。
nginx リバースプロキシと TLS
typress 自体には TLS は載せず、前段の nginx か Caddy で終端します。Let's Encrypt は 2026 年に IP アドレス向けの短命証明書発行を一般公開したので、ドメインがまだなくても TLS は張れます。
server {
listen 443 ssl http2;
server_name your-site.example;
ssl_certificate /etc/letsencrypt/live/.../fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem;
location / {
proxy_pass http://127.0.0.1:4321;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}LE 自動更新
短命プロファイルの cert は 6 日で切れます。packaging/typress-le-renew.timer は 12 時間ごとに certbot renew を回すので、1 度失敗しても次のサイクルで挽回できます。
sudo cp packaging/typress-le-renew.{service,timer} /etc/systemd/system/
sudo systemctl enable --now typress-le-renew.timermacOS からのクロスコンパイル罠
Bun の --target=bun-linux-x64 でクロスコンパイルしたバイナリは、Linux 上で JSC のヒープが暴走して 1.8 GB を消費する既知のバグがあります。Linux ホスト上でネイティブビルドしてください。他の本番運用上の罠はトラブルにまとめています。