Português
Começar

← Todos os templates · Produtividade

Faça deploy de NocoDB em um clique

Um banco de dados no-code: tabelas como planilhas, formulários, quadros kanban e calendários, com uma API

Uma alternativa auto-hospedada para Airtable.

O que é NocoDB?

O NocoDB é uma plataforma de banco de dados no-code: as tabelas parecem e funcionam como uma planilha, e cada uma também pode ser vista como formulário, galeria, quadro kanban, calendário, mapa ou gráfico de Gantt. Os campos guardam texto, números, datas, seleções, anexos, fórmulas, links para outras tabelas, referências e valores acumulados. Cada tabela tem uma API REST, webhooks disparam quando registros são criados, atualizados ou excluídos, e as tabelas podem ser importadas do Airtable, de CSV, de Excel e de JSON.

Equipes usam o NocoDB no lugar do Airtable para manter um CRM, um inventário, um calendário de conteúdo ou qualquer lista compartilhada num banco de dados que elas controlam. Este template roda a edição Community, gratuita, com PostgreSQL, cria o super administrador a partir dos campos antes de o NocoDB responder a qualquer pessoa e fecha o cadastro, então as pessoas só entram por convite. O porém: a Sustainable Use License do NocoDB permite uso interno e pessoal, mas não revendê-lo, e SSO e permissões por tabela e por campo ficam nos planos pagos auto-hospedados.

Hospedagem de NocoDB no Pethost

  1. Você entra no Pethost com uma passkey, GitHub ou Google. Ainda não tem máquina? Você escolhe um plano, e o link espera até ela ficar pronta.
  2. Novo projeto abre em NocoDB. Você preenche o que ele pede e clica em Criar projeto: E-mail, Senha do administrador.
  3. Em um ou dois minutos NocoDB está no ar no próprio endereço com HTTPS. Os segredos são gerados ao acaso, e os dados vão para o backup noturno.
  4. É um projeto como qualquer outro: você ou seu agente podem alterá-lo, fazer rollback ou restaurá-lo.

Perguntas sobre NocoDB

O NocoDB é gratuito?

A edição Community auto-hospedada é gratuita, com registros e usuários ilimitados, sob a Sustainable Use License do NocoDB: você pode usá-la dentro da sua própria empresa ou para uso pessoal, mas não vendê-la a outros. Os planos pagos auto-hospedados começam em US$ 24 por usuário por mês, com cobrança anual, e adicionam SSO e permissões por tabela e por campo.

NocoDB ou Airtable: qual é a diferença?

Os dois mostram tabelas como planilhas, com formulários, kanban e galerias. O Airtable roda só na nuvem dele, cobrado por usuário, enquanto o NocoDB roda onde você fizer o deploy dele, e a edição Community não impõe limite de registros.

Posso importar minhas bases do Airtable para o NocoDB?

Sim. O NocoDB importa uma base a partir do link compartilhado dela, com um token de acesso pessoal do Airtable que possa ler registros, e traz as tabelas, as visualizações e os registros. Campos de fórmula não vêm junto, e o link de uma visualização compartilhada traz só aquela tabela.

O NocoDB tem API?

Sim. Cada tabela tem uma API REST, chamada com um token de API, e webhooks enviam uma requisição quando um registro é criado, atualizado ou excluído, então outros apps e scripts podem ler e gravar os dados.

Como adiciono pessoas ao NocoDB?

Em Members & teams → Adicionar Membros, por e-mail ou com um link de convite privado, escolhendo a função de cada um. Este template fecha o cadastro público, então ninguém entra sem convite. O NocoDB envia os convites por e-mail depois que o NC_SMTP_HOST e as outras variáveis NC_SMTP_ estiverem no .env do projeto.

De quanta memória e disco NocoDB precisa?

O NocoDB usa cerca de 800 MB de memória com o Postgres, e o banco de dados dele cresce com os seus registros; os anexos ocupam o que os arquivos deles ocupam. No Pethost, o plano Starter basta, com espaço para outros apps ao lado.

Arquivo Docker Compose de NocoDB

O template é este compose.yaml e as variáveis gravadas no .env do projeto quando ele é criado. O Pethost roda o arquivo exatamente como está escrito.

Containers: nocodb (nocodb/nocodb:2026.10.0), postgres (postgres:18-alpine).

Volumes, no backup noturno: data, db.

services:
  nocodb:
    image: nocodb/nocodb:2026.10.0
    restart: unless-stopped
    # Any setting of NocoDB can be added to the project's .env, such as NC_SMTP_HOST and the other
    # NC_SMTP_ settings, which send its invitations and password resets by email.
    env_file: .env
    environment:
      NC_DB: pg://postgres:5432?u=nocodb&p=${POSTGRES_PASSWORD}&d=nocodb
      NC_AUTH_JWT_SECRET: ${JWT_SECRET}
      NC_SITE_URL: ${URL}
      # The super admin is made from these at the first start, before NocoDB answers anyone, and
      # its email and password are set again from them at every start: change them here.
      NC_ADMIN_EMAIL: ${ADMIN_EMAIL}
      NC_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      # Uploaded files are served only to those signed in, through links that expire.
      NC_SECURE_ATTACHMENTS: "true"
    # A new NocoDB lets anyone sign up, and only its super admin closes that, in Account → Setup.
    # So until that setting has been saved once, NocoDB runs on port 8081, which nobody reaches,
    # and the super admin closes sign-up there; only then does it answer on 8080. Turned on again
    # in NocoDB later, sign-up stays open.
    command:
      - sh
      - -c
      - |
        set -e
        cd /usr/src/app
        if ! node -e '
          const { Client } = require("pg");
          const url = new URL(process.env.NC_DB);
          const params = url.searchParams;
          const connection = { host: url.hostname, port: Number(url.port), user: params.get("u"), password: params.get("p"), database: params.get("d") };
          (async () => {
            for (let i = 0; i < 60; i++) {
              const db = new Client(connection);
              try {
                await db.connect();
                const result = await db.query("select 1 from nc_store where key = $$1", ["nc-app-settings"]);
                process.exit(result.rowCount > 0 ? 0 : 1);
              } catch (error) {
                // No such table: a new database, which the migrations of NocoDB have yet to fill.
                if (error.code === "42P01") process.exit(1);
                await db.end().catch(() => {});
                await new Promise((done) => setTimeout(done, 1000));
              }
            }
            process.exit(1);
          })();
        '; then
          PORT=8081 node --no-wasm-dynamic-tiering --no-wasm-tier-up docker/index.js &
          setup=$$!
          node -e '
            const base = "http://127.0.0.1:8081";
            const call = async (path, body, token) => {
              const response = await fetch(base + path, {
                method: "POST",
                headers: { "content-type": "application/json", ...(token ? { "xc-auth": token } : {}) },
                body: JSON.stringify(body)
              });
              if (!response.ok) throw new Error(path + ": " + response.status + " " + (await response.text()));
              return response.json();
            };
            const closeSignUp = async () => {
              const { token } = await call("/api/v1/auth/user/signin", { email: process.env.NC_ADMIN_EMAIL, password: process.env.NC_ADMIN_PASSWORD });
              await call("/api/v1/app-settings", { invite_only_signup: true }, token);
            };
            (async () => {
              let failure;
              for (let i = 0; i < 300; i++) {
                try {
                  return await closeSignUp();
                } catch (error) {
                  failure = error;
                  await new Promise((done) => setTimeout(done, 1000));
                }
              }
              console.error(failure);
              process.exit(1);
            })();
          '
          kill $$setup
          wait $$setup || true
        fi
        exec /usr/src/appEntry/start.sh
    volumes:
      - data:/usr/app/data
    depends_on:
      postgres:
        condition: service_healthy
    # The port listens before NocoDB is ready: the deploy waits for its health.
    healthcheck:
      test: ["CMD-SHELL", "wget -q --tries=1 --spider http://127.0.0.1:8080/api/v1/health || exit 1"]
      interval: 5s
      timeout: 5s
      retries: 5
      start_period: 120s

  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: nocodb
      POSTGRES_USER: nocodb
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - db:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U nocodb -d nocodb"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 30s

volumes:
  data:
  db:

Mais em Produtividade