diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index 12c02fd1..75f1aaf2 100755 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -1147,7 +1147,7 @@ nc -z 192.168.2.197 631 # проверить порт наружу - `entrypoint.sh`: стартует `dbus-daemon --system`, затем `avahi-daemon --no-drop-root`, затем `exec cupsd -f`. - `data/cupsd.conf`: `Browsing Off` → `Browsing On` + добавлена строка `BrowseLocalProtocols dnssd` (бэкап `cupsd.conf.pre-avahi`). -**⚠️ Важный питфолл:** после правки конфига НЕ использовать `docker restart cups-splix` — он убивает avahi-daemon (defunct), перед новым подъёмом обязателен **`docker stop cups-splix && docker rm cups-splix && docker compose up -d`** (полный пересоздание, чтобы entrypoint перевыполнился с нуля). +**✅ 2026-11-07: повторный сбой после перезагрузки TrueNAS устранён.** Старый entrypoint принимал оставшийся `/run/dbus/system_bus_socket` за живой D-Bus и пропускал его запуск; Avahi завершался, CUPS продолжал работать без mDNS. Дополнительно виртуальные сети Docker исчерпали лимит multicast-групп (`IP_ADD_MEMBERSHIP failed: No buffer space available`), поэтому восстановленный Avahi не публиковал IPv4-анонс в LAN. Теперь Avahi ограничен `allow-interfaces=enp3s0`; новый entrypoint очищает runtime-файлы, проверяет готовность D-Bus → Avahi → CUPS и контролирует процессы, IPP и фактическую публикацию принтера в LAN. При отказе/зависании завершает контейнер, который восстанавливает `restart: unless-stopped`; добавлен Docker HEALTHCHECK. Обычный `docker restart cups-splix` теперь поддерживается. Проверены два перезапуска, аварийное завершение каждого из трёх сервисов и зависание Avahi; после каждого восстановлены IPP и mDNS на `enp3s0 / 192.168.2.197:631`. Подробности, бэкап и проверка печати: [[personal/tech/samsung-clx-216x]]. **Проверка анонса:** ```bash diff --git a/personal/tech/samsung-clx-216x.md b/personal/tech/samsung-clx-216x.md index 84a0de5f..39507c6f 100755 --- a/personal/tech/samsung-clx-216x.md +++ b/personal/tech/samsung-clx-216x.md @@ -2,7 +2,7 @@ type: tech topic: print tags: [print, printer, samsung, cups, truenas, novosibirsk] -updated: "2026-10-09" +updated: "2026-11-07" --- # Samsung CLX-216x — Новосибирск @@ -25,15 +25,14 @@ updated: "2026-10-09" ## Эксплуатация - Конфигурация: `/mnt/RED_2TB/docker/cups/` на TrueNAS. -- После изменения конфигурации поднимать полным пересозданием: +- После изменения Dockerfile или скриптов пересобрать образ и пересоздать контейнер: ```bash -docker stop cups-splix -docker rm cups-splix -docker compose up -d +cd /mnt/RED_2TB/docker/cups +docker compose up -d --build --force-recreate cups-splix ``` -- Не использовать `docker restart cups-splix`: Avahi после него становится zombie, mDNS пропадает. +- С 2026-11-07 обычный `docker restart cups-splix` поддерживается и проверен. Старый запрет относился к ошибке прежнего entrypoint; причина устранена (см. ниже). - Из внешней сети печать идёт через SSH в контейнер; порт `631` наружу не опубликован. ## Печать PDF извне @@ -56,3 +55,23 @@ ssh -i ~/.ssh/id_rsa truenas_admin@mallexxx.duckdns.org \ - Образ основан на Debian 12; в нём CUPS, splix, Avahi, D-Bus и USB-утилиты. Точка входа запускает D-Bus, затем Avahi, затем `cupsd`. - Каталоги `data`, `cache`, `spool` принадлежат `root:lp` и имеют права `0700`. Бэкап делать внутри контейнера через `docker exec … tar`, затем забирать `docker cp`. - Локально собранный образ не переживает потерю docker data-root; конфигурация и USB-очередь сохраняются в `/mnt/RED_2TB/docker/cups/`, образ нужно пересобрать. + +## Исправление повторного сбоя 2026-11-07 + +- Проверка по SSH: USB `04e8:3425` присутствовал, очередь была idle/enabled/accepting, но D-Bus отсутствовал, его socket от 31 августа возвращал `Connection refused`, Avahi был defunct. Контейнер повторно запустился 1 ноября после перезапуска TrueNAS. +- Причина: прежний entrypoint проверял только существование socket, запускал Avahi в фоне с подавлением ошибок и не контролировал дочерние процессы. Пересоздание контейнера обходило ошибку, но следующий старт существующего контейнера воспроизводил её. +- Дополнительная причина, обнаруженная проверкой mDNS после восстановления D-Bus: Avahi присоединялся ко всем виртуальным интерфейсам Docker и на физическом `enp3s0.IPv4` получал `IP_ADD_MEMBERSHIP failed: No buffer space available`. Из-за исчерпания multicast memberships оставалась лишь IPv6-публикация на LAN. В Dockerfile установлен `allow-interfaces=enp3s0`: mDNS печати работает только в домашней сети, новые сети Docker не расходуют его multicast memberships. +- Исправлены `/mnt/RED_2TB/docker/cups/{Dockerfile,entrypoint.sh}`, добавлен `healthcheck.sh`. При старте удаляются старые container-local socket/PID-файлы; D-Bus, Avahi и CUPS запускаются последовательно с проверкой готовности. PID 1 контролирует все три процесса и каждые 5 секунд проверяет Avahi по D-Bus и очередь по IPP. После трёх неудачных проверок или выхода процесса контейнер завершается; Docker автоматически поднимает его согласно сохранённому `restart: unless-stopped`. Завершение зависших процессов ограничено по времени. Ошибки Avahi видны в `docker logs`. +- В образ добавлен Docker HEALTHCHECK (15 секунд, timeout 12 секунд, start-period 30 секунд, retries 3). `healthcheck.sh` проверяет также фактический IPv4 mDNS-анонс очереди на `enp3s0`, а не только доступность процессов. Самовосстановление обеспечивает entrypoint: один HEALTHCHECK сам по себе контейнеры не перезапускает. +- Проверка: два `docker restart`; SIGKILL отдельно Avahi, D-Bus и CUPS; SIGSTOP Avahi для имитации зависания. После каждого теста контейнер healthy, IPP отвечает, `_ipp._tcp` разрешается на физическом `enp3s0` в `192.168.2.197:631` с правильным `rp=printers/Samsung_CLX-216x_Series`. Полный reboot TrueNAS не выполнялся. +- Одностраничное тестовое задание отправлено через LAN IPP; результат CUPS — completed. Печать именно с телефона удалённо не проверялась. +- Бэкап исходных Dockerfile/entrypoint/compose: `/mnt/RED_2TB/docker/cups/backup-startup-20261107T133009Z/`; прежний образ: `cups-splix:before-startup-20261107T133009Z`. Очередь, spool и USB-настройки сохранены. + +Проверка состояния: + +```bash +docker inspect cups-splix --format '{{.State.Health.Status}}' +docker exec cups-splix /healthcheck.sh +docker exec cups-splix avahi-browse -rtp _ipp._tcp +docker logs --tail 60 cups-splix +```