Auf Node.js deployen

Auf dieser Seite

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

  1. Projekt bauen:

    npm run build
  2. 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.

VariableBeschreibung
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_SECRETOptional. 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

VariableBeschreibungBeispiel
DATABASE_PATHPfad zur SQLite-Datenbank/data/emdash.db
HOSTServer-Host0.0.0.0
PORTServer-Port4321
S3_ENDPOINTS3-Endpunkt-URLhttps://xxx.r2.cloudflarestorage.com
S3_BUCKETS3-Bucket-Namemy-media-bucket
S3_ACCESS_KEY_IDS3-ZugriffsschlüsselAKIA...
S3_SECRET_ACCESS_KEYS3-Geheimschlüssel...
S3_PUBLIC_URLÖffentliche URL für Medienhttps://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.