Deploying NocoDB Open-Source Airtable Alternative on Ubuntu 24.04
Step-by-step guide to deploy NocoDB with PostgreSQL, Docker Compose, and Traefik on Ubuntu 24.04 for a self-hosted Airtable-style platform secured with automatic HTTPS.

NocoDB is an open-source no-code platform that puts a spreadsheet-style UI on top of a relational database, with grid, form, Kanban, and gallery views plus a REST API. This guide deploys NocoDB using Docker Compose with a PostgreSQL backend and Traefik handling automatic HTTPS, then exercises the API with a sample base, following no-code database deployment practices documented in Vultr Docs.
Set Up the Directory Structure
1. Create the project directories:
mkdir -p ~/nocodb/{data,pgdata,letsencrypt}
cd ~/nocodb
2. Create the environment file:
nano .env
DOMAIN=nocodb.example.com
LETSENCRYPT_EMAIL=admin@example.com
POSTGRES_DB=postgres
POSTGRES_PASSWORD=strong_password
POSTGRES_USER=postgres
Deploy with Docker Compose
1. Create the Compose manifest:
nano docker-compose.yaml
services:
traefik:
image: traefik:v3.6
container_name: traefik
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
restart: unless-stopped
db:
image: postgres:16
container_name: nocodb-db
hostname: root_db
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- "./pgdata:/var/lib/postgresql/data"
healthcheck:
test: ["CMD", "pg_isready", "-U", "\({POSTGRES_USER}", "-d", "\){POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
nocodb:
image: nocodb/nocodb:0.301.2
container_name: nocodb
depends_on:
db:
condition: service_healthy
environment:
NC_DB: "pg://db:5432?u=\({POSTGRES_USER}&p=\){POSTGRES_PASSWORD}&d=${POSTGRES_DB}"
volumes:
- "./data:/usr/app/data"
expose:
- "8080"
labels:
- "traefik.enable=true"
- "traefik.http.routers.nocodb.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.nocodb.entrypoints=websecure"
- "traefik.http.routers.nocodb.tls.certresolver=letsencrypt"
- "traefik.http.services.nocodb.loadbalancer.server.port=8080"
restart: unless-stopped
2. Start the services:
docker compose up -d
3. Verify the services and tail logs:
docker compose ps
docker compose logs
Create the Super Admin
Open
https://nocodb.example.com.Register the Super Admin account with email and password.
Complete the onboarding wizard (role and workspace prefs).
Create a Base and Query the API
1. From the dashboard, create a base named Employee Directory.
2. Add a table named Employees with fields: Name (text), Email (text), Department (text).
3. Insert a sample record — for example, Jane Smith, jane@example.com, Engineering.
4. Generate an API token from the profile menu → API Tokens.
5. Copy the table ID from the table context menu.
6. Query the table over HTTPS:
curl -s -H "xc-token: YOUR_API_TOKEN" \
"https://nocodb.example.com/api/v2/tables/TABLE_ID/records" | jq
Next Steps
NocoDB is running and served securely over HTTPS. From here you can:
Add views (Grid, Form, Kanban, Gallery, Calendar) for the same table
Invite collaborators with role-based permissions per base
Wire automations to webhooks or Zapier/Make for downstream integrations
For the full guide with additional tips, visit the original article on Vultr Docs.






