Diese Anleitung beschreibt die Installation von Formbricks als Portainer-Stack in einer bestehenden Umgebung mit:
form.it-service-ahd.deform-file.it-service-ahd.de/volume1/docker/formbricks/Die Anleitung ist bewusst für eine bestehende NPM-Umgebung aufgebaut. Formbricks selbst läuft intern auf einem freien Host-Port, während NPM die Veröffentlichung nach außen übernimmt.
In diesem Aufbau werden folgende Container verwendet:
https://form.it-service-ahd.de → Formbricks über NPMhttps://form-file.it-service-ahd.de → MinIO S3 API über NPMVor dem Start sollten folgende Punkte erfüllt sein:
form.it-service-ahd.deform-file.it-service-ahd.de/volume1/docker/ vorhanden.Hinweis: Da NPM bereits die Ports 80 und 443 nutzt, darf der Formbricks-Stack diese Ports nicht selbst belegen.
Lege die benötigten Ordner auf der Synology an.
mkdir -p /volume1/docker/formbricks/postgres
mkdir -p /volume1/docker/formbricks/redis
mkdir -p /volume1/docker/formbricks/minio
mkdir -p /volume1/docker/formbricks/uploads
Die Struktur sollte danach so aussehen:
/volume1/docker/formbricks/
├── postgres/
├── redis/
├── minio/
└── uploads/
Vor dem Stack-Deploy werden mehrere Kennwörter und Secrets benötigt.
Lege ein sicheres Passwort für PostgreSQL fest.
Beispiel:
POSTGRES_PASSWORD=<dein_sicheres_db_passwort>
Lege Benutzername und Passwort für MinIO fest.
Beispiel:
MINIO_ROOT_USER=<dein_minio_benutzer>
MINIO_ROOT_PASSWORD=<dein_minio_passwort>
Die folgenden drei Werte solltest du per Shell generieren:
openssl rand -hex 32
Diesen Befehl führst du dreimal aus und verwendest die Ergebnisse für:
NEXTAUTH_SECRETENCRYPTION_KEYCRON_SECRETBeispiel:
NEXTAUTH_SECRET=<zufallswert_1>
ENCRYPTION_KEY=<zufallswert_2>
CRON_SECRET=<zufallswert_3>
Öffne in Portainer:
Stacks → Add stack
Empfohlener Name:
formbricks
Füge anschließend folgenden Stack ein.
version: "3.9"
services:
formbricks-db:
image: postgres:15-alpine
container_name: formbricks-db
restart: unless-stopped
environment:
POSTGRES_DB: formbricks
POSTGRES_USER: formbricks
POSTGRES_PASSWORD: <DB_PASSWORT_EINTRAGEN>
volumes:
- /volume1/docker/formbricks/postgres:/var/lib/postgresql/data
formbricks-redis:
image: redis:7-alpine
container_name: formbricks-redis
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
volumes:
- /volume1/docker/formbricks/redis:/data
formbricks-minio:
image: minio/minio:latest
container_name: formbricks-minio
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: <MINIO_BENUTZER_EINTRAGEN>
MINIO_ROOT_PASSWORD: <MINIO_PASSWORT_EINTRAGEN>
volumes:
- /volume1/docker/formbricks/minio:/data
ports:
- "9100:9000"
- "9101:9001"
formbricks-minio-init:
image: minio/mc:latest
container_name: formbricks-minio-init
depends_on:
- formbricks-minio
entrypoint:
- /bin/sh
- -c
- |
until mc alias set local http://formbricks-minio:9000 <MINIO_BENUTZER_EINTRAGEN> <MINIO_PASSWORT_EINTRAGEN>; do
echo "Warte auf MinIO..."
sleep 2
done
mc mb --ignore-existing local/formbricks-uploads
mc anonymous set download local/formbricks-uploads
cat > /tmp/cors.xml <<'XML'
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://form.it-service-ahd.de</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>
XML
mc cors set local/formbricks-uploads /tmp/cors.xml
echo "Bucket und CORS wurden eingerichtet."
formbricks:
image: ghcr.io/formbricks/formbricks:latest
container_name: formbricks
restart: unless-stopped
depends_on:
- formbricks-db
- formbricks-redis
- formbricks-minio
ports:
- "3100:3000"
environment:
WEBAPP_URL: https://form.it-service-ahd.de
NEXTAUTH_URL: https://form.it-service-ahd.de
DATABASE_URL: postgresql://formbricks:<DB_PASSWORT_EINTRAGEN>@formbricks-db:5432/formbricks?schema=public
REDIS_URL: redis://formbricks-redis:6379
NEXTAUTH_SECRET: <NEXTAUTH_SECRET_EINTRAGEN>
ENCRYPTION_KEY: <ENCRYPTION_KEY_EINTRAGEN>
CRON_SECRET: <CRON_SECRET_EINTRAGEN>
S3_ACCESS_KEY: <MINIO_BENUTZER_EINTRAGEN>
S3_SECRET_KEY: <MINIO_PASSWORT_EINTRAGEN>
S3_REGION: us-east-1
S3_BUCKET_NAME: formbricks-uploads
S3_ENDPOINT_URL: https://form-file.it-service-ahd.de
S3_FORCE_PATH_STYLE: "1"
LOG_LEVEL: info
TELEMETRY_DISABLED: "1"
# Für den Erststart ohne Mailserver möglich.
# Sobald SMTP eingerichtet ist, diese beiden Zeilen entfernen.
EMAIL_VERIFICATION_DISABLED: "1"
PASSWORD_RESET_DISABLED: "1"
volumes:
- /volume1/docker/formbricks/uploads:/home/nextjs/apps/web/uploads
Vor dem Deploy müssen alle Platzhalter ersetzt werden:
<DB_PASSWORT_EINTRAGEN><MINIO_BENUTZER_EINTRAGEN><MINIO_PASSWORT_EINTRAGEN><NEXTAUTH_SECRET_EINTRAGEN><ENCRYPTION_KEY_EINTRAGEN><CRON_SECRET_EINTRAGEN>Achte darauf, dass du überall dieselben Werte konsistent verwendest.
Klicke in Portainer auf:
Deploy the stack
Beim ersten Start lädt Docker alle benötigten Images herunter. Anschließend sollten folgende Container sichtbar sein:
formbricks-dbformbricks-redisformbricks-minioformbricks-minio-initformbricksHinweis: Der Container
formbricks-minio-initdarf nach erfolgreicher Initialisierung beendet sein. Das ist in diesem Fall normal.
Nun werden in NPM zwei Proxy Hosts eingerichtet.
Erstelle in NPM einen neuen Proxy Host mit folgenden Werten:
form.it-service-ahd.dehttp3100proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Erstelle einen zweiten Proxy Host mit folgenden Werten:
form-file.it-service-ahd.dehttp9100client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Wichtig: Diese Einstellungen sind für größere Uploads und sauberes Streaming von MinIO hinter einem Reverse Proxy sinnvoll.
Im Stack ist zusätzlich Port 9101 für die MinIO-Konsole freigegeben. Für den reinen Betrieb von Formbricks ist das nicht zwingend notwendig.
Wenn du die MinIO-Konsole von außen erreichbar machen möchtest, solltest du eine eigene zusätzliche Subdomain verwenden, zum Beispiel:
form-file-console.it-service-ahd.de
Im Normalfall reicht es jedoch aus, nur die S3-API über form-file.it-service-ahd.de bereitzustellen.
Sobald beide Proxy Hosts aktiv sind und gültige Zertifikate besitzen, rufe im Browser auf:
https://form.it-service-ahd.de
Beim ersten Aufruf erscheint der Einrichtungsassistent von Formbricks. Dort legst du deinen ersten Benutzer an.
Nach dem ersten Login solltest du die Installation testen.
Wenn diese Punkte funktionieren, sind Formbricks, MinIO, Proxy und CORS in der Regel korrekt eingerichtet.
Falls die Oberfläche nicht erreichbar ist oder Uploads fehlschlagen, prüfe zuerst die Logs in Portainer.
formbricksformbricks-minioformbricks-dbformbricks-redisPrüfe insbesondere:
Prüfe insbesondere:
form-file.it-service-ahd.de zeigt korrekt auf NPMform-file.it-service-ahd.de ist gültigMögliche Ursachen:
Prüfung:
formbricks?3100?form.it-service-ahd.de korrekt auf?Mögliche Ursachen:
WEBAPP_URL und NEXTAUTH_URL stimmen nicht mit der echten HTTPS-Domain übereinLösung:
https://form.it-service-ahd.de gesetzt seinMögliche Ursachen:
S3_ENDPOINT_URL ist falschform-file.it-service-ahd.de fehltLösung:
S3_ENDPOINT_URL muss https://form-file.it-service-ahd.de seinformbricks und formbricks-minio prüfenMögliche Ursache:
formbricks-minio-init konnte den Bucket nicht anlegenLösung:
formbricks-minio-init prüfenVerwendeter Bucket-Name:
formbricks-uploads
In dieser Anleitung wird der Bucket für Downloads bewusst pragmatisch konfiguriert, damit Projektlogos, Bilder und Uploads zuverlässig funktionieren.
Für besonders restriktive Produktionsumgebungen solltest du die Bucket-Policies später noch feiner absichern und nur die tatsächlich benötigten Pfade öffentlich lesbar machen.
Vor jedem Update empfiehlt sich ein Backup des gesamten Ordners:
/volume1/docker/formbricks/
Empfehlung: Nach dem ersten erfolgreichen Betrieb kannst du statt
latestmit einem festen getesteten Release-Tag arbeiten.
Für ein vollständiges Backup sollten folgende Verzeichnisse gesichert werden:
/volume1/docker/formbricks/postgres
/volume1/docker/formbricks/redis
/volume1/docker/formbricks/minio
/volume1/docker/formbricks/uploads
Für eine Wiederherstellung gehst du grundsätzlich wie folgt vor:
Für einen stabilen Betrieb empfiehlt sich:
Mit dieser Konfiguration läuft Formbricks:
/volume1/docker/formbricks/form.it-service-ahd.deform-file.it-service-ahd.deDer Aufbau ist damit passend für eine bestehende Synology-/Portainer-/NPM-Umgebung und lässt sich später unkompliziert erweitern, absichern und aktualisieren.