Node.js と Express
Express、Fastify、Koa、Hono、NestJS など、どの Node.js サーバーでも同じです。
最小限のアプリ
js
// server.js
const express = require('express')
const app = express()
const port = process.env.PORT || 8080
app.get('/', (req, res) => res.send('Hello from Express'))
app.listen(port, '0.0.0.0', () => console.log(`listening on ${port}`))json
{
"scripts": { "start": "node server.js" },
"dependencies": { "express": "^5.1.0" }
}Zenavo が検出する内容
zbpack は Node.js としてビルドします。
| ステップ | コマンド |
|---|---|
| インストール | リポジトリのロックファイルに応じて npm install、pnpm install、yarn install、bun install(ロックファイルがなければ yarn) |
| ビルド | build スクリプトがあれば実行(TypeScript、バンドラー) |
| 起動 | start スクリプト。なければ node index.js |
Node.js のバージョンは package.json の engines.node から取ります(未設定なら 22)。
json
"engines": { "node": "22" }別のコマンドを使うには、Settings → Build → zbpack options で ZBPACK_BUILD_COMMAND か ZBPACK_START_COMMAND を設定します(ビルドプラン)。
デプロイ
- Add Service → GitHub で、リポジトリとブランチを選びます。
- 変数を追加して Next をクリックし、プレビューに nodejs と表示されていることを確認して Deploy をクリックします。
- Networking タブでドメインを生成します。
データベースに接続する
プロジェクトにデータベースを追加し、アプリのサービスでその変数を参照します。
sh
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}
REDIS_URL=${REDIS_CONNECTION_STRING}マイグレーションはビルドではなくアプリの起動時に実行してください。ビルドからはプロジェクトのデータベースに届きません。package.json の predeploy スクリプトは、サービスが起動するたびに start の前に実行されます。
json
"scripts": {
"predeploy": "node migrate.js",
"start": "node server.js"
}TypeScript
build スクリプトでコンパイルし、その出力を起動します。
json
"scripts": {
"build": "tsc",
"start": "node dist/server.js"
}typescript は dependencies と devDependencies のどちらに置いても構いません。ビルドでは両方インストールされます。
よくある問題
| 症状 | 原因 |
|---|---|
| デプロイが healthy にならない | サーバーが localhost や固定ポートで待ち受けています。0.0.0.0 と process.env.PORT で待ち受けてください。 |
起動時に Cannot find module | start スクリプトがビルドで作られていないファイルを指しているか、package.json に依存関係が足りません。 |
| 違うパッケージマネージャーが使われる | ロックファイルがないか、2 つあります。ちょうど 1 つにしてください。 |
| アップロードしたファイルがデプロイ後に消える | コンテナのディスクはデプロイのたびに置き換わります。ボリュームかオブジェクトストレージを使ってください。 |