Files

8.0 KiB
Executable File
Raw Permalink Blame History

type, topic, tags, updated
type topic tags updated
tech print
print
printer
samsung
cups
truenas
novosibirsk
2026-11-07

Samsung CLX-216x — Новосибирск

Подключение и сервисы

  • Принтер подключён по USB к TrueNAS в Новосибирске: usb://Samsung/CLX-216x%20Series?serial=9566BAGQ213134Z.&interface=1.
  • 192.168.2.197 — адрес TrueNAS, не принтера.
  • Контейнер cups-splix обслуживает очередь Samsung_CLX-216x_Series через CUPS и драйвер splix.
  • В контейнере работают cupsd, dbus-daemon, avahi-daemon; Avahi публикует _ipp._tcp / mDNS для Android.

История проблем и решений

  1. После пересоздания пула исчез локально собранный образ cups-splix; контейнер не работал, CUPS на :631 не было, принтер оказался недоступен.
  2. Образ пересобрали из /mnt/RED_2TB/docker/cups/, контейнер подняли. USB-очередь восстановилась из сохранённого CUPS-конфига.
  3. Штатная Android-служба считала доступную по IPP очередь недоступной: не было mDNS-анонса.
  4. В контейнер добавили avahi-daemon и dbus-daemon, включили CUPS browsing. После этого Android обнаруживает принтер.

Эксплуатация

  • Конфигурация: /mnt/RED_2TB/docker/cups/ на TrueNAS.
  • После изменения Dockerfile или скриптов пересобрать образ и пересоздать контейнер:
cd /mnt/RED_2TB/docker/cups
docker compose up -d --build --force-recreate cups-splix
  • С 2026-11-07 обычный docker restart cups-splix поддерживается и проверен. Старый запрет относился к ошибке прежнего entrypoint; причина устранена (см. ниже).
  • Из внешней сети печать идёт через SSH в контейнер; порт 631 наружу не опубликован.

Печать PDF извне

Загрузить PDF на TrueNAS, скопировать в контейнер и поставить в очередь:

scp -i ~/.ssh/id_rsa file.pdf truenas_admin@mallexxx.duckdns.org:/tmp/evrika_print.pdf
ssh -i ~/.ssh/id_rsa truenas_admin@mallexxx.duckdns.org \
  'docker cp /tmp/evrika_print.pdf cups-splix:/tmp/evrika_print.pdf'
ssh -i ~/.ssh/id_rsa truenas_admin@mallexxx.duckdns.org \
  'docker exec cups-splix lp -d Samsung_CLX-216x_Series -o media=A4 /tmp/evrika_print.pdf'

Проверка: lpstat -W completed внутри контейнера. CUPS сам конвертирует PDF для splix. После печати удалить временные файлы в /tmp на TrueNAS и в контейнере.

Контейнер и сохранность конфигурации

  • docker-compose.yml использует network_mode: host, USB /dev/bus/usb, а /etc/cups, кэш и spool хранятся в /mnt/RED_2TB/docker/cups/{data,cache,spool}.
  • Образ основан на 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-настройки сохранены.

Проверка состояния:

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