Alternativ till Typeform, Google Forms och SurveyMonkey på egen server: Formbricks och LimeSurvey jämförda

Formbricks och LimeSurvey på samma server med Debian 13, med samma kundenkät på 12 frågor i båda, på svenska och engelska, med villkor, matris, NPS, filuppladdning, dolda fält, ett inbäddat formulär och 200 simulerade svarande, jämförda på minne, rapporter, export, webhooks, GDPR, behörigheter och kostnad, bredvid Typeform, Google Forms och SurveyMonkey.

Testad på Formbricks 6.0.2 och LimeSurvey 7.5.1 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 14 oktober 2026

Rekommenderad server för guiden

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Minne · 60 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

Stegen testades på VC-P Titanium. Det här kräver så lite att VC-P Alloy, med lika många vCPU:er och lika mycket minne på en äldre processor, räcker i liten skala och kostar mindre.

100 kr/mån

Beställ nu
På den här sidan

Det korta svaret

Välj Formbricks om du vill ha känslan från Typeform: en fråga i taget, en modern editor, NPS-värde och diagram direkt, signerade webhooks och ett komplett REST-API, allt i gratisversionen. Den är också den klart tyngsta av de två, med sju containrar och omkring 840 MB i vila, och roller, tvåstegsinloggning, SSO och reCAPTCHA kräver en betald licens. Välj LimeSurvey för långa eller formella enkäter, enkäter på många språk, eller när flera personer behöver olika behörigheter: användare, grupper, behörigheter per enkät, CAPTCHA, tvåstegsinloggning och export till SPSS, R och Stata är gratis, och den gick på omkring 150 MB. Svagheterna är ett äldre utseende, inga webhooks, ingen NPS-fråga och en enkät som inte fungerade inbäddad på en annan domän i vårt test.

Båda underhålls aktivt: Formbricks 6.0.0 kom den 21 september 2026 och LimeSurvey 7.5.1 den 7 oktober 2026, enligt deras releaser på GitHub.

Det här testade vi

Vi installerade båda på samma nya Melonslab VC-P Titanium (4 vCPU, 16 GB) med Debian 13, under var sin användare, som rootless Podman-enheter med Quadlet bakom samma Caddy, med lösenord och nycklar som Podman-hemligheter. Vi har ingen guide för någon av dem än, så vi byggde båda enligt mönstret i våra andra guider, ovanpå Podman-guiden. Så körde vi Formbricks och Så körde vi LimeSurvey visar filerna.

Sedan byggde vi samma kundenkät i båda, på engelska och svenska:

  • 12 frågor: var du hörde talas om oss (ett val), en NPS-fråga från 0 till 10, "Vad borde vi göra bättre?" som bara visas vid 6 eller lägre, vilka tjänster du använder (flera val), supporten betygsatt från 1 till 5, en matris där du bedömer pris, kvalitet, leveranstid och kommunikation från dåligt till utmärkt, om du har kontaktat supporten, en fritextfråga om ärendet som bara visas om du har det, en filuppladdning, hur ofta du använder oss, en fritextfråga och om vi får kontakta dig;
  • två dolda fält, channel och customer, som fylls i från adressen, till exempel ?channel=newsletter&customer=C-1001;
  • en publik länk, och samma enkät i en iframe på en vanlig HTML-sida;
  • ett mejl till Anna, som äger enkäten, för varje svar, som fångades av en testserver för e-post på samma maskin. Inga riktiga mejl skickades någonstans.

Vi svarade på enkäten i en webbläsare på båda språken, med en uppladdning, för att kontrollera villkoren. Sedan skickade vi 200 simulerade svarande, som ett skript tog fram med samma svar för båda verktygen, 115 av dem på svenska, genom varje verktygs publika väg: Formbricks publika API för svar, som dess enkätsida använder, och LimeSurveys enkätsidor, sida för sida som en webbläsare gör. Inga riktiga personer deltog. Därefter tittade vi på rapporterna, exporterade CSV-filer, provade webhooks och API, raderade en svarandes uppgifter, slog på och av lagring av IP-adresser, lade till en andra användare med färre rättigheter, bytte gränssnittet till svenska, startade om servern, mätte, och tog en säkerhetskopia av båda som vi återställde till en ny användare.

Typeform, Google Forms och SurveyMonkey testade vi inte. Vi skapade inga konton hos dem. Det sidan säger om dem kommer från deras egna pris- och hjälpsidor, som vi länkar till där vi använder dem och läste den 14 oktober 2026.

Siffrorna

Formbricks 6.0.2LimeSurvey 7.5.1
Containrar7 som körs: Formbricks, Hub, Cube, SpiceDB, PostgreSQL 18 med pgvector, Valkey 9, Garage för uppladdningar; plus 4 jobb som körs vid start och stannar2: LimeSurvey (Apache och PHP 8.4), MariaDB 12.3
Minne i vila efter omstart835 MB (Formbricks 616, Cube 82, PostgreSQL 74, SpiceDB 38)145 MB (MariaDB 132, LimeSurvey 13)
Minne vid toppen av användningen1,10 GB (Formbricks 848)201 MB (MariaDB 141, LimeSurvey 60)
Avbilder på disk3,27 GB1,27 GB
Data efter testet90 MB174 MB
Från useradd till inloggningssidan1 minut 53 sekunder45 sekunder
200 simulerade svarandeomkring 25 sekunder, ett anrop var7 minuter 40 sekunder, 12 till 14 sidor var
NPSen egen frågetyp, med värdet i rapportenen lista från 0 till 10; inget värde
Webhooksja, signeradenej, bara via ett tillägg från tredje part
Roller och behörigheter, gratisnej: alla medlemmar är ägareja: användare, grupper, per enkät
Skydd mot spam, gratiskontroll av e-post, PIN, svarsgräns; reCAPTCHA kostarCAPTCHA
Tvåstegsinloggning, gratisnejja
Svenskt gränssnittjaja
LicensAGPL 3.0, betalfunktioner under Formbricks egen licensGPL 2.0 eller senare

Minnet är summan av varje apps containrar, mätt med podman stats fem minuter efter en omstart, med varje app öppnad en gång och de 200 svaren på plats. Toppen är det högsta värdet medan de 200 svarande skickades. Tiderna är hur lång tid kommandona tog för en ny användare, mest nedladdning av avbilder, inte tiden det tar att läsa och skriva dem. Tiderna för de svarande säger lika mycket om hur verktygen tar emot svar som om hastighet: Formbricks tar emot ett helt svar i ett anrop, LimeSurvey en sida i taget, och svarade på varje sida på omkring 0,2 sekunder.

Installation

LimeSurvey är två containrar. Vi använde martialblog/limesurvey, en avbild som communityn gör: LimeSurvey ger inte ut någon egen. Den skapar adminkontot från en Podman-hemlighet vid första starten, så det finns ingen öppen installationssida, och den var klar 45 sekunder efter useradd.

Formbricks har vuxit för varje huvudversion. Version 5 lade till Hub, en egen API-tjänst, och Cube, som driver rapporterna; version 6 lade till SpiceDB, behörigheter i stil med Googles Zanzibar i en egen databas. Dess Compose-fil startar elva containrar, varav fyra är jobb som förbereder databaserna och stannar. Filuppladdning kräver S3-lagring som den svarandes webbläsare når, och den körde vi med Garage under en andra adress, forms-files.example.com, som i Garage-guiden. Den första besökaren hos Formbricks får sidan som skapar admin, så skapa den så fort Caddy är på plats; därefter svarade registreringssidorna "Page not found", och nya personer kunde bara komma in via inbjudan.

Att bygga enkäten

Formbricks editor fungerar som Typeforms: block med frågor, villkor på varje block och en förhandsvisning bredvid. Frågetyperna räckte till alla våra tolv, även NPS, matris och filuppladdning. Dolda fält är en lista med namn på enkäten; vi lade till channel och customer, och de sparades från adressen. En hake: namnet source nekades med "Hidden field id is not allowed".

LimeSurvey är ett klassiskt enkätverktyg med fler frågetyper än vi behövde: matriser, rangordning, dubbla skalor, ekvationer och mer. Villkor skrivs per fråga i dess uttrycksspråk, till exempel !is_empty(nps) and nps <= 6. Det finns ingen NPS-fråga, så vår blev en lista från 0 till 10. Dolda fält är vanliga frågor som är dolda och fylls i från adressen via frågekoden. LimeSurvey tog också bort understrecken i våra koder, så support_rating blev supportrating. Vi importerade enkäten som en tabbseparerad fil, ett format som LimeSurvey dokumenterar för det här.

Båda visade bara rätt följdfrågor: betyget 3 tog fram "Vad borde vi göra bättre?", 9 hoppade över den, och "Nej" på frågan om supporten hoppade över ärendet.

Så ser det ut för den som svarar

Formbricks visar en fråga per sida på ett luftigt kort, med en tillbakaknapp. Den svenska versionen visade "Nästa", "Tillbaka" och "Obligatorisk" runt våra egna svenska texter, men enkätens namn stod kvar på engelska, eftersom det är ett internt fält.

LimeSurvey visade en välkomstsida med "Det finns 12 frågor i denna enkät.", sedan en fråga per sida i standardtemat, med en meny för språk. Den ser gammaldags ut bredvid Formbricks, men är enkel och tydlig. Filuppladdningen öppnar en dialog och tog som mest 2 MB per fil, fast vi angav 5 MB på frågan: det är PHP-gränsen i avbilden.

Bädda in formuläret på en webbsida

Båda gav en länk och fungerade i en iframe på en vanlig HTML-sida under en annan underdomän på samma domän. LimeSurvey krävde en inställning först: som standard skickar den X-Frame-Options: SAMEORIGIN, och tillåter inbäddning först när Configuration > Global settings > Security > IFrame embedding allowed står på Allow.

På en sida på en annan domän misslyckades LimeSurvey: den första sidan laddades, och Nästa svarade "400: Bad Request - The CSRF token could not be verified." Dess sessionskakor skickas inte från en sida på en annan webbplats. LimeSurveys egen buggdatabas har fallet, stängt utan ändring; den lösning folk använder är att ändra kakinställningarna i config.php, vilket avbilden vi använde inte låter dig göra. Formbricks fungerade från en annan domän och har dessutom ett skript för popup-enkäter på din egen webbplats, som vi inte testade. Ska enkäten ligga inne på din webbplats är Formbricks det säkra valet; med LimeSurvey länkar du till den.

Resultat och rapporter

Formbricks sammanfattning visade varje fråga som diagram eller tabell: påbörjade och slutförda svar, NPS uppdelat på promotorer, passiva och kritiker med värdet, ett snitt för betyget, procent per ruta i matrisen och fritextsvaren i en lista. Svar på svenska och engelska räknades ihop under samma val, och ett filter och ett datumintervall smalnar av.

LimeSurvey har en sida för Statistics som bygger tabeller och diagram för de frågor du väljer, med filter, och en lista med varje svar. Den gav inget NPS-värde: det räknar du ut själv, eller med en ekvationsfråga.

Export till CSV

FormbricksLimeSurvey
FormatCSV, Excel och en ZIP-fil med uppladdningarnaCSV, Excel, PDF, HTML, Word, JSON, R, SPSS, Stata
Svarpå den svarandes språk, plus en kolumn med ID för varje flervalsfrågapå ett språk du väljer, som text eller koder
Kolumner53, med webbläsare, enhet, adress, språk och dolda fälten per fråga och delfråga

