部署到 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