Formbricks on Ubuntu 24.04 on Azure User Guide
Overview
Formbricks is an open source experience management and survey platform, a self hosted alternative to Typeform, Qualtrics and Google Forms. Build link surveys, website and in app surveys and email surveys in a drag and drop editor, collect and analyse responses, and manage contacts and segments, all through a modern web interface and a documented API. The cloudimg image runs the official Formbricks self hosted stack the supported way, as the upstream container alongside a bundled PostgreSQL and cache, orchestrated by Docker Compose under systemd and fronted by nginx. Every image is pinned by digest and captured into the VM, so your instance starts in seconds. A unique owner administrator, application secrets, database password and Management API key are generated for each VM on first boot, before the port is reachable, and the owner is pre seeded so nobody can claim your instance before you sign in. Backed by 24/7 cloudimg support.
Formbricks is a trademark of its respective owner. This image is produced by cloudimg and is not affiliated with, endorsed by, or sponsored by Formbricks. It ships the free and open source AGPL 3.0 self hosted core, unmodified, with no enterprise key set.

What is included:
- Formbricks v5.1.4 (the AGPL 3.0 self hosted core), shipped unmodified and pinned by image digest
- The official self hosted stack: a bundled PostgreSQL and cache, plus the Apache 2.0 Formbricks Hub API and the Apache 2.0 Cube analytics service, all reachable only inside a private Docker network (never published to a host port)
- Docker Engine (Docker CE) with Formbricks published to the loopback interface only, fronted by nginx on port
80 formbricks.service,formbricks-firstboot.serviceandnginx.serviceas systemd units, enabled and active on boot- A unique application secret, encryption key, cron secret, database password and Management API key, plus a pre seeded owner administrator, generated per VM on first boot and never baked into the image
- Open sign up disabled and the sign up endpoint blocked, so nobody can seize your instance
- A clean, empty instance on first boot: no default account, no shipped secret, no prior data
- 24/7 cloudimg support
Prerequisites
An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. The image runs five containers (Formbricks, PostgreSQL, a cache, Hub and Cube), so Standard_B2s (2 vCPU / 4 GiB RAM) is the practical minimum; choose Standard_B2ms (8 GiB) or larger for production teams and heavier response volumes. NSG inbound: allow 22/tcp from your management network and 80/tcp (and 443/tcp once you add TLS) for the web interface. Formbricks serves plain HTTP on port 80; for production, put it behind TLS with your own domain (see the final section).
Step 1 - Deploy from the Azure Marketplace
- In the Azure portal, choose Create a resource and search the Marketplace for the cloudimg Formbricks offer.
- Select the plan, then Create.
- On the Basics tab pick your subscription, resource group and region, name the VM, and select Standard_B2s (or larger).
- Choose SSH public key authentication with admin username
azureuserand provide your public key. - On the Networking tab, allow inbound
22/tcpfrom your management network and80/tcpfor the web interface. - Review and create. When the VM is running, note its public IP address.
Step 2 - Deploy from the Azure CLI
az vm create \
--resource-group my-formbricks-rg \
--name formbricks \
--image cloudimg:formbricks:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
az vm open-port --resource-group my-formbricks-rg --name formbricks --port 80 --priority 900
Step 3 - Connect to your VM
Replace <vm-ip> with your VM's public IP address:
ssh azureuser@<vm-ip>
Step 4 - Confirm the services are running
Formbricks, its bundled PostgreSQL and cache, the Hub and Cube services, and nginx all come up automatically on first boot. Confirm the core services are active:
sudo systemctl is-active docker formbricks nginx
Expected output:
active
active
active
The stack runs as five containers on a private Docker network. PostgreSQL, the cache, Hub and Cube are never published to a host port; only Formbricks is published, and only to the loopback interface, with nginx in front on port 80.

Step 5 - Secure by default: the owner is pre seeded
On a fresh Formbricks instance the first account created owns it, and the setup wizard is open until someone completes it. On a public server that is a risk: whoever reaches it first would own your instance. The cloudimg image closes this. On first boot, before the port is reachable, a unique owner administrator is created with a per VM password, so the organization is already claimed. Open sign up is disabled (it is off by default in self hosted Formbricks) and blocked at nginx, and the setup wizard is closed, so new members join by invitation only.
You can see the whole posture at a glance. Self service sign up and the setup wizard are refused, a wrong Management API key is rejected, and only the per VM key is accepted:
curl -s -o /dev/null -w 'POST /auth/signup -> HTTP %{http_code}\n' -X POST http://127.0.0.1/auth/signup
curl -s -o /dev/null -w 'GET /setup -> HTTP %{http_code}\n' http://127.0.0.1/setup
Expected output (self registration and the setup wizard are both blocked):
POST /auth/signup -> HTTP 403
GET /setup -> HTTP 404

Step 6 - Read your unique credentials
Your per VM owner administrator, application secrets and Management API key are written to a root only file:
sudo cat /root/formbricks-credentials.txt
The file holds the Formbricks URL, the admin email (admin@formbricks.local), the per VM admin password and the per VM Management API key. Keep it safe.

Step 7 - Sign in to Formbricks
Open http://<vm-ip>/ in your browser. You are met with the Formbricks login screen: there is no anonymous access and no open sign up. Choose Login with Email and sign in with the admin email and the password from the credentials file.

Step 8 - Explore your surveys
After signing in you land on the Surveys list for your workspace. From here you can create a survey, filter by status and type, and open any survey to see its responses and summary. The left sidebar gives you Surveys, Contacts, Feedback Records, Dashboards and Settings.

Step 9 - Create and edit a survey
Choose New Survey to start from a template or a blank survey. In the editor you add and reorder questions by drag and drop, with question types for ratings, multiple choice, open text, NPS, matrix and more, and a live preview alongside. Configure styling, languages, logic and follow ups, then publish the survey to get a shareable link or embed it on your website or app.

Step 10 - Workspace settings and the Management API
Under Settings you manage your workspace name, survey languages, appearance, integrations and team access, and under the organization you manage teams, domain and API Keys. Create a scoped API key here to drive Formbricks from your own scripts with the documented Management API. The cloudimg image also pre generates a per VM key in the credentials file so you can call the API right away:
curl -H "x-api-key: fbk_<your-api-key>" http://<vm-ip>/api/v1/management/me

Step 11 - Check the stack health from the command line
Formbricks exposes an unauthenticated liveness endpoint, and a readiness endpoint that reports whether the database and other dependencies are reachable. They are handy for monitoring:
curl -s http://127.0.0.1/health
Expected output (a healthy app):
{"status":"ok"}

Step 12 - Invite your team and enable email
Because open sign up is disabled, add colleagues from Settings, Organization, Members while signed in as the owner. To send those invitations and email surveys, configure an SMTP server: set the SMTP_* values in /etc/formbricks/formbricks.env and restart the stack:
# Edit /etc/formbricks/formbricks.env and set:
# SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, MAIL_FROM
sudo systemctl restart formbricks
Step 13 - Production: your own domain with TLS
Formbricks serves plain HTTP on port 80. For production, point a DNS record at the VM, put Formbricks behind TLS, and set the application URL to your https domain so survey links and authentication callbacks use the right origin. A common approach is to add a certificate to nginx with Certbot:
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d surveys.<your-domain>
Then set WEBAPP_URL and NEXTAUTH_URL in /etc/formbricks/formbricks.env to https://surveys.<your-domain> and restart with sudo systemctl restart formbricks. See the Formbricks documentation for the full production checklist.
Support
Every cloudimg image includes 24/7 support. If you have any questions about deploying or operating Formbricks on Azure, contact the cloudimg team through the Azure Marketplace listing or at www.cloudimg.co.uk.