En brist i Formbricks: i CSV-exporten var matrisens kolumner tomma för alla svar på svenska. Svaren var sparade, och sammanfattningen räknade dem, men exporten letar upp dem via radernas engelska namn. Har du en matris på flera språk, exportera via API:t eller kontrollera filen.

E-post vid nya svar

Båda skickade ett mejl till Anna för varje slutfört svar, även alla 200 simulerade, via testservern för e-post. I Formbricks slår varje användare på det per enkät under Notifications; enkäter som skapades via API:t hade det avslaget. LimeSurvey skickar det till adressen i enkätens inställningar under Notifications & data, på den svarandes språk: "Svar inskickat för undersökningen Kundenkät 2026" för ett svenskt svar. Formbricks läser e-postservern från enhetsfilen, med lösenordet som Podman-hemlighet; LimeSurvey sparar den i sin databas, inställd under Global settings > Email settings.

Webhooks och API

Formbricks skickar webhooks för nya, ändrade och slutförda svar, signerade enligt Standard Webhooks med rubriken Webhook-Signature, och innehållet hade varje svar, de dolda fälten och länken till den uppladdade filen. Den har ett REST-API med nycklar per organisation och arbetsyta; vi byggde enkäten med det. Bra att veta: API:t i version 1 kunde inte skapa en enkät på två språk i vårt test, medan version 3 kunde det. En webhook till en annan app på samma server misslyckades med ECONNREFUSED: Formbricks ansluter till serverns publika adress, som inne i podden är podden själv, och AddHost ändrade inte det. Inför testet gav vi podden en egen adress, och då kom webhooks fram.

LimeSurvey har inga egna webhooks; det finns tillägg från tredje part, som vi inte provade. Dess API, RemoteControl, är JSON-RPC och avslaget som standard: Global settings > Interfaces > RPC interface enabled. Med det importerade och aktiverade vi enkäten, exporterade svar och raderade dem. För att reagera på ett nytt svar frågar du API:t med jämna mellanrum.

Språk

Båda körde vår enkät på engelska och svenska från samma enkät, med den svarandes språk i länken (?lang=sv-SE i Formbricks, ?lang=sv i LimeSurvey) eller valt i en meny. I Formbricks lägger du först till svenska under Survey Languages och översätter sedan varje text; flerspråkiga enkäter ingår i gratisversionen. LimeSurvey har haft det i många år och klarar många språk per enkät, med en egen vy för översättning.

Anonymitet och GDPR

  • IP-adresser. Ingen av dem sparar några som standard. Med Capture IP address påslaget sparade Formbricks första halvan av vår IPv6-adress och nollor efter; LimeSurvey, med Save IP address och Anonymize IP address påslagna, behöll de tre första grupperna. Formbricks har också Anonymize responses, som slutar spara adress, land och enhet och tar bort parametrar från sparade sidadresser.
  • Radera en svarande. Vi raderade alla svar från customer C-1001 via varje API. Båda tog bort svaren. LimeSurvey raderade också den uppladdade filen; det gjorde inte Formbricks: filen låg kvar i lagringen, bara nåbar för inloggade användare, och måste tas bort för hand.
  • Var data finns. På din egen server stannar svar och uppladdningar i Sverige.

Spam och robotar

Våra 200 simulerade svarande kom igenom båda utan att stoppas, omkring åtta i sekunden i Formbricks. Formbricks skydd med reCAPTCHA v3 är en betalfunktion, och det anropar Google; gratisversionen har Verify email before submission, Protect survey with a PIN och en gräns för antalet svar. LimeSurvey har en egen CAPTCHA med bild, gratis: med Use CAPTCHA for survey access påslaget öppnades enkäten med en CAPTCHA-sida. Den har också deltagarlistor med åtkomstkoder för slutna enkäter.

Team och behörigheter

Formbricks har organisationer och arbetsytor, men utan licens blir alla du bjuder in Owner: inbjudan visade member och manager med "Unlock Organization Roles with a higher plan". Team med åtkomst per arbetsyta kostar också, liksom tvåstegsinloggning och SSO.

LimeSurvey har användare, grupper och behörigheter per enkät, allt gratis. Vi gav Erik läsrätt till svaren och statistiken i en enkät: han kunde bläddra bland svaren och se statistiken, och de globala inställningarna svarade "403: Forbidden". Tvåstegsinloggning och inloggning via LDAP finns som tillägg i grundinstallationen, som vi inte provade.

Svenska

  • Formbricks: Swedish (Svenska) under Your Profile. Det mesta blev svenska, som "Enkäter", "Ny enkät" och "Svarsalternativ", med delar på engelska, som rubrikerna "ASK" och "ANALYZE".
  • LimeSurvey: Svenska i varje användares språkinställning. Erik såg "Enkäter", "Svar" och "Statistik", med några engelska ord, som "Running".

För den som svarar var båda på svenska, som beskrivs ovan.

Resurser

LimeSurvey är en PHP-app. I vila stod MariaDB för nästan allt av dess 145 MB, och med 200 svarande steg det till 201 MB.

Formbricks är en Next.js-app med tjänster runt omkring. I vila använde den 835 MB, tre fjärdedelar av det i Formbricks egen container, och medan den tog emot de 200 svaren steg den till 1,10 GB. Dess avbilder tar 3,27 GB, mot 1,27 GB för LimeSurvey.

Båda ryms gott och väl på en server med 8 GB, som på vår testserver, där båda körde samtidigt.

Uppdateringar och säkerhetskopior

LimeSurvey följer taggen 7-apache för sin avbild, så Podman uppdaterar den inom version 7, och den uppdaterar sin databas vid start. Vi byggde och besvarade enkäten på 7.5.0; vår ominstallation och återställning några timmar senare hämtade 7.5.1, med data i behåll. Säkerhetskopian är en dump av databasen och volymen med uppladdningar, 240 KB i vårt test.

