Dieses HowTo zeigt, wie du das Projekt gilbertfl/escpos-netprinter als virtuellen ESC/POS-Netzwerkdrucker einsetzt. Der Dienst emuliert einen 80-mm-Bondrucker, nimmt Druckdaten per Netzwerk entgegen und speichert Ausdrucke als HTML-Seiten, die du über eine Weboberfläche ansehen kannst.
escpos-netprinter reproduzierbar auf Linux oder in einer Hyper-V-Umgebung ein, verstehst die benötigten Ports und Datenpfade und kannst Testdrucke sowie Fehlersuche sauber durchführen.
Das Repository stellt einen containerbasierten ESC/POS-Netzwerkdrucker bereit. Ausdrucke werden nicht auf Papier ausgegeben, sondern als HTML-Belege gespeichert und im Browser angezeigt.
| Komponente | Funktion |
|---|---|
9100/tcp |
JetDirect bzw. RAW-Druckdaten für viele POS- und Bondrucker-Clients |
515/tcp |
LPD-Schnittstelle |
80/tcp |
Weboberfläche zum Anzeigen der empfangenen Belege |
631/tcp |
Optional für CUPS-Administration bei Debugging |
9100 oder 515 senden kannFür Linux empfiehlt sich Docker Engine. Auf Windows-Hosts mit Hyper-V hast du in der Praxis zwei sinnvolle Wege:
Wenn du den ESC/POS-Emulator auf einem dedizierten Ubuntu Server 22.x betreiben willst, solltest du zuerst die Netzwerkkonfiguration sauber festlegen. In diesem Beispiel erhält der Server die statische Adresse 192.168.10.20/24, als Gateway 192.168.10.1 und als DNS-Server ebenfalls 192.168.10.1.
192.168.10.20/24, damit POS-Clients, Testsysteme oder Hyper-V-Hosts den Emulator immer unter derselben Adresse erreichen können.
Prüfe zuerst den Namen des Netzwerkinterfaces. Je nach Installation heißt es häufig eth0, ens160, enp0s3 oder ähnlich.
ip a
Unter Ubuntu Server 22.x wird die Netzwerkkonfiguration in der Regel mit Netplan verwaltet. Öffne die vorhandene YAML-Datei, zum Beispiel:
sudo nano /etc/netplan/00-installer-config.yaml
Ersetze den Inhalt durch eine Konfiguration wie im folgenden Beispiel. Passe dabei den Interfacenamen an dein System an. Im Beispiel wird eth0 verwendet.
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.10.20/24
routes:
- to: default
via: 192.168.10.1
nameservers:
addresses:
- 192.168.10.1
Teste die Konfiguration zuerst, bevor du sie dauerhaft aktivierst:
sudo netplan try
Wenn alles funktioniert, übernimm die Einstellungen dauerhaft:
sudo netplan apply
ip a
ip route
resolvectl status
Prüfe anschließend die Erreichbarkeit von Gateway und DNS:
ping -c 4 192.168.10.1
ping -c 4 google.com
192.168.10.20 gesetzt ist, die Standardroute auf 192.168.10.1 zeigt und Namensauflösung funktioniert, ist die Basis für Docker und den ESC/POS-Dienst bereit.
Nach der Netzwerkkonfiguration installierst du Docker Engine direkt auf dem Ubuntu Server. Damit läuft der Emulator stabil und unabhängig von einer Desktop-Umgebung.
sudo apt update
sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
sudo docker run hello-world
Wenn du Docker später ohne sudo nutzen möchtest:
sudo usermod -aG docker $USER
newgrp docker
sudo oft völlig ausreichend. Für Labor- oder Testsysteme ist die Docker-Gruppe bequem, auf produktionsnahen Systemen solltest du Berechtigungen bewusst vergeben.
Installiere auf einer unterstützten Linux-Distribution Docker Engine. Auf Ubuntu kannst du dafür die offizielle Docker-Dokumentation verwenden.
Der einfachste Start erfolgt mit dem vorgebauten Image aus Docker Hub. Das Repository nennt dazu folgenden Startansatz:
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
--mount source=receiptVolume,target=/home/escpos-emu/web \
gilbertfl/escpos-netprinter:3.2
Wenn du statt eines Docker-Volumes lieber ein Host-Verzeichnis verwenden willst, kannst du einen Bind-Mount nutzen:
mkdir -p /srv/escpos-netprinter/web
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
-v /srv/escpos-netprinter/web:/home/escpos-emu/web \
gilbertfl/escpos-netprinter:3.2
Nach dem Start erreichst du die Oberfläche über die zuvor konfigurierte statische Server-IP. In diesem Beispiel lautet die Adresse:
http://192.168.10.20/
Dort erscheinen die empfangenen Belege als HTML-Ausgaben.
Die robusteste Umsetzung in Hyper-V ist eine eigene Linux-VM, zum Beispiel Ubuntu Server. Der Hyper-V-Host stellt dabei nur die Virtualisierung bereit, und der ESC/POS-Dienst läuft vollständig in der Gast-VM.
Externen virtuellen Switch, damit andere Systeme die Druckports erreichen könnenDamit POS-Clients oder Testsysteme den virtuellen Drucker erreichen, muss die VM an einen passenden virtuellen Switch gebunden sein.
| Switch-Typ | Einsatz |
|---|---|
| Extern | Die VM ist aus deinem LAN erreichbar. Für echte Netzwerktests meist die beste Wahl. |
| Intern | Kommunikation nur zwischen Host und VMs. Gut für Labors ohne Zugriff aus dem restlichen Netzwerk. |
| Privat | Nur VM-zu-VM. Für typische ESC/POS-Tests meist zu eingeschränkt. |
Falls du keinen separaten Linux-Gast betreiben möchtest, kannst du Docker Desktop auf dem Windows-System verwenden und Linux-Container ausführen. Docker Desktop unterstützt auf Windows WSL 2 und arbeitet je nach Modus mit virtualisierten Backends.
Danach kannst du denselben Containerbefehl auch in PowerShell ausführen:
docker run -d `
--name escpos-netprinter `
-p 515:515/tcp `
-p 80:80/tcp `
-p 9100:9100/tcp `
--mount source=receiptVolume,target=/home/escpos-emu/web `
gilbertfl/escpos-netprinter:3.2
Wenn du das Image nicht aus Docker Hub verwenden möchtest, kannst du es laut Repository auch selbst bauen:
wget --show-progress https://github.com/gilbertfl/escpos-netprinter/archive/refs/tags/3.2.zip
unzip 3.2.zip
cd escpos-netprinter-3.2
docker build -t escpos-netprinter:3.2 .
Anschließend startest du den selbst gebauten Container:
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
--mount source=receiptVolume,target=/home/escpos-emu/web \
escpos-netprinter:3.2
Das Repository nennt mehrere Verzeichnisse innerhalb des Containers, die für Betrieb und Fehlersuche relevant sind.
| Pfad im Container | Bedeutung |
|---|---|
/home/escpos-emu/web/ |
Belege, Statusdaten und Logs |
/home/escpos-emu/web/receipts |
HTML-Belege |
/home/escpos-emu/web/tmp |
Temporäre Dateien, vor allem beim Debugging |
/home/escpos-emu/web/receipt_list.csv |
Liste der empfangenen Belege mit Dateipfaden |
Das Projekt unterstützt die Umgebungsvariable ESCPOS_DEBUG=True. Damit werden laut README ausführlichere Logs für CUPS, JetDirect, ESC/POS-Konvertierung und die Weboberfläche erzeugt.
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
--mount source=receiptVolume,target=/home/escpos-emu/web \
--env ESCPOS_DEBUG=True \
gilbertfl/escpos-netprinter:3.2
docker logs escpos-netprinter
# fortlaufend ansehen
docker logs -f escpos-netprinter
Bei Problemen mit der CUPS-Schnittstelle kannst du zusätzlich Port 631 veröffentlichen:
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
-p 631:631/tcp \
--mount source=receiptVolume,target=/home/escpos-emu/web \
gilbertfl/escpos-netprinter:3.2
cupsadmin mit dem Passwort 123456 genannt. Ändere diese Zugangsdaten sofort oder nutze Port 631 nur kurzzeitig in einem isolierten Testnetz.Für einen einfachen Funktionstest reicht es, rohe Daten an Port 9100 zu senden. Unter Linux kannst du beispielsweise mit nc testen:
printf 'Testbeleg\n\nHallo ESC/POS\n\n' | nc <IP-des-Containers-oder-der-VM> 9100
Wenn deine Anwendung bereits mit einem Netzwerk-Bondrucker arbeitet, trägst du einfach die IP-Adresse deiner VM oder deines Docker-Hosts und Port 9100 als Druckziel ein.
| Variable | Standardwert | Zweck |
|---|---|---|
ESCPOS_DEBUG |
false |
Ausführliche Debug-Ausgabe aktivieren |
PRINTER_PORT |
9100 |
JetDirect-Port |
FLASK_RUN_DEBUG |
false |
Flask-Debug-Modus |
FLASK_RUN_PORT |
80 |
Port der Weboberfläche |
ESCPOS_TIMEZONE |
America/Montreal |
Zeitzone für Datum und Uhrzeit |
Beispiel mit angepasster Zeitzone:
docker run -d \
--name escpos-netprinter \
-p 515:515/tcp \
-p 80:80/tcp \
-p 9100:9100/tcp \
--mount source=receiptVolume,target=/home/escpos-emu/web \
--env ESCPOS_TIMEZONE=Europe/Vienna \
gilbertfl/escpos-netprinter:3.2
9100 oder 515 sendetdocker psESCPOS_DEBUG=True und beobachte docker logs -fping oder Test-NetConnection/home/escpos-emu/webFür produktionsnahe Tests empfiehlt sich meistens eine kleine Linux-VM unter Hyper-V mit externer Netzwerkanbindung. Diese Kombination ist übersichtlich, portabel und vermeidet unnötige Abhängigkeiten vom Windows-Desktop. Für schnelle lokale Tests genügt dagegen häufig Docker Desktop auf dem Host.
escpos-netprinter ist ein praktischer ESC/POS-Emulator für Labor, Entwicklung und Integrationstests. Besonders auf Linux oder in einer Hyper-V-Linux-VM lässt sich das Projekt sauber betreiben. Mit den Ports 9100, 515 und 80, einem persistenten Mount und optionalem Debugging hast du schnell eine virtuelle Bondrucker-Umgebung, die Papier spart und gleichzeitig gute Sicht auf die erzeugten Belege bietet.