services:
zitadel:
container_name: zitadel
restart: 'unless-stopped'
image: 'ghcr.io/zitadel/zitadel:v4.0.1'
command: 'start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled'
environment:
- 'ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/machinekey/service-account.json'
- 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa'
- 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin'
- 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1'
- 'ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME=root'
- 'ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD=RootPassword1!'
- 'ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED=false'
- 'ZITADEL_EXTERNALDOMAIN=localhost'
- 'ZITADEL_EXTERNALPORT=9310'
- 'ZITADEL_PORT=9310'
- 'ZITADEL_EXTERNAL=localhost'
- 'ZITADEL_TLS_ENABLED=false'
- 'ZITADEL_DATABASE_POSTGRES_HOST=postgres'
- 'ZITADEL_DATABASE_POSTGRES_PORT=5432'
- 'ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel'
- 'ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel'
- 'ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel'
- 'ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable'
- 'ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=postgres'
- 'ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=password'
- 'ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable'
- 'ZITADEL_EXTERNALSECURE=false'
- 'ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED=false'
depends_on:
postgres: { condition: service_healthy }
ports:
- '9310:9310'
volumes:
- ./docker/zitadel/:/machinekey/:rw
healthcheck:
test: ["CMD", "/app/zitadel", "ready"]
interval: '3s'
retries: 20
start_period: '10s'
postgres:
container_name: postgres
restart: "unless-stopped"
image: postgres:16.1-alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
volumes:
- postgresql-data:/var/lib/postgresql/data
ports:
- 9876:5432/tcp
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -p 5432"]
interval: 5s
retries: 10
start_period: 5s
volumes:
postgresql-data: