[2026-08-31] eagle: family/how-to/truenas-infrastructure.md personal/tech/mac-print-shared-services.md
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# TrueNAS — инфраструктура
|
||||
|
||||
> Обновлено: 2026-08-25 (docker поднят; modbus-bridge/mbusd починены после гонки с udev)
|
||||
> Обновлено: 2026-08-31 (cups-splix mDNS-фикс завершён; docker поднят)
|
||||
|
||||
> ## ✅ СТАТУС на 2026-08-25: пул ONLINE, docker поднят, почти все контейнеры Up
|
||||
> **Пул RED_2TB пересоздан (2026-08-21) и работает:** `zpool status` ONLINE, rsync возврата данных завершён, `/mnt/RED_2TB/` смонтирован.
|
||||
@@ -115,21 +115,23 @@ TrueNAS использует **NFSv4 ACL**, а не стандартный POSIX
|
||||
| modbus-bridge | modbus-bridge | — | — |
|
||||
| cups-splix | cups-splix | — | принтер |
|
||||
|
||||
### cups-splix — принтер Samsung CLX-216x (✅ поднят 2026-08-26; ⚠️ mDNS-фикс 2026-08-31 в работе)
|
||||
### cups-splix — принтер Samsung CLX-216x (✅ поднят 2026-08-26; ✅ mDNS-фикс 2026-08-31 завершён)
|
||||
|
||||
**Статус:** контейнер работает (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 + ПРАВКИ».**
|
||||
**Статус:** контейнер работает, принтер `Samsung_CLX-216x_Series` **idle / enabled / accepting**. CUPS слушает `0.0.0.0:631` (host-сеть). mDNS-анонс **включён** — штатная Android print service теперь видит принтер по mDNS (подробно: [[mac-print-shared-services]]). См. ниже раздел «✅ mDNS/AirPrint анонс принтера».
|
||||
|
||||
Папка: `/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`.
|
||||
Папка: `/mnt/RED_2TB/docker/cups/` → `Dockerfile`, `entrypoint.sh`, `docker-compose.yml`, `data/`→`/etc/cups`, `cache/`→`/var/cache/cups`, `spool/`→`/var/spool/cups`, `uld/`, бэкап `backup_20260831-003619.tar.gz`.
|
||||
|
||||
- **Image:** `cups-splix` (локальная сборка из Dockerfile)
|
||||
- **Image:** `cups-splix` (локальная сборка из Dockerfile; старый образ сохранён как `cups-splix-old` для отката)
|
||||
- **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)
|
||||
- **Сборка/поднятие:**
|
||||
- **Сборка/поднятие (⚠️ полное пересоздание, НЕ `docker restart`):**
|
||||
```bash
|
||||
cd /mnt/RED_2TB/docker/cups/
|
||||
docker build -t cups-splix-new . # собрать новый образ с avahi (бэкап уже есть)
|
||||
# затем согласовать пересоздание работающего контейнера (docker stop/rm/tag/compose up)
|
||||
docker build -t cups-splix-new .
|
||||
docker stop cups-splix && docker rm cups-splix
|
||||
docker tag cups-splix-new cups-splix && docker tag cups-splix cups-splix-old 2>/dev/null
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
> Полный разбор и симптом «телефон не видит принтер»: [[mac-print-shared-services]]
|
||||
@@ -440,7 +442,7 @@ docker exec cups-splix sh -c "timeout 6 avahi-browse -rt -p _ipp._tcp | grep ';e
|
||||
|
||||
> Диагностика и полное объяснение: [[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]].
|
||||
> ⚠️ **2026-08-31: топология изменена.** TrueNAS больше НЕ в локальной сети (только публичный DNS `mallexxx.duckdns.org`) — из других подсетей/внешки `192.168.2.197` недостижим, и **снаружи `mallexxx.duckdns.org:631` закрыт**. НО **из самой подсети `192.168.2.x` TrueNAS достижима** (телефон `192.168.2.141` успешно печатал по `192.168.2.197:631` — CUPS access_log это подтверждает). → Samsung Mobile Print (app) печатает (висит на локальном IPP внутри подсети), а штатная Android print service с `ipp://192.168.2.197:631/...` показывала «недоступен» из-за **отсутствия mDNS/AirPrint-анонса** (avahi-daemon не запущен; `printer-dns-sd-name = no-value`). ✅ **Исправлено** (см. раздел «✅ mDNS/AirPrint анонс принтера»): cups-splix пересобран с avahi-daemon, cupsd.conf получил `Browsing On` + `BrowseLocalProtocols dnssd` → принтер анонсируется по mDNS (`mopria-certified=1.3`, IPv4 `192.168.2.197`); Android-служба теперь находит принтер сама. Детали и откат: [[mac-print-shared-services]].
|
||||
|
||||
## Связанные заметки
|
||||
- [[truenas-access]] — SSH-доступ
|
||||
|
||||
@@ -3,6 +3,7 @@ type: tech
|
||||
topic: print
|
||||
tags: [print, printer, samsung, cups, macos]
|
||||
created: 2026-08-26
|
||||
updated: 2026-08-31
|
||||
---
|
||||
|
||||
# Печать и общие сервисы (Mac + сеть)
|
||||
@@ -122,21 +123,26 @@ TrueNAS ушла из локальной сети и доступна **толь
|
||||
|
||||
**Механика:** 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
|
||||
## ✅ РЕЗУЛЬТАТ (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_<ts>.tar.gz` на хосте.
|
||||
- ✅ **Новый `Dockerfile`** (в cups/, заменил старый): в apt добавлен **`avahi-daemon`** + `procps`; убран `useradd`-ку только не трогал; добавлен `COPY entrypoint.sh /entrypoint.sh`; `ENTRYPOINT ["/entrypoint.sh"]` вместо пустого `CMD ["cupsd","-f"]`.
|
||||
- ✅ **Новый `Dockerfile`** (в cups/, заменил старый): в apt добавлен **`avahi-daemon`** + `procps`; добавлен `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, без ошибок).
|
||||
- ✅ **`cupsd.conf`**: `Browsing Off` → `Browsing On` + `BrowseLocalProtocols dnssd` (бэкап `cupsd.conf.pre-avahi`). Валидность: `/usr/sbin/cupsd -t` → OK.
|
||||
- ✅ **Образ**: собрал `cups-splix-new`, затем пометил **старый образ как `cups-splix-old`** (откат), а новый — как `cups-splix`.
|
||||
- ✅ **Контейнер пересоздан**: `docker stop cups-splix && docker rm cups-splix && docker compose up -d`.
|
||||
|
||||
**НЕ выполнено (ждёт 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.
|
||||
**Проверка mDNS (всё сошлось):**
|
||||
- `ps aux`: запущены `cupsd` (PID1), `dbus-daemon --system`, `avahi-daemon: running [truenas.local]`.
|
||||
- `ipptool` Get-Printer-Attributes: `printer-dns-sd-name` больше не `no-value` → теперь анонс зарегистрирован.
|
||||
- `avahi-browse -rt -p _ipp._tcp`: на физическом интерфейсе **`;enp3s0;IPv4;`** по адресу **`192.168.2.197;631`** с TXT **`mopria-certified=1.3`**, `pdl=application/pdf,...`, `rp=printers/Samsung_CLX-216x_Series`, `UUID=68e3b8c6-...`.
|
||||
- CUPS по-прежнему слушает `0.0.0.0:631`, принтер `idle/enabled/accepting`.
|
||||
|
||||
**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 (важно):** НЕ использовать **`docker restart cups-splix`** после правки конфига — он убивает avahi-daemon (становится `<defunct>`), dbus тоже пропадает. Подъём ТОЛЬКО полным пересозданием: **`docker stop cups-splix && docker rm cups-splix && docker compose up -d`**, чтобы `entrypoint.sh` выполнился с нуля.
|
||||
|
||||
**Pitfall (compose):** `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).
|
||||
|
||||
Reference in New Issue
Block a user