Formbricks följer taggen 6.0, men Formbricks avbilder uppdateras inte automatiskt: fyra jobb förbereder databaserna innan den startar, så du uppdaterar genom att ändra taggarna och starta om hela podden. Räkna med att läsa versionsnyheterna: var och en av de två senaste huvudversionerna lade till tjänster. Säkerhetskopian är en dump av PostgreSQL och Garages volymer, 2,4 MB i vårt test. När vi också återställde SpiceDB:s databas föll SpiceDB på "duplicate key value violates unique constraint", och Formbricks startade inte; att lämna SpiceDB:s databas tom och låta Formbricks bygga upp den från sina egna data fungerade.

Vi återställde båda till en ny användare, med hemligheterna från säkerhetskopian, och enkäterna, de 200 svaren, användarna, uppladdningarna och API-nyckeln kom tillbaka. Båda kom också tillbaka av sig själva efter en omstart.

Så körde vi Formbricks

Formbricks Docker-dokumentation installerar med ett skript och en Compose-fil. Vi körde samma avbilder och inställningar som Compose-filen för 6.0.2, som Quadlet-enheter i en pod, med tre ändringar: SpiceDB:s databas skapas av ett skript vid PostgreSQL:s första start i stället för av ett eget jobb, uppladdningarna hamnar i Garage i stället för i RustFS, som är valfritt, och AddHost skickar lagringsadressen till Caddy, eftersom Formbricks hämtar uppladdningar därifrån och serverns egen adress tillhör podden.

Skapa användaren som root, som i steg 1 i Plane-guiden, med formbricks i stället för plane. Skapa hemligheterna som formbricks, även Garage-nyckeln som Formbricks använder:

pw=$(openssl rand -hex 24)
printf %s "$pw" | podman secret create formbricks-db-password -
printf %s "postgresql://postgres:$pw@localhost:5432/formbricks?schema=public" | podman secret create formbricks-db-url -
printf %s "postgresql://postgres:$pw@localhost:5432/formbricks?sslmode=disable" | podman secret create formbricks-hub-db-url -
spw=$(openssl rand -hex 24)
printf %s "$spw" | podman secret create formbricks-spicedb-db-password -
printf %s "postgresql://spicedb:$spw@localhost:5432/spicedb?sslmode=disable" | podman secret create formbricks-spicedb-db-url -
for s in spicedb-token nextauth-secret encryption-key cron-secret hub-key cube-secret s3-rpc; do
  openssl rand -hex 32 | tr -d '\n' | podman secret create formbricks-$s -
done
printf %s "GK$(openssl rand -hex 12)" | podman secret create formbricks-s3-key-id -
openssl rand -hex 32 | tr -d '\n' | podman secret create formbricks-s3-secret-key -
printf %s 'your-smtp-password' | podman secret create formbricks-smtp-password -

Hämta Cubes konfiguration från releasen, och skapa ~/garage.toml som i steg 3 i Plane-guiden, med api_bind_addr = "[::]:3900":

mkdir -p ~/cube/schema ~/initdb ~/.config/containers/systemd
curl -fsSL -o ~/cube/cube.js https://raw.githubusercontent.com/formbricks/formbricks/6.0.2/docker/cube/cube.js
curl -fsSL -o ~/cube/schema/FeedbackRecords.js https://raw.githubusercontent.com/formbricks/formbricks/6.0.2/docker/cube/schema/FeedbackRecords.js

~/initdb/spicedb.sh, som PostgreSQL kör en gång, på en tom volym:

#!/bin/sh
psql -v ON_ERROR_STOP=1 -U postgres -v pw="$SPICEDB_DB_PASSWORD" <<'SQL'
CREATE ROLE spicedb LOGIN PASSWORD :'pw';
CREATE DATABASE spicedb OWNER spicedb;
SQL

I ~/.config/containers/systemd/, formbricks.pod:

[Pod]
PodName=formbricks
PublishPort=127.0.0.1:8134:3000
PublishPort=127.0.0.1:8135:3900
AddHost=forms-files.example.com:host-gateway

[Install]
WantedBy=default.target

formbricks-db.container, formbricks-cache.container och formbricks-s3.container:

[Container]
ContainerName=formbricks-db
Image=docker.io/pgvector/pgvector:pg18
Pod=formbricks.pod
Volume=formbricks-db:/var/lib/postgresql
Volume=%h/initdb:/docker-entrypoint-initdb.d:ro
Environment=POSTGRES_DB=formbricks
Secret=formbricks-db-password,type=env,target=POSTGRES_PASSWORD
Secret=formbricks-spicedb-db-password,type=env,target=SPICEDB_DB_PASSWORD
HealthCmd=pg_isready -U postgres
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always
TimeoutStartSec=300
[Container]
ContainerName=formbricks-cache
Image=docker.io/valkey/valkey:9-alpine
Pod=formbricks.pod
Volume=formbricks-cache:/data
Exec=valkey-server --appendonly yes --maxmemory-policy noeviction
AutoUpdate=registry

[Service]
Restart=always
[Container]
ContainerName=formbricks-s3
Image=docker.io/dxflrs/garage:v2.4.1
Exec=/garage server --single-node
Pod=formbricks.pod
Volume=%h/garage.toml:/etc/garage.toml:ro
Volume=formbricks-s3-meta:/var/lib/garage/meta
Volume=formbricks-s3-data:/var/lib/garage/data
Secret=formbricks-s3-rpc,type=env,target=GARAGE_RPC_SECRET
StopTimeout=30

[Service]
Restart=always

Avbilden är pgvectors, PostgreSQL 18 med vektortillägget som Formbricks Compose-fil använder. SpiceDB förbereder först sin databas och stannar, sedan körs den. formbricks-spicedb-migrate.container och formbricks-spicedb.container:

[Unit]
Requires=formbricks-db.service
After=formbricks-db.service

