Implementar en Node.js

En esta página

EmDash se ejecuta en cualquier plataforma de alojamiento de Node.js 22+. Esta guía utiliza SQLite con almacenamiento local o compatible con S3; libSQL y PostgreSQL funcionan de la misma manera en Node.js — consulte Opciones de base de datos.

Requisitos previos

  • Node.js v22.12.0 o superior
  • Un proveedor de alojamiento de Node.js o VPS

Configuración

Configure EmDash para la implementación en Node.js:

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",
			}),
		}),
	],
});

Compilar y ejecutar

  1. Compile el proyecto:

    npm run build
  2. Inicie el servidor:

    node ./dist/server/entry.mjs

El servidor se ejecuta en http://localhost:4321 de forma predeterminada. Las migraciones se aplican en la primera solicitud. Si la base de datos está vacía y la configuración no se ha completado, su archivo seed (o el predeterminado integrado si no tiene uno) también se aplica en esa primera solicitud.

Almacenamiento de producción

Para producción, use almacenamiento compatible con S3 en lugar del sistema de archivos local:

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

Agregue un .dockerignore para mantener pequeño el contexto de compilación:

node_modules
dist
.git

Cree un 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"]

El archivo seed se lee en tiempo de compilación y se incrusta en el paquete, por lo que no necesita copiarse en la imagen de tiempo de ejecución. Las migraciones se ejecutan en la primera solicitud después de una implementación; el seed se aplica solo cuando la base de datos no tiene colecciones y la configuración no se ha completado — los datos existentes nunca se sobrescriben.

Compile la imagen y ejecute el contenedor:

docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site

Un archivo de Docker Compose administra el mismo contenedor con un volumen con nombre:

services:
  emdash:
    build: .
    ports:
      - "4321:4321"
    volumes:
      - emdash-data:/app/data
    restart: unless-stopped

volumes:
  emdash-data:

Inicie la pila en segundo plano:

docker compose up -d

Variables de entorno

Recomendado: clave de cifrado

EMDASH_ENCRYPTION_KEY es la clave para cifrar los secretos de los plugins en reposo. La clave se valida al inicio; el cifrado de secretos de plugins la usa una vez habilitado. Configúrela en cada implementación para que los secretos estén protegidos sin un cambio de configuración posterior.

Genere una clave y agregue el resultado a su entorno:

npx emdash secrets generate  # add the result to your environment

La clave la proporciona usted y nunca se almacena en la base de datos; solo se almacena el texto cifrado. Haga una copia de seguridad en un lugar duradero (un administrador de contraseñas, KMS o el almacén de secretos de su equipo) — perderla significa perder cada secreto cifrado con ella.

Opcional: sobrescrituras de valores estables

EmDash genera automáticamente el secreto HMAC de vista previa y el salt de hash de IP del comentarista y los persiste en la base de datos en el primer uso. Las variables de entorno a continuación los fijan a un valor que usted controla — útil cuando un proceso separado necesita compartir un secreto con su sitio principal.

VariableDescripción
EMDASH_PREVIEW_SECRETSobrescritura para el secreto HMAC de vista previa generado automáticamente.
EMDASH_IP_SALTSobrescritura para el salt de hash de IP del comentarista generado automáticamente.
EMDASH_AUTH_SECRETOpcional. Si se establece, se usa como fuente de salt de IP (a menos que EMDASH_IP_SALT también esté establecido, que tiene prioridad), manteniendo estables los hashes de IP del comentarista para instalaciones que ya dependen de él. Déjelo sin establecer para una nueva implementación.

Base de datos y almacenamiento

VariableDescripciónEjemplo
DATABASE_PATHRuta a la base de datos SQLite/data/emdash.db
HOSTHost del servidor0.0.0.0
PORTPuerto del servidor4321
S3_ENDPOINTURL del endpoint de S3https://xxx.r2.cloudflarestorage.com
S3_BUCKETNombre del bucket de S3my-media-bucket
S3_ACCESS_KEY_IDClave de acceso de S3AKIA...
S3_SECRET_ACCESS_KEYClave secreta de S3...
S3_PUBLIC_URLURL pública para medioshttps://cdn.example.com

Almacenamiento persistente

SQLite requiere almacenamiento en disco persistente. Asegúrese de que su plataforma de alojamiento proporcione:

  • Un volumen montado o disco persistente
  • Acceso de escritura al directorio de la base de datos
  • Mecanismos de copia de seguridad para el archivo de la base de datos

Comprobaciones de estado

Agregue un endpoint de comprobación de estado para balanceadores de carga:

export const GET = () => {
  return new Response("OK", { status: 200 });
};

Configure su plataforma para verificar /health para sondeos de actividad.