老旧打印机回春:HP P1505n 的 Docker CUPS 与 AirPrint 完整部署方案

HP LaserJet P1505n 是一款基于 Host-based 协议的经典打印机。本文将分享一套通过 Docker 容器化技术,为该打印机提供完美 AirPrint 支持的方案。

本方案解决了 iOS 预览显示、Web 管理权限、多余打印机名称以及物理关机后自动显示离线等核心问题。

🛠 1. 环境准备 (宿主机 Debian)

在开始之前,请确保宿主机没有任何冲突的打印服务:

  • 清理冲突服务:停止并禁用宿主机的 avahi-daemoncups
  • 创建持久化目录:建议路径为 /opt/docker_data/hp-cups/,并在其下创建 configservices 文件夹。
  • 准备插件:将 hplip-3.22.6-plugin.run 放入 /opt/docker_data/hp-cups/

📦 2. 核心配置文件

2.1 Docker Compose (1Panel 编排)

使用 Host 网络模式以确保 mDNS 广播效率,并通过自定义 entrypoint 解决 D-Bus 冲突。

1
2
3
4
5
6
7
8
9
10
11
12
services:
cups:
image: p1505n-final:latest
container_name: cups-server
restart: always
network_mode: host
privileged: true
entrypoint: /bin/sh -c "rm -f /var/run/avahi-daemon/pid && sed -i 's/.*enable-dbus=.*/enable-dbus=no/g' /etc/avahi/avahi-daemon.conf && chmod 644 /etc/avahi/services/airprint.service && avahi-daemon -D --no-chroot && sleep 2 && /usr/sbin/cupsd -f & sleep 10 && cupsctl --remote-admin --remote-any --share-printers && avahi-daemon --reload && wait"
volumes:
- /opt/docker_data/hp-cups/config:/etc/cups
- /opt/docker_data/hp-cups/services/airprint.service:/etc/avahi/services/airprint.service
- /opt/docker_data/hp-cups/hplip-3.22.6-plugin.run:/etc/cups/hplip-3.22.6-plugin.run

2.2 cupsd.conf (权限与广播策略)

关闭内置广播以消除重复,并放行远程管理权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
LogLevel warn
MaxLogSize 1m
ErrorLog stderr

Port 631
Listen /var/run/cups/cups.sock

Browsing Off
BrowseLocalProtocols none
BrowseWebIF No

<Location />
Order allow,deny
Allow all
</Location>

<Location /admin>
Order allow,deny
Allow all
</Location>

<Location /printers>
Order allow,deny
Allow all
</Location>

DefaultEncryption IfRequested
ServerAlias *

2.3 airprint.service (Avahi 广播描述)

定义 iOS 发现打印机所需的 URF 参数,确保预览图显示正常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">HP LaserJet P1505n (AirPrint)</name>
<service>
<type>_ipp._tcp</type>
<subtype>_universal._sub._ipp._tcp</subtype>
<port>631</port>
<txt-record>txtvers=1</txt-record>
<txt-record>rp=printers/hp1505n</txt-record>
<txt-record>ty=HP LaserJet P1505n</txt-record>
<txt-record>URF=W8,SRGB24,CP1,RS600</txt-record>
<txt-record>Color=F</txt-record>
</service>
</service-group>

📡 3. 物理状态同步 (自动离线监控)

通过检测打印机 IP 连通性来联动开关广播服务,让 iOS 端状态与物理机同步。

3.1 监控脚本 ip_monitor.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
PRINTER_IP="192.168.1.X" # 修改为打印机实际 IP
CONTAINER_NAME="cups-server"

while true; do
if ping -c 2 -W 2 $PRINTER_IP > /dev/null; then
if ! docker exec $CONTAINER_NAME pgrep avahi-daemon > /dev/null; then
docker exec $CONTAINER_NAME avahi-daemon -D --no-chroot
docker exec $CONTAINER_NAME avahi-daemon --reload
fi
else
if docker exec $CONTAINER_NAME pgrep avahi-daemon > /dev/null; then
docker exec $CONTAINER_NAME avahi-daemon -k 2>/dev/null
fi
fi
sleep 10
done

💡 4. 初始化与维护流程

  1. 启动编排:在 1Panel 中应用并启动容器。
  2. 安装驱动插件:运行以下命令完成固件插件安装。
    1
    docker exec -it cups-server hp-plugin -i -p /etc/cups/hplip-3.22.6-plugin.run -s
  3. 清理缓存:若在手机端发现重名打印机,请重启 iPhone 或开关飞行模式以刷新 mDNS 缓存。

本文由 Elric 的 不太聪明智能助理「小龍蝦 🦞」协助整理与发布。