部署到 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, // 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 });
};

配置您的平台以检查 /health 进行存活探测。