网络唤醒工具UpSnap部署使用以及高阶使用PVE管理,docker管理

1,514 阅读8分钟

GitHub 最新版 最新提交时间 DockerHub ghcr.io

介绍

一个用 SvelteKit、Go 和 PocketBase 编写的简单 LAN 网络应用程序唤醒。
UpSnap 是,和 永远是,免费和开源软件。

特征

  • 🚀 一键式设备唤醒仪表板
  • ⏰ 通过 Cron 实现自动化的定时事件
  • 🔌 Ping 您选择的任何端口
  • 🔍 使用网络扫描发现设备(需要 nmap)
  • 👤 安全的用户管理
  • 🌐 i18n 对这些语言的支持
  • 🎨 35 个主题
  • 🐳 适用于 amd64、arm64、arm/v7、arm/v6 的 Docker 镜像
  • 🏠 自托管

自由度高,可通过自定义Ping唤醒关机命令来实现进阶功能

  • 管理PVE虚拟机
  • 管理docker容器

欢迎关注我B站账号 秦曱凧 (读作 qín yuē zhēng)

有需要帮忙部署这个项目的朋友,一杯奶茶,即可程远程帮你部署,需要可联系。
微信号 E-0_0-
闲鱼搜索用户 明月人间
或者邮箱 firfe163@163.com
如果这个项目有帮到你。欢迎start。

镜像

  • DockerHub
    seriousm4x/upsnap:5.1.9
    
  • ghcr.io
    ghcr.io/seriousm4x/upsnap:5.1.9
    

docker run 部署

mkdir -p /docker/upsnap && \
cd /docker/upsnap
docker run -d \
  --name upsnap \
  --restart always \
  --cpus 1 --memory 512m \
  --log-opt max-size=1m \
  --log-opt max-file=3 \
  --network bridge \
  --tty --interactive \
  -e TZ=Asia/Shanghai \
  -e TIME_ZONE=Asia/Shanghai \
  -e UPSNAP_WEBSITE_TITLE=网站标题 \
  -p 端口:5000 \
  -v 映射路径:/app/pb_data \
  -v 映射路径:/ssh \
  seriousm4x/upsnap:5.1.9

compose 部署

compose 文件

文件名

compose.yaml

文件内容

# version: "3"

name: upsnap

x-config: &config
  restart: always
  cpus: 1
  mem_limit: 512m
  logging:
    options:
      max-size: 1m
      max-file: "3"

services:
  upsnap:
    container_name: upsnap
    image: seriousm4x/upsnap:5.1.9
    network_mode: bridge
    tty: true
    stdin_open: true
    <<: *config
    environment:
      TZ: Asia/Shanghai
      TIME_ZONE: Asia/Shanghai
      UPSNAP_WEBSITE_TITLE: 网络唤醒
    ports:
      - 端口:8090
    volumes:
      - 文件路径/data:/app/pb_data
      - 文件路径/ssh:/ssh

部署命令

docker compose up -d

参数说明

  • 初始化设置管理员账号

  • 中文

    • 登录
    • 点击 右上角头像
    • 点击 Edit account
    • Language 选择 中文
    • 点击 Save
  • 自定义端口
    配置中添加下面内容

        entrypoint: /bin/sh -c "./upsnap serve --http 0.0.0.0:端口"
        # 健康检查,自定义端口后建议添加
        healthcheck:
          test: curl -fs "http://localhost:端口/api/health" || exit 1
          interval: 10s
    
  • 环境变量

    • UPSNAP_INTERVAL 示例值:*/10 * * * * *,设置设备轮询的时间间隔
    • UPSNAP_SCAN_RANGE 示例值:192.168.1.0/24,扫描范围用于本地网络上的设备发现
    • UPSNAP_SCAN_TIMEOUT 示例值:500ms,扫描超时是 nmap 的 --host-timeout 参数值,用于等待设备响应 (nmap.org/book/man-pe…)
    • UPSNAP_PING_PRIVILEGED 示例值:true,如果没有 root 用户权限,设置为 false

下面所有Linux命令以Debian为例

系统开启网络唤醒

不同的主板策略不同,有的直接在bios中打开对应的选项即可,有的需要在系统中配置,具体情况和询问主板客服。

Windows设置方法

  • 打开设备管理器
    • 在“网络适配器”中找到电脑网卡名称,鼠标右键选择“属性”
    • 点击高级,找到【Wakke on Magic Packer】设置为【Enabled】值即可
  • 关闭快速启动功能
    • 在电脑的搜索窗口搜索“选择电源计划”,然后点击打开选择电源计划
    • 点击【选择电源按钮的功能】
    • 先点击【更改当前不可用的设置】,然后再取消勾选“启用快速启动”选项即可

Linux(Debian)设置方法

  • 检查网卡是否支持 WOL
    首先,确认你的网卡支持网络唤醒功能。
    • 使用 ethtool 检查
      1. 安装 ethtool
        apt update && apt install ethtool
        
      2. 查看网卡名称:
        ip a
        
        找到你的网卡名称(如 eth0enp0s3)。
      3. 检查 WOL 支持:
        ethtool <网卡名称>
        
        ethtool enp0s3
        
        在输出中,找到 Supports Wake-onWake-on 字段:
        • Supports Wake-on:表示网卡支持的 WOL 模式(如 g 表示支持魔术包唤醒)。
        • Wake-on:当前 WOL 设置(d 表示禁用,g 表示启用)。
  • 启用 WOL
    如果网卡支持 WOL,但当前未启用,可以通过以下步骤启用。
    • 使用 ethtool 启用
      运行以下命令启用 WOL:
      ethtool -s 网卡名称 wol g
      
      ethtool -s enp0s3 wol g
      
  • 验证是否启用
    再次运行 ethtool 检查 Wake-on 字段是否为 g
    ethtool enp0s3
    
  • 持久化 WOL 设置
    默认情况下,ethtool 的设置会在重启后失效。为了持久化 WOL 设置,可以通过以下方法实现。
    1. 编辑网络配置文件:
      nano /etc/network/interfaces.d/<网卡名称>
      
      如果文件不存在,可以编辑 /etc/network/interfaces
    2. 在网卡配置中添加以下行:
      up /sbin/ethtool -s <网卡名称> wol g
      
      auto enp0s3
      iface enp0s3 inet dhcp
          up /sbin/ethtool -s enp0s3 wol g
      
    3. 保存并退出,然后重启网络服务:
      systemctl restart networking
      

普通网络唤醒

  • 新增
  • 通用(下面内容必填)
    • 名称 给添加的设备起一个名字
    • IP 需要唤醒设备的IP地址
    • MAC 需要唤醒设备的MAC地址
    • 子网掩码,一般是255.255.255.0
    • 查看IP和MAC
      • NAS 图形界面中的网络设置
      • Linux 终端输入命令ip a
      • Windows 设置 网络和Internet 属性
  • 链接(可不写) 可以添加设置的常用网址
  • 分组(可不写) 根据需求添加
  • 保存

添加关机命令

注意实际使用时,把下面示例命令中的密码或秘钥文件名 pass.txt key.txt 改成自己添加的,() 设备IP192.168.1.11也改成自己实际的设备IP

Linux(NAS)

原理是通过SSH链接设备,执行关机命令。因此设备的SSH需要开启

  • 准备密码或秘钥

    • 将密码或秘钥写入一个文本文件中
    • 文件放在部署时映射的ssl目录中
    • 下面示例中
      • 密码文件名 pass.txt
      • 秘钥文件名 key.txt
      • 设备IP 192.168.1.11
  • root用户

    • 关机选项中关机命令天机下面内容

    • 密码 格式

      sshpass -f 密码文件 ssh -o "StrictHostKeyChecking=no" 用户名@IP "具体命令"
      

      示例

      sshpass -f /ssh/pass.txt ssh -o "StrictHostKeyChecking=no" root@IP "shutdown -h now"
      
      • 密码明文(不推荐)
        sshpass -p 密码 ssh -o "StrictHostKeyChecking=no" 用户@IP地址 "shutdown -h now"
        
    • 秘钥

      在使用秘钥时,要确保秘钥文件只有所有者可读,即权限600

      格式

      ssh -i 密钥路径 -o "StrictHostKeyChecking=no" 用户@IP地址 "具体命令"
      

      示例

      ssh -i /ssh/key.txt -o "StrictHostKeyChecking=no" root@192.168.1.1 "shutdown -h now"
      
  • root用户

    • 需要用户具有执行shutdown命令的权限
    • 这里提供一个简单的通过编辑visudo文件来实现
      • 切换到root
      • 输入下面命令
        visudo
        
      • 在末尾写入下面内容 用户名 ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt
      • 保存退出
      • 这样指定的用户就可以直接运行sudo shutdown -h now而不需要输入密码来关机

Windows

在 Windows 上通过 net rpc来执行命令关机,因为net rpc走的是SMB通道,因此需要目标设备开启SMB共享、防火墙关闭或开启ping相关的规则。

  • 防火墙操作

    • 打开 高级安全 Windows Defender 防火墙
    • 相关入站规则
      • 核心网络诊断 - ICMP 回显请求(ICMPv4-In) 专用公用
  • 密码明文

    net rpc shutdown -I IP地址 -U "用户名%密码"
    
  • 密码文件

    • 创建一个文件,存放用户名密码
    • 文件内容格式
      username=用户名
      password=你的密码
      
    • 设置权限
      • 必须设置为 600,否则 net 命令会拒绝读取
    • 命令格式
      net rpc shutdown -I 192.168.1.100 -A 用户名密码文件路径
      

定时开关机

通过cron来设置定时规则

管理PVE

  • 思路

    • 在唤醒部分通过自定义命令,用SSH链接到PVE上,执行对应虚拟机的开机命令即可
  • CT模板 开机命令

    pct start 容器ID
    
  • 普通虚拟机 开机命令

    qm start 虚拟机ID
    

管理docker容器

  • 思路

  • Ping选项,自定义检测容器端口命令代替Ping

  • 在唤醒和关机部分远程执行容器的启动和停止命令

  • 权限问题

    • 默认只有root用户有权限操作docker
    • 如果使用非root用户,需要赋予用户执行docker的权限
      • 切换到root
      • 查看是否有Docker用户组
        grep docker /etc/group
        
      • 创建Docker用户组
        groupadd docker
        
      • 查看/var/run/docker.sock是否属于Docker用户组
        ls -l /var/run/docker.sock
        
      • 将用户添加到Docker用户组
        usermod -aG docker 用户名
        
      • 需要注销再重新登录或重启系统以使更改生效。
  • Ping 自定义
    格式如下,替换容器的具体IP和端口

    nc -z -w 1 IP 端口; exit $?
    
  • 容器操作

    • 容器名称在容器部署时可以设置,没设置会自动生成
      • docker run命令通过参数--name设置
      • compose通过通过参数container_name设置
      • 没有设置,自动生成的需要自己查找
    • 开启
      • 单个
        docker start 容器名
        
      • 多个
        docker start 容器名1 容器名2 容器名3
        
    • 停止
      • 单个
        docker stop 容器名
        
      • 多个
        docker stop 容器名1 容器名2 容器名3
        
  • Compose操作
    这个仅限非NAS的Linux设备,NAS上不行

    • 启动
      cd compose文件目录 && docker compose start
      
    • 停止
    • cd compose文件目录 && docker compose stop