fepli
EntwicklerSelbst hostenEnterprise

Konfiguration

fepli wird mit Umgebungsvariablen konfiguriert und nur mit ihnen. Alle drei Container, die das Image ausführen, Web, Worker und Cron, erhalten dieselben Variablen.

Geben Sie dem Web-, dem Worker- und dem Cron-Container genau dieselben Variablen. Der Worker schreibt die E-Mails, und der Cron verschickt die Erinnerungen: Ein Worker mit einer anderen Datenbank oder einem anderen Mailserver als der Web-Container verschickt die falschen Mails oder keine. Am besten verwenden Sie eine env-Datei, die alle drei gemeinsam nutzen, wie in den Beispielen.

Pflichtvariablen

Setzen Sie alle diese Variablen im Produktivbetrieb. Ohne sie startet fepli nicht oder startet mit Standardwerten, die für Sie falsch sind.

fepli läuft nicht, solange APP_SECRET leer ist oder ein Platzhalter, den fepli oder Symfony veröffentlicht hat, etwa ThisTokenIsNotSoSecretChangeIt oder !ChangeMe!. Dasselbe gilt für INTEGRATIONS_ENCRYPTION_KEY, solange er leer ist oder ein von fepli veröffentlichter Schlüssel. Die Werte, die frühere Versionen der lokalen Einrichtung verwendet haben, gelten für beide als veröffentlicht. Anfragen erhalten dann eine Fehlerseite, und Befehle brechen ab, darunter die Datenbankmigration beim Start. Die Meldung im Log nennt die Variable, die Sie setzen müssen. Nur die Umgebungen dev und test sind ausgenommen. Das Image läuft als prod.

  • Name
    APP_SECRET
    Typ
    string
    Beschreibung

    Signiert Sessions, Anmeldelinks und Formular-Tokens. Das Image setzt keinen Wert, deshalb setzt jede Installation ihren eigenen: openssl rand -hex 32. Wenn Sie ihn später ändern, sind alle abgemeldet, und die Links in bereits verschickten E-Mails werden ungültig.

  • Name
    INTEGRATIONS_ENCRYPTION_KEY
    Typ
    string
    Beschreibung

    Verschlüsselt die Zugangsdaten, die Admins im Admin-Panel hinterlegen, etwa die Zugangsdaten eines Zahlungsanbieters. Das Image lässt ihn leer, deshalb setzt jede Installation ihren eigenen. Erzeugen Sie ihn einmal mit openssl rand -base64 32 und ändern Sie ihn nie: Zugangsdaten, die mit einem anderen Schlüssel gespeichert wurden, auch mit einem leeren, lassen sich nicht mehr lesen, und Admins müssen sie erneut eingeben.

  • Name
    DATABASE_URL
    Typ
    URL
    Beschreibung

    Die MariaDB-Datenbank, z. B. mysql://fepli:…@mariadb:3306/fepli. Kodieren Sie Sonderzeichen im Passwort als URL (@ wird zu %40).

  • Name
    DATABASE_SERVER_VERSION
    Typ
    string
    Beschreibung

    Die Version Ihres MariaDB-Servers, z. B. mariadb-12.3.0. Sie muss zum Server passen, den Sie betreiben, sonst erzeugt die Datenbankschicht SQL für die falsche Version. Der Standard ist mariadb-11.2.4.

  • Name
    TRUSTED_HOSTS
    Typ
    regex
    Beschreibung

    Alle Hosts, unter denen fepli antwortet, als ein regulärer Ausdruck, z. B. ^(www\.)?example\.fepli\.eu$. Verbinden Sie bei mehreren Mandanten deren Hosts mit | und fügen Sie die Plattform-Konsole hinzu. Der Produktivbetrieb muss die Variable setzen: fepli baut die Links in seinen E-Mails aus dem Host, den eine Anfrage nennt, und ein leerer Wert lässt jeden Host zu.

  • Name
    APP_BASE_URL
    Typ
    URL
    Beschreibung

    Schema und Ausweich-Host für Links in E-Mails, z. B. https://example.fepli.eu. Links in E-Mails führen zu den Domains des Mandanten, um den es geht, egal wo die E-Mail verschickt wurde. Das beschreibt der Abschnitt Domains. Schema und Host von APP_BASE_URL erhält ein Link nur, wenn fepli dafür keinen Mandanten kennt oder der Mandant keine passende Domain hat.

  • Name
    MAILER_DSN
    Typ
    DSN
    Beschreibung

    Der Server für ausgehende Mails, z. B. smtp://user:password@smtp.example.org:587. Verwenden Sie smtps:// für Port 465. Das Image enthält keinen lokalen Mailserver, deshalb funktioniert der Standardwert nicht.

  • Name
    ADMIN_EMAIL
    Typ
    email
    Beschreibung

    Der Envelope-Absender jeder E-Mail, an den Bounces gehen, und die Adresse des CMS, z. B. ferienpass@example.fepli.eu. Ihr Mailserver muss für deren Domain senden dürfen (SPF, DKIM). Das Image setzt keinen Wert: Ohne ihn haben E-Mails keinen eigenen Envelope-Absender, und Bounces gehen an die Adresse, von der sie verschickt wurden. Absendername und Antwortadresse, die Familien sehen, legt jeder Mandant in seinem eigenen Admin-Panel fest.

