Skip to main content

Command Palette

Search for a command to run...

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.

Updated
3 min read
Deploying NocoDB Open-Source Airtable Alternative on Ubuntu 24.04
S
A Developer Advocate with a focus on improving the developer experience through clear communication, technical enablement, and community engagement.
A
DevOps Engineer with experience in Kubernetes, automation, cloud infrastructure, and observability. I work in Developer Relations, contribute to technical documentation, and collaborate on engineering-focused projects.

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

  1. Open https://nocodb.example.com.

  2. Register the Super Admin account with email and password.

  3. 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.

The Self-Hosted Stack

Part 1 of 50

The Self-Hosted Stack is a developer-focused series exploring open-source tools you can deploy, run, and manage on your own infrastructure. From AI platforms and databases to developer tools, observability stacks, and authentication systems, each guide walks through deploying production-ready open-source software on Vultr cloud infrastructure.

More from this blog

V

Vultr

81 posts

Vultr is a global cloud infrastructure provider trusted by developers and businesses in 185+ countries. We publishe hands-on guides spanning Linux administration, server configuration, DevOps, networking, open source stacks, AI code agents, and Vultr product walkthroughs, all tested against real cloud environments and built for engineers who ship.