diff --git a/docker-compose.yml b/docker-compose.yml index c4896e3..6ad8135 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.7' - x-icinga-db-web-config: &icinga-db-web-config icingaweb.modules.icingadb.config.icingadb.resource: icingadb @@ -89,15 +87,24 @@ services: entrypoint: [] logging: *default-logging image: icinga/icingaweb2 - restart: on-failure + restart: unless-stopped volumes: - icingaweb:/data + # ADDED: Depend on mysql and icinga2 to ensure they're ready before starting the director + depends_on: + mysql: + condition: service_healthy + icinga2: + condition: service_healthy # The Icinga 2 docker image does not support configuration via env vars at the moment. # So, we have to ship some configs with this little init container. Referenced in depends_on of the icinga2 service. init-icinga2: command: [ "/config/init-icinga2.sh" ] - environment: *icinga2-environment + environment: + # ADDED/CONFIRMED: Explicitly pass the password to the init script + ICINGAWEB_ICINGA2_API_USER_PASSWORD: ${ICINGAWEB_ICINGA2_API_USER_PASSWORD:-icingaweb} + <<: *icinga2-environment image: icinga/icinga2 logging: *default-logging volumes: @@ -105,20 +112,37 @@ services: - ./icingadb.conf:/config/icingadb.conf - ./icingaweb-api-user.conf:/config/icingaweb-api-user.conf - ./init-icinga2.sh:/config/init-icinga2.sh + # UNIFIED: Depend on healthy services before running the init script + depends_on: + icingadb-redis: + condition: service_healthy + mysql: + condition: service_healthy icinga2: command: [ "sh", "-c", "sleep 5 ; icinga2 daemon" ] - depends_on: - - icingadb-redis - - init-icinga2 environment: *icinga2-environment image: icinga/icinga2 logging: *default-logging ports: - - 5665:5665 + - "127.0.0.1:3070:5665" + restart: unless-stopped volumes: - icinga2:/data - ./icinga2.conf.d:/custom_data/custom.conf.d + # UNIFIED: Use condition-based dependency for init completion and redis readiness + depends_on: + init-icinga2: + condition: service_completed_successfully + icingadb-redis: + condition: service_healthy + healthcheck: + # Use HTTPS (-k), fail on error (-f), and include Basic Auth (-u) + test: ["CMD", "curl", "-k", "-f", "-u", "icingaweb:${ICINGAWEB_ICINGA2_API_USER_PASSWORD:-icingaweb}", "https://localhost:5665/v1/"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 90s icingadb: environment: @@ -129,44 +153,65 @@ services: ICINGADB_DATABASE_PASSWORD: ${ICINGADB_MYSQL_PASSWORD:-icingadb} ICINGADB_REDIS_HOST: icingadb-redis ICINGADB_REDIS_PORT: 6379 - depends_on: - - mysql - - icingadb-redis image: icinga/icingadb logging: *default-logging + restart: unless-stopped + # UNIFIED: Use condition-based dependency for database and redis readiness + depends_on: + mysql: + condition: service_healthy + icingadb-redis: + condition: service_healthy icingadb-redis: image: redis logging: *default-logging + restart: unless-stopped + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 1s + timeout: 3s + retries: 5 icingaweb: - depends_on: - - mysql environment: icingaweb.enabledModules: director, icingadb, incubator <<: [*icinga-db-web-config, *icinga-director-config, *icinga-web-config] logging: *default-logging image: icinga/icingaweb2 ports: - - 8080:8080 + - "127.0.0.1:3065:8080" # Restart Icinga Web container automatically since we have to wait for the database to be ready. # Please note that this needs a more sophisticated solution. - restart: on-failure + restart: unless-stopped volumes: - icingaweb:/data + # UNIFIED: Use condition-based dependency for database readiness + depends_on: + mysql: + condition: service_healthy mysql: image: mariadb:10.7 - command: --default-authentication-plugin=mysql_native_password + command: + - --sql-mode=TRADITIONAL,ANSI_QUOTES # FIXED: Removed quotes around the value + - --default-authentication-plugin=mysql_native_password environment: MYSQL_RANDOM_ROOT_PASSWORD: 1 ICINGADB_MYSQL_PASSWORD: ${ICINGADB_MYSQL_PASSWORD:-icingadb} ICINGAWEB_MYSQL_PASSWORD: ${ICINGAWEB_MYSQL_PASSWORD:-icingaweb} ICINGA_DIRECTOR_MYSQL_PASSWORD: ${ICINGA_DIRECTOR_MYSQL_PASSWORD:-director} logging: *default-logging + restart: unless-stopped volumes: - mysql:/var/lib/mysql - ./env/mysql/:/docker-entrypoint-initdb.d/ + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_RANDOM_ROOT_PASSWORD"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 20s volumes: icinga2: