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
-
Compile el proyecto:
npm run build -
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.
| Variable | Descripción |
|---|---|
EMDASH_PREVIEW_SECRET | Sobrescritura para el secreto HMAC de vista previa generado automáticamente. |
EMDASH_IP_SALT | Sobrescritura para el salt de hash de IP del comentarista generado automáticamente. |
EMDASH_AUTH_SECRET | Opcional. 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
| Variable | Descripción | Ejemplo |
|---|---|---|
DATABASE_PATH | Ruta a la base de datos SQLite | /data/emdash.db |
HOST | Host del servidor | 0.0.0.0 |
PORT | Puerto del servidor | 4321 |
S3_ENDPOINT | URL del endpoint de S3 | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | Nombre del bucket de S3 | my-media-bucket |
S3_ACCESS_KEY_ID | Clave de acceso de S3 | AKIA... |
S3_SECRET_ACCESS_KEY | Clave secreta de S3 | ... |
S3_PUBLIC_URL | URL pública para medios | https://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.