Deployment guide

Baserow

Overview

Baserow is an open-source, no-code online database and a friendly alternative to Airtable. Create tables, link records with relations, and visualize your data with grid, gallery, form and kanban views, all through a modern spreadsheet-style web interface. A complete REST API and webhooks cover automation.

The SecureAnyCloud 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. systemd manages the container and nginx fronts it. 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.

Baserow is a trademark of Baserow B.V. This image is produced by SecureAnyCloud 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 you get:

  • 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 80 reverse-proxying the app (including WebSocket support for realtime) with an unauthenticated /healthz endpoint
  • baserow.service and baserow-firstboot.service as 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/baserow holding the PostgreSQL cluster, uploads and Redis data, captured into the image and re-provisioned with every VM
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_D2s_v4 (2 vCPU / 8 GiB RAM) is a good starting size. The all-in-one image bundles PostgreSQL, Redis and the application, so do not go below 4 GiB of RAM.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network, and 80/tcp (plus 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 Step 10).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure portal, choose Create a resource, search the Marketplace for Baserow by SecureAnyCloud, and select Create.

On the Basics tab, 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 select Review + create and Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:baserow-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name baserow \
  --image sac1647283583153:baserow-ubuntu-24-04:default:latest \
  --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

Connect over SSH as azureuser:

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

On first boot, the image starts the Baserow container, resolves the VM's public URL, and initializes a clean database with fresh per-VM secrets. Confirm that 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, because nginx owns port 80. The container status shows healthy.

Step 5 - Check the health endpoints

Query the unauthenticated liveness endpoint that nginx serves and the backend health check that Baserow exposes:

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 redirects 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, so claim the instance as soon as it boots, before anyone 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.

Right after you register, close the sign-up window so that 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, 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, which suits catalogs 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 account (once, in Step 6) and authenticate to obtain a token. You can then read and write rows programmatically. This example 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. In the Baserow UI, open a database and choose View API Docs. The documentation includes 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 per-VM application secrets all live there. The disk is captured into the image and re-provisioned on every VM. Confirm the mount:

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, use your own domain and terminate TLS. Point a DNS record at the VM, then pin your domain:

# /etc/baserow/baserow.env
# sac-managed: no BASEROW_PUBLIC_URL=https://baserow.example.com

Set the marker line to # sac-managed: no so that the image does not overwrite your value, then restart Baserow:

sudo systemctl restart baserow

Terminate TLS at nginx by adding a 443 server block with your certificate, for example via Certbot. Alternatively, 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. Run sudo journalctl -u baserow -f and sudo docker logs -f baserow.
  • Restart and stop. Run sudo systemctl restart baserow to restart and sudo systemctl stop baserow to stop.
  • Backups. Back up the /var/lib/baserow data disk with Azure disk snapshots. It 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, run sudo docker pull baserow/baserow:<new-tag>, then run sudo systemctl daemon-reload && sudo systemctl restart baserow. Review the Baserow release notes for migration guidance first, and snapshot the data disk beforehand.

Support

SecureAnyCloud maintains this image and provides 24/7 support. For help deploying or operating Baserow on Azure, contact SecureAnyCloud support through the Azure Marketplace listing.

Deploy on Azure

Launch Baserow on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure