#1752: Добавить проверки healthcheck в docker-compose.yml

Отредактирована: 56 дней назад

Симптомы

Как мне добавить проверки healthcheck и зависимости в docker-compose.yml, чтобы работоспособность контейнеров проверялась автоматически средствами Docker?

Решение

Для систем, установленных после 1 июля 2026 года эти проверки добавляются автоматически, в момент установки Swarmica.

Для систем, установленных ранее, необходимо выполнить следующие действия:

  1. Войдите на сервер Swarmica с правами root
  2. Зайдите в папку установки Swarmica, обычно /root/swarmica/:
    cd /root/swarmica
    
  3. Создайте резервную копию docker-compose.yml:
    cp docker-compose.yml{,.backup}
    
  4. Отредактируйте сервис postgres, добавив healthcheck:
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
    
    Таким образом, вся секция postgres будет выглядеть примерно так:
    postgres:
      image: postgres:14.2-bullseye
      restart: always
      container_name: swarmica-postgres
      shm_size: 1gb
      command: postgres -N 400 -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c track_activity_query_size=16384 -c wal_keep_size=512MB
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
        interval: 10s
        timeout: 5s
        retries: 5
        start_period: 10s
      volumes:
        - swarmica_postgres_data:/var/lib/postgresql/data:Z
        - swarmica_postgres_data_backups:/backups:z
        - ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
      env_file:
        - .env
    
  5. Отредактируйте сервис redis, добавив healthcheck:
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 5s
    
    Таким образом, вся секция должна выглядеть так:
    redis:
      image: redis:6-bullseye
      restart: always
      container_name: swarmica-redis
      command: redis-server --save 20 1 --loglevel warning --timeout 86400 --maxclients 100000
      healthcheck:
        test: ["CMD", "redis-cli", "ping"]
        interval: 10s
        timeout: 5s
        retries: 5
        start_period: 5s
    
  6. Отредактируйте секцию сервиса django, изменив разделы depends_on и добавив healthcheck вот так:
    django:
      ...rest of your config...
      depends_on:
        postgres:
          condition: service_healthy
        redis:
          condition: service_healthy
      healthcheck:
        test: ["CMD", "python", "-c", "import urllib.request; req = urllib.request.Request('http://127.0.0.1:5000/api/instance', headers={'Host': 'django'}); resp = urllib.request.urlopen(req, timeout=5); exit(0 if 200 <= resp.status < 400 else 1)"]
        interval: 15s
        timeout: 5s
        retries: 10
        start_period: 40s
      ...rest of your config...
    
  7. Далее, в сервисах frontend, helpcenter, celeryworker, celerybeat, django-websocket, mcp, telegram, whatsapp_green, vk, max (в тех, которые есть у вас в docker-compose.yml - в зависимости от настроек системы, у вас могут быть не все из них) измените секцию depends_on вот так:
    depends_on:
      django:
        condition: service_healthy
    
  8. Перезапустите сервисы:
    docker compose down && docker compose up -d