[Container]
ContainerName=formbricks-spicedb-migrate
Image=docker.io/authzed/spicedb:v1.52.0
Pod=formbricks.pod
Exec=datastore migrate head
Environment=SPICEDB_DATASTORE_ENGINE=postgres
Secret=formbricks-spicedb-db-url,type=env,target=SPICEDB_DATASTORE_CONN_URI

[Service]
Type=oneshot
RemainAfterExit=yes
[Unit]
Requires=formbricks-spicedb-migrate.service
After=formbricks-spicedb-migrate.service

[Container]
ContainerName=formbricks-spicedb
Image=docker.io/authzed/spicedb:v1.52.0
Pod=formbricks.pod
Exec=serve
Environment=SPICEDB_DATASTORE_ENGINE=postgres SPICEDB_LOG_FORMAT=json SPICEDB_TELEMETRY_ENDPOINT=
Secret=formbricks-spicedb-db-url,type=env,target=SPICEDB_DATASTORE_CONN_URI
Secret=formbricks-spicedb-token,type=env,target=SPICEDB_GRPC_PRESHARED_KEY

[Service]
Restart=always

Databasjobben för Formbricks och Hub, formbricks-migrate.container och formbricks-hub-migrate.container:

[Unit]
Requires=formbricks-db.service
After=formbricks-db.service

[Container]
ContainerName=formbricks-migrate
Image=ghcr.io/formbricks/formbricks:6.0
Pod=formbricks.pod
Entrypoint=node
Exec=packages/database/dist/scripts/apply-migrations.js
Secret=formbricks-db-url,type=env,target=DATABASE_URL

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=600
[Unit]
Requires=formbricks-migrate.service
After=formbricks-migrate.service

[Container]
ContainerName=formbricks-hub-migrate
Image=ghcr.io/formbricks/hub:0.14
Pod=formbricks.pod
Entrypoint=sh
Exec=-c 'goose -dir /app/migrations postgres "$$DATABASE_URL" up && river migrate-up --database-url "$$DATABASE_URL"'
Secret=formbricks-hub-db-url,type=env,target=DATABASE_URL

[Service]
Type=oneshot
RemainAfterExit=yes

$$ hindrar systemd från att byta ut variabeln innan containern ser den. Sedan Hub och Cube, formbricks-hub.container och formbricks-cube.container:

[Unit]
Requires=formbricks-hub-migrate.service
After=formbricks-hub-migrate.service

[Container]
ContainerName=formbricks-hub
Image=ghcr.io/formbricks/hub:0.14
Pod=formbricks.pod
Secret=formbricks-hub-db-url,type=env,target=DATABASE_URL
Secret=formbricks-hub-key,type=env,target=API_KEY

[Service]
Restart=always
[Unit]
Requires=formbricks-hub-migrate.service
After=formbricks-hub-migrate.service

[Container]
ContainerName=formbricks-cube
Image=ghcr.io/formbricks/cube:1.7.47-1
Pod=formbricks.pod
Volume=%h/cube/cube.js:/cube/conf/cube.js:ro
Volume=%h/cube/schema:/cube/conf/model:ro
Environment=CUBEJS_DB_TYPE=postgres CUBEJS_DB_HOST=localhost CUBEJS_DB_PORT=5432 CUBEJS_DB_NAME=formbricks CUBEJS_DB_USER=postgres
Environment=CUBEJS_JWT_ISSUER=formbricks-web CUBEJS_JWT_AUDIENCE=formbricks-cube CUBEJS_DEFAULT_API_SCOPES=meta,data
Environment=CUBEJS_EXTERNAL_DEFAULT=false CUBEJS_CACHE_AND_QUEUE_DRIVER=memory
Secret=formbricks-db-password,type=env,target=CUBEJS_DB_PASS
Secret=formbricks-cube-secret,type=env,target=CUBEJS_API_SECRET

[Service]
Restart=always

formbricks-authzed-init.container, som skriver Formbricks behörigheter till SpiceDB, och bygger upp dem igen om SpiceDB:s databas är tom:

[Unit]
Requires=formbricks-migrate.service formbricks-spicedb.service
After=formbricks-migrate.service formbricks-spicedb.service

[Container]
ContainerName=formbricks-authzed-init
Image=ghcr.io/formbricks/formbricks:6.0
Pod=formbricks.pod
Entrypoint=formbricks-authzed
Exec=upgrade prepare
Secret=formbricks-db-url,type=env,target=DATABASE_URL
Secret=formbricks-spicedb-token,type=env,target=AUTHZED_TOKEN
Environment=ENCRYPTION_KEY=unused CUBEJS_API_SECRET=unused CUBEJS_API_URL=http://localhost HUB_API_KEY=unused HUB_API_URL=http://localhost REDIS_URL=redis://localhost
Environment=AUTHZED_ENABLED=true AUTHZED_ENDPOINT=localhost:50051 AUTHZED_SYSTEM_KEY=formbricks AUTHZED_INSECURE=true AUTHZED_CONSISTENCY=fully_consistent

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=300

Värdena unused är platshållare som Formbricks Compose-fil sätter på samma sätt; jobbet använder dem inte. Och formbricks-app.container, med dina egna adresser och din e-postserver:

[Unit]
Requires=formbricks-cache.service formbricks-hub.service formbricks-cube.service formbricks-authzed-init.service
After=formbricks-cache.service formbricks-hub.service formbricks-cube.service formbricks-authzed-init.service

