跳转到内容

部署到 Node.js

EmDash 可以运行在任何支持 Node.js 22+ 的托管平台上。本指南介绍如何使用 SQLite,以及本地或 S3 兼容存储来完成部署。

  • Node.js v22.12.0 或更高版本
  • 一个 Node.js 托管提供商或 VPS

为 Node.js 部署配置 EmDash:

astro.config.mjs
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. 构建项目:
Terminal window
npm run build
  1. 初始化数据库:

    Terminal window
    npx emdash init --database ./data/emdash.db
  2. 启动服务器:

    Terminal window
    node ./dist/server/entry.mjs

服务器默认运行在 http://localhost:4321。

在生产环境中,建议使用 S3 兼容存储,而不是本地文件系统:

astro.config.mjs
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
}),
}),
],
});

创建 Dockerfile:

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 ./
ENV HOST=0.0.0.0
ENV PORT=4321
EXPOSE 4321
CMD ["node", "./dist/server/entry.mjs"]

构建并运行:

Terminal window
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
变量描述
EMDASH_AUTH_SECRET用于签署会话 Cookie 和身份验证令牌。使用 npx emdash auth secret 生成。
EMDASH_PREVIEW_SECRET用于签署草稿内容的预览 URL。使用 npx emdash auth secret 生成。
变量描述示例
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 需要持久化磁盘存储。请确保您的托管平台提供:

  • 已挂载的卷或持久化磁盘
  • 对数据库目录的写入权限
  • 数据库文件的备份机制

为负载均衡器添加健康检查端点:

src/pages/health.ts
export const GET = () => {
return new Response("OK", { status: 200 });
};

配置您的平台以检查 /health 端点作为存活探针。