Dienste

Wie fepli Redis und, falls Sie es betreiben, Varnish erreicht. fepli nutzt Redis für vier Zwecke, jeweils in einem eigenen Datenbankindex. Die folgenden Werte setzen voraus, dass die Dienste redis und varnish heißen, wie in den Beispielen.

VariableBeispielWofür sie dient
REDIS_URLredis://redis:6379/1die Caches, die Web- und Worker-Container teilen: die Einstellungen der Mandanten, die Übersetzungen von DeepL, die Ergebnisse von KI-Aufträgen
LOCK_DSNredis://redis:6379/2Sperren, damit z. B. zwei Familien nicht gleichzeitig den letzten Platz buchen. Der Standard, flock, wirkt nur innerhalb eines Containers.
SESSION_DSNredis://redis:6379/3die Sessions aller angemeldeten Personen. Ist die Variable leer, liegen sie in Dateien im Web-Container: Das genügt nur für einen Web-Container, und ein Update meldet alle ab. Setzen Sie Redis, um Sessions über Updates hinweg zu behalten und mehr als einen Web-Container zu betreiben.
MESSENGER_TRANSPORT_DSNredis://redis:6379/messagesdie Warteschlange der Hintergrundaufträge, die der Worker liest. Der Datenbankindex gehört in den Query-String (?dbindex=0), nicht in den Pfad.
VARNISH_HOSTvarnish:80wohin fepli Purge-Anfragen sendet, wenn sich Daten ändern. Leer lassen, um ohne Varnish zu laufen: fepli sendet dann keine. Der Standard ist varnish:80, die Variable wegzulassen ist also etwas anderes, als sie leer zu setzen.
VARNISH_BASE_URLhttp://varnishdie Basis-URL dieser Anfragen. Das ist der Standard. Ohne Varnish spielt sie keine Rolle.
VARNISH_PURGE_TOKENdie Ausgabe von openssl rand -hex 32optional: das Geheimnis, das Varnish und fepli für Purges teilen. fepli sendet es mit jeder Purge-Anfrage im Header X-Purge-Token. Hat Varnish in seiner eigenen Umgebung einen Wert, akzeptiert es Purges nur aus dem privaten Netz und nur mit diesem Wert. Ohne Wert darf jede Anfrage aus dem privaten Netz purgen. Geben Sie deshalb Varnish und dem Web-, dem Worker- und dem Cron-Container denselben Wert. Steht das Token nur bei Varnish, scheitert jeder Purge mit 405.

Redis muss seine Daten auf der Platte halten und darf nie Schlüssel verdrängen: Ein verdrängter Auftrag ist eine E-Mail, die nie hinausgeht, und eine verdrängte Session ist eine Person, die mitten in der Anmeldung abgemeldet wird. Starten Sie es mit --appendonly yes --maxmemory-policy noeviction.

Ohne Redis und ohne Worker

Eine Demo oder ein Test kann allein mit dem Web-Container und MariaDB laufen, mit diesen Werten:

VariableWertWas sich ändert
REDIS_URLleerdie gemeinsamen Caches sind Dateien im Web-Container. fepli liest das beim Start des Containers, nicht bei jeder Anfrage.
MESSENGER_TRANSPORT_DSNsync://es gibt keine Warteschlange: Jeder Auftrag läuft in der Anfrage, die ihn ausgelöst hat. Diese Anfrage wartet auf die E-Mail, den Export oder die Zuteilung und zeigt den Fehler, wenn der Auftrag scheitert. Nichts wird wiederholt.
LOCK_DSNflockder Standard: Sperren gelten innerhalb des einen Containers
SESSION_DSNleerder Standard: Sessions sind Dateien im Container, und ein Update meldet alle ab
VARNISH_HOSTleerkeine Purge-Anfragen

Jede dieser Einstellungen funktioniert nur mit einem Web-Container. Starten Sie damit keinen Worker: Er hätte nichts zu lesen. Zeitgesteuerte Aufträge brauchen weiterhin den Cron, sonst laufen sie nicht.

Vertrauenswürdige Proxys

  • Name
    TRUSTED_PROXIES
    Typ
    string
    Beschreibung

    Die Adressen, von denen sich die Proxys vor fepli verbinden, Varnish und Ihr TLS-Proxy, als kommagetrennte Liste von Adressen und Bereichen. fepli entnimmt die Adresse des Besuchers aus X-Forwarded-For und das Schema aus X-Forwarded-Proto nur bei Anfragen von diesen Adressen. Der Standard, 127.0.0.1,::1,172.16.0.0/12,192.168.0.0/16, deckt die Netze ab, die Docker einem Compose-Projekt gibt. Setzen Sie die Variable, wenn sich Ihre Proxys von anderswo verbinden, z. B. 10.0.0.0/8 auf Docker Swarm oder Kubernetes. Leer vertraut keinem Proxy.

Installationen mit mehreren Mandanten

  • Name
    FEPLI_PLATFORM_HOST
    Typ
    host
    Beschreibung

    Die Domain der Plattform-Konsole, z. B. platform.example.fepli.eu. Lassen Sie die Variable bei einer Installation mit einem Mandanten ungesetzt. Tragen Sie die Domain auch in TRUSTED_HOSTS ein.

  • Name
    FEPLI_PUBLIC_SUFFIX
    Typ
    domain
    Beschreibung

    Die Domain, unter der Sie Adressen vergeben, z. B. example.fepli.eu. Mit ihr schlägt Mandant anlegen <slug>.example.fepli.eu als Adresse eines neuen Mandanten vor. Das ist nur ein Vorschlag: DNS, Zertifikat und TRUSTED_HOSTS richten weiterhin Sie ein. Ohne die Variable gibt es keinen Vorschlag.

Objektspeicher

fepli legt, was Personen hochladen und was es exportiert, auf der lokalen Platte ab, im Volume storage. Nennen Sie einen Bucket in einem S3-kompatiblen Objektspeicher, wandert dieser Teil dorthin. Ohne diese Variablen oder mit leeren Werten bleibt alles auf der Platte: Eine Installation ohne Objektspeicher braucht dafür keine Konfiguration.

  • Name
    S3_PERMANENT_BUCKET
    Typ
    string
    Beschreibung

    Der Bucket für das, was fepli behält, bis es selbst es löscht: Anhänge, Logo und Anmeldebild jedes Mandanten, die Dateien von E-Mail-Antworten und Anmeldungen und die Dateien, die an einer Rundmail hängen. Geben Sie ihm keine Ablaufregel und nehmen Sie ihn in Ihre Backups auf.

  • Name
    S3_UPLOADS_BUCKET
    Typ
    string
    Beschreibung

    Optional ein eigener Bucket für das, was Familien senden: die Dateien von E-Mail-Antworten und Anmeldungen. Ohne ihn liegen sie im permanenten Bucket. fepli löscht diese Dateien mit ihrer Anmeldung oder Unterhaltung und versieht jede mit dem Tag fepli-retention=default; filtern Sie eine eigene Ablaufregel nach diesem Tag. Teil Ihrer Backups.

  • Name
    S3_EPHEMERAL_BUCKET
    Typ
    string
    Beschreibung

    Der Bucket für Exporte, die fepli neu erzeugt, wenn jemand sie anfordert. Geben Sie ihm eine Regel, die Objekte nach 7 Tagen ablaufen lässt: fepli löscht sie nur selbst, solange sie auf der Platte liegen.

  • Name
    S3_RETENTION_BUCKET
    Typ
    string
    Beschreibung

    Der Bucket für die Unterlagen, die fepli vorlegen können muss: jeden Beleg wie ausgestellt und den Nachweis jeder Einwilligung einer Familie mit ihrem Widerruf. fepli schreibt jedes Objekt einmal, ändert es nie, sperrt es bis zum Ende seiner Frist und löscht es danach. Legen Sie den Bucket mit eingeschaltetem Object Lock und ohne Standard-Aufbewahrung an, dazu mit einer Regel, die nicht aktuelle Versionen entfernt.

  • Name
    AWS_S3_ENDPOINT
    Typ
    URL
    Beschreibung

    Die URL Ihres Objektspeichers, z. B. https://s3.example.fepli.eu.

  • Name
    AWS_S3_REGION
    Typ
    string
    Beschreibung

    Seine Region.

  • Name
    AWS_S3_ACCESS_ID
    Typ
    string
    Beschreibung

    Zusammen mit AWS_S3_ACCESS_SECRET ein Schlüssel, der in den Buckets lesen, schreiben und löschen sowie im Retention-Bucket das Object Lock einer Datei setzen und lesen darf.

