name: keycloak-stack services: db: image: postgres:16-alpine container_name: keycloak-db restart: unless-stopped environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} TZ: Europe/Paris healthcheck: test: ["CMD-SHELL", "pg_isready -U keycloak -d keycloak"] interval: 10s timeout: 5s retries: 5 volumes: - ./db_data:/var/lib/postgresql/data networks: - keycloak-net keycloak: image: quay.io/keycloak/keycloak:26.2 container_name: keycloak restart: unless-stopped command: start depends_on: db: condition: service_healthy environment: KC_DB: postgres KC_DB_URL: jdbc:postgresql://db:5432/keycloak KC_DB_USERNAME: keycloak KC_DB_PASSWORD: ${POSTGRES_PASSWORD} KC_HOSTNAME: auth.goutailler-olivier.com KC_HOSTNAME_STRICT: "true" KC_HTTP_ENABLED: "true" KC_PROXY_HEADERS: xforwarded KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN:-admin} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD} TZ: Europe/Paris KC_SPI_THEME_STATIC_MAX_AGE: "-1" KC_SPI_THEME_CACHE_THEMES: "false" KC_SPI_THEME_CACHE_TEMPLATES: "false" volumes: - ./themes:/opt/keycloak/themes networks: - keycloak-net - proxy labels: - traefik.enable=true - traefik.http.routers.keycloak.rule=Host(`auth.goutailler-olivier.com`) - traefik.http.routers.keycloak.entrypoints=websecure - traefik.http.routers.keycloak.tls.certresolver=le - traefik.http.services.keycloak.loadbalancer.server.port=8080 - traefik.docker.network=proxy networks: keycloak-net: driver: bridge proxy: external: true name: proxy