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
-
Compilez le projet :
npm run build -
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.
| Variable | Description |
|---|---|
EMDASH_PREVIEW_SECRET | Remplacement pour le secret HMAC de prévisualisation généré automatiquement. |
EMDASH_IP_SALT | Remplacement pour le sel de hachage IP du commentateur généré automatiquement. |
EMDASH_AUTH_SECRET | Optionnel. 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
| Variable | Description | Exemple |
|---|---|---|
DATABASE_PATH | Chemin vers la base de données SQLite | /data/emdash.db |
HOST | Hôte du serveur | 0.0.0.0 |
PORT | Port du serveur | 4321 |
S3_ENDPOINT | URL du point de terminaison S3 | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | Nom du bucket S3 | my-media-bucket |
S3_ACCESS_KEY_ID | Clé d’accès S3 | AKIA... |
S3_SECRET_ACCESS_KEY | Clé secrète S3 | ... |
S3_PUBLIC_URL | URL publique pour les médias | https://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é.