No description
  • Shell 75%
  • Python 10.3%
  • HTML 8.2%
  • Dockerfile 6.5%
Find a file
2026-10-04 23:15:07 +02:00
avahi Publish Brother HL-1110 via Avahi IPP DNS-SD 2026-10-04 21:28:11 +02:00
cups Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00
scripts Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00
udev Initial Brother HL-1110 Docker print server 2026-10-04 21:08:54 +02:00
web Initial Brother HL-1110 Docker print server 2026-10-04 21:08:54 +02:00
.env.example Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00
.gitattributes Keep Avahi service files on LF line endings 2026-10-04 21:28:48 +02:00
.gitignore Initial Brother HL-1110 Docker print server 2026-10-04 21:08:54 +02:00
docker-compose.yml Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00
Dockerfile Publish Brother HL-1110 via Avahi IPP DNS-SD 2026-10-04 21:28:11 +02:00
nodered-brother-hl1110-fhem.json Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00
README.md Enable LAN CUPS administration and add Node-RED flow 2026-10-04 23:15:07 +02:00

Brother HL-1110 Docker Printserver

Ein robuster, lokaler Netzwerkdruckserver für einen per USB angeschlossenen Brother HL-1110 auf einem Linux-Docker-Host. Er verwendet CUPS, den Open-Source-Treiber brlaser, IPP und Avahi/mDNS. brlaser führt die Brother-HL-1110-Serie als unterstütztes Modell auf.

Eigenschaften

  • CUPS-Druckername: Brother_HL1110
  • dynamische USB-Erkennung über CUPS/libusb – keine USB-ID und keine Device-URI sind im Projekt fest codiert
  • dynamische Auswahl des installierten brlaser-HL-1110-Modells mittels lpinfo -m; bei mehreren Treffern erfolgt bewusst keine unsichere Auswahl
  • IPP-Netzwerkdruck: ipp://SERVER-IP:631/printers/Brother_HL1110
  • Avahi veröffentlicht eine explizite IPP-/AirPrint-DNS-SD-Ankündigung für Brother_HL1110, damit die Erkennung nicht von distributionsspezifischem CUPS-DNS-SD-Verhalten abhängt
  • persistente CUPS-Konfiguration und Druckspool unter data/cups/
  • optionales, vollständig deaktivierbares MQTT-Power-Management (mqtt oder none)
  • sichere Abschaltlogik: mindestens zwei leere Queue-Prüfungen im Abstand von fünf Sekunden; CUPS-Aufträge werden nie durch die Skripte gelöscht
  • optionales geschütztes Status-/Power-Web-UI

Architektur und Sicherheit

Der Dienst nutzt auf dem Linux-Deployment-Host network_mode: host. Das vermeidet die üblichen Multicast-/mDNS-Probleme eines Docker-Bridge-Netzes und ermöglicht, dass Avahi und CUPS DNS-SD direkt im LAN publizieren. Deshalb gibt es keine ports:-Sektion: CUPS lauscht direkt am Linux-Host auf TCP 631 und das optionale Web-UI auf TCP 8080.

Der Container ist nicht privileged. Er erhält nur den USB-Bus als Gerät (/dev/bus/usb:/dev/bus/usb), damit CUPS/libusb den Drucker finden kann. Das ist absichtlich breiter als ein einzelner USB-Knoten, aber für einen automatisch wiedererkannten USB-Drucker stabiler. Eine konkrete USB-ID oder /dev/usb/lp0 wird nicht vorausgesetzt.

Die Dateien /etc/localtime und /etc/timezone des Linux-Hosts werden schreibgeschützt in den Container eingebunden. Dadurch verwenden CUPS, die Power-Skripte und das Web-UI dieselbe lokale Zeit wie der Server.

Die CUPS-Oberfläche und IPP sind in cups/cupsd.conf auf Loopback sowie RFC1918 Privatnetze beschränkt: 10.0.0.0/8, 172.16.0.0/12 und 192.168.0.0/16. Die CUPS-Administration unter /admin ist ebenfalls nur aus diesen privaten Netzen erreichbar und verlangt eine Anmeldung mit einem Mitglied der Gruppe lpadmin. Standardmäßig erzeugt der Container dafür beim Start einen Account mit WEB_USERNAME und WEB_PASSWORD; über CUPS_ADMIN_USERNAME und CUPS_ADMIN_PASSWORD können getrennte Zugangsdaten gesetzt werden. Keine Router-Portweiterleitung für TCP 631 oder TCP 8080 einrichten.