Jede Bucket-Variable entscheidet für sich: Ist nur S3_PERMANENT_BUCKET gesetzt, bleiben Exporte auf der Platte. Was wohin kommt:

WasBucketSchlüssel
Anhänge von Angebotenpermanent<tenant>/attachments/…
Logo und Anmeldebild eines Mandantenpermanent<tenant>/branding/…
Anhänge von E-Mail-Antworten, Dateien, die Familien mit einer Anmeldung sendenUploads, sonst permanent<tenant>/inbound_attachments/…
Dateien, die an einer Rundmail hängenpermanent<tenant>/mailing/…
Exporteephemeral<tenant>/export/…
jeder Beleg wie ausgestelltRetention<tenant>/receipts/…
der Nachweis jeder Einwilligung und ihres WiderrufsRetention<tenant>/consents/…
Bilder von Angeboten, Logos von Veranstalter:innenkeinerimmer auf der Platte, storage/<tenant>/media/… und …/logos/…: fepli skaliert Bilder nur aus lokalen Dateien

<tenant> ist in einer Installation mit mehreren Mandanten die UUID des Mandanten in Base58 (bin/console ferienpass:tenant:list zeigt sie) und in einer Installation mit einem Mandanten der Ordner der App selbst. Auf der Platte sind die Schlüssel dieselben, unter storage/: storage/<tenant>/attachments/…. Eine Installation, die von einer Version ohne Mandantenordner aktualisiert wurde, findet ihre älteren Dateien erst, wenn sie in den Ordner verschoben sind: storage/attachments/x.pdf nach storage/<tenant>/attachments/x.pdf, und so für jeden Speicher.

Wenn Sie einen Bucket nennen, verschiebt fepli keine Dateien, die schon auf der Platte liegen. Kopieren Sie sie zuerst, das Verzeichnis jedes Mandanten an seine Schlüssel im Bucket (storage/<tenant>/attachments/ nach <tenant>/attachments/ im permanenten Bucket), und setzen Sie die Variable danach: fepli sucht eine Datei nur dort, wohin ihre Variable zeigt. Exporte brauchen keine Kopie, fepli erzeugt sie neu.

Optionale Variablen

Funktionen, die ausgeschaltet bleiben, bis Sie ihre Variable setzen. Schlüssel, die Sie hier setzen, gelten für jeden Mandanten. Bei mehreren davon können Admins auch eigene im Admin-Panel hinterlegen, pro Mandant, unter Einstellungen → Integrationen. Ein Schlüssel, den Sie hier setzen, hat Vorrang vor dem im Admin-Panel.

