Github https://github.com/Kaiyuan/go4wol
好几年前我用 Nodejs 弄的,配置起来很麻烦,现在我喊 Claude 用 Go 写一个,并且直接 Docker 部署就可以用了。
2.0
增加一个网页,可以直接在网页上实现唤醒设备,网页有设备记录功能,支持 PWA。
Docker Compose 部署
version: '3.8'
services:
go4wol:
build: .
container_name: go4wol
restart: unless-stopped
network_mode: host # 使用host网络模式,确保能够发送广播包
# 注意:使用host网络模式时,ports映射会被忽略
ports:
- "52133:52133" # 在host网络模式下这行会被忽略,但保留以备切换到bridge模式
environment:
- PORT=52133
- ADMIN_PASSWORD=your_secure_password # 请修改为安全的密码
- TZ=Asia/Shanghai
volumes:
- ./data:/data:rw # 挂载数据目录到宿主机,确保读写权限
user: "1000:1000" # 使用与容器内相同的用户ID
labels:
- "traefik.enable=true"
- "traefik.http.routers.go4wol.rule=Host(`go4wol.local`)"
- "traefik.http.services.go4wol.loadbalancer.server.port=52133"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
image: kaiyuan/go4wol:latest
# 如果不能使用host网络模式,请使用以下配置
# services:
# go4wol:
# build: .
# container_name: go4wol
# restart: unless-stopped
# ports:
# - "52133:52133"
# environment:
# - PORT=52133
# - ADMIN_PASSWORD=your_secure_password
# - TZ=Asia/Shanghai
# volumes:
# - ./data:/data
# networks:
# - go4wol-network
# privileged: true # 可能需要特权模式来发送广播包
#
# networks:
# go4wol-network:
# driver: bridge
1.0
运行
version: '3.8'
services:
go4wol:
build: .
container_name: go4wol
restart: unless-stopped
ports:
- "52133:52133"
environment:
- PORT=52133
- TZ=Asia/Shanghai
network_mode: host
# 给容器特权以发送网络广播包(仅在必要时使用)
# privileged: true
labels:
- "traefik.enable=true"
- "traefik.http.routers.wol.rule=Host(`wol.local`)"
- "traefik.http.services.wol.loadbalancer.server.port=52133"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
image: kaiyuan/go4wol:1.0
API 接口
发送WOL包
端点: POST /wol
请求体:
{
"mac": "AA:BB:CC:DD:EE:FF", // 必需:目标设备的MAC地址
"broadcast": "192.168.1.255", // 可选:广播地址,默认255.255.255.255
"port": 9 // 可选:端口号,默认9
}
响应:
{
"success": true,
"message": "WOL packet sent successfully",
"mac": "AA:BB:CC:DD:EE:FF"
}
健康检查
端点: GET /health
响应:
{
"status": "healthy",
"timestamp": "2024-01-15T10:30:00Z",
"service": "WOL Service"
}
使用示例
cURL 命令
# 发送WOL包
curl -X POST http://localhost:52133/wol \
-H 'Content-Type: application/json' \
-d '{"mac":"AA:BB:CC:DD:EE:FF"}'
# 指定广播地址和端口
curl -X POST http://localhost:52133/wol \
-H 'Content-Type: application/json' \
-d '{"mac":"AA:BB:CC:DD:EE:FF","broadcast":"192.168.1.255","port":9}'
JavaScript 示例
async function wakeDevice(mac, broadcast = null, port = null) {
const payload = { mac };
if (broadcast) payload.broadcast = broadcast;
if (port) payload.port = port;
const response = await fetch('/wol', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
const result = await response.json();
return result;
}
// 使用示例
wakeDevice('AA:BB:CC:DD:EE:FF')
.then(result => console.log('WOL发送结果:', result))
.catch(error => console.error('错误:', error));
网络配置注意事项
-
推荐使用host网络模式:这样可以确保WOL广播包能够正确发送
-
如果必须使用bridge模式,确保Docker网络配置允许广播
-
确保目标设备的网卡支持Wake-on-LAN功能
故障排除
常见问题
-
WOL包发送失败
-
检查目标设备是否支持Wake-on-LAN
-
确认网络配置和广播地址正确
-
验证MAC地址格式是否正确
-
-
服务无法访问
-
检查端口是否被占用
-
确认防火墙设置
-
验证Docker容器是否正常运行
-
-
权限问题
-
确保部署脚本有执行权限
-
检查Docker是否正常运行
-
调试方法
# 检查容器状态
docker ps -a | grep go4wol
# 查看详细日志
docker logs go4wol
# 进入容器调试
docker exec -it go4wol sh
# 测试网络连接
curl http://localhost:52133/health