Für Clients müssen im LAN mindestens verfügbar sein:

  • TCP 631 (IPP/CUPS)
  • UDP 5353 (mDNS/AirPrint/DNS-SD)

WLAN-Client-Isolation, VLAN-Grenzen oder Multicast-Filter können die automatische Entdeckung verhindern, auch wenn direktes IPP-Drucken funktioniert.

Voraussetzungen auf dem Linux-Server

  • Linux-Server mit Docker Engine und Docker Compose Plugin
  • USB-Zugriff des Docker-Daemons
  • Brother HL-1110 direkt per USB angeschlossen
  • Linux-Host und Clients im selben LAN/WLAN

Vor der Hardware-Konfiguration sammeln:

lsusb
lsusb -t
uname -a
cat /etc/os-release
docker version
docker compose version
ip addr

# Optional, wenn CUPS bereits auf dem Host installiert ist:
lpinfo -v

Falls vorhanden, kann zusätzlich geprüft werden:

udevadm info --query=all --name=/dev/usb/lp0

/dev/usb/lp0 ist jedoch nicht notwendig: Der Container verwendet CUPS/libusb und lpinfo -v zur Erkennung. Die reale URI wird erst zur Laufzeit verwendet.

Projekt auf den Linux-Server übertragen

Dieses Verzeichnis wurde lokal unter D:\Downloads\Git\brother-docker-printserver erstellt. Übertrage den Ordner per Git, scp, rsync oder einem anderen sicheren Verfahren auf den Linux-Server und arbeite dort mit Linux-Pfaden, zum Beispiel:

cd /srv/brother-docker-printserver
cp .env.example .env
nano .env
docker compose build
docker compose up -d

Status und Logs:

docker compose ps
docker compose logs -f

Die persistenten Daten werden beim ersten Start automatisch angelegt:

data/cups/etc    # /etc/cups
data/cups/spool  # /var/spool/cups
data/cups/log    # /var/log/cups

Ein initial leerer Bind-Mount wird vom Entrypoint mit den CUPS-Defaults aus dem Image initialisiert. Lösche data/ nicht, wenn du bestehende CUPS-Queues oder wartende Aufträge erhalten willst.

Ersteinrichtung und Druckererkennung

Schalte den Drucker für die erste Konfiguration zwingend ein und starte den Container. Erst nachdem die Queue einmal dynamisch und eindeutig erzeugt wurde, können Aufträge auch bei später ausgeschaltetem Drucker zuverlässig in CUPS warten und das optionale Auto-Power-System auslösen. Der Entrypoint wartet auf CUPS und sucht dann mit lpinfo -v genau eine USB-URI, die auf PRINTER_URI_MATCH passt. Anschließend wird der exakt eine passende brlaser-Model-Identifier aus lpinfo -m gewählt und die Queue Brother_HL1110 erstellt, freigegeben und als Standard gesetzt.

Bei null oder mehreren URI-/Treiber-Treffern wird keine URI/PPD geraten. Prüfe dann auf dem Linux-Server:

docker compose exec brother-printserver lpinfo -v
docker compose exec brother-printserver lpinfo -m | grep -i brlaser
docker compose exec brother-printserver /usr/local/bin/printer-status.sh

Passe bei Bedarf ausschließlich PRINTER_URI_MATCH in .env anhand der real beobachteten URI an. Wenn der Drucker beim ersten Containerstart aus ist, bleibt CUPS trotzdem gesund; der Entrypoint sucht weiter und richtet die Queue nach dem Erscheinen ein. Bis zur ersten Queue-Erstellung kann allerdings kein Clientauftrag an Brother_HL1110 adressiert werden, weil keine USB-URI oder Modellkennung erfunden wird.

Öffne CUPS im LAN:

http://SERVER-IP:631

Beispiel (nur als Form, keine feste Projekt-IP):

http://192.168.1.10:631

Tests im Container:

docker compose exec brother-printserver lpstat -t
docker compose exec brother-printserver lpstat -p Brother_HL1110
docker compose exec brother-printserver sh -c 'echo "Brother HL-1110 Printserver Test" | lp -d Brother_HL1110'

Clients

Windows 10 / Windows 11

  1. Einstellungen → Bluetooth und Geräte → Drucker & Scanner öffnen.
  2. Gerät hinzufügen wählen und die automatische mDNS-Erkennung abwarten.
  3. Falls nötig Manuell hinzufügen und diese CUPS-URL eintragen:
