Déployer sur Node.js

Sur cette page

EmDash fonctionne sur n’importe quelle plateforme d’hébergement Node.js 22+. Ce guide utilise SQLite avec un stockage local ou compatible S3 ; libSQL et PostgreSQL fonctionnent de la même manière sur Node.js — voir Options de base de données.

Prérequis

  • Node.js v22.12.0 ou supérieur
  • Un fournisseur d’hébergement Node.js ou VPS

Configuration

Configurez EmDash pour le déploiement 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",
			}),
		}),
	],
});

Compiler et exécuter

  1. Compilez le projet :

    npm run build
  2. Démarrez le serveur :

    node ./dist/server/entry.mjs

Le serveur s’exécute sur http://localhost:4321 par défaut. Les migrations sont appliquées à la première requête. Si la base de données est vide et que la configuration n’a pas été effectuée, votre fichier seed (ou celui par défaut intégré si vous n’en avez pas) est également appliqué lors de cette première requête.

Stockage de production

Pour la production, utilisez un stockage compatible S3 au lieu du système de fichiers 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

Ajoutez un .dockerignore pour garder le contexte de build petit :

node_modules
dist
.git

Créez 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"]

Le fichier seed est lu au moment de la compilation et intégré dans le bundle, il n’a donc pas besoin d’être copié dans l’image d’exécution. Les migrations s’exécutent à la première requête après un déploiement ; le seed ne s’applique que lorsque la base de données n’a pas de collections et que la configuration n’a pas été effectuée — les données existantes ne sont jamais écrasées.

Compilez l’image et exécutez le conteneur :

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

Un fichier Docker Compose gère le même conteneur avec un volume nommé :

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

volumes:
  emdash-data:

Démarrez la pile en arrière-plan :

docker compose up -d

Variables d’environnement

Recommandé : clé de chiffrement

EMDASH_ENCRYPTION_KEY est la clé pour chiffrer les secrets des plugins au repos. La clé est validée au démarrage ; le chiffrement des secrets des plugins l’utilise une fois activé. Définissez-la à chaque déploiement pour que les secrets soient protégés sans changement de configuration ultérieur.

Générez une clé et ajoutez le résultat à votre environnement :

npx emdash secrets generate  # add the result to your environment

La clé est fournie par vous et n’est jamais stockée dans la base de données ; seul le texte chiffré l’est. Sauvegardez-la dans un endroit durable (un gestionnaire de mots de passe, KMS ou le magasin de secrets de votre équipe) — la perdre signifie perdre chaque secret chiffré avec elle.

Optionnel : remplacements de valeurs stables

EmDash génère automatiquement le secret HMAC de prévisualisation et le sel de hachage IP du commentateur et les conserve dans la base de données lors de la première utilisation. Les variables d’environnement ci-dessous les fixent à une valeur que vous contrôlez — utile lorsqu’un processus séparé doit partager un secret avec votre site principal.

VariableDescription
EMDASH_PREVIEW_SECRETRemplacement pour le secret HMAC de prévisualisation généré automatiquement.
EMDASH_IP_SALTRemplacement pour le sel de hachage IP du commentateur généré automatiquement.
EMDASH_AUTH_SECRETOptionnel. S’il est défini, utilisé comme source de sel IP (sauf si EMDASH_IP_SALT est également défini, qui a la priorité), gardant les hachages IP du commentateur stables pour les installations qui en dépendent déjà. Laissez-le non défini pour un nouveau déploiement.

Base de données et stockage

VariableDescriptionExemple
DATABASE_PATHChemin vers la base de données SQLite/data/emdash.db
HOSTHôte du serveur0.0.0.0
PORTPort du serveur4321
S3_ENDPOINTURL du point de terminaison S3https://xxx.r2.cloudflarestorage.com
S3_BUCKETNom du bucket S3my-media-bucket
S3_ACCESS_KEY_IDClé d’accès S3AKIA...
S3_SECRET_ACCESS_KEYClé secrète S3...
S3_PUBLIC_URLURL publique pour les médiashttps://cdn.example.com

Stockage persistant

SQLite nécessite un stockage disque persistant. Assurez-vous que votre plateforme d’hébergement fournit :

  • Un volume monté ou un disque persistant
  • Accès en écriture au répertoire de la base de données
  • Mécanismes de sauvegarde pour le fichier de base de données

Contrôles de santé

Ajoutez un point de terminaison de contrôle de santé pour les équilibreurs de charge :

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

Configurez votre plateforme pour vérifier /health pour les sondes de vivacité.