VariableSchaltet ein
MAPBOX_TOKENKarten: den Treffpunkt auf der Seite eines Angebots, die Adresssuche, die Ortsauswahl im Admin-Panel
PMPAYMENT_AGS, PMPAYMENT_PROCEDURE, PMPAYMENT_SALTOnline-Zahlung über pmPayment, mit einem Konto für die ganze Installation
BREVO_API_KEYTextnachrichten über Brevo. BREVO_API_KEY registriert auch den Webhook für Zustellberichte. fepli hält sie nur für Mandanten fest, die die App Versand nachverfolgen einschalten.
INBOUND_SECRET, INBOUND_DOMAINE-Mail-Antworten: Antworten auf eine Nachricht aus dem Admin-Panel landen in deren Unterhaltung. INBOUND_DOMAIN nur bei einer Installation mit einem Mandanten; bei mehreren Mandanten trägt jeder seine Antwortdomain im Admin-Panel ein, in der App Antworten per E-Mail.
OPENAI_API_KEYdie KI-Funktionen des Admin-Panels, etwa das Erzeugen von Angebotsbildern
DEEPL_API_KEYmaschinelle Übersetzung über DeepL
CORS_ALLOW_ORIGINAufrufe der REST API aus den Browsern anderer Websites, als regulärer Ausdruck ihrer Origins. Standardmäßig darf nur localhost.
STATUS_HEARTBEAT_URLeine stündliche Anfrage des Crons an diese URL, für einen Uptime-Monitor, der Alarm schlägt, wenn der Cron stehen bleibt

Feinabstimmung

VariableStandardWas sie bewirkt
FRANKENPHP_MAX_THREADS6wie viele Anfragen ein Web-Container gleichzeitig bearbeitet. Jede kann bis zu 512 MB Arbeitsspeicher belegen.
PORT80der Port, auf dem der Web-Container lauscht
MIGRATE_ON_START1ob der Web-Container die Datenbank beim Start migriert. Setzen Sie 0, um app:migrate selbst auszuführen.
RELYING_PARTY_NAMEfeplider Name, den Browser anzeigen, wenn ein Admin einen Passkey anlegt

Vom Image gesetzt

Lassen Sie APP_ENV=prod und APP_DEBUG=0 so, wie das Image sie setzt. Der Debug-Modus zeigt jedem Besucher Interna.

Der Worker erhält eine Variable mehr als die anderen: IS_WORKER=1.

Ein vollständiges Beispiel

fepli.env

# openssl rand -hex 32
APP_SECRET=9f1c…
# openssl rand -base64 32, und nie ändern
INTEGRATIONS_ENCRYPTION_KEY=Qm3v…

DATABASE_URL=mysql://fepli:…@mariadb:3306/fepli
DATABASE_SERVER_VERSION=mariadb-12.3.0

REDIS_URL=redis://redis:6379/1
LOCK_DSN=redis://redis:6379/2
SESSION_DSN=redis://redis:6379/3
MESSENGER_TRANSPORT_DSN=redis://redis:6379/messages

# Mit Varnish. Ohne: VARNISH_HOST=
VARNISH_HOST=varnish:80
VARNISH_BASE_URL=http://varnish
# openssl rand -hex 32; Varnish erhält denselben Wert
VARNISH_PURGE_TOKEN=5b0e…

# Nur, wenn sich Ihre Proxys von außerhalb der Compose-Netze von Docker verbinden
#TRUSTED_PROXIES=10.0.0.0/8

TRUSTED_HOSTS='^(www\.)?example\.fepli\.eu$'
APP_BASE_URL=https://example.fepli.eu

MAILER_DSN=smtp://ferienpass%40example.fepli.eu:…@smtp.example.fepli.eu:587
ADMIN_EMAIL=ferienpass@example.fepli.eu

# Nur mit Objektspeicher. Ohne ihn bleiben Uploads im Volume storage
#S3_PERMANENT_BUCKET=fepli-permanent
#S3_UPLOADS_BUCKET=fepli-uploads
#S3_EPHEMERAL_BUCKET=fepli-ephemeral
#S3_RETENTION_BUCKET=fepli-retention
#AWS_S3_ENDPOINT=https://s3.example.fepli.eu
#AWS_S3_REGION=eu-central
#AWS_S3_ACCESS_ID=…
#AWS_S3_ACCESS_SECRET=…

Docker Compose liest eine solche Datei mit env_file:. Setzen Sie reguläre Ausdrücke in einfache Anführungszeichen, damit Compose das $ und die Backslashes darin unverändert lässt. Die Datei enthält die Geheimnisse: Machen Sie sie nur für sich selbst lesbar (chmod 600).

War diese Seite hilfreich?