http://SERVER-IP:631/printers/Brother_HL1110

IPP-Clients können alternativ verwenden:

ipp://SERVER-IP:631/printers/Brother_HL1110

Windows kann gegebenenfalls einen eigenen lokalen Treiber verlangen. Bevorzuge zunächst die IPP-/Microsoft-IPP-Class-Driver-Option; der Server rendert mit brlaser für den USB-Drucker.

iPhone und iPad (AirPrint)

Im Dokument: Teilen → Drucken → Drucker auswählen → Brother HL-1110. Voraussetzung: iOS-Gerät und Linux-Server befinden sich im selben LAN/WLAN und mDNS/UDP 5353 wird nicht blockiert. CUPS publiziert die freigegebene Queue über DNS-SD; Avahi stellt die mDNS-Infrastruktur des Host-Netzes bereit.

Android

Unter Einstellungen → Verbundene Geräte/Drucken → Standarddruckdienst den Systemdruckdienst aktivieren. Die Bezeichnung unterscheidet sich nach Android-Version. Der Drucker sollte über IPP/mDNS erscheinen. Falls nicht, prüfe WLAN-Client-Isolation und richte den Drucker – wenn der jeweilige Systemdruckdienst dies anbietet – manuell per IPP-URL ein.

Linux und optional macOS

Linux-Desktops finden freigegebene DNS-SD-Drucker oft automatisch. Als manuelles Linux-Beispiel:

lpadmin -p Brother_HL1110 -E -v ipp://SERVER-IP:631/printers/Brother_HL1110 -m everywhere

Aktuelle macOS-Versionen unterstützen IPP/AirPrint ebenfalls, sofern mDNS im Netz erlaubt ist.

Optionales Power-Management

Der sichere Standard ist:

PRINTER_POWER_METHOD=none

Dann bleibt der Drucker an der Netzspannung und nutzt seinen eigenen Energiesparmodus. Das ist die stabilste Betriebsart.

Für echten Netzstrombetrieb verwende MQTT mit einer Smart-Plug- oder Home-Automation-Regel:

PRINTER_POWER_METHOD=mqtt
MQTT_HOST=192.168.0.40
MQTT_PORT=1883
MQTT_TOPIC=/SmartHome/Serverraum/Brother_HL1110/
MQTT_ON_PAYLOAD=ON
MQTT_OFF_PAYLOAD=OFF

Der Monitor fragt CUPS standardmäßig alle drei Sekunden ab. Bei einem wartenden Job schaltet er ein, wartet auf die USB-Erkennung und aktualisiert die bekannte CUPS-URI. CUPS behält den Job währenddessen in seiner persistenten Queue. Nach leerem Queue-Zustand läuft der Idle-Timer; vor dem Abschalten wird zweimal geprüft (mit fünf Sekunden Abstand), dass kein Auftrag vorhanden ist.

Bei nicht erreichbarer MQTT-Infrastruktur, fehlendem USB-Gerät oder Timeout protokolliert der Dienst einen Fehler und versucht später erneut. Er löscht keine Queue und keine Druckjobs.

Optionales Web-UI

Das UI ist standardmäßig aus. Es startet nur mit expliziter Aktivierung und zwei gesetzten Zugangsdaten:

WEB_ENABLED=true
WEB_PORT=8080
WEB_USERNAME=...
WEB_PASSWORD=...

Danach ist es im LAN unter http://SERVER-IP:8080 erreichbar und verwendet HTTP Basic Auth. Stelle es niemals über das Internet bereit.

Nützliche Betriebsbefehle

# Status inklusive lpstat und lsusb
docker compose exec brother-printserver /usr/local/bin/printer-status.sh

# Nur manuell, wenn Power Management konfiguriert ist
docker compose exec brother-printserver /usr/local/bin/printer-on.sh
docker compose exec brother-printserver /usr/local/bin/printer-off.sh

# Laufende CUPS-Queue
docker compose exec brother-printserver lpstat -o Brother_HL1110

Aktualisierung und Fehlerdiagnose

docker compose down
docker compose build --pull
docker compose up -d
docker compose logs -f

Bei USB-Problemen zuerst die Host-Daten (lsusb, lsusb -t) und dann die Containeransicht (lpinfo -v, lsusb) vergleichen. Verwende nicht reflexartig privileged: true; der beabsichtigte und dokumentierte Zugriff ist der USB-Bus.