Node.jsへのデプロイ

このページ

EmDashは、任意のNode.js 22+ホスティングプラットフォーム上で動作します。このガイドでは、ローカルまたはS3互換ストレージを使用したSQLiteを使用します。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, // Optional 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"]

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

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

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  # add the result to your environment

キーはあなたが提供し、データベースには保存されません。保存されるのは 暗号化された暗号文のみです。永続的な場所(パスワードマネージャー、 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 });
};

プラットフォームを設定して、livenessプローブ用に/healthをチェックします。