78 lines
8.0 KiB
Markdown
Executable File
78 lines
8.0 KiB
Markdown
Executable File
---
|
||
type: tech
|
||
topic: print
|
||
tags: [print, printer, samsung, cups, truenas, novosibirsk]
|
||
updated: "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 или скриптов пересобрать образ и пересоздать контейнер:
|
||
|
||
```bash
|
||
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, скопировать в контейнер и поставить в очередь:
|
||
|
||
```bash
|
||
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-настройки сохранены.
|
||
|
||
Проверка состояния:
|
||
|
||
```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
|
||
```
|