# Контейнеры 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"
-->

### Симптомы

После обновления ПринтМенеджер в схеме с балансировщиком:

- Один или несколько контейнеров `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:**

Проверьте, что NFS хранилище работает корректно на каждом сервере с ПринтМенеджерами:
1. Создайте файл test.txt таким образом:
```bash
cd /opt/printmanager
sudo docker-compose exec app touch /opt/app/public/media/test.txt
```
2. Проверьте, что файл появился в NFS хранилище.
3. Удалите этот файл таким образом
```bash
cd /opt/printmanager/
sudo docker-compose exec app rm /opt/app/public/media/test.txt
```
4. Убедитесь, что файл test.txt был удален из NFS хранилища.

**Шаг 3. Проверить логи `printmanager-app`:**

```bash
cd /opt/printmanager/
sudo docker-compose logs app --tail=100
```

Признак NFS-проблемы:
```
failed to mount local volume: connection refused, port=2049, addr=127.0.0.1
```

**Шаг 4. Проверить `printmanager-redis` и `printmanager-redis-sentinel`:**

```bash
cd /opt/printmanager/
sudo docker-compose logs redis redis-sentinel --tail=50
```

Признак проблемы Redis:
```
Connection with master lost
MASTER <-> REPLICA sync started
+sdown master
+tilt mode entered
```

**Шаг 5. Проверить `printmanager-ftpd`:**

```bash
cd /opt/printmanager/
sudo docker-compose logs ftpd --tail=50
```

Признак проблемы ftpd:
```
Permission denied при записи PID
```

---

### Решение

#### NFS не смонтирован

Проверить, запущен ли stunnel (если NFS проброшен через stunnel):

```bash
systemctl status stunnel
```

Если stunnel не запущен:

```bash
systemctl start stunnel
```

После этого перезапустить ПринтМенеджер:

```bash
cd /opt/printmanager/
sudo docker-compose down && sudo docker-compose up -d
```

#### Redis не выбрал мастера

Подождать 1–6 минут — sentinel должен автоматически выбрать нового мастера. Если не восстановился:

```bash
cd /opt/printmanager/
sudo docker-compose down && sudo docker-compose up -d
```
Проверить логи через 1 минуту:

```bash
sudo docker-compose logs redis-sentinel --tail=30
```

Норма: 
```bash
# Sentinel ID is <id>
# +monitor master redis <ip-address> 6379 quorum 2
* +slave slave <ip-address>:6379 <ip-address> 6379 @ redis <ip-address> 6379
* +sentinel sentinel <id> <ip-address> 26379 @ redis <ip-address> 6379
```

#### Ошибка прав в printmanager-ftpd

```bash
cd /opt/printmanager/
sudo docker-compose down && sudo docker-compose up -d
```

Если ошибка повторяется — передать логи в ТП.

---

### Как проверить результат

```bash
sudo docker-compose ps
```

Все контейнеры в статусе `Up`. В панели HAProxy нода отображается как `UP`. Тестовое задание успешно печатается.

---

### Когда эскалировать

- Причина не определяется по логам.
- NFS недоступен по сетевым причинам (не связано с stunnel).
- Redis не восстанавливается после перезапуска.
- Проблема воспроизводится на всех нодах одновременно.

Приложить к заявке: вывод `docker-compose ps` со всех нод, логи всех нод ПринтМенеджера, версии М и ПринтМенеджер.

---

### Связанные страницы

- [Как обновить Printum](https://wiki.printum.io/books/6-obnovlenie-i-obsluzivanie/page/kak-obnovit-printum)
- [Как работает отказоустойчивый ПринтМенеджер](https://wiki.printum.io/books/1-arxitektura-i-koncepcii/page/kak-rabotaet-otkazoustoicivyi-printmenedzer)
- [Резервное копирование и восстановление данных](https://docs.printum.io/books/6-obnovlenie-i-obsluzivanie/page/rezervnoe-kopirovanie-i-vosstanovlenie-dannyx)