What is NocoDB
NocoDB is an open-source, no-code platform that puts a spreadsheet-style UI on top of your existing SQL databases. Think of it as a self-hosted Airtable: you connect it to MySQL, PostgreSQL, SQLite, or MariaDB, and it gives you a visual table editor, form builder, gallery views, and a REST/GraphQL API — without writing any SQL.
It does not store or manage data itself. NocoDB is a UI and API layer that sits in front of databases you already run. Your data stays in your SQL database; NocoDB is just how you look at and interact with it.
One of the main benefits is speed: spinning up a working CRUD interface for an existing database takes minutes, not days. You can give non-technical teammates access to specific tables through a clean interface while keeping the raw database locked down.
NocoDB is built on Node.js and deploys easily via Docker. It supports role-based access control (owner, editor, commenter, viewer), shareable views, webhooks, and a no-code form builder for data entry. All the heavy lifting — storage, replication, backups — is handled by the underlying SQL database you connect it to.
NocoDB Supported DBs
-
Oracle DB: Oracle supports PL/SQL and SQL language to write queries to access data from its database.
-
Microsoft SQL server: Microsoft SQL Server is a relational database management system (RDBMS) that supports a wide variety of transaction processing, business intelligence and analytics applications in corporate IT environments..
-
PostgreSQL: PostgreSQL is a powerful, open-source relational database that is known for its performance, reliability, and robust feature set. It supports a wide range of data types and provides a powerful query language.
-
MySQL / Mariadb: MySQL is a popular open-source relational database that is widely used in web-based applications. It is known for its performance and scalability and supports a wide range of data types.
-
SQLite: SQLite is a lightweight, serverless relational database that is widely used in embedded systems and mobile applications. It is easy to use and requires no setup or administration.
Install via docker compose
create a docker-compose.yml and add the following to it
version: "2.1"services: nocodb: depends_on: nocodb_db: condition: service_healthy environment: NC_DB: "mysql2://nocodb:3306?u=nocodb&p=nocodb&d=nocodb" image: "nocodb/nocodb:latest" ports: - "8080:8080" restart: always volumes: - "./nc_data:/usr/app/data"
nocodb_db: environment: MYSQL_DATABASE: nocodb MYSQL_PASSWORD: nocodb MYSQL_ROOT_PASSWORD: nocodb_r MYSQL_USER: nocodb healthcheck: retries: 10 test: - CMD - mysqladmin - ping - "-h" - localhost timeout: 20s image: "mysql:8.0.32" restart: always volumes: - "./db_data:/var/lib/mysql"Run the following command in the terminal from the directory where the docker-compose.yml file is located:
docker-compose up -dThis command will start the NocoDB service in the background and map port 8080 of the container to port 8080 of your host machine. It will also create a data directory in the current directory and map it to the /usr/app/data directory in the container. This directory will be used to store the NocoDB data files.
wait for a few seconds and make your way to http://localhost:8080.
et voila! you have nocodb running. head to their docs sitedocs site for more info.
Related Reading
- Appwrite Backend-as-a-service (BaaS)
- How to install NextCloud via Docker
- Uptime Monitoring with Uptime Kuma
- Wiki.js for your documentation in docker
- Automatic Backup of Docker MySQL or MariaDB Containers
Things That Will Bite You
NocoDB is genuinely good, but “et voila” covers a lot of sins. Here’s what the docs don’t front-load.
The NC_DB string is unforgiving
That connection string format — mysql2://host:port?u=user&p=pass&d=db — is NocoDB’s own thing, not a standard URI. Get one character wrong and the container starts fine, logs nothing useful, and you spend 20 minutes staring at a spinner on the login page. Confirm the connection is actually working:
# tail logs right after docker-compose up -ddocker compose logs -f nocodb# look for: "NocoDB started successfully"# not for: "NC_DB connection failed" (which is weirdly quiet)If you’re connecting to an existing external database instead of the sidecar MySQL, use NC_DB pointing at your real host. Don’t forget to open the port on the database host — NocoDB is making a network connection from inside the container, so localhost on the host machine means nothing to it.
Volumes or you will lose your metadata
NocoDB stores its own metadata (views, forms, API tokens, user accounts) separately from your actual database. That lives in /usr/app/data inside the container. The Compose file above maps it correctly — but if you nuke the container without the volume, you lose all your configured views, API keys, and user accounts. Your underlying SQL data is fine; your NocoDB setup is gone. Back up nc_data/ alongside your database dumps.
Role-based access gotcha
The “viewer” role can see data but can’t be restricted to specific rows — only specific tables/views. If you’re giving a non-technical colleague access to a customer table and don’t want them seeing everything, create a filtered view first, then share that view. Sharing the base table directly gives them the full dataset.
Hooking NocoDB’s API into a script
One of the more useful things NocoDB gives you for free is a REST API on top of whatever database you point it at. Here’s a quick curl to pull rows from a table once you’ve grabbed your API token from the UI (Account → Team & Auth → API Tokens):
# list rows from a table — replace TABLE_ID and your tokencurl -s \ -H "xc-token: YOUR_API_TOKEN" \ "http://localhost:8080/api/v1/db/data/noco/YOUR_PROJECT_ID/TABLE_ID?limit=25" \ | jq '.list[] | {id, title}'The project ID and table ID are in the URL when you’re looking at the table in the browser. Combine this with a cron job or a tiny Python script and you’ve got a no-code database with a real API — which is honestly the use case that makes NocoDB shine beyond “Airtable but free.”