From 5796d9e2de2b9c0540d60617a6cbb82f95f5d61d Mon Sep 17 00:00:00 2001 From: monlor Date: Sat, 12 Oct 2024 19:22:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20telegram=20message=20sup?= =?UTF-8?q?port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webdav-backup/Dockerfile | 11 ++++----- webdav-backup/README.md | 29 +++++++++++++----------- webdav-backup/entrypoint.sh | 45 +++++++++++++++++++++++++++++++++++-- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/webdav-backup/Dockerfile b/webdav-backup/Dockerfile index d7e8a8b..8933b4c 100644 --- a/webdav-backup/Dockerfile +++ b/webdav-backup/Dockerfile @@ -1,21 +1,18 @@ FROM alpine:latest LABEL MAINTAINER me@monlor.com -LABEL VERSION 1.0.0 +LABEL VERSION 1.0.1 # 安装必要的工具 -RUN apk add --no-cache bash curl tar pv +RUN apk add --no-cache bash curl tar pv && mkdir -p /data # 复制脚本到容器 COPY --chmod=755 *.sh / # 设置环境变量 -ENV WEBDAV_URL="" -ENV WEBDAV_USERNAME="" -ENV WEBDAV_PASSWORD="" -ENV WEBDAV_PATH="" -ENV BACKUP_DIRS="" ENV BACKUP_INTERVAL="60" +ENV BACKUP_DIRS="/data" +ENV BACKUP_TASK_NAME="默认备份任务" # 运行脚本 CMD ["/entrypoint.sh"] diff --git a/webdav-backup/README.md b/webdav-backup/README.md index 7919362..74cc5e1 100644 --- a/webdav-backup/README.md +++ b/webdav-backup/README.md @@ -1,13 +1,15 @@ # WebDAV备份工具 -这个工具可以定期将指定的多个目录备份到WebDAV服务器,并提供恢复功能。 +这个工具可以定期将指定的目录备份到WebDAV服务器,并提供恢复功能。 ## 功能 -- 定时备份指定的多个目录 +- 定时备份指定的目录 - 将备份文件上传到WebDAV服务器 - 可配置的备份间隔时间 - 从WebDAV服务器恢复指定的备份文件 +- 支持 Telegram 通知(启动时和备份失败时) +- 可自定义备份任务名称 ## 使用方法 @@ -18,11 +20,7 @@ docker run -d \ -e WEBDAV_URL="https://your-webdav-server.com/backup" \ -e WEBDAV_USERNAME="your_username" \ -e WEBDAV_PASSWORD="your_password" \ - -e WEBDAV_PATH="/backup" \ - -e BACKUP_DIRS="/path/to/dir1 /path/to/dir2" \ - -e BACKUP_INTERVAL="60" \ - -v /path/to/dir1:/path/to/dir1 \ - -v /path/to/dir2:/path/to/dir2 \ + -v /path/to/data:/data \ monlor/webdav-backup ``` @@ -30,7 +28,7 @@ docker run -d \ 要恢复备份,请按照以下步骤操作: -1. 首先,确保备份容器正在运行。如果没有运行,请使用上面的命令启动它。 +1. 确保备份容器正在运行。如果没有运行,请使用上面的命令启动它。 2. 进入运行中的容器: @@ -50,12 +48,15 @@ docker exec -it /bin/bash ## 环境变量 -- `WEBDAV_URL`: WebDAV服务器的URL -- `WEBDAV_USERNAME`: WebDAV服务器的用户名 -- `WEBDAV_PASSWORD`: WebDAV服务器的密码 -- `WEBDAV_PATH`: WebDAV服务器上的备份路径,默认为 "/backup" -- `BACKUP_DIRS`: 要备份的目录,用空格分隔多个目录 +- `WEBDAV_URL`: WebDAV服务器的URL(必需), 格式为 https://your-webdav-server.com/dav +- `WEBDAV_USERNAME`: WebDAV服务器的用户名(必需) +- `WEBDAV_PASSWORD`: WebDAV服务器的密码(必需) +- `WEBDAV_PATH`: WebDAV服务器上的备份路径,默认为 空,格式为 /backup +- `BACKUP_DIRS`: 要备份的目录,用空格分隔多个目录,默认为 "/data" - `BACKUP_INTERVAL`: 备份间隔时间(分钟),默认为60分钟 +- `BACKUP_TASK_NAME`: 备份任务的名称,默认为 "默认备份任务" +- `TELEGRAM_BOT_TOKEN`: Telegram Bot 的 token(可选) +- `TELEGRAM_CHAT_ID`: 接收 Telegram 通知的聊天 ID(可选) ## 注意事项 @@ -64,6 +65,8 @@ docker exec -it /bin/bash - 考虑实现备份文件的轮换或清理机制,以防止WebDAV服务器存储空间耗尽 - 恢复操作会覆盖目标目录中的现有数据,请谨慎操作 - 在执行恢复操作之前,请确保您有足够的权限访问和修改目标目录 +- 如果配置了 Telegram 通知,程序会在启动时发送一条包含所有重要参数的通知消息 +- 如果配置了 Telegram 通知,只有在备份失败时才会发送额外的通知 ## 贡献 diff --git a/webdav-backup/entrypoint.sh b/webdav-backup/entrypoint.sh index f8f15b5..0c5b7f8 100644 --- a/webdav-backup/entrypoint.sh +++ b/webdav-backup/entrypoint.sh @@ -6,13 +6,52 @@ if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" exit 1 fi +# 检查 Telegram 相关环境变量 +if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then + TELEGRAM_ENABLED=true + echo "Telegram 通知已启用" +else + TELEGRAM_ENABLED=false + echo "Telegram 通知未启用" +fi + +# 添加发送 Telegram 消息的函数 +send_telegram_message() { + if [ "$TELEGRAM_ENABLED" = true ]; then + response=$(curl -s -w "\n%{http_code}" -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ + -d chat_id="${TELEGRAM_CHAT_ID}" \ + -d text="$1" \ + -d parse_mode="HTML") + + body=$(echo "$response" | sed '$d') + status_code=$(echo "$response" | tail -n1) + + if [ "$status_code" != "200" ]; then + echo "Telegram 消息发送成功" + else + echo "Telegram 消息发送失败. 状态码: $status_code, 响应: $body" + fi + fi +} + echo "开始备份任务..." +echo "备份任务名称: ${BACKUP_TASK_NAME}" echo "备份目录: ${BACKUP_DIRS}" echo "备份间隔: ${BACKUP_INTERVAL} 分钟" echo "WebDAV URL: ${WEBDAV_URL}" echo "WebDAV 用户名: ${WEBDAV_USERNAME}" echo "WebDAV 路径: ${WEBDAV_PATH}" +# 发送启动通知 +startup_message="WebDAV 备份任务已启动%0A" +startup_message+="任务名称: ${BACKUP_TASK_NAME}%0A" +startup_message+="备份目录: ${BACKUP_DIRS}%0A" +startup_message+="备份间隔: ${BACKUP_INTERVAL} 分钟%0A" +startup_message+="WebDAV URL: ${WEBDAV_URL}%0A" +startup_message+="WebDAV 路径: ${WEBDAV_PATH}" + +send_telegram_message "$startup_message" + # 无限循环执行备份 while true; do # 获取当前日期 @@ -52,7 +91,9 @@ while true; do if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then echo "备份完成: ${CURRENT_DATE}/${BACKUP_FILE}" else - echo "错误: 无法上传备份文件 ${BACKUP_FILE}. HTTP 状态码: ${HTTP_CODE}" + error_message="错误: 无法上传备份文件 ${BACKUP_FILE}. HTTP 状态码: ${HTTP_CODE}" + echo "$error_message" + send_telegram_message "WebDAV 备份失败%0A任务名称: ${BACKUP_TASK_NAME}%0A${error_message}" fi # 清理临时文件 @@ -64,4 +105,4 @@ while true; do echo "等待 ${BACKUP_INTERVAL} 分钟后再进行备份..." sleep $((BACKUP_INTERVAL * 60)) -done \ No newline at end of file +done