部署至 Node.js

本頁內容

EmDash 可在任何支援 Node.js 22 以上的代管平台上運作。本指南說明使用 SQLite 以及本機或 S3 相容儲存空間,在常見供應商上的部署方式。

必要條件

  • 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
  1. 初始化資料庫:

    npx emdash init --database ./data/emdash.db
  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 ./
COPY --from=builder /app/seed ./seed
COPY --from=builder /app/astro.config.mjs ./

RUN mkdir -p data

ENV HOST=0.0.0.0
ENV PORT=4321

EXPOSE 4321
CMD ["sh", "-c", "npx emdash init && 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_AUTH_SECRET用於簽署工作階段 Cookie 與驗證權杖。請以 npx emdash auth secret 產生。
EMDASH_PREVIEW_SECRET用於簽署草稿內容的預覽 URL。請以 npx emdash auth secret 產生。

資料庫與儲存空間

變數名稱說明範例
EMDASH_SITE_URL面向瀏覽器的公開來源位址(未設定時回退到 SITE_URL)https://example.com
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