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",
}),
}),
],
});
建置與執行
- 建置專案:
npm run build
-
初始化資料庫:
npx emdash init --database ./data/emdash.db -
啟動伺服器:
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_PATH | SQLite 資料庫路徑 | /data/emdash.db |
HOST | 伺服器主機 | 0.0.0.0 |
PORT | 伺服器連接埠 | 4321 |
S3_ENDPOINT | S3 端點 URL | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | S3 儲存貯體名稱 | my-media-bucket |
S3_ACCESS_KEY_ID | S3 存取金鑰 | AKIA... |
S3_SECRET_ACCESS_KEY | S3 秘密金鑰 | ... |
S3_PUBLIC_URL | 媒體公開 URL | https://cdn.example.com |
持續性儲存空間
SQLite 需要持久性磁碟。請確認代管平台提供:
- 已掛載的磁碟區或持久磁碟
- 對資料庫目錄的寫入權限
- 資料庫檔案的備份機制
健康檢查
為負載平衡器新增健康檢查端點:
export const GET = () => {
return new Response("OK", { status: 200 });
};
請將平台設定為在存活探針中檢查 /health。