EmDash läuft auf jeder Node.js 22+-Hosting-Plattform. Diese Anleitung verwendet SQLite mit lokalem oder S3-kompatiblem Speicher; libSQL und PostgreSQL funktionieren auf Node.js genauso — siehe Datenbankoptionen.
Voraussetzungen
- Node.js v22.12.0 oder höher
- Ein Node.js-Hosting-Anbieter oder VPS
Konfiguration
Konfigurieren Sie EmDash für Node.js-Deployment:
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",
}),
}),
],
});
Bauen und starten
-
Projekt bauen:
npm run build -
Server starten:
node ./dist/server/entry.mjs
Der Server läuft standardmäßig auf http://localhost:4321. Migrationen werden bei der ersten Anfrage angewendet. Wenn die Datenbank leer ist und das Setup noch nicht abgeschlossen wurde, wird Ihre Seed-Datei (oder der integrierte Standard, wenn Sie keine haben) ebenfalls bei dieser ersten Anfrage angewendet.
Produktionsspeicher
Verwenden Sie für die Produktion S3-kompatiblen Speicher anstelle des lokalen Dateisystems:
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, // Optionale CDN-URL
}),
}),
],
});
Docker
Fügen Sie eine .dockerignore hinzu, um den Build-Kontext klein zu halten:
node_modules
dist
.git
Erstellen Sie ein 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"]
Die Seed-Datei wird zur Build-Zeit gelesen und in das Bundle eingebettet, sodass sie nicht in das Runtime-Image kopiert werden muss. Migrationen werden bei der ersten Anfrage nach einem Deploy ausgeführt; der Seed wird nur angewendet, wenn die Datenbank keine Collections hat und das Setup nicht abgeschlossen wurde — bestehende Daten werden nie überschrieben.
Wenn dieser Fehler auftritt, installieren Sie die Toolchain in der Builder-Phase vor npm ci:
# Alpine-basierte Images (node:22-alpine)
RUN apk add --no-cache python3 make g++
# Debian-basierte Images (node:22-slim)
RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ \
&& rm -rf /var/lib/apt/lists/*
Image bauen und Container starten:
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
Eine Docker Compose-Datei verwaltet den gleichen Container mit einem benannten Volume:
services:
emdash:
build: .
ports:
- "4321:4321"
volumes:
- emdash-data:/app/data
restart: unless-stopped
volumes:
emdash-data:
Stack im Hintergrund starten:
docker compose up -d
Umgebungsvariablen
Empfohlen: Verschlüsselungsschlüssel
EMDASH_ENCRYPTION_KEY ist der Schlüssel zur Verschlüsselung von Plugin-Secrets im
Ruhezustand. Der Schlüssel wird beim Start validiert; die Plugin-Secret-Verschlüsselung
verwendet ihn, sobald sie aktiviert ist. Setzen Sie ihn bei jedem Deployment, damit Secrets ohne
spätere Konfigurationsänderung geschützt sind.
Generieren Sie einen Schlüssel und fügen Sie das Ergebnis zu Ihrer Umgebung hinzu:
npx emdash secrets generate # Ergebnis zur Umgebung hinzufügen
Der Schlüssel wird von Ihnen bereitgestellt und nie in der Datenbank gespeichert; nur verschlüsselter Chiffretext wird gespeichert. Sichern Sie ihn an einem dauerhaften Ort (Passwort-Manager, KMS oder Secret-Store Ihres Teams) — sein Verlust bedeutet den Verlust jedes mit ihm verschlüsselten Secrets.
Optional: Überschreibungen stabiler Werte
EmDash generiert automatisch das Preview-HMAC-Secret und den Commenter-IP-Hash- Salt und speichert sie bei der ersten Verwendung in der Datenbank. Die untenstehenden Umgebungsvariablen fixieren sie auf einen von Ihnen kontrollierten Wert — nützlich, wenn ein separater Prozess ein Secret mit Ihrer Hauptseite teilen muss.
| Variable | Beschreibung |
|---|---|
EMDASH_PREVIEW_SECRET | Überschreibung für das automatisch generierte Preview-HMAC-Secret. |
EMDASH_IP_SALT | Überschreibung für den automatisch generierten Commenter-IP-Hash-Salt. |
EMDASH_AUTH_SECRET | Optional. Wenn gesetzt, wird es als IP-Salt-Quelle verwendet (es sei denn, EMDASH_IP_SALT ist auch gesetzt, was Vorrang hat), wodurch Commenter-IP-Hashes für Installationen stabil bleiben, die bereits darauf angewiesen sind. Lassen Sie es für ein neues Deployment ungesetzt. |
Datenbank und Speicher
| Variable | Beschreibung | Beispiel |
|---|---|---|
DATABASE_PATH | Pfad zur SQLite-Datenbank | /data/emdash.db |
HOST | Server-Host | 0.0.0.0 |
PORT | Server-Port | 4321 |
S3_ENDPOINT | S3-Endpunkt-URL | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | S3-Bucket-Name | my-media-bucket |
S3_ACCESS_KEY_ID | S3-Zugriffsschlüssel | AKIA... |
S3_SECRET_ACCESS_KEY | S3-Geheimschlüssel | ... |
S3_PUBLIC_URL | Öffentliche URL für Medien | https://cdn.example.com |
Persistenter Speicher
SQLite benötigt persistenten Festplattenspeicher. Stellen Sie sicher, dass Ihre Hosting-Plattform Folgendes bietet:
- Ein gemountetes Volume oder persistenter Speicher
- Schreibzugriff auf das Datenbankverzeichnis
- Backup-Mechanismen für die Datenbankdatei
Health Checks
Fügen Sie einen Health-Check-Endpunkt für Load Balancer hinzu:
export const GET = () => {
return new Response("OK", { status: 200 });
};
Konfigurieren Sie Ihre Plattform, /health für Liveness-Probes zu prüfen.