From 8e512eefd18c7a71ce7c1ee18d6b5523dfd7217d Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 31 Aug 2026 13:48:39 +0600 Subject: [PATCH] [2026-08-31] eagle: family/how-to/truenas-infrastructure.md personal/tech/mac-print-shared-services.md --- family/how-to/truenas-infrastructure.md | 19 +++++++------- personal/tech/mac-print-shared-services.md | 30 +++++++++++++++++++++- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index eb931390..ccc044cf 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -115,23 +115,22 @@ TrueNAS использует **NFSv4 ACL**, а не стандартный POSIX | modbus-bridge | modbus-bridge | — | — | | cups-splix | cups-splix | — | принтер | -### cups-splix — принтер Samsung CLX-216x (⚠️ не поднят 2026-08-26) +### cups-splix — принтер Samsung CLX-216x (✅ поднят 2026-08-26; ⚠️ mDNS-фикс 2026-08-31 в работе) -**Статус:** контейнер НЕ запущен. Образ `cups-splix` не собран (пропал — `.ix-apps` docker data-root не переносился при пересоздании пула; локальная сборка не «перекачается»). Папка конфига цела. +**Статус:** контейнер работает (2026-08-31 `Up 4 days`), принтер `Samsung_CLX-216x_Series` **idle / enabled / accepting**. CUPS слушает `0.0.0.0:631` (host-сеть). НО принтер **не анонсируется через mDNS/AirPrint** (`printer-dns-sd-name = no-value`, `avahi-daemon` в контейнере не запущен) → штатная Android print service показывает «недоступен» (подробно: [[mac-print-shared-services]]). **План mDNS-фикса (пересборка с avahi, бэкап сделан, образ собран, пересоздание контейнера ждёт OK) — см. [[mac-print-shared-services]] раздел «PLAN + ПРАВКИ».** -Папка: `/mnt/RED_2TB/docker/cups/` → `Dockerfile`, `docker-compose.yml`, `docker build.txt`, `data/`→`/etc/cups`, `cache/`→`/var/cache/cups`, `spool/`→`/var/spool/cups`, `uld/`. +Папка: `/mnt/RED_2TB/docker/cups/` → `Dockerfile`, `entrypoint.sh`, `docker-compose.yml`, `docker build.txt`, `data/`→`/etc/cups`, `cache/`→`/var/cache/cups`, `spool/`→`/var/spool/cups`, `uld/`, бэкап `backup_20260831-003619.tar.gz`. - **Image:** `cups-splix` (локальная сборка из Dockerfile) -- **Dockerfile** (debian:12-slim): `cups-daemon cups-client cups-common printer-driver-splix avahi-utils dbus usbutils nano`; `cupsadmin:admin` (группа lpadmin); `EXPOSE 631`; CMD `cupsd -f` -- **compose:** `network_mode: host`, `privileged: true`, volume `/dev/bus/usb:/dev/bus/usb`, restart `unless-stopped` +- **Dockerfile** (debian:12-slim): `cups-daemon cups-client cups-common printer-driver-splix avahi-daemon avahi-utils dbus usbutils nano procps`; `cupsadmin:admin` (группа lpadmin); `COPY entrypoint.sh`; `EXPOSE 631`; `ENTRYPOINT ["/entrypoint.sh"]` +- **entrypoint.sh:** `dbus-daemon --system --fork` → `avahi-daemon --no-drop-root --syslog` (фон) → `exec cupsd -f` +- **compose:** `image: cups-splix`, `network_mode: host`, `privileged: true`, volume `/dev/bus/usb:/dev/bus/usb`, restart `unless-stopped` (содержит устаревший `command: [cupsd -f]`, но ENTRYPOINT переопределяет — правится только через root/UI, файл 600 root) - **Сборка/поднятие:** ```bash cd /mnt/RED_2TB/docker/cups/ -docker build -t cups-splix . -docker compose up -d -# проверка: порт 631 открылся, принтер подцепился +docker build -t cups-splix-new . # собрать новый образ с avahi (бэкап уже есть) +# затем согласовать пересоздание работающего контейнера (docker stop/rm/tag/compose up) ``` -- **Проверка доступности сейчас:** `lpstat`/`cupsd` на хосте НЕ установлены, порт 631 закрыт (local и снаружи) — подтверждает, что печать не работает. > Полный разбор и симптом «телефон не видит принтер»: [[mac-print-shared-services]] @@ -418,7 +417,7 @@ nc -z 192.168.2.197 631 # проверить порт наружу - Принтер: `usb://Samsung/CLX-216x%20Series?serial=9566BAGQ213134Z.&interface=1` (USB ID `04e8:3425` Samsung CLX-216x). - Порт 631: открыт наружу после подъёма. -> ⚠️ **2026-08-31: топология изменена.** TrueNAS больше НЕ в локальной сети (только публичный DNS `mallexxx.duckdns.org`). `192.168.2.197` из телефона/внешки недостижим, и **снаружи `mallexxx.duckdns.org:631` закрыт**. Подтверждено SSH: `cups-splix` **Up**, принтер idle/enabled/accepting, CUPS слушает `0.0.0.0:631`, но наружу не проброшен. → Samsung Mobile Print (app) печатает (у него адрес вписан вручную/закэширован), а штатная Android print service с `ipp://192.168.2.197:631/...` показывает «недоступен» (ожидаемо, локального пути нет). Подробный разбор: [[mac-print-shared-services]]. +> ⚠️ **2026-08-31: топология изменена.** TrueNAS больше НЕ в локальной сети (только публичный DNS `mallexxx.duckdns.org`). `192.168.2.197` из телефона/внешки недостижим, и **снаружи `mallexxx.duckdns.org:631` закрыт**. Подтверждено SSH: `cups-splix` **Up**, принтер idle/enabled/accepting, CUPS слушает `0.0.0.0:631`, но наружу не проброшен. → Samsung Mobile Print (app) печатает (у него адрес вписан вручную/закэширован), а штатная Android print service с `ipp://192.168.2.197:631/...` показывает «недоступен» (ожидаемо, локального пути нет). **Дополнительно (2026-08-31):** корень «недоступен» в штатной службе — не только сеть, но и **отсутствие mDNS/AirPrint-анонса** (avahi-daemon не запущен; `printer-dns-sd-name = no-value`). План исправления (новый Dockerfile + entrypoint с avahi, бэкап, образ собран) — в [[mac-print-shared-services]] раздел «PLAN + ПРАВКИ»; пересоздание контейнера ждёт OK Alex. Подробный разбор: [[mac-print-shared-services]]. ## Связанные заметки - [[truenas-access]] — SSH-доступ diff --git a/personal/tech/mac-print-shared-services.md b/personal/tech/mac-print-shared-services.md index 8a42dd23..bfdaab5e 100644 --- a/personal/tech/mac-print-shared-services.md +++ b/personal/tech/mac-print-shared-services.md @@ -112,4 +112,32 @@ TrueNAS ушла из локальной сети и доступна **толь **Вывод:** «недоступен» в штатной службе — НЕ баг настройки и НЕ проблема порта. Это прямое следствие того, что CUPS-хост (TrueNAS) физически вне сети телефона: локального пути нет, а публичный `mallexxx.duckdns.org:631` закрыт. Android-штатная служба не умеет удалённый IPP через интернет без открытого наружу порта. -**ОТКРЫТЫЙ ВОПРОС** (не разобран, нет доступа к настройкам приложения): по какому именно адресу Samsung Mobile Print реально шлёт печать, раз 631 снаружи закрыт. Гипотезы: (1) приложение кэширует соединение с времён, когда TrueNAS была локально; (2) используется другой публичный путь (реверс-прокси Caddy на ином порту/HTTPS), не записанный в доках. Для полного разбора нужен адрес/хост из настроек принтера внутри Samsung Mobile Print. +**ОТКРЫТЫЙ ВОПРОС** (не разобран, нет доступа к настройкам приложения): по какому именно адресу Samsung Mobile Print реально шлёт печать, раз 631 снаружи закрыт. Гипотезы: (1) приложение кэширует соединение с времён, когда TrueNAS была локально; (2) используется другой публичный путь (реверс-прокси Caddy на ином порту/HTTPS), не записанный в доках. Для полного разбора нужен адрес/хост из настроек принтера внутри Samsung Mobile Print. Отмечено: **лог CUPS access_log показывает, что практически вся печать шла с IP `192.168.2.141`** (26-30 авг, POST /printers/... Print-Job → 200 successful-ok) — т.е. Samsung Mobile Print ходил по локальному IP, когда TrueNAS ещё была в сети. Похоже, приложение реально кэшировало локальное соединение. + +## ✅ НАСТОЯЩИЙ МЕХАНИЗМ «недоступен» в Android print service (2026-08-31, подтверждено ipptool) + +Дополнительная проверка **внутри контейнера** (`ipptool -tv` → CUPS) дала ключевой факт: + +- **`printer-dns-sd-name = no-value`** +- В контейнере cups-splix **НЕ запущен `avahi-daemon`** (процессы: только `cupsd`; `ps aux | grep avahi` — пусто). Пакеты `dbus` + `avahi-utils` в образе есть, но **`avahi-daemon` не установлен и не стартует**, а CMD — только `cupsd -f`. + +**Механика:** Samsung Mobile Print — вендорское приложение, ходит на CUPS **напрямую по IPP** (POST Print-Job по IP) → работает даже без mDNS. **Android штатная служба печати** (Mopria/Default) даже при ручном добавлении по IP затем делает **mDNS/AirPrint-проверку** принтера (`_ipp._tcp` / `_ipps._tcp.local`), чтобы получить `printer-uuid` и capabilities. Если mDNS-анонса нет (`printer-dns-sd-name = no-value`, avahi не запущен) — Android помечает принтер **«недоступен»**, даже если IPP по-IP физически отвечает. Полный ответ CUPS на Get-Printer-Attributes — `successful-ok [PASS]`, принтер idle/accepting/shared — подтверждает: CUPS здоров, всё дело в отсутствии mDNS-анонса. + +## PLAN + ПРАВКИ (2026-08-31, частично выполнено): поднять mDNS через avahi-daemon + +**Место:** папка `/mnt/RED_2TB/docker/cups/`. + +**Выполнено:** +- ✅ **Бэкап** конфига: `/mnt/RED_2TB/docker/cups/backup_20260831-003619.tar.gz` (создан внутри контейнера `tar` → `docker cp`; md5 `0e303a6a57ae767d1e14cd72c8039fe4`). Внутри: `/etc/cups`, `/var/spool/cups`, `/var/cache/cups`. Дубль в `/tmp/cups_backup_.tar.gz` на хосте. +- ✅ **Новый `Dockerfile`** (в cups/, заменил старый): в apt добавлен **`avahi-daemon`** + `procps`; убран `useradd`-ку только не трогал; добавлен `COPY entrypoint.sh /entrypoint.sh`; `ENTRYPOINT ["/entrypoint.sh"]` вместо пустого `CMD ["cupsd","-f"]`. +- ✅ **`entrypoint.sh`** (в cups/): стартует `dbus-daemon --system --fork`, затем `avahi-daemon --no-drop-root --syslog` в фоне, затем `exec cupsd -f`. +- ✅ **Образ `cups-splix-new` собран** на TrueNAS (`docker build -t cups-splix-new .`, ~108s, без ошибок). + +**НЕ выполнено (ждёт OK Alex на пересоздание работающего контейнера):** +- ⏳ `docker stop cups-splix && docker rm cups-splix` (данные в volumes на хосте `data/cache/spool` НЕ теряются) +- ⏳ `docker tag cups-splix-new cups-splix && docker rmi <старый>` +- ⏳ `docker compose up -d` → проверка: `ps aux | grep avahi`, `ipptool` даёт `printer-dns-sd-name` не `no-value`, `ippfind` находит принтер по mDNS. + +**Pitfall (обнаружен):** `docker-compose.yml` в cups/ — `-rw------- root:root` (600), **truenas_admin перезаписать не может** (Permission denied) → compose НЕ менял. Это ок: ENTRYPOINT переопределяет `command`, лишний cupsd не стартует (скрипт сам делает `exec cupsd -f`, аргументы `$@` игнорирует). Если потребуется убрать `command` из compose — править через root/UI. + +**Pitfall (бэкап):** `data/ cache/ spool/` под TrueNAS — `drwx------ root:lp` (0700), truenas_admin их напрямую не читает → **бэкап делать ТОЛЬКО через контейнер** (`docker exec ... tar` → `docker cp`), либо через /admin (root).