Skip to main content

Self-hosted Formbricks, after version 5

Read this first. You can self-host Formbricks under AGPL-3.0, and the product is good. But the deployment changed shape on 27 May 2026. Formbricks 5 made Cube and the Formbricks Hub mandatory and added Valkey. The stable Compose file now defines five long-running services plus two one-shot migration jobs, and it ships no reverse proxy, so a working instance is six containers. Any guide showing one app container next to Postgres, including this page before 2026-09-09, is describing version 3.

Everything below was read from Formbricks' own repository, documentation and pricing page on 2026-09-09.

What changed, and what most guides still say​

What older guides sayWhat is true on 2026-09-09Source
One app container plus PostgresThe stable Compose file defines postgres, redis, formbricks, hub and cube, plus two migration jobsdocker/docker-compose.yml
Pin v3.6.0Latest release is 5.4.2, published 2026-09-03releases
postgres:16-alpine is fineThe compose file uses pgvector/pgvector:pg18docker/docker-compose.yml
Redis is optional caching"Redis URL for caching, rate limiting, audit logging, and the shared BullMQ background-job queue". The app will not start without itenvironment variables
NEXTAUTH_SECRET is openssl rand -base64 32Documented as openssl rand -hex 32, maximum 32 bytesenvironment variables
Attribute targeting and contacts are in the free build"Contact management & segments", "Teams & access roles" and two-factor authentication are listed under the Enterprise Editionlicence
~12.1k GitHub stars12.9kgithub.com/formbricks/formbricks

The 5.0.0 release notes lead with the warning, not with the features: "Formbricks 5 adds new mandatory infrastructure components (Cube and the Formbricks Hub services) and ships major data-model changes." Read the 5.0.0 release notes before you upgrade an existing instance. This is not a docker compose pull.

What is actually in the stack now?​

We counted the top-level services: keys in docker/docker-compose.yml on the stable branch on 2026-09-09.

ServiceImageRole
postgrespgvector/pgvector:pg18Database, with the vector extension available
redisvalkey/valkey (digest-pinned)Cache, rate limiting, audit log, BullMQ queue
formbricksghcr.io/formbricks/formbricksThe app. Publishes 3000:3000
hubghcr.io/formbricks/hubFeedback directory and background workers
cubecubejs/cube:v1.6.6Analytics layer behind cross-survey dashboards
formbricks-migrate, hub-migratesame app and hub imagesOne-shot schema migrations, restart: no
taxonomy, vllmoptionalBehind the taxonomy and qwen Compose profiles. Not started by default

Two details worth knowing before you provision anything. The app publishes port 3000 on the host, so if the box has a public IP, bind it to 127.0.0.1:3000:3000 or close 3000 at the firewall before you point DNS at it. And there is an optional vllm profile running vllm/vllm-openai, which is a local LLM runtime for the taxonomy service. It is off unless you ask for it, and it is not something to switch on casually on a shared VPS.

How much RAM does self-hosted Formbricks need?​

Formbricks documents no minimum. Not on the Docker setup page, not on the one-click page, and the installer script performs no memory check. So there is no vendor number to quote, and anyone quoting one is inventing it.

Our own measurement is obsolete and we say so:

Measured 2026-05-02, Formbricks 3.6.0Idle RAMPeak (200 concurrent submissions)
formbricks530 MB840 MB
db (postgres 16)155 MB200 MB
caddy15 MB20 MB
Total, three containers700 MB1,060 MB

That was three containers. Version 5 keeps the app and the database, swaps Postgres 16 for pgvector on Postgres 18, and adds Valkey, the Hub and a Cube.js instance. We have not re-measured it, so we will not publish a v5 idle figure.

Estimate, dated 2026-09-09, and labelled as one: buy 8 GB rather than 4 GB. Cube alone is a Node service with its own working set, the Hub runs the queue workers, and the 700 MB above was the floor for a stack with three fewer moving parts. Run docker stats --no-stream after the first week of real traffic and size from what you see, not from what anybody wrote in a blog post.

What does self-hosting Formbricks actually cost?​

Every figure here was read from the vendor's own pricing page on 2026-09-09.

OptionMonthly costResponses included
Formbricks Cloud Hobby$0250
Formbricks Cloud Pro$742,000
Formbricks Cloud Scale$3255,000
Typeform Plus$79 month-to-month, $56 billed annually1,000
Typeform Business$129 month-to-month, $91 billed annually10,000
Self-hosted, Liquid Web 4 GB Managed VPS$72 regular, $36 for two monthsno licence cap
Self-hosted, Liquid Web 8 GB Managed VPS$100 regular, $50 for two monthsno licence cap

Note the two traps in that table. Liquid Web's headline prices are a 50%-off promotion that covers the first two months only; the regular rate is what you pay from month three. Typeform's $56 and $91 are annual-billing rates, and this page quoted them as flat monthly costs until today.

