EmDash läuft auf jeder Node.js 22+ Hosting-Plattform. Dieser Leitfaden 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 die Node.js-Bereitstellung:
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",
}),
}),
],
});
Erstellen und Ausführen
-
Erstellen Sie das Projekt:
npm run build -
Starten Sie den Server:
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 die integrierte Standarddatei, falls 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, // Optional 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 Laufzeit-Image kopiert werden muss. Migrationen werden bei der ersten Anfrage nach einer Bereitstellung ausgeführt; der Seed wird nur angewendet, wenn die Datenbank keine Collections hat und das Setup noch nicht abgeschlossen wurde — bestehende Daten werden niemals überschrieben.
Erstellen Sie das Image und führen Sie den Container aus:
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
Eine Docker Compose-Datei verwaltet denselben Container mit einem benannten Volume:
services:
emdash:
build: .
ports:
- "4321:4321"
volumes:
- emdash-data:/app/data
restart: unless-stopped
volumes:
emdash-data:
Starten Sie den Stack im Hintergrund:
docker compose up -d
Umgebungsvariablen
Empfohlen: Verschlüsselungsschlüssel
EMDASH_ENCRYPTION_KEY ist der Schlüssel zur Verschlüsselung von Plugin-Geheimnissen
im Ruhezustand. Der Schlüssel wird beim Start validiert; die Plugin-Geheimnisverschlüsselung verwendet
ihn, sobald sie aktiviert ist. Setzen Sie ihn bei jeder Bereitstellung, damit Geheimnisse geschützt sind
ohne eine spätere Konfigurationsänderung.
Generieren Sie einen Schlüssel und fügen Sie das Ergebnis Ihrer Umgebung hinzu:
npx emdash secrets generate # add the result to your environment
Der Schlüssel wird von Ihnen bereitgestellt und niemals in der Datenbank gespeichert; nur verschlüsselter Chiffretext ist es. Sichern Sie ihn an einem dauerhaften Ort (einem Passwort-Manager, KMS oder dem Geheimnisspeicher Ihres Teams) — ihn zu verlieren bedeutet, jedes damit verschlüsselte Geheimnis zu verlieren.
Optional: Stabile Wertüberschreibungen
EmDash generiert automatisch das Preview-HMAC-Geheimnis und das Kommentator-IP-Hash-Salt und speichert sie bei der ersten Verwendung in der Datenbank. Die unten aufgeführten Umgebungsvariablen fixieren sie auf einen von Ihnen kontrollierten Wert — nützlich, wenn ein separater Prozess ein Geheimnis mit Ihrer Hauptseite teilen muss.
| Variable | Beschreibung |
|---|---|
EMDASH_PREVIEW_SECRET | Überschreibung für das automatisch generierte Preview-HMAC-Geheimnis. |
EMDASH_IP_SALT | Überschreibung für das automatisch generierte Kommentator-IP-Hash-Salt. |
EMDASH_AUTH_SECRET | Optional. Falls gesetzt, wird es als IP-Salt-Quelle verwendet (es sei denn, EMDASH_IP_SALT ist ebenfalls gesetzt, was Vorrang hat), wodurch Kommentator-IP-Hashes für Installationen stabil bleiben, die bereits darauf angewiesen sind. Lassen Sie es für eine neue Bereitstellung 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 erfordert persistenten Festplattenspeicher. Stellen Sie sicher, dass Ihre Hosting-Plattform Folgendes bietet:
- Ein gemountetes Volume oder eine persistente Festplatte
- Schreibzugriff auf das Datenbankverzeichnis
- Backup-Mechanismen für die Datenbankdatei
Integritätsprüfungen
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, um /health für Liveness-Probes zu überprüfen.