Desplegar en Node.js

En esta página

EmDash se ejecuta en cualquier plataforma de alojamiento con Node.js 22 o superior. Esta guía cubre el despliegue en proveedores habituales usando SQLite y almacenamiento local o compatible con S3.

Requisitos previos

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

Configuración

Configura EmDash para el despliegue 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. Compila el proyecto:
npm run build
  1. Inicializa la base de datos:

    npx emdash init --database ./data/emdash.db
  2. Inicia el servidor:

    node ./dist/server/entry.mjs

El servidor se ejecuta por defecto en http://localhost:4321.

Almacenamiento en producción

En producción, usa 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

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

node_modules
dist
.git

Crea 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 ./
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"]

Compilar y ejecutar:

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

O usa Docker Compose:

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

volumes:
  emdash-data:
docker compose up -d

Variables de entorno

Obligatorias en producción

VariableDescripción
EMDASH_AUTH_SECRETFirma las cookies de sesión y los tokens de autenticación. Genera con npx emdash auth secret.
EMDASH_PREVIEW_SECRETFirma las URL de vista previa del contenido en borrador. Genera con npx emdash auth secret.

Base de datos y almacenamiento

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

Almacenamiento persistente

SQLite requiere disco persistente. Asegúrate de que tu plataforma ofrezca:

  • Un volumen montado o disco persistente
  • Permisos de escritura en el directorio de la base de datos
  • Mecanismos de copia de seguridad del archivo de base de datos

Comprobaciones de estado

Añade un endpoint de comprobación de estado para los balanceadores de carga:

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

Configura tu plataforma para comprobar /health en las sondas de actividad (liveness).