Now the arithmetic, which does not say what a page selling hosting is supposed to say. An 8 GB managed VPS at $100/mo subject to change · verified 2026-09-09 is more expensive than Formbricks Cloud Pro at $74/mo subject to change · verified 2026-09-09, and more expensive than Typeform Plus at $79 month-to-month. Under roughly 2,000 responses a month, self-hosting on a managed VPS costs you more money and gives you a server to look after. The old version of this page compared a $14 VPS against $50 Typeform and got the answer backwards, because neither number was real.

The case flips above 2,000 responses a month. Formbricks Cloud's next step is Scale at $325/mo for 5,000 responses, so a self-hosted box saves about $225/mo at that volume and keeps saving as volume grows, because your response count stops being a billing input. The cheap self-hosting arithmetic you see elsewhere also assumes an unmanaged box, which is a real option and a different product: you become the on-call sysadmin for six containers, a Postgres major version and an object store.

Should you self-host Formbricks?​

Your situationDo this
Under 2,000 responses/month, no data-residency constraintFormbricks Cloud. It is cheaper than the server and there is nothing to operate.
Over 2,000 responses/month, or response volume that spikesSelf-host. Unmetered responses is the strongest argument for it.
Responses cannot leave your infrastructureSelf-host, and budget the operations time honestly.
You need SSO, 2FA, teams and roles, or contact segmentsBuy an Enterprise licence, self-hosted or not. The AGPL build does not include them.
You only need link-based forms, and design matters mostTypeform. It is a better forms product and this is not a close call on polish.
You already run product analyticsPostHog includes surveys, with 1,500 survey responses a month on its free Cloud tier. One less system.
Compose stacks are the part you dreadCoolify manages them on your own VPS with a UI.

Which features need the Enterprise licence?​

The AGPL core is not crippled. Formbricks' licence page says the core "is fully functional and includes everything you need to design & run link surveys, website surveys and in-app surveys": unlimited surveys, all question types, conditional logic, custom styling, the full API and SDKs, webhooks, multi-language, and the Slack, Zapier and Notion integrations.

The Enterprise Edition, which is licensed separately from the AGPL core, gates branding removal, whitelabel email follow-ups, teams and access roles, contact management and segments, workflows, the unified feedback inbox, insights dashboards, audit logs, OIDC/SAML SSO, two-factor authentication, and support SLAs.

Read that list against your requirements before you provision anything. Two-factor authentication sitting on the Enterprise side is the one that surprises people, and no amount of self-hosting works around it.

How do you install it?​

Formbricks documents a one-click script for Ubuntu, and after version 5 that is the path to take. Hand-rolled Compose files that predate the Hub and Cube will not produce a working instance.

  1. Provision an Ubuntu VPS. Open ports 80 and 443. The script is Ubuntu-only.
  2. Point an A record at the box. The installer wants a real domain for its Let's Encrypt certificates.
  3. Run the installer:
curl -fsSL https://raw.githubusercontent.com/formbricks/formbricks/stable/docker/formbricks.sh -o formbricks.sh \
&& chmod +x formbricks.sh \
&& ./formbricks.sh install
  1. Answer the prompts. The script installs Docker and Compose, then brings up Postgres, Redis, Formbricks, the Hub, Cube and Traefik as the reverse proxy. If you accept the bundled object storage it also starts RustFS plus three one-shot init containers.
  2. Keep ./formbricks/.env. The script writes your generated secrets there with 0600 permissions, and its own docs tell you to keep that file private and put it in the server backup plan. Losing ENCRYPTION_KEY means losing access to encrypted fields.
  3. Open your domain and create the first admin account.

Formbricks' own note on the bundled RustFS is worth repeating: it is "designed for convenience on a single server" and is "not the ideal RustFS architecture for high-availability or larger production environments". It also asks for local SSD or NVMe rather than a network filesystem. A Managed VPS with NVMe storage satisfies that; an NFS mount does not.

If you would rather run the Compose file yourself and put your own proxy in front, the app publishes 3000 on the host, so a host-level Caddy config is four lines:

forms.yourdomain.com {
reverse_proxy 127.0.0.1:3000
encode gzip
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
}

Set WEBAPP_URL and NEXTAUTH_URL to https://forms.yourdomain.com when you do, or survey links and auth callbacks will point at the wrong host.

How do you get your data back out?​

Two stores hold your data now, and an export has to cover both.

# Surveys, responses, contacts, configuration
docker compose exec postgres pg_dump -U formbricks formbricks > formbricks.sql

# File-upload answers live in S3/RustFS, not in Postgres.
# Back up the bucket, or the RustFS data volume, in the same job.

Per-survey CSV export from the dashboard still works and is the fastest way to hand a single survey to someone. It is not a backup: it does not carry survey definitions, contact attributes or uploaded files.

Where Formbricks still wins​