[Container]
ContainerName=formbricks-app
Image=ghcr.io/formbricks/formbricks:6.0
Pod=formbricks.pod
Environment=WEBAPP_URL=https://forms.example.com NEXTAUTH_URL=https://forms.example.com
Environment=REDIS_URL=redis://localhost:6379 HUB_API_URL=http://localhost:8080 CUBEJS_API_URL=http://localhost:4000
Environment=CUBEJS_JWT_ISSUER=formbricks-web CUBEJS_JWT_AUDIENCE=formbricks-cube
Environment=SKIP_STARTUP_MIGRATION=true TELEMETRY_DISABLED=1
Environment=AUTHZED_ENABLED=true AUTHZED_ENDPOINT=localhost:50051 AUTHZED_SYSTEM_KEY=formbricks AUTHZED_INSECURE=true AUTHZED_CONSISTENCY=fully_consistent
Environment=S3_REGION=garage S3_BUCKET_NAME=formbricks S3_ENDPOINT_URL=https://forms-files.example.com S3_FORCE_PATH_STYLE=1
Environment=MAIL_FROM=forms@example.com MAIL_FROM_NAME=Formbricks
Environment=SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_USER=forms@example.com SMTP_AUTHENTICATED=1
Environment=EMAIL_VERIFICATION_DISABLED=0 PASSWORD_RESET_DISABLED=0
Secret=formbricks-db-url,type=env,target=DATABASE_URL
Secret=formbricks-nextauth-secret,type=env,target=NEXTAUTH_SECRET
Secret=formbricks-encryption-key,type=env,target=ENCRYPTION_KEY
Secret=formbricks-cron-secret,type=env,target=CRON_SECRET
Secret=formbricks-hub-key,type=env,target=HUB_API_KEY
Secret=formbricks-cube-secret,type=env,target=CUBEJS_API_SECRET
Secret=formbricks-spicedb-token,type=env,target=AUTHZED_TOKEN
Secret=formbricks-s3-key-id,type=env,target=S3_ACCESS_KEY
Secret=formbricks-s3-secret-key,type=env,target=S3_SECRET_KEY
Secret=formbricks-smtp-password,type=env,target=SMTP_PASSWORD

[Service]
Restart=always
TimeoutStartSec=300

Hämta de sju avbilderna först, docker.io/pgvector/pgvector:pg18, docker.io/valkey/valkey:9-alpine, docker.io/dxflrs/garage:v2.4.1, docker.io/authzed/spicedb:v1.52.0, ghcr.io/formbricks/formbricks:6.0, ghcr.io/formbricks/hub:0.14 och ghcr.io/formbricks/cube:1.7.47-1, omkring 3,3 GB. Starta sedan podden och ge Garage hinken och nyckeln:

systemctl --user daemon-reload
systemctl --user start formbricks-pod
systemctl --user enable --now podman-auto-update.timer
garage() { podman exec -e RUST_LOG=warn formbricks-s3 /garage "$@"; }
garage bucket create formbricks
garage key import -n formbricks --yes "$(podman secret inspect --showsecret --format '{{.SecretData}}' formbricks-s3-key-id)" "$(podman secret inspect --showsecret --format '{{.SecretData}}' formbricks-s3-secret-key)"
garage bucket allow --read --write formbricks --key formbricks

Den är klar när curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8134/health skriver ut 200. Blocken i Caddys ~/Caddyfile, där det andra låter webbläsare ladda upp direkt till Garage från enkätsidan:

forms.example.com {
    reverse_proxy 127.0.0.1:8134
}

forms-files.example.com {
    header Access-Control-Allow-Origin https://forms.example.com
    header Access-Control-Allow-Methods "GET, POST, PUT, HEAD"
    header Access-Control-Allow-Headers *
    header Access-Control-Expose-Headers ETag
    @preflight method OPTIONS
    respond @preflight 204
    reverse_proxy 127.0.0.1:8135
}

Starta om Caddy, öppna https://forms.example.com direkt och skapa admin. Formbricks bekräftar adressen via mejl före första inloggningen, så e-postinställningarna måste fungera; för port 465, lägg till SMTP_SECURE_ENABLED=1. Utan e-post fungerar inte bekräftelse vid registrering, inbjudningar, återställning av lösenord eller aviseringar om svar.

För säkerhetskopian, som formbricks: dumpa databasen och exportera Garage, som stoppas i några sekunder då uppladdningar misslyckas, och spara hemligheterna:

umask 077
mkdir -p ~/backup
podman exec formbricks-db pg_dump -U postgres -Fc formbricks > ~/backup/formbricks.dump
systemctl --user stop formbricks-s3
podman volume export formbricks-s3-meta > ~/backup/formbricks-s3-meta.tar
podman volume export formbricks-s3-data > ~/backup/formbricks-s3-data.tar
systemctl --user start formbricks-s3
for s in $(podman secret ls --format '{{.Name}}'); do
  printf '%s %s\n' "$s" "$(podman secret inspect --showsecret --format '{{.SecretData}}' "$s")"
done > ~/backup/secrets.txt

För att återställa till en ny användare: lägg tillbaka filerna, skapa hemligheterna från secrets.txt, importera Garages två volymer, starta podden och vänta på /health, stoppa sedan formbricks-app, formbricks-hub, formbricks-cube och formbricks-spicedb, ta bort och skapa databasen formbricks, läs in dumpen med pg_restore och starta om podden. Låt SpiceDB:s databas vara som den nya installationen gjorde den: formbricks-authzed-init fyller den från Formbricks data.

Så körde vi LimeSurvey

LimeSurvey ger inte ut någon avbild, och dess installationsmanual beskriver PHP och en webbserver. Vi använde martialblog/limesurvey, communityavbilden som andra bygger vidare på, i varianten med Apache, med MariaDB som i MariaDB-guiden: version 12.3, avbildens hälsokontroll och MARIADB_AUTO_UPGRADE. Två saker att veta om avbilden:

  • Den skriver config.php och security.php inne i containern vid varje start, utifrån inställningarna nedan. Krypteringsnycklarna kommer från hemligheter, så de överlever en ny container.
  • Den skapar admin från ADMIN_PASSWORD, men bara i en tom databas.

