name: twenty services: server: image: twentycrm/twenty:${TAG:-latest} volumes: - server-local-data:/app/packages/twenty-server/.local-storage ports: - "3000:3000" environment: NODE_PORT: 3000 PG_DATABASE_URL: postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/default SERVER_URL: ${SERVER_URL} REDIS_URL: ${REDIS_URL:-redis://redis:6379} DISABLE_DB_MIGRATIONS: ${DISABLE_DB_MIGRATIONS} DISABLE_CRON_JOBS_REGISTRATION: ${DISABLE_CRON_JOBS_REGISTRATION} STORAGE_TYPE: ${STORAGE_TYPE} STORAGE_S3_REGION: ${STORAGE_S3_REGION} STORAGE_S3_NAME: ${STORAGE_S3_NAME} STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT} APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string} # MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED} # CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED} # AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID} # AUTH_GOOGLE_CLIENT_SECRET: ${AUTH_GOOGLE_CLIENT_SECRET} # AUTH_GOOGLE_CALLBACK_URL: ${AUTH_GOOGLE_CALLBACK_URL} # AUTH_GOOGLE_APIS_CALLBACK_URL: ${AUTH_GOOGLE_APIS_CALLBACK_URL} # CALENDAR_PROVIDER_MICROSOFT_ENABLED: ${CALENDAR_PROVIDER_MICROSOFT_ENABLED} # MESSAGING_PROVIDER_MICROSOFT_ENABLED: ${MESSAGING_PROVIDER_MICROSOFT_ENABLED} # AUTH_MICROSOFT_ENABLED: ${AUTH_MICROSOFT_ENABLED} # AUTH_MICROSOFT_CLIENT_ID: ${AUTH_MICROSOFT_CLIENT_ID} # AUTH_MICROSOFT_CLIENT_SECRET: ${AUTH_MICROSOFT_CLIENT_SECRET} # AUTH_MICROSOFT_CALLBACK_URL: ${AUTH_MICROSOFT_CALLBACK_URL} # AUTH_MICROSOFT_APIS_CALLBACK_URL: ${AUTH_MICROSOFT_APIS_CALLBACK_URL} # EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-contact@yourdomain.com} # EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-"John from YourDomain"} # EMAIL_SYSTEM_ADDRESS: ${EMAIL_SYSTEM_ADDRESS:-system@yourdomain.com} # EMAIL_DRIVER: ${EMAIL_DRIVER:-smtp} # EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST:-smtp.gmail.com} # EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-465} # EMAIL_SMTP_USER: ${EMAIL_SMTP_USER:-} # EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-} depends_on: db: condition: service_healthy healthcheck: test: curl --fail http://localhost:3000/healthz interval: 5s timeout: 5s retries: 20 restart: always networks: - proxy - twenty labels: - "traefik.enable=true" - "traefik.docker.network=proxy" - "traefik.http.routers.twenty.entrypoints=http" - "traefik.http.routers.twenty.rule=Host(`twenty.jimsgarage.co.uk`)" - "traefik.http.middlewares.twenty-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.twenty.middlewares=twenty-https-redirect" - "traefik.http.routers.twenty-secure.entrypoints=https" - "traefik.http.routers.twenty-secure.rule=Host(`twenty.jimsgarage.co.uk`)" - "traefik.http.routers.twenty-secure.tls=true" - "traefik.http.routers.twenty-secure.tls.certresolver=cloudflare" - "traefik.http.routers.twenty-secure.service=twenty" - "traefik.http.services.twenty.loadbalancer.server.port=3000" worker: image: twentycrm/twenty:${TAG:-latest} volumes: - server-local-data:/app/packages/twenty-server/.local-storage command: ["yarn", "worker:prod"] environment: PG_DATABASE_URL: postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/default SERVER_URL: ${SERVER_URL} REDIS_URL: ${REDIS_URL:-redis://redis:6379} DISABLE_DB_MIGRATIONS: "true" # it already runs on the server DISABLE_CRON_JOBS_REGISTRATION: "true" # it already runs on the server STORAGE_TYPE: ${STORAGE_TYPE} STORAGE_S3_REGION: ${STORAGE_S3_REGION} STORAGE_S3_NAME: ${STORAGE_S3_NAME} STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT} APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string} # MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED} # CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED} # AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID} # AUTH_GOOGLE_CLIENT_SECRET: ${AUTH_GOOGLE_CLIENT_SECRET} # AUTH_GOOGLE_CALLBACK_URL: ${AUTH_GOOGLE_CALLBACK_URL} # AUTH_GOOGLE_APIS_CALLBACK_URL: ${AUTH_GOOGLE_APIS_CALLBACK_URL} # CALENDAR_PROVIDER_MICROSOFT_ENABLED: ${CALENDAR_PROVIDER_MICROSOFT_ENABLED} # MESSAGING_PROVIDER_MICROSOFT_ENABLED: ${MESSAGING_PROVIDER_MICROSOFT_ENABLED} # AUTH_MICROSOFT_ENABLED: ${AUTH_MICROSOFT_ENABLED} # AUTH_MICROSOFT_CLIENT_ID: ${AUTH_MICROSOFT_CLIENT_ID} # AUTH_MICROSOFT_CLIENT_SECRET: ${AUTH_MICROSOFT_CLIENT_SECRET} # AUTH_MICROSOFT_CALLBACK_URL: ${AUTH_MICROSOFT_CALLBACK_URL} # AUTH_MICROSOFT_APIS_CALLBACK_URL: ${AUTH_MICROSOFT_APIS_CALLBACK_URL} # EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-contact@yourdomain.com} # EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-"John from YourDomain"} # EMAIL_SYSTEM_ADDRESS: ${EMAIL_SYSTEM_ADDRESS:-system@yourdomain.com} # EMAIL_DRIVER: ${EMAIL_DRIVER:-smtp} # EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST:-smtp.gmail.com} # EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-465} # EMAIL_SMTP_USER: ${EMAIL_SMTP_USER:-} # EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-} depends_on: db: condition: service_healthy server: condition: service_healthy restart: always networks: - twenty db: image: postgres:16 volumes: - db-data:/var/lib/postgresql/data environment: POSTGRES_USER: ${PG_DATABASE_USER:-postgres} POSTGRES_PASSWORD: ${PG_DATABASE_PASSWORD:-postgres} healthcheck: test: pg_isready -U ${PG_DATABASE_USER:-postgres} -h localhost -d postgres interval: 5s timeout: 5s retries: 10 restart: always networks: - twenty redis: image: redis restart: always command: ["--maxmemory-policy", "noeviction"] networks: - twenty volumes: db-data: server-local-data: networks: twenty: proxy: external: true