skrift-app (Konfigurator): - Datei-Produkte (Unterschriftenservice): Mehrfach-Upload (PDF/Word/Excel), komplett preisfrei (keine Preisleiste/Aufpreise/Kostenübersicht/Zahlung) - Extern-/Etsy-Modus (?extern=1&versand&kuvert&beschriftung&menge): vom Betreiber vorkonfiguriert, Kunde füllt nur Empfänger/Text/Rechnungsdaten/Übersicht, keine Preise/Zahlung; Menge greift immer (auch >25 / ohne Empfänger); eigener Danke-Text - Adressmodell: zwei feste Adressen (Rechnung/Lieferung) ohne Namen statt Dropdown; Auto-Vorbefüllung; Lieferadresse nur bei Sammelversand; abweichende Lieferadresse per Default aus; Pflichtfelder erzwungen - Platzhalter-Tabelle immer im Text-Schritt (auch Sammelversand ohne Kuvert) + Excel; Tabellen-Eingabe nur bis 25, „Ab 26"-Hinweis entfernt - Stammdaten: zwei Adressblöcke + Erfolgsmeldung Directus/Backend: - Signatur-Endpunkte /signature-preview + /signature-render (Proxy zum signature-service, Marker + Konto-Offsets), Modul-Reiter „Unterschriften" (aus Auftrag oder manuell), Tabelle über volle Breite - Generierung läuft bei jeder Bestellung; Kuverts immer (Datei-Produkt: nur Kuvert, DIN Lang als Default); source_files am Auftrag - Produktions-Board: „Dateien"-Button (hochgeladene Originale, keine SVGs) - Alt-Mail-Login: Zweit-Mails melden im selben Konto an (skrift-auth) - Team-Mails schlank + konfigurierbar (email_settings.team_email) für Bestellung/Muster/Anfrage; keine Bestellbestätigung bei Datei-Produkten, separate Vorlagen unterschriften_eingang/extern_eingang - Rechnungsadresse wird ins Konto übernommen, wenn dort noch keine steht - Kunden-Policy: directus_files create/read (Upload); Bootstrap: users billing_address/shipping_address/alt_emails, orders.source_files/source=extern, signatures marker/offsets, unterschriftenservice input_mode=datei/pricing_mode=formel Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
109 lines
3.6 KiB
YAML
109 lines
3.6 KiB
YAML
# Directus + Postgres — Daten-/Auth-/Admin-Schicht für Skrift.
|
||
#
|
||
# Hinter dem Nginx Proxy Manager (kein Host-Port; NPM proxyt intern per container_name).
|
||
# Im NPM als Proxy Host anlegen:
|
||
# Domain Names : admin.skrift.de (PUBLIC_URL in .env muss dazu passen)
|
||
# Scheme : http
|
||
# Forward Hostname : skrift-directus
|
||
# Forward Port : 8055
|
||
# SSL : Let's-Encrypt-Zertifikat aktivieren
|
||
#
|
||
# Start: cp .env.example .env → Werte setzen → docker compose up -d
|
||
|
||
services:
|
||
database:
|
||
image: postgres:16-alpine
|
||
container_name: skrift-directus-db
|
||
restart: unless-stopped
|
||
volumes:
|
||
- directus-db:/var/lib/postgresql/data
|
||
environment:
|
||
POSTGRES_USER: ${DB_USER}
|
||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||
POSTGRES_DB: ${DB_DATABASE}
|
||
healthcheck:
|
||
test: ["CMD", "pg_isready", "-U", "${DB_USER}", "-d", "${DB_DATABASE}"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
networks:
|
||
- internal
|
||
|
||
directus:
|
||
image: directus/directus:11
|
||
container_name: skrift-directus
|
||
restart: unless-stopped
|
||
depends_on:
|
||
database:
|
||
condition: service_healthy
|
||
volumes:
|
||
- directus-uploads:/directus/uploads
|
||
# Bind-Mount: Extensions kommen aus dem Repo-Ordner ./extensions
|
||
- ./extensions:/directus/extensions
|
||
# Generierte Auftragsdateien read-only einblenden (gleicher Ordner wie
|
||
# das Backend beschreibt / SFTP-Ziel) – für Direktzugriff statt Kopie.
|
||
- /var/skrift-output:/var/skrift-output:ro
|
||
environment:
|
||
SECRET: ${DIRECTUS_SECRET}
|
||
|
||
DB_CLIENT: pg
|
||
DB_HOST: database
|
||
DB_PORT: 5432
|
||
DB_DATABASE: ${DB_DATABASE}
|
||
DB_USER: ${DB_USER}
|
||
DB_PASSWORD: ${DB_PASSWORD}
|
||
|
||
# Erster Admin – wird nur beim allerersten Start angelegt
|
||
ADMIN_EMAIL: ${ADMIN_EMAIL}
|
||
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
||
|
||
PUBLIC_URL: ${PUBLIC_URL}
|
||
|
||
# CORS für das Frontend (Portal/Konfigurator)
|
||
CORS_ENABLED: "true"
|
||
CORS_ORIGIN: ${CORS_ORIGIN}
|
||
|
||
# E-Mail: für passwortlosen Login-Code + Benachrichtigungen (Flows)
|
||
EMAIL_FROM: ${EMAIL_FROM}
|
||
EMAIL_TRANSPORT: smtp
|
||
EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST}
|
||
EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT}
|
||
EMAIL_SMTP_USER: ${EMAIL_SMTP_USER}
|
||
EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD}
|
||
EMAIL_SMTP_SECURE: ${EMAIL_SMTP_SECURE}
|
||
|
||
# Skrift-Backend (SVG-Generierung: Vorschau + finaler Auftrag).
|
||
# SKRIFT_BACKEND_TOKEN MUSS dem API_TOKEN des Backends entsprechen,
|
||
# sonst antwortet das Backend mit 401.
|
||
SKRIFT_BACKEND_URL: ${SKRIFT_BACKEND_URL:-http://skrift-backend:4000}
|
||
SKRIFT_BACKEND_TOKEN: ${SKRIFT_BACKEND_TOKEN}
|
||
SKRIFT_PREVIEW_LIMIT: ${SKRIFT_PREVIEW_LIMIT:-10}
|
||
SKRIFT_TEAM_EMAIL: ${SKRIFT_TEAM_EMAIL:-hello@skrift.de}
|
||
|
||
# Shared Secret für den WordPress-Webhook (JetFormBuilder → /skrift-orders/inbound/*).
|
||
# Muss identisch als ?token=... in der Webhook-URL stehen.
|
||
SKRIFT_WEBHOOK_TOKEN: ${SKRIFT_WEBHOOK_TOKEN}
|
||
|
||
# Signatur-Plotter-Service (Vorschau/Render im Unterschriftenservice-Modul).
|
||
SKRIFT_SIGN_URL: ${SKRIFT_SIGN_URL:-http://skrift-signature-service:8000}
|
||
|
||
# PayPal – server-seitige Zahlungsprüfung (Secret liegt NUR hier, nie im Frontend)
|
||
PAYPAL_CLIENT_ID: ${PAYPAL_CLIENT_ID}
|
||
PAYPAL_CLIENT_SECRET: ${PAYPAL_CLIENT_SECRET}
|
||
PAYPAL_ENV: ${PAYPAL_ENV:-sandbox}
|
||
expose:
|
||
- "8055"
|
||
networks:
|
||
- internal
|
||
- npm
|
||
|
||
volumes:
|
||
directus-db:
|
||
directus-uploads:
|
||
|
||
networks:
|
||
internal:
|
||
npm:
|
||
name: nginx-proxy-manager_default
|
||
external: true
|