Skapa användaren som root, som i steg 1 i Plane-guiden, med limesurvey. Skapa hemligheterna som limesurvey:

openssl rand -hex 24 | tr -d '\n' | podman secret create limesurvey-db-password -
printf %s "$(openssl rand -base64 18)" | podman secret create limesurvey-admin-password -
openssl rand -hex 24 | tr -d '\n' | podman secret create limesurvey-encrypt-nonce -
openssl rand -hex 32 | tr -d '\n' | podman secret create limesurvey-encrypt-key -

~/.config/containers/systemd/limesurvey.pod:

[Pod]
PodName=limesurvey
PublishPort=127.0.0.1:8141:8080

[Install]
WantedBy=default.target

limesurvey-db.container:

[Container]
ContainerName=limesurvey-db
Image=docker.io/library/mariadb:12.3
Pod=limesurvey.pod
Volume=limesurvey-db:/var/lib/mysql
Environment=MARIADB_DATABASE=limesurvey MARIADB_USER=limesurvey MARIADB_RANDOM_ROOT_PASSWORD=1 MARIADB_AUTO_UPGRADE=1
Secret=limesurvey-db-password,type=env,target=MARIADB_PASSWORD
HealthCmd=healthcheck.sh --connect --innodb_initialized
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

limesurvey-app.container, med din egen adress:

[Unit]
Requires=limesurvey-db.service
After=limesurvey-db.service

[Container]
ContainerName=limesurvey-app
Image=docker.io/martialblog/limesurvey:7-apache
Pod=limesurvey.pod
Volume=limesurvey-upload:/var/www/html/upload
Environment=DB_TYPE=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=limesurvey DB_USERNAME=limesurvey DB_MYSQL_ENGINE=InnoDB
Environment=ADMIN_USER=admin ADMIN_NAME=Anna ADMIN_EMAIL=anna@example.com
Environment=PUBLIC_URL=https://survey.example.com BASE_URL=https://survey.example.com URL_FORMAT=path
Secret=limesurvey-db-password,type=env,target=DB_PASSWORD
Secret=limesurvey-admin-password,type=env,target=ADMIN_PASSWORD
Secret=limesurvey-encrypt-nonce,type=env,target=ENCRYPT_NONCE
Secret=limesurvey-encrypt-key,type=env,target=ENCRYPT_SECRET_BOX_KEY
AutoUpdate=registry

[Service]
Restart=always
TimeoutStartSec=300

DB_MYSQL_ENGINE=InnoDB ersätter avbildens standard, MyISAM, för tabellerna med svar. Hämta docker.io/library/mariadb:12.3 och docker.io/martialblog/limesurvey:7-apache, och sedan:

systemctl --user daemon-reload
systemctl --user start limesurvey-pod
systemctl --user enable --now podman-auto-update.timer
podman secret inspect --showsecret --format '{{.SecretData}}' limesurvey-admin-password; echo

Lägg till survey.example.com i Caddy med reverse_proxy 127.0.0.1:8141, och logga in som admin på https://survey.example.com/index.php/admin. Adressen utan index.php, /admin, skickade oss till den publika startsidan. Ställ in e-postservern under Configuration > Global settings > Email settings: SMTP, leverantörens server med :587 under SMTP host, användare, lösenord och den SMTP encryption som leverantören använder. Vi testade bara att skicka via vår testserver för e-post. Utan e-post fungerar inte inbjudningar till deltagare och aviseringar; enkäterna fungerar ändå. LimeSurvey varnar "SSL not enforced" på sin översikt; Caddy levererar den bara över HTTPS, och vi lät Force HTTPS vara avslaget.

För säkerhetskopian, som limesurvey:

umask 077
mkdir -p ~/backup
podman exec limesurvey-db sh -c 'mariadb-dump -ulimesurvey -p"$MARIADB_PASSWORD" --single-transaction limesurvey' > ~/backup/limesurvey-db.sql
podman volume export limesurvey-upload > ~/backup/limesurvey-upload.tar
for s in $(podman secret ls --format '{{.Name}}'); do
  printf '%s %s\n' "$s" "$(podman secret inspect --showsecret --format '{{.SecretData}}' "$s")"
done > ~/backup/secrets.txt

För att återställa till en ny användare: skapa hemligheterna från secrets.txt, kör podman volume create limesurvey-upload och importera tar-filen i den, starta limesurvey-db, läs in dumpen med podman exec -i limesurvey-db sh -c 'mariadb -ulimesurvey -p"$MARIADB_PASSWORD" limesurvey' < ~/backup/limesurvey-db.sql, och starta om limesurvey-app.

Licens och kostnad

Vi läste licenstexterna och prissidorna den 14 oktober 2026.

  • Formbricks görs av Formbricks GmbH i Tyskland. Kärnan är öppen källkod under AGPL 3.0; betalfunktionerna finns i samma avbild, under Formbricks egen Enterprise-licens, och låses upp med en nyckel. Enligt dess licenssida har gratisutgåvan Community obegränsat antal svar och användare, en arbetsyta, webhooks, API, filuppladdning och flerspråkiga enkäter. En nyckel krävs bland annat för att dölja "Powered by Formbricks", för team och roller, kontakter och segment, kvoter, granskningsloggar, SSO med OpenID Connect eller SAML, skydd mot spam med reCAPTCHA, tvåstegsinloggning och fler arbetsytor. På egen server prissätts den per svar, arbetsyta och funktion, utan publikt pris. Formbricks Cloud är gratis för 250 svar i månaden, med drift i Frankfurt; Pro listas till 74 och Scale till 325 US-dollar i månaden, för 2 000 och 5 000 svar.
  • LimeSurvey görs av LimeSurvey GmbH i Tyskland och är öppen källkod under GPL, version 2 eller senare, enligt licensfilen. Community Edition har inga betalfunktioner. LimeSurvey Cloud listas, med 25 % moms, till 380 kr i månaden för Basic med 1 000 svar i månaden, 3 887 kr om året för Expert med 10 000 svar om året och 10 053 kr om året för Business med 50 000; du väljer var den ska driftas, och Tyskland och Finland föreslås för kunder i EU.

