EmDash läuft auf jeder Node.js-22+-Hosting-Plattform. Diese Anleitung beschreibt die Bereitstellung bei gängigen Anbietern mit SQLite sowie lokalem oder S3-kompatiblem Speicher.
Voraussetzungen
- Node.js v22.12.0 oder höher
- Ein Node.js-Hosting-Anbieter oder ein VPS
Konfiguration
Konfiguriere EmDash für die Bereitstellung unter 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",
}),
}),
],
});
Erstellen und Ausführen
- Projekt bauen:
npm run build
-
Datenbank initialisieren:
npx emdash init --database ./data/emdash.db -
Server starten:
node ./dist/server/entry.mjs
Der Server läuft standardmäßig unter http://localhost:4321.
Speicher in der Produktion
In der Produktion solltest du S3-kompatiblen Speicher statt des lokalen Dateisystems verwenden:
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üge eine .dockerignore hinzu, um den Build-Kontext klein zu halten:
node_modules
dist
.git
Erstelle eine 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 ./
COPY --from=builder /app/seed ./seed
COPY --from=builder /app/astro.config.mjs ./
RUN mkdir -p data
ENV HOST=0.0.0.0
ENV PORT=4321
EXPOSE 4321
CMD ["sh", "-c", "npx emdash init && node ./dist/server/entry.mjs"]
Erstellen und ausführen:
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
Oder verwende Docker Compose:
services:
emdash:
build: .
ports:
- "4321:4321"
volumes:
- emdash-data:/app/data
restart: unless-stopped
volumes:
emdash-data:
docker compose up -d
Umgebungsvariablen
Für die Produktion erforderlich
| Variable | Beschreibung |
|---|---|
EMDASH_AUTH_SECRET | Signiert Sitzungs-Cookies und Auth-Tokens. Erzeugen mit npx emdash auth secret. |
EMDASH_PREVIEW_SECRET | Signiert Vorschau-URLs für Entwürfe. Erzeugen mit npx emdash auth secret. |
Datenbank und Speicher
| Variable | Beschreibung | Beispiel |
|---|---|---|
EMDASH_SITE_URL | Öffentlicher, browserseitiger Origin (Fallback auf SITE_URL) | https://example.com |
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-Zugangsschlüssel | AKIA... |
S3_SECRET_ACCESS_KEY | S3-Geheimschlüssel | ... |
S3_PUBLIC_URL | Öffentliche Medien-URL | https://cdn.example.com |
Persistenter Speicher
SQLite benötigt persistenten Festplattenspeicher. Stelle sicher, dass deine Hosting-Plattform Folgendes bietet:
- Ein eingebundenes Volume oder eine persistente Festplatte
- Schreibrechte für das Datenbankverzeichnis
- Backup-Mechanismen für die Datenbankdatei
Health Checks
Füge einen Health-Check-Endpunkt für Load Balancer hinzu:
export const GET = () => {
return new Response("OK", { status: 200 });
};
Konfiguriere deine Plattform so, dass sie /health für Liveness-Probes prüft.