# Контейнеры Unhealthy после обновления в конфигурации с балансировщиком

---
title: Контейнеры Unhealthy после обновления в конфигурации с балансировщиком
slug: ts-konteinery-unhealthy-posle-obnovleniya
tags: [обновление, unhealthy, балансировщик, HAProxy, NFS, Redis, docker]
domain: Troubleshooting
type: Troubleshooting
audience: partner-engineer
product_versions: "4.x"
status: ready
related_components: [ПринтМенеджер, Балансировщик, NFS, Redis]
related_pages:
  - kak-obnovit-printum
  - kak-rabotaet-otkazoustoychivyy-printmanager
  - kak-rabotaet-filialnaya-arhitektura-printum
related_errors:
  - "connection refused"
---

# Контейнеры Unhealthy после обновления в конфигурации с балансировщиком

## Симптомы

После обновления ПринтМенеджер в схеме с балансировщиком:

- Один или несколько контейнеров `printmanager-app` запускаются со статусом `unhealthy`.
- Нода недоступна через HAProxy (статус `DOWN` в панели HAProxy).
- Печать работает частично или не работает совсем.

---

## Причина

Три наиболее частые:

1. **NFS не смонтирован** — volume `printmanager_media` недоступен, контейнер не может запуститься.
2. **Redis потерял master** — после одновременного перезапуска нод Redis sentinel не успел выбрать нового мастера.
3. **Ошибка прав в printmanager-ftpd** — контейнер завершился с ошибкой при записи PID-файла.

---

## Диагностика

**Шаг 1. Проверить статус всех контейнеров на проблемной ноде:**

```bash
cd /opt/printmanager
sudo docker-compose ps
```

Зафиксировать какие контейнеры в статусе `unhealthy` или `Exit`.

**Шаг 2. Проверить монтирование NFS:**

```bash
df -h | grep printmanager
mount | grep nfs
```

Норма: NFS-том смонтирован и отображается в выводе.
Ошибка: том отсутствует или `connection refused`.

**Шаг 3. Проверить логи `printmanager-app`:**

```bash
sudo docker-compose logs printmanager-app --tail=100
```

Признак NFS-проблемы:
```
failed to mount local volume: connection refused, port=2049, addr=127.0.0.1
```

**Шаг 4. Проверить Redis:**

```bash
sudo docker-compose logs printmanager-redis --tail=50
```

Признак проблемы Redis:
```
Connection with master lost
MASTER <-> REPLICA sync started
+sdown master
+tilt mode entered
```

**Шаг 5. Проверить `printmanager-ftpd`:**

```bash
sudo docker-compose logs printmanager-ftpd --tail=50
```

Признак проблемы ftpd:
```
Permission denied при записи PID
```

---

## Решение

### NFS не смонтирован

Проверить, запущен ли stunnel (если NFS проброшен через stunnel):

```bash
systemctl status stunnel
```

Если stunnel не запущен:

```bash
systemctl start stunnel
```

После этого перезапустить ПринтМенеджер:

```bash
sudo docker-compose down && sudo docker-compose up -d
```

Если stunnel отсутствует после восстановления из бэкапа — см. [restore.sh не восстанавливает stunnel](ts-restore-ne-vosstanavlivaet-stunnel) (TODO).

### Redis не выбрал мастера

Подождать 1–2 минуты — sentinel должен автоматически выбрать нового мастера. Если не восстановился:

```bash
sudo docker-compose restart printmanager-redis printmanager-redis-sentinel
```

Проверить логи через 1 минуту:

```bash
sudo docker-compose logs printmanager-redis-sentinel --tail=30
```

Норма: `+elected-leader`, `+promoted-slave`.

### Ошибка прав в printmanager-ftpd

```bash
sudo docker-compose restart printmanager-ftpd
```

Если ошибка повторяется — передать логи в ТП.

---

## Как проверить результат

```bash
sudo docker-compose ps
```

Все контейнеры в статусе `Up`. В панели HAProxy нода отображается как `UP`. Тестовое задание успешно печатается.

---

## Когда эскалировать

- Причина не определяется по логам.
- NFS недоступен по сетевым причинам (не связано с stunnel).
- Redis не восстанавливается после перезапуска.
- Проблема воспроизводится на всех нодах одновременно.

Приложить к заявке: вывод `docker-compose ps` со всех нод, логи `printmanager-app`, `printmanager-redis`, `printmanager-ftpd`, версии М и ПринтМенеджер.

---

## Связанные страницы

- [Как обновить Printum](kak-obnovit-printum)
- [Как работает отказоустойчивый ПринтМенеджер](kak-rabotaet-otkazoustoychivyy-printmanager)
- [Как восстановить Printum из резервной копии](kak-vosstanovit-printum-iz-rezervnoy-kopii)