---
title: "NocoDB: Docker Compose i hosting jednym kliknięciem"
description: "NocoDB zmienia bazę danych w arkusze, formularze i tablice kanban dla każdego. Hostuj tę alternatywę dla Airtable z PostgreSQL u siebie w jeden klik."
---

[← Wszystkie szablony](https://pethost.dev/pl/templates/) · [Produktywność](https://pethost.dev/pl/templates/productivity/)

# Wdróż NocoDB jednym kliknięciem

Baza danych no-code: tabele jak arkusze kalkulacyjne, formularze, tablice kanban i kalendarze, z API

Alternatywa dla Airtable, hostowana u siebie.

[Wdróż na Pethost](https://console.pethost.dev/?template=nocodb)

## Czym jest NocoDB?

NocoDB to platforma bazodanowa no-code: tabele wyglądają i działają jak arkusz kalkulacyjny, a każdą można też oglądać jako formularz, galerię, tablicę kanban, kalendarz, mapę albo wykres Gantta. Pola przechowują tekst, liczby, daty, opcje wyboru, załączniki, formuły, powiązania z innymi tabelami, wyszukiwania (lookup) i zestawienia (rollup). Każda tabela ma REST API, webhooki uruchamiają się, gdy rekord zostanie utworzony, zmieniony albo usunięty, a tabele można importować z Airtable, CSV, Excela i JSON-a.

Zespoły używają NocoDB zamiast Airtable, żeby prowadzić CRM, inwentarz, kalendarz treści albo dowolną wspólną listę w bazie danych, którą kontrolują. Ten szablon uruchamia darmową edycję Community z PostgreSQL, tworzy superadministratora z pól formularza, zanim NocoDB komukolwiek odpowie, i zamyka rejestrację, więc ludzie dołączają tylko przez zaproszenie. Haczyk: licencja Sustainable Use License od twórców NocoDB pozwala na użytek wewnętrzny i osobisty, ale nie na odsprzedawanie aplikacji, a SSO i uprawnienia do poszczególnych tabel i pól są w płatnych planach do hostowania u siebie.

## Hosting NocoDB na Pethost

1. Logujesz się do Pethost kluczem dostępu, przez GitHub albo Google. Nie masz jeszcze maszyny? Wybierasz plan, a link czeka, aż będzie gotowa.
2. Okno „Nowy projekt” otwiera się na aplikacji NocoDB. Wypełniasz to, o co prosi, i klikasz „Utwórz projekt”: **E-mail**, **Hasło administratora**.
3. Za minutę czy dwie aplikacja NocoDB działa pod własnym adresem z HTTPS. Jej sekrety są tworzone losowo, a dane trafiają do nocnego backupu.
4. To projekt jak każdy inny: ty albo twój agent możecie go zmienić, cofnąć do wcześniejszej wersji albo przywrócić.

## Pytania o NocoDB

**Czy NocoDB jest darmowy?**

Edycja Community do hostowania u siebie jest darmowa, bez limitu rekordów i użytkowników, na licencji Sustainable Use License od twórców NocoDB: możesz jej używać we własnej firmie albo na własny użytek, ale nie możesz jej sprzedawać innym. Płatne plany do hostowania u siebie kosztują od 24 $ za użytkownika miesięcznie przy płatności rocznej i dodają SSO oraz uprawnienia do poszczególnych tabel i pól.

**NocoDB czy Airtable: czym się różnią?**

Oba pokazują tabele jak arkusze kalkulacyjne, z formularzami, kanbanem i galeriami. Airtable działa tylko w chmurze Airtable, z ceną za użytkownika, a NocoDB tam, gdzie go wdrożysz, i jego edycja Community nie ogranicza liczby rekordów.

**Czy mogę zaimportować bazy z Airtable do NocoDB?**

Tak. NocoDB importuje bazę z jej linku udostępniania, z osobistym tokenem dostępu Airtable, który może odczytywać rekordy, i przenosi tabele, widoki i rekordy. Pola formuł nie przechodzą, a link do udostępnionego widoku przenosi tylko tę jedną tabelę.

**Czy NocoDB ma API?**

Tak. Każda tabela ma REST API, wywoływane z tokenem API, a webhooki wysyłają żądanie, gdy rekord zostanie utworzony, zmieniony albo usunięty, więc inne aplikacje i skrypty mogą czytać i zapisywać dane.

**Jak dodać ludzi do NocoDB?**

W zakładce Members & teams → Dodaj Członków, e-mailem albo prywatnym linkiem z zaproszeniem, z wybraną rolą. Ten szablon zamyka publiczną rejestrację, więc bez zaproszenia nikt nie dołączy. NocoDB wysyła zaproszenia e-mailem, gdy w pliku .env projektu są NC_SMTP_HOST i pozostałe ustawienia NC_SMTP_.

**Ile pamięci i miejsca na dysku potrzebuje NocoDB?**

NocoDB zajmuje około 800 MB pamięci razem z Postgresem, a jego baza danych rośnie wraz z rekordami; załączniki zajmują tyle miejsca, co ich pliki. Na Pethost wystarczy mu plan Starter, z miejscem na inne aplikacje obok.

## NocoDB: plik Docker Compose

Szablon to ten compose.yaml i zmienne zapisywane do .env projektu przy jego tworzeniu. Pethost uruchamia plik dokładnie tak, jak jest napisany.

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

**Wolumeny, w nocnym backupie:** 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:
```

[compose.yaml](https://pethost.dev/templates/nocodb/compose.yaml)[Zobacz na GitHubie](https://github.com/pethost-dev/templates/tree/main/nocodb)

## [Więcej w kategorii Produktywność](https://pethost.dev/pl/templates/productivity/)

- [**Mealie**Menedżer przepisów i planer posiłków](https://pethost.dev/pl/templates/mealie/)
- [**Ryot**Dziennik filmów, seriali, książek, gier i treningów](https://pethost.dev/pl/templates/ryot/)
- [**Vikunja**Listy zadań i projekty, z widokiem kanban i Gantta](https://pethost.dev/pl/templates/vikunja/)
- [**Excalidraw**Tablica do diagramów i szkiców w stylu odręcznym, ze współpracą w czasie rzeczywistym](https://pethost.dev/pl/templates/excalidraw/)
- [**Odoo**Aplikacje dla firmy w jednym: CRM, sprzedaż, fakturowanie, magazyn, strona internetowa, projekty i nie tylko](https://pethost.dev/pl/templates/odoo/)
- [**PLANKA**Tablice kanban dla projektów i zespołów, aktualizowane u wszystkich w czasie rzeczywistym](https://pethost.dev/pl/templates/planka/)

Pethost · Stephan Gomer · NIP 1133096755

Pethost

- [Szablony](https://pethost.dev/pl/templates/)
- [O nas](https://pethost.dev/about/)
- [Dokumentacja](https://pethost.dev/docs/)
- [Blog](https://pethost.dev/pl/blog/)
- [API](https://pethost.dev/docs/api/)
- [CLI](https://pethost.dev/docs/cli/)
- [Plugin](https://github.com/pethost-dev/plugin)
- [Regulamin](https://pethost.dev/terms/)
- [Prywatność](https://pethost.dev/privacy/)
- [Zwroty](https://pethost.dev/refunds/)
- [support@pethost.dev](mailto:support@pethost.dev)

Bazy danych

- [Postgres](https://pethost.dev/pl/postgres/)

Porównania

- [Coolify vs Dokploy vs CapRover vs Dokku](https://pethost.dev/pl/blog/coolify-vs-dokploy-vs-caprover-vs-dokku/)
- [Coolify Cloud vs Dokploy Cloud](https://pethost.dev/pl/blog/coolify-cloud-vs-dokploy-cloud/)
- [Cennik Railway vs Render vs Fly.io](https://pethost.dev/pl/blog/railway-vs-render-vs-fly-io-pricing/)
- [Zarządzany hosting Docker Compose](https://pethost.dev/pl/blog/managed-docker-compose-hosting/)

Alternatywy

- [Alternatywy dla Railway](https://pethost.dev/pl/blog/railway-alternatives/)
- [Alternatywy dla Heroku](https://pethost.dev/pl/blog/heroku-alternatives/)
- [Alternatywy dla Dokploy](https://pethost.dev/pl/blog/dokploy-alternatives/)
- [Alternatywy dla Coolify](https://pethost.dev/pl/blog/coolify-alternatives/)
- [Alternatywy dla Render](https://pethost.dev/pl/blog/render-alternatives/)
- [Alternatywy dla Sliplane](https://pethost.dev/pl/blog/sliplane-alternatives/)