För ett företag som gör enkäter för egen del tillåter båda gratisversionerna det utan kostnad och utan tak för antalet svar, och på din egen server stannar svaren i Sverige.

Typeform, Google Forms och SurveyMonkey i dag

Det som följer kommer från tjänsternas egna sidor, lästa den 14 oktober 2026, inte från våra tester. Ingen av de tre har en version att köra själv.

Typeforms prissida visade, i US-dollar i månaden vid årsbetalning, Basic för 28 med 100 svar i månaden, Plus för 56 med 1 000 och Business för 91 med 10 000; vid månadsbetalning 39, 79 och 129. Villkor, webhooks och integrationer ingår från Basic, och att ta bort Typeforms märkning från Plus. Flerspråkiga formulär listas för planerna Talent och Growth Flow, och "SSO, HIPAA, GDPR, US or EU data center" för Enterprise. Samma sida hade också en jämförelsetabell med lägre priser än korten, så kontrollera innan du köper. Den nämner en gratisplan utan att visa den bland planerna.

Google Forms är gratis med ett Google-konto, och ingår i Google Workspace, som prissidan listade från 6,80 euro per användare i månaden, utan moms; datalagring i en vald region listas under Enterprise. En fråga med filuppladdning kräver att alla som svarar loggar in: "To answer this question, responders need to sign in to a Google Account", och filerna hamnar i ägarens Google Drive, enligt Googles hjälpsida. Förgrening, Go to section based on answer, "is only available for Multiple choice and Dropdown question types", enligt en annan hjälpsida.

SurveyMonkeys prissida visade en gratis Basic-plan med 10 frågor per enkät, Standard Monthly för 409 kr i månaden för 1 000 svar i månaden, Advantage Annual för 4 428 kr om året för 15 000 svar om året och Premier Annual för 10 788 kr om året för 40 000, var och en för en användare, med extra svar för 1 kr styck. Dess teamplaner börjar på 300 kr per användare i månaden vid årsbetalning, för minst tre användare; flerspråkiga enkäter listas från Team Premier, för 675 kr, och datacenter i EU under Enterprise.

Det här ger du upp jämfört med Typeform, Google Forms och SurveyMonkey

Med din egen server stannar svaren i Sverige, du betalar ett fast pris för servern i stället för per svar eller användare, och ingen sätter tak för dina svar. Men var ärlig om vad du lämnar:

  • Finish och mallar. Typeforms design, videofrågor och formulär byggda med AI, och SurveyMonkeys frågebank och jämförelsetal, har ingen motsvarighet här. Formbricks kommer närmast i utseende; LimeSurvey ser gammaldags ut.
  • Integrationer. Google Forms skriver direkt till Google Sheets, och Typeform och SurveyMonkey kopplas till hundratals tjänster. Här har du webhooks och API i Formbricks, ett API du frågar i LimeSurvey, och lite eget arbete.
  • Paneler med svarande. SurveyMonkey säljer svar från sin egen panel. Inget av verktygen på egen server hittar svarande åt dig.
  • Skydd mot spam. Formbricks reCAPTCHA kostar; LimeSurveys CAPTCHA är gratis men enkel. Våra 200 skriptade svarande kom igenom båda obehindrat.
  • Driften. Uppdateringar, säkerhetskopior, e-post och servern är ditt ansvar, och särskilt Formbricks är sju tjänster som ändras med varje huvudversion.

Vilken ska du välja

Kundfeedback, NPS och enkäter på din webbplats: Formbricks. Den har formulären i Typeform-stil, NPS med värde, diagram utan inställningar, signerade webhooks, REST-API, uppladdning, villkor och två språk i gratisversionen, och den fungerade inbäddad på en annan domän. Svagheterna är vikten, omkring 840 MB i vila och 3,3 GB avbilder, sju tjänster att hålla igång och en återställning som kräver omsorg, att alla blir ägare utan licens, att reCAPTCHA, tvåstegsinloggning och SSO kräver en betald nyckel, att uppladdningar blir kvar när du raderar ett svar, och en CSV-export som tappade våra svenska svar i matrisen. Vi har ingen guide för den än: filerna i Så körde vi Formbricks är det vi körde, ovanpå Podman-guiden. Den går gott och väl på en VC-P Alloy.

Forskning, långa enkäter, många språk eller många användare: LimeSurvey. Behörigheter per enkät, grupper, CAPTCHA, tvåstegsinloggning, statistik och export till SPSS, R och Stata är gratis, under GPL, på omkring 150 MB. Svagheterna är ett äldre gränssnitt, inga webhooks, inget NPS-värde, en gräns på 2 MB för uppladdningar i avbilden vi använde, en avbild som communityn gör, och enkäter som inte fungerade inbäddade på en annan domän, så länka till dem i stället. Filerna finns i Så körde vi LimeSurvey; en VC-P Alloy kör den med plats för många andra appar.

Enkla interna formulär som i dag ligger i Google Forms: båda fungerar. LimeSurvey är den lättare att driva; Formbricks den trevligare att fylla i.

Tillsammans använde de omkring 1 GB i vila och 1,3 GB vid topparna, så en VC-P Alloy kör båda.

Kör det på din egen server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

100 kr/mån

vCPU
2
Minne
8 GB
Lagring
60 GB
Trafik
10 TB
Performance
SSD · RAID 1
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp

Stegen testades på VC-P Titanium. Det här kräver så lite att VC-P Alloy, med lika många vCPU:er och lika mycket minne på en äldre processor, räcker i liten skala och kostar mindre.

Alla guider