Node.jsへのデプロイ

このページ

EmDashはNode.js 22以上の任意のホスティングプラットフォームで動作します。このガイドではSQLiteとローカルまたはS3互換ストレージを使用します。libSQLとPostgreSQLもNode.jsで同様に動作します — データベースオプションを参照してください。

前提条件

  • Node.js v22.12.0以上
  • Node.jsホスティングプロバイダーまたはVPS

設定

Node.jsデプロイメント用にEmDashを設定します:

import { defineConfig } from "astro/config";
import node from "@astrojs/node";
import emdash, { local, s3 } from "emdash/astro";
import { sqlite } from "emdash/db";

export default defineConfig({
	output: "server",
	adapter: node({ mode: "standalone" }),
	integrations: [
		emdash({
			database: sqlite({ url: "file:./data/emdash.db" }),
			storage: local({
				directory: "./data/uploads",
				baseUrl: "/_emdash/api/media/file",
			}),
		}),
	],
});

ビルドと実行

  1. プロジェクトをビルド:

    npm run build
  2. サーバーを起動:

    node ./dist/server/entry.mjs

サーバーはデフォルトで http://localhost:4321 で動作します。マイグレーションは最初のリクエスト時に適用されます。データベースが空でセットアップが完了していない場合、シードファイル(ない場合は組み込みのデフォルト)もその最初のリクエスト時に適用されます。

本番ストレージ

本番環境では、ローカルファイルシステムの代わりにS3互換ストレージを使用します:

import emdash, { s3 } from "emdash/astro";

export default defineConfig({
	integrations: [
		emdash({
			database: sqlite({ url: `file:${process.env.DATABASE_PATH}` }),
			storage: s3({
				endpoint: process.env.S3_ENDPOINT,
				bucket: process.env.S3_BUCKET,
				accessKeyId: process.env.S3_ACCESS_KEY_ID,
				secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
				publicUrl: process.env.S3_PUBLIC_URL, // オプションのCDN URL
			}),
		}),
	],
});

Docker

ビルドコンテキストを小さく保つために .dockerignore を追加します:

node_modules
dist
.git

Dockerfile を作成します:

FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./

RUN mkdir -p data

ENV HOST=0.0.0.0
ENV PORT=4321

EXPOSE 4321
CMD ["node", "./dist/server/entry.mjs"]

シードファイルはビルド時に読み込まれバンドルにインライン化されるため、ランタイムイメージにコピーする必要はありません。マイグレーションはデプロイ後の最初のリクエスト時に実行されます。シードはデータベースにコレクションがなくセットアップが完了していない場合にのみ適用されます — 既存のデータは上書きされません。

そのエラーが発生した場合は、npm ci の前にビルダーステージでツールチェーンをインストールします:

# Alpineベースのイメージ(node:22-alpine)
RUN apk add --no-cache python3 make g++

# Debianベースのイメージ(node:22-slim)
RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ \
    && rm -rf /var/lib/apt/lists/*

イメージをビルドしてコンテナを実行:

docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site

Docker Composeファイルは名前付きボリュームで同じコンテナを管理します:

services:
  emdash:
    build: .
    ports:
      - "4321:4321"
    volumes:
      - emdash-data:/app/data
    restart: unless-stopped

volumes:
  emdash-data:

バックグラウンドでスタックを起動:

docker compose up -d

環境変数

推奨:暗号化キー

EMDASH_ENCRYPTION_KEY はプラグインシークレットを保存時に暗号化するための キーです。キーは起動時に検証され、プラグインシークレットの暗号化は 有効化されると使用されます。すべてのデプロイで設定して、後の設定変更なしに シークレットが保護されるようにしてください。

キーを生成して結果を環境に追加します:

npx emdash secrets generate  # 結果を環境に追加

キーはあなたが提供し、データベースには保存されません。暗号化された 暗号文のみが保存されます。永続的な場所(パスワードマネージャー、 KMS、チームのシークレットストア)にバックアップしてください — 失うとそれで暗号化されたすべてのシークレットを失います。

オプション:安定値のオーバーライド

EmDashはプレビューHMACシークレットとコメンターIPハッシュソルトを 自動生成し、初回使用時にデータベースに保存します。以下の環境変数は あなたが制御する値に固定します — 別のプロセスがメインサイトとシークレットを 共有する必要がある場合に便利です。

変数説明
EMDASH_PREVIEW_SECRET自動生成されたプレビューHMACシークレットのオーバーライド。
EMDASH_IP_SALT自動生成されたコメンターIPハッシュソルトのオーバーライド。
EMDASH_AUTH_SECRETオプション。設定されるとIPソルトソースとして使用されます(EMDASH_IP_SALT も設定されている場合はそちらが優先)。すでにこれに依存しているインストールのコメンターIPハッシュを安定に保ちます。新しいデプロイでは未設定のままにしてください。

データベースとストレージ

変数説明
DATABASE_PATHSQLiteデータベースのパス/data/emdash.db
HOSTサーバーホスト0.0.0.0
PORTサーバーポート4321
S3_ENDPOINTS3エンドポイントURLhttps://xxx.r2.cloudflarestorage.com
S3_BUCKETS3バケット名my-media-bucket
S3_ACCESS_KEY_IDS3アクセスキーAKIA...
S3_SECRET_ACCESS_KEYS3シークレットキー...
S3_PUBLIC_URLメディアの公開URLhttps://cdn.example.com

永続ストレージ

SQLiteには永続的なディスクストレージが必要です。ホスティングプラットフォームが以下を提供することを確認してください:

  • マウントされたボリュームまたは永続ディスク
  • データベースディレクトリへの書き込みアクセス
  • データベースファイルのバックアップメカニズム

ヘルスチェック

ロードバランサー用のヘルスチェックエンドポイントを追加します:

export const GET = () => {
  return new Response("OK", { status: 200 });
};

ライブネスプローブ用に /health をチェックするようプラットフォームを設定してください。