Baserow on Ubuntu 24.04 on Azure User Guide
Overview
Baserow is an open-source, no-code online database and a friendly alternative to Airtable. You create tables, link records with relations, and visualise your data with grid, gallery, form and kanban views, all through a modern spreadsheet-style web interface, plus a complete REST API and webhooks for automation. The cloudimg image runs the free and open-source (MIT-licensed) Baserow core the officially supported way: the upstream all-in-one Docker image, which bundles the Django backend, the Nuxt frontend, PostgreSQL, Redis and Celery, managed by systemd and fronted by nginx. The pinned image is captured into the VM so your instance starts in seconds, all application secrets are generated uniquely per VM on first boot, and the database and uploads live on a dedicated Azure data disk. Backed by 24/7 cloudimg support.
Baserow is a trademark of Baserow B.V. This image is produced by cloudimg and is not affiliated with, endorsed by, or sponsored by Baserow B.V. It ships only the free and open-source MIT-licensed Baserow core; no premium or enterprise features are enabled.
What is included:
- Baserow 2.3.1 (free and open-source MIT core) running as the official all-in-one Docker container (Django, Nuxt, PostgreSQL, Redis and Celery bundled)
- Docker Engine (Docker CE), with the container bound to the loopback interface only
- nginx on port
80reverse-proxying the app (including WebSocket support for realtime) with an unauthenticated/healthzendpoint baserow.serviceandbaserow-firstboot.serviceas systemd units, enabled and active on boot- Per-VM application secrets (Django
SECRET_KEY, the JWT signing key, and the PostgreSQL and Redis passwords) generated on first boot into the data volume, never baked into the image - A dedicated 20 GiB Azure data disk at
/var/lib/baserowholding the PostgreSQL cluster, uploads and Redis data, captured into the image and re-provisioned with every VM - 24/7 cloudimg support

Prerequisites
An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. Standard_D2s_v4 (2 vCPU / 8 GiB RAM) is a good starting point; the all-in-one image bundles PostgreSQL, Redis and the application, so do not go below 4 GiB of RAM. NSG inbound: allow 22/tcp from your management network and 80/tcp (and 443/tcp once you add TLS) for the web interface. Baserow 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
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Baserow by cloudimg, and select Create. On Basics pick your subscription, resource group, region and size; under Administrator account choose SSH public key and paste your key; under Inbound port rules allow SSH (22) and HTTP (80). Review the dedicated data disk on the Disks tab, then Review + create then Create.
Step 2 - Deploy from the Azure CLI
az vm create \
--resource-group <your-rg> \
--name baserow \
--image <marketplace-image-urn> \
--size Standard_D2s_v4 \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name baserow --port 80 --priority 1010
Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>
Step 4 - Confirm the services are running
On first boot the image starts the Baserow container, resolves the VM public URL, and initialises a clean database with fresh per-VM secrets. Confirm the services are active and that the container is bound to the loopback interface behind nginx:
systemctl is-active docker baserow nginx baserow-firstboot
sudo ss -tlnp | grep -E ':80 |127.0.0.1:3000'
sudo docker ps --format 'table {{.Image}}\t{{.Status}}'
All four services report active, the Baserow container listens only on 127.0.0.1:3000 (nginx owns port 80), and the container status shows healthy.

Step 5 - Check the health endpoints
nginx serves an unauthenticated liveness endpoint, and Baserow exposes its own backend health check:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/healthz
curl -s http://127.0.0.1/api/_health/; echo
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/
/healthz prints 200, the Baserow backend health check prints OK, and the web app root returns a redirect to the login page.

Step 6 - Register your administrator account immediately
This is the most important step. Baserow ships with no default login: the first person to open the web interface and register becomes the administrator. There is no shipped password and nothing to rotate, which means you must claim the instance the moment it boots so that nobody else can. Open the web interface in your browser:
http://<vm-public-ip>/
Click Sign up, then create your account with your email address and a strong password. This first account is your admin.

Immediately after registering, close the signup window so no further self-registration is possible: click your account (bottom-left) then Settings, open the Admin section, and turn off Allow new users to sign up. From then on you add users by inviting them to a workspace.
Step 7 - Build a table and explore the views
Create a workspace, add a database, and create your first table. Baserow behaves like a spreadsheet: add fields (text, number, single select, date, boolean, link-to-table and more), then type your data directly into the grid view.

Add more views of the same data without duplicating it. A gallery view turns each record into a card, ideal for catalogues and visual data:

A form view generates a shareable web form that writes submissions straight back into your table, so anyone can add records without an account:

Step 8 - Use the REST API
Every table you create is instantly available through Baserow's REST API. Register your admin (once, from Step 6) and authenticate to obtain a token, then read and write rows programmatically. The example below authenticates and lists your workspaces:
# Obtain a JWT access token
curl -s -X POST http://<vm-public-ip>/api/user/token-auth/ \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"<your-password>"}'
# Use the access_token from the response
curl -s http://<vm-public-ip>/api/workspaces/ \
-H 'Authorization: JWT <access_token>'
Each database also publishes auto-generated API documentation from the Baserow UI (open a database then choose View API Docs), including per-table endpoints for creating, reading, updating and deleting rows.
Step 9 - Data and secrets on the dedicated disk
The container's /baserow/data volume is bind-mounted from the dedicated Azure data disk at /var/lib/baserow. The embedded PostgreSQL cluster, uploaded files, Redis data and the per-VM application secrets all live there and are captured into the image and re-provisioned on every VM:
df -h /var/lib/baserow | tail -1
findmnt -no SOURCE,TARGET,FSTYPE /var/lib/baserow
sudo ls /var/lib/baserow

A short notes file records the first-signup model and the resolved public URL for this VM (it contains no password, because Baserow ships none):
sudo cat /root/baserow-notes.txt

Step 10 - Set your own domain and add TLS for production
By default the image resolves the VM's public IP on every boot and sets it as BASEROW_PUBLIC_URL, so the app works immediately. For production you should use your own domain and terminate TLS. Point a DNS record at the VM, then pin your domain:
# /etc/baserow/baserow.env
# cloudimg-managed: no
BASEROW_PUBLIC_URL=https://baserow.example.com
Set the marker line to # cloudimg-managed: no so the image does not overwrite your value, then restart Baserow:
sudo systemctl restart baserow
Terminate TLS at nginx (add a 443 server block with your certificate, for example via Certbot) or place the VM behind an Azure Application Gateway or a load balancer with a managed certificate. Baserow's realtime features use WebSockets, which the bundled nginx configuration already forwards.
Maintenance
- Logs:
sudo journalctl -u baserow -fandsudo docker logs -f baserow. - Restart / stop:
sudo systemctl restart baserowandsudo systemctl stop baserow. - Backups: back up the
/var/lib/baserowdata disk (Azure disk snapshots), which contains the entire PostgreSQL database and all uploads. - Upgrades: Baserow is pinned to a specific image tag for reproducibility. To upgrade, edit the image tag in
/etc/systemd/system/baserow.service, runsudo docker pull baserow/baserow:<new-tag>, thensudo systemctl daemon-reload && sudo systemctl restart baserow. Review the Baserow release notes for migration guidance first, and snapshot the data disk beforehand.
Support
This image is maintained by cloudimg with 24/7 support. For help deploying or operating Baserow on Azure, contact cloudimg support through the Azure Marketplace listing.