Nothing above argues against the product. Formbricks is one of the few tools you can self-host that was built for in-product surveys rather than link forms: you drop @formbricks/js into your app, pass user attributes, and target a survey at people who did a specific thing rather than at everyone who clicked an email. Typeform does not do that, and neither does a self-hosted form builder. The API and SDKs are in the AGPL build, not behind the licence.

Run it yourself when response volume, data custody, or the in-product SDK is the requirement. If it is only the monthly bill, check the arithmetic above first: below 2,000 responses a month it comes out the other way. And if the survey is really an email or lifecycle campaign, Mautic is the tool for that, with the rest of the stack compared on the self-hosted CRM & GTM hub.

Frequently Asked Questions

Five long-running services plus two one-shot migration jobs, from the stable Compose file read on 2026-09-09: postgres (pgvector/pgvector:pg18), redis (Valkey), formbricks, hub and cube, with formbricks-migrate and hub-migrate running once at startup. The Compose file ships no reverse proxy, so a working install is six containers once you add one. The official one-click installer uses Traefik for that, and adds a RustFS container plus three init containers if you accept its bundled object storage. Formbricks 3.x needed three containers, which is why older guides show a much smaller stack.

You can pin an older image tag, and the three-container layout will still come up. You would be running a release line the project has moved past: the latest release on 2026-09-03 was 5.4.2, and version 5 is where the feedback directory, cross-survey dashboards and the current data model live. The upgrade is also not reversible in place, since the current Compose file runs Postgres 18 and a Postgres 16 data directory needs a dump and restore to move. If you are starting fresh, start on 5.x.

Not at low volume. Formbricks Cloud Pro is $74/mo for 2,000 responses a month and the Hobby tier is free for 250, both read on 2026-09-09. A Liquid Web 8 GB Managed VPS is $100/mo at the regular rate, $50/mo for the first two months. Under about 2,000 responses a month, the server costs more than the subscription and you also operate it. Above that, Cloud's next tier is Scale at $325/mo for 5,000 responses, so self-hosting saves roughly $225/mo and stops charging you per response entirely.

Formbricks' licence page, read 2026-09-09, lists these as Enterprise Edition rather than AGPL core: removing the Formbricks branding, whitelabel email follow-ups, teams and access roles, contact management and segments, workflows, the unified feedback inbox, insights dashboards, audit logs, OIDC/SAML SSO, two-factor authentication, and support SLAs. The core keeps unlimited surveys, every question type, conditional logic, custom styling, the full API and SDKs, webhooks, multi-language and the Slack, Zapier and Notion integrations. Two-factor authentication being on the paid side is the one to check against your security policy before you commit.

No, not once file uploads are in use. Formbricks enables S3-compatible object storage when S3_BUCKET_NAME is set, and the one-click installer can bundle RustFS on the same server for it (both read 2026-09-09). Answers to file-upload questions live there, not in Postgres, so a database dump alone restores surveys and responses with broken attachment links. Back up the bucket or the RustFS volume in the same job, and keep ./formbricks/.env with them: ENCRYPTION_KEY is required to read encrypted fields back.

Common mistakes and fixes

After upgrading from 3.x, the formbricks container starts and exits before the UI comes up.

Version 5 added mandatory services that a 3.x .env never set. `REDIS_URL` is the usual culprit: the environment-variable reference (read 2026-09-09) says the application will not start without it. `CRON_SECRET`, `HUB_API_KEY`, `HUB_API_URL`, `CUBEJS_API_SECRET` and `CUBEJS_API_URL` are required too. Read the logs with `docker compose logs formbricks --tail 100`, then work from the official variable list at https://formbricks.com/docs/self-hosting/configuration/environment-variables rather than patching one name at a time. Also note that `NEXTAUTH_SECRET` and `ENCRYPTION_KEY` are documented as `openssl rand -hex 32`, capped at 32 bytes; the base64 secret from older guides is longer than that.

Postgres refuses to start after you swap in the image the current compose file uses.

The stable compose file ships `pgvector/pgvector:pg18`. A data directory initialised by Postgres 16 will not be read by Postgres 18: a major version bump needs a dump and restore, not a new image tag. Dump on the old version first, `docker compose exec db pg_dump -U formbricks formbricks > formbricks_16.sql`, bring up an empty pg18 volume, then restore. Rehearse it on a snapshot. There is no in-place path and no rollback once the volume has been touched by the newer server.

Survey file uploads are missing from your backup, or return 404 after a restore.

Uploads no longer live in Postgres. Formbricks enables S3-compatible storage when `S3_BUCKET_NAME` is set, with `S3_ACCESS_KEY`, `S3_SECRET_KEY`, `S3_REGION`, `S3_ENDPOINT_URL` and `S3_FORCE_PATH_STYLE` alongside it (read 2026-09-09). The one-click installer can bundle RustFS on the same box for this. A `pg_dump` is therefore no longer a complete backup: back up the bucket, or the RustFS data volume, in the same job.