services: nocodb: image: nocodb/nocodb-ee:latest env_file: docker.env deploy: mode: replicated replicas: 1 depends_on: - db - redis - minio restart: unless-stopped volumes: - ./nocodb:/usr/app/data labels: - "com.centurylinklabs.watchtower.enable=true" - "traefik.enable=true" - "traefik.http.routers.nocodb.rule=Host(`{{PLACEHOLDER_NOCODB_DOMAIN}}`)" - "traefik.http.routers.nocodb.entrypoints=websecure" - "traefik.http.routers.nocodb.tls=true" - "traefik.http.routers.nocodb.tls.certresolver=letsencrypt" networks: - nocodb-network worker: image: nocodb/nocodb-ee:latest env_file: docker.env environment: - NC_WORKER_CONTAINER=true networks: - nocodb-network depends_on: - nocodb restart: unless-stopped volumes: - ./nocodb:/usr/app/data labels: - "com.centurylinklabs.watchtower.enable=true" traefik: image: traefik:v3.1 command: - "--api.insecure=true" - "--providers.docker=true" - "--entrypoints.web.address=:80" - "--providers.docker.exposedByDefault=false" - "--entrypoints.websecure.address=:443" - "--entrypoints.minio.address=:9000" - "--entrypoints.minio-console.address=:9001" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - "--certificatesresolvers.letsencrypt.acme.email=contact@{{PLACEHOLDER_NOCODB_DOMAIN}}" - "--certificatesresolvers.letsencrypt.acme.storage=/etc/letsencrypt/acme.json" ports: - "80:80" - "443:443" restart: unless-stopped volumes: - "/var/run/docker.sock:/var/run/docker.sock" - ./letsencrypt:/etc/letsencrypt networks: - nocodb-network db: image: postgres:16.6 environment: POSTGRES_USER: "{{PLACEHOLDER_PG_USER}}" POSTGRES_PASSWORD: "{{PLACEHOLDER_PG_PASSWORD}}" POSTGRES_DB: postgres volumes: - ./postgres:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 networks: - nocodb-network redis: image: redis:latest restart: unless-stopped command: - /bin/sh - -c - redis-server healthcheck: test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] volumes: - ./redis:/data networks: - nocodb-network minio: image: minio/minio:latest restart: unless-stopped entrypoint: /bin/sh volumes: - ./minio:/export command: -c "mkdir -p /export/nocodb && /usr/bin/minio server /export --console-address \":9001\"" environment: - MINIO_ROOT_USER=nc_minio_user - MINIO_ROOT_PASSWORD={{PLACEHOLDER_MINIO_ROOT_PASSWORD}} - MINIO_BROWSER_REDIRECT_URL=https://{{PLACEHOLDER_MINIO_DOMAIN}}/minio/ui/ - MINIO_SERVER_URL=https://{{PLACEHOLDER_MINIO_DOMAIN}} labels: # Main MinIO Service (Port 9000) - "traefik.enable=true" - "traefik.http.services.minio.loadbalancer.server.port=9000" - "traefik.http.routers.minio.rule=Host(`{{PLACEHOLDER_MINIO_DOMAIN}}`)" - "traefik.http.routers.minio.entrypoints=websecure" - "traefik.http.routers.minio.tls=true" - "traefik.http.routers.minio.tls.certresolver=letsencrypt" - "traefik.http.routers.minio.service=minio" # MinIO Console Service (Port 9001) - "traefik.http.services.minio-console.loadbalancer.server.port=9001" - "traefik.http.routers.minio-console.rule=Host(`{{PLACEHOLDER_MINIO_DOMAIN}}`) && PathPrefix(`/minio/ui`)" - "traefik.http.middlewares.minio-console-stripprefixregex.stripprefixregex.regex=^/minio/ui" - "traefik.http.routers.minio-console.middlewares=minio-console-stripprefixregex" - "traefik.http.routers.minio-console.entrypoints=websecure" - "traefik.http.routers.minio-console.tls=true" - "traefik.http.routers.minio-console.tls.certresolver=letsencrypt" - "traefik.http.routers.minio-console.service=minio-console" networks: - nocodb-network watchtower: image: containrrr/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --schedule "0 2 * * 6" --cleanup restart: unless-stopped networks: - nocodb-network volumes: redis: networks: nocodb-network: driver: bridge