Joulenap/joulenap

GitHub: Joulenap/joulenap

Joulenap 是一个自托管的 Proxmox VE 备份调度器,通过 Wake-on-LAN 按需唤醒和关闭备份服务器,实现节能的自动化备份流程。

Stars: 18 | Forks: 0

Joulenap

你的 Proxmox 备份服务器在休眠。Joulenap 唤醒它,运行备份,然后再让它安然入睡。

CI License: AGPL v3 Docker image

Joulenap 是一个小型自托管的 **Web UI + 调度器**,可运行自动化的 Proxmox VE 备份,将其备份到**大部分时间都处于关机状态的 Proxmox Backup Server (PBS)**。在预定的时间,它会通过网络(Wake-on-LAN)唤醒 PBS,运行备份,应用保留和垃圾回收策略,将 PBS 重新关闭,并通知你——这样你就可以获得异地、去重的备份,而**无需让第二台机器 24/7 全天候运行**。 名字就说明了这一点:当你的备份服务器打个盹儿时,节省了一个 *joule*(焦耳)的能量。💤 ## 为什么需要 专用的 PBS 机器是将备份保留在独立硬件上的正确方法(3-2-1 规则),但如果让设备 24/7 全天候运行,仅仅为了每晚执行几分钟的任务,这会浪费电力。Proxmox 内置的计划备份假设目标始终可达,因此它们无法驱动“唤醒 → 备份 → 休眠”的循环。 Joulenap 用一个友好的 UI 填补了这一空白:选择时间,选择要备份的 guest,然后就无需操心了。 ## 工作原理
Joulenap **自行管理计划**(内部调度器),因此无需对 Proxmox 主机进行任何修改。它通过 **API**(受限的 token)与 PVE 和 PBS 通信,并且仅使用单个 **SSH** 命令来执行 PBS 关机操作,因为该操作没有 API。 ## 功能 - ⏰ Web UI 调度器:选择备份时间,启用/禁用,查看下一次/上一次运行 - 🔌 PBS 的 Wake-on-LAN,带有就绪等待和超时机制 - 🗂️ 按 guest 选择:备份**所有** guest、**排除**列表中的所有 guest,或明确的**包含**列表(在前两种模式下,新 guest 会自动被覆盖) - ♻️ 保留策略(每日/每周/每月/每年),每次备份后进行垃圾回收 (GC),以及单独调度的 verify - 🔔 通知:支持 Apprise、Telegram、ntfy、Discord、电子邮件 — 可在成功和/或失败时发送 - 📜 实时日志查看器,带有逐步详情的运行历史记录,实时 PVE/PBS 任务输出,以及手动的“立即运行备份” / “立即运行 GC”(可选择让 PBS 保持唤醒)— 支持在运行中途停止 - ⚙️ 高级设置选项卡,带有内置的 `config.yaml` 编辑器,以及可选的更新检查 - 📊 集成:支持 Homepage、Homarr、Dashy 或 Glance 的备份状态,以及用于 Grafana 的 Prometheus `/metrics` 端点(当某个 guest 停止备份时发出警报)— 详见 [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) - 🌍 多语言 UI - 🔒 受登录保护;机密信息不保留在仓库中 ## 状态 **v0.9.0.** 功能完备:调度器 + Wake-on-LAN + vzdump + 保留策略 + GC + verify + 通知 + 设置向导,已打包为 Docker 镜像 — 具备传输加固(PBS TLS pinning + SSH 主机密钥验证)和认证加固(登录速率限制、会话加固)。 包括外部调度模式(PVE/PBS 运行各自的任务;Joulenap 负责唤醒 PBS,监控任务并在任务完成后将其关闭),带有逐步详情的运行历史记录,支持在运行中途停止任务,用于仪表板 (Homepage/Homarr/Dashy/Glance)和 Prometheus 的[集成](docs/INTEGRATIONS.md),即使 PBS 关机也能显示持久化数据存储的使用情况,按通道生成的通知测试报告,以及可在手机上使用的响应式 UI。 设计与 API 详见 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。 ## 快速开始 (Docker) 只需一条命令 — 无需下载文件,无需事先编辑配置。容器会在首次运行时创建自己的配置,你只需通过 Web 向导将其填写完整: ``` mkdir -p /opt/joulenap/data docker run -d --name joulenap \ --restart unless-stopped \ --network host \ -e TZ=Etc/UTC \ -v /opt/joulenap/data:/app/data \ catubba/joulenap:latest # 然后打开 http://:8080 ``` `--network host` 让 Joulenap 能够在你的局域网广播中发送 Wake-on-LAN 魔术包;这个单独的 `data` 目录会在更新后持久化保存配置、历史记录、日志和 SSH 密钥。你可以在**首次运行界面上选择你的时区**(已通过浏览器预先检测),因此上面的 `TZ` 只是一个中立的默认值。更喜欢使用 Compose?请参阅 [`docker-compose.example.yml`](docker-compose.example.yml)。 📖 **完整指南:** [`docs/INSTALL.md`](docs/INSTALL.md) 介绍了如何从零开始安装 **Proxmox LXC**(创建容器 → 安装 Docker → 运行 Joulenap),以及 Docker Compose 和无 Docker 的原生安装方式、时区和首次运行设置。每个配置字段都在 [`config.example.yaml`](config.example.yaml) 中有详细文档说明。 ## 配置 所有设置都保存在 `config.yaml` 中(每个字段的具体说明、分组和注释请参见 [`config.example.yaml`](config.example.yaml))。通常你不需要手动修改它 — 容器会在首次运行时在挂载的 `data/` 目录中创建它,并由**设置向导**来填充内容。机密信息(API token、SSH 密钥、bot token)保留在该 `config.yaml` 中;仓库中的副本被 **git-ignored**(Git 忽略),因此永远不会被提交。 ## 安全性 Joulenap 可以触发备份以及开启/关闭机器,因此应将其视为特权应用: - 对 PVE 和 PBS 使用**受限的 API token**,而不是 root 密码 — 每个 token 所需的确切权限列在 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#permissions-cheat-sheet) 中。 - 用于 PBS 的 SSH 密钥应是专用的,并且最好限制为仅能执行关机命令。 - **PBS API 已启用 TLS-pinning**:对 PBS 的调用会锁定到其证书指纹(在设置时捕获),因此如果证书被替换/中间人攻击 (MITM) 将被拒绝;合法续期的证书在你重新运行向导中的 PBS 检测后会被接受。 - **会验证 PBS SSH 主机密钥**:在设置期间确认一次并存储在 `data/known_hosts` 中;随后的关机/GC 连接都会根据此文件进行验证。详见 [`docs/CONFIG-WIZARD.md`](docs/CONFIG-WIZARD.md#security)。 - 将 UI 保留在你的局域网/VPN 中,并启用登录保护。不要将其暴露在互联网上。 - `config.yaml` 包含机密信息 — 请严格限制其文件权限,并将其排除在版本控制之外。 - **登录锁定**:在某个 IP 地址连续 5 次登录失败后,该 IP 将被锁定 5 分钟(防止在线暴力破解攻击)。 - **密码最低要求**:管理员密码必须至少为 8 个字符。 - **会话 cookie**(配置中的 `app.session`):当通过 HTTPS 或在 TLS 终结代理后提供服务时,请设置 `https_only: true`;`max_age_days` 控制会话生命周期(默认 14 天)。更改管理员密码会立即使所有现有会话失效。 - **首次运行设置**:请尽快完成初始账户设置 — 在创建账户之前,设置端点将保持开放状态(为安全起见,已进行速率限制)。 ## 路线图 - [✅] v0.1:调度器 + WoL + vzdump + 保留策略 + 通知 + Web UI - [✅] 每次备份后进行垃圾回收,以及计划内的 verify 任务 - [✅] 来自 PBS 的按 guest 划分的最新备份状态 - [ ] RTC 唤醒选项(BIOS 闹钟)作为 WoL 的替代方案 - [ ] 多个 PBS 目标 / 异地同步 ## 许可证 基于 **GNU Affero General Public License v3.0** (AGPL-3.0) 获得许可。详见 [`LICENSE`](LICENSE)。 ## 免责声明 Joulenap 是一个独立的开源项目,**与 Proxmox Server Solutions GmbH 没有关联、不受其赞助或认可**。“Proxmox” 是其各自所有者的商标;此处使用它仅用于描述兼容性。
标签:Proxmox VE, TCP SYN 扫描, Wake-on-LAN, Web UI, 任务调度, 内存分配, 自动化备份, 自定义请求头, 节能, 请求拦截, 跨平台