Deploy NocoDB on a single server with Docker, Traefik, and automatic HTTPS.
A single command runs NocoDB with Postgres + Redis, sets up Traefik with automatic Let's Encrypt SSL, and gives you a working HTTPS endpoint.
Everything runs on one server: app, database, cache, and proxy. For a managed database, multiple app replicas, or Kubernetes, see Custom infrastructure.
Prerequisites:Docker with the Compose v2 plugin, on a host with ports 80 and 443 reachable. A Linux server is recommended for production; macOS and Windows (Git Bash or WSL) work too. If using a real domain, point its DNS A record at this host's public IP before running the installer.
Just evaluating locally? The Quickstart is the simpler path on Mac or Windows. This installer runs there too, but its HTTPS setup assumes a host reachable at your domain on ports 80 and 443.
Must resolve to this server. Blank or localhost gives local mode (port 8080); a bare IP serves plaintext HTTP on port 80. Both skip SSL.
Postgres
1 (Bundled) or 2 (Existing)
Bundled is the typical choice. Choose Existing to use a managed database (RDS, Cloud SQL, etc.).
Redis
1 (Bundled) or 2 (Existing)
Same idea.
Let's Encrypt email
ops@example.com
Only asked when you provided a real domain. Used for SSL certificate renewal notifications.
After you confirm the summary, the installer writes everything into nocodb/, pulls the images, and starts the stack. The first run can take a few minutes.
./nocodb/├── docker-compose.yml # Service orchestration├── docker.env # Environment variables├── .gitignore # Keeps secrets and runtime data out of version control├── nocodb/│ └── db.json # Database connection (knex format, supports custom CA)├── update.sh # docker compose pull && up -d && image prune└── letsencrypt/ # Traefik ACME storage (production with a real domain)
Postgres, Redis, and NocoDB application data (including attachments) are stored in Docker-managed named volumes, not in this directory. Run docker volume ls to see them. They survive docker compose down.
If you already have nginx, Caddy, or a load balancer in front, run the installer with a blank domain (local mode). NocoDB then listens on port 8080. Forward the X-Forwarded-Proto and Host headers from your proxy so NocoDB generates correct callback URLs. For more control, see Custom infrastructure.
Once the stack is up and you can sign in, walk through this checklist before opening it to real traffic:
Firewall. Allow only the ports you need (22 for SSH, 80+443 for HTTPS). On Ubuntu/Debian: sudo ufw allow OpenSSH && sudo ufw allow 80,443/tcp && sudo ufw enable. On RHEL family: firewall-cmd --add-service=ssh --add-service=http --add-service=https --permanent && firewall-cmd --reload.
Verify secret-file permissions. The installer already restricts docker.env and nocodb/db.json to 600. Re-apply if you copied or edited them by hand:
cd nocodbchmod 600 docker.env nocodb/db.json
SELinux (RHEL, Rocky, Alma, Fedora). Named volumes are relabeled by Docker automatically, so the data volumes need no action. The remaining bind mounts are the config files and the letsencrypt/ directory. If SELinux is in Enforcing mode (getenforce) and those are denied, add the :Z suffix to their entries in docker-compose.yml (e.g. ./letsencrypt:/letsencrypt:Z).
License activation outbound. NocoDB calls https://app.nocodb.com/api/v1/on-premise/agent over TCP 443 every 6 hours. If you filter egress by host or path, allowlist exactly that. For fully offline servers, see Airgapped license.
Log rotation. Docker's json-file log driver grows unbounded by default. Add a global cap in /etc/docker/daemon.json:
Restart Docker (sudo systemctl restart docker) for the change to apply.
systemd unit (optional but recommended). The default Compose stack restarts containers on Docker daemon restart, but a systemd unit makes the deployment itself a managed service. Create /etc/systemd/system/nocodb.service:
[Unit]Description=NocoDBRequires=docker.serviceAfter=docker.service network-online.target[Service]Type=oneshotRemainAfterExit=yesWorkingDirectory=/path/to/nocodbExecStart=/usr/bin/docker compose up -dExecStop=/usr/bin/docker compose down[Install]WantedBy=multi-user.target
Once NocoDB is running, sign up as the first user and go to Admin Panel → License to paste your key. See Purchase a license and License activation for the full flow.