feat: 实现 Docker 备份系统,支持远程一键安装
实现功能: - 文件夹和 MySQL 容器数据库备份 - tar.gz 压缩和自动清理旧备份 - systemd 定时任务集成 - 远程一键安装脚本(通过 Gitea 仓库) - 完整的 llmdoc 文档系统 安装方式: bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) 配置文件位置:/etc/docker-backup/config.yml 命令:docker-backup, docker-backup-cleanup
This commit is contained in:
41
.gitignore
vendored
Normal file
41
.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
# 编辑器和 IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# 配置文件(不提交实际的配置,只提交示例)
|
||||
config/backup.yml
|
||||
|
||||
# 日志文件
|
||||
*.log
|
||||
|
||||
# 备份文件
|
||||
*.tar.gz
|
||||
*.sql.gz
|
||||
|
||||
# 临时文件
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Claude Code
|
||||
.mcp.json
|
||||
.claude/
|
||||
|
||||
# 容器和云相关
|
||||
*.env
|
||||
docker-compose.override.yml
|
||||
|
||||
# 依赖和构建
|
||||
node_modules/
|
||||
dist/
|
||||
build/
|
||||
|
||||
# 安全和秘钥
|
||||
*.key
|
||||
*.pem
|
||||
330
README.md
Normal file
330
README.md
Normal file
@@ -0,0 +1,330 @@
|
||||
# Docker Backup
|
||||
|
||||
一个功能强大、易于使用的 Docker 数据备份工具,支持文件夹备份、MySQL 容器数据库备份、定时任务和自动清理旧备份。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- ✅ **文件夹备份**: 打包指定文件夹为 tar.gz 压缩文件
|
||||
- ✅ **排除目录**: 支持配置需要排除的文件夹和文件模式
|
||||
- ✅ **MySQL 备份**: 备份 MySQL 容器数据库为 sql.gz 压缩文件
|
||||
- ✅ **合并打包**: 将文件夹和数据库备份合并为单个压缩文件
|
||||
- ✅ **定时备份**: 使用 systemd timer 实现定时自动备份
|
||||
- ✅ **自动清理**: 按天数或数量自动清理旧备份文件
|
||||
- ✅ **灵活配置**: 使用 YAML 配置文件,易于管理
|
||||
- ✅ **日志记录**: 完整的操作日志,方便问题排查
|
||||
- ✅ **一键安装**: 提供自动化安装脚本
|
||||
|
||||
## 系统要求
|
||||
|
||||
- **操作系统**: Linux (支持 systemd)
|
||||
- **依赖工具**: bash, tar, gzip, docker, yq
|
||||
- **权限**: root 或 sudo 权限
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 一键安装
|
||||
|
||||
使用以下命令直接从远程安装:
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
安装脚本会自动完成以下操作:
|
||||
- 检测操作系统
|
||||
- 安装依赖工具(yq 等)
|
||||
- 从远程仓库下载脚本文件
|
||||
- 安装到系统目录(`/usr/local/bin`、`/etc/docker-backup`)
|
||||
- 创建配置文件
|
||||
- 配置 systemd 服务和定时器
|
||||
- 启动定时任务
|
||||
|
||||
### 2. 编辑配置文件
|
||||
|
||||
```bash
|
||||
sudo vi /etc/docker-backup/config.yml
|
||||
```
|
||||
|
||||
根据您的实际环境修改配置,主要包括:
|
||||
- 备份输出目录
|
||||
- 需要备份的文件夹
|
||||
- 需要排除的目录
|
||||
- MySQL 容器信息
|
||||
- 保留策略
|
||||
|
||||
### 3. 测试备份
|
||||
|
||||
```bash
|
||||
# 手动执行一次备份
|
||||
docker-backup
|
||||
|
||||
# 查看备份文件
|
||||
docker-backup-cleanup --list
|
||||
```
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 配置文件示例
|
||||
|
||||
配置文件位于 `/etc/docker-backup/config.yml`,主要配置项说明:
|
||||
|
||||
```yaml
|
||||
# 备份基础配置
|
||||
backup:
|
||||
output_dir: "/var/backups/docker-backup" # 备份文件存放目录
|
||||
prefix: "backup" # 备份文件名前缀
|
||||
retention:
|
||||
enabled: true # 是否启用自动清理
|
||||
keep_days: 7 # 保留最近 N 天的备份
|
||||
|
||||
# 文件夹备份配置
|
||||
folders:
|
||||
enabled: true # 是否启用文件夹备份
|
||||
sources: # 需要备份的文件夹列表
|
||||
- "/var/lib/docker/volumes"
|
||||
- "/opt/app/data"
|
||||
excludes: # 需要排除的目录模式
|
||||
- "*/logs"
|
||||
- "*/temp"
|
||||
- "*/cache"
|
||||
|
||||
# MySQL 数据库备份配置
|
||||
mysql:
|
||||
enabled: true # 是否启用 MySQL 备份
|
||||
container_name: "mysql" # MySQL 容器名称
|
||||
username: "root" # 数据库用户名
|
||||
password: "your_password_here" # 数据库密码
|
||||
databases: # 要备份的数据库列表
|
||||
- "database1"
|
||||
- "database2"
|
||||
# 或者备份所有数据库: databases: "all"
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
enabled: true
|
||||
log_file: "/var/log/docker-backup.log"
|
||||
level: "INFO"
|
||||
```
|
||||
|
||||
## 使用指南
|
||||
|
||||
### 定时任务管理
|
||||
|
||||
```bash
|
||||
# 查看定时任务状态
|
||||
systemctl status docker-backup.timer
|
||||
|
||||
# 查看下次执行时间
|
||||
systemctl list-timers docker-backup.timer
|
||||
|
||||
# 停止定时任务
|
||||
sudo systemctl stop docker-backup.timer
|
||||
|
||||
# 启动定时任务
|
||||
sudo systemctl start docker-backup.timer
|
||||
|
||||
# 禁用定时任务(开机不自动启动)
|
||||
sudo systemctl disable docker-backup.timer
|
||||
|
||||
# 启用定时任务(开机自动启动)
|
||||
sudo systemctl enable docker-backup.timer
|
||||
```
|
||||
|
||||
### 手动执行备份
|
||||
|
||||
```bash
|
||||
# 执行备份
|
||||
docker-backup
|
||||
|
||||
# 查看备份日志
|
||||
sudo journalctl -u docker-backup.service -f
|
||||
```
|
||||
|
||||
### 备份文件管理
|
||||
|
||||
```bash
|
||||
# 列出所有备份文件
|
||||
docker-backup-cleanup --list
|
||||
|
||||
# 删除 7 天前的备份
|
||||
docker-backup-cleanup --days 7
|
||||
|
||||
# 只保留最近 10 个备份
|
||||
docker-backup-cleanup --count 10
|
||||
|
||||
# 使用配置文件中的清理策略
|
||||
docker-backup-cleanup --auto
|
||||
```
|
||||
|
||||
## 高级配置
|
||||
|
||||
### 自定义服务名称
|
||||
|
||||
```bash
|
||||
SERVICE_NAME=mybackup bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
### 自定义定时计划
|
||||
|
||||
```bash
|
||||
# 每天早上 6 点执行
|
||||
SCHEDULE="*-*-* 06:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
|
||||
# 每周一凌晨 2 点执行
|
||||
SCHEDULE="Mon *-*-* 02:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
|
||||
# 每小时执行
|
||||
SCHEDULE="hourly" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
### 修改已安装的定时计划
|
||||
|
||||
编辑 timer 文件:
|
||||
|
||||
```bash
|
||||
sudo vi /etc/systemd/system/docker-backup.timer
|
||||
```
|
||||
|
||||
修改 `OnCalendar` 行,然后重新加载配置:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart docker-backup.timer
|
||||
```
|
||||
|
||||
## 备份文件格式
|
||||
|
||||
备份文件采用时间戳命名格式:
|
||||
|
||||
```
|
||||
backup-20250125-143022.tar.gz
|
||||
```
|
||||
|
||||
文件内部结构:
|
||||
|
||||
```
|
||||
backup-20250125-143022.tar.gz
|
||||
├── folders.tar.gz # 文件夹备份
|
||||
└── mysql.sql.gz # MySQL 数据库备份
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 查看服务日志
|
||||
|
||||
```bash
|
||||
# 查看最近的日志
|
||||
sudo journalctl -u docker-backup.service -n 50
|
||||
|
||||
# 实时跟踪日志
|
||||
sudo journalctl -u docker-backup.service -f
|
||||
|
||||
# 查看特定时间的日志
|
||||
sudo journalctl -u docker-backup.service --since "2025-01-25 14:00:00"
|
||||
```
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### 1. 权限不足
|
||||
|
||||
确保脚本有执行权限:
|
||||
|
||||
```bash
|
||||
sudo chmod +x /usr/local/bin/docker-backup
|
||||
sudo chmod +x /usr/local/bin/docker-backup-cleanup
|
||||
```
|
||||
|
||||
#### 2. MySQL 连接失败
|
||||
|
||||
检查:
|
||||
- MySQL 容器是否运行:`docker ps | grep mysql`
|
||||
- 用户名和密码是否正确
|
||||
- 容器名称是否匹配
|
||||
|
||||
#### 3. 磁盘空间不足
|
||||
|
||||
查看磁盘使用情况:
|
||||
|
||||
```bash
|
||||
df -h
|
||||
|
||||
# 手动清理旧备份
|
||||
docker-backup-cleanup --days 3
|
||||
```
|
||||
|
||||
#### 4. yq 命令找不到
|
||||
|
||||
重新运行安装脚本安装 yq:
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
## 卸载
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall
|
||||
```
|
||||
|
||||
卸载脚本会:
|
||||
- 停止并禁用 systemd 服务
|
||||
- 删除 systemd 服务文件
|
||||
- 删除脚本文件
|
||||
- 可选删除配置目录(会提示确认)
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
docker-backup/
|
||||
├── bin/
|
||||
│ ├── backup.sh # 主备份脚本
|
||||
│ └── cleanup.sh # 清理脚本
|
||||
├── config/
|
||||
│ └── backup.yml.example # 配置文件示例
|
||||
├── systemd/
|
||||
│ ├── docker-backup.service.template # systemd service 模板
|
||||
│ └── docker-backup.timer.template # systemd timer 模板
|
||||
├── install.sh # 安装脚本
|
||||
└── README.md # 项目文档
|
||||
```
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **保护配置文件**: 配置文件包含数据库密码,请设置适当的权限:
|
||||
|
||||
```bash
|
||||
sudo chmod 600 /etc/docker-backup/config.yml
|
||||
```
|
||||
|
||||
2. **备份文件权限**: 确保备份文件只能被授权用户访问:
|
||||
|
||||
```bash
|
||||
sudo chmod 700 /var/backups/docker-backup
|
||||
```
|
||||
|
||||
3. **定期测试恢复**: 定期测试备份文件的恢复过程,确保备份有效。
|
||||
|
||||
4. **异地备份**: 建议将备份文件同步到远程服务器或云存储。
|
||||
|
||||
## 贡献
|
||||
|
||||
欢迎提交 Issue 和 Pull Request!
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 作者
|
||||
|
||||
Your Name
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (2025-01-25)
|
||||
|
||||
- 初始版本发布
|
||||
- 支持文件夹备份
|
||||
- 支持 MySQL 容器备份
|
||||
- 支持定时任务
|
||||
- 支持自动清理旧备份
|
||||
- 提供一键安装脚本
|
||||
400
bin/backup.sh
Executable file
400
bin/backup.sh
Executable file
@@ -0,0 +1,400 @@
|
||||
#!/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# Docker Backup Script
|
||||
# 功能:备份指定文件夹和 MySQL 容器数据库
|
||||
###############################################################################
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
set -o pipefail # 管道命令任何一个失败都返回失败
|
||||
|
||||
# 脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# 配置文件路径(系统级配置)
|
||||
CONFIG_FILE="${CONFIG_FILE:-/etc/docker-backup/config.yml}"
|
||||
|
||||
# 临时目录
|
||||
TEMP_DIR=""
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
###############################################################################
|
||||
# 日志函数
|
||||
###############################################################################
|
||||
|
||||
log() {
|
||||
local level=$1
|
||||
shift
|
||||
local message="$@"
|
||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
echo -e "[${timestamp}] [${level}] ${message}"
|
||||
|
||||
# 如果配置了日志文件,同时写入文件
|
||||
if [[ -n "${LOG_FILE}" ]] && [[ "${LOGGING_ENABLED}" == "true" ]]; then
|
||||
echo "[${timestamp}] [${level}] ${message}" >> "${LOG_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
log_info() {
|
||||
log "INFO" "${GREEN}$@${NC}"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
log "WARN" "${YELLOW}$@${NC}"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
log "ERROR" "${RED}$@${NC}"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 清理函数
|
||||
###############################################################################
|
||||
|
||||
cleanup() {
|
||||
if [[ -n "${TEMP_DIR}" ]] && [[ -d "${TEMP_DIR}" ]]; then
|
||||
log_info "清理临时目录: ${TEMP_DIR}"
|
||||
rm -rf "${TEMP_DIR}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 注册清理函数
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
###############################################################################
|
||||
# 检查依赖
|
||||
###############################################################################
|
||||
|
||||
check_dependencies() {
|
||||
log_info "检查依赖工具..."
|
||||
|
||||
local missing_deps=()
|
||||
|
||||
# 检查 yq
|
||||
if ! command -v yq &> /dev/null; then
|
||||
missing_deps+=("yq")
|
||||
fi
|
||||
|
||||
# 检查 tar
|
||||
if ! command -v tar &> /dev/null; then
|
||||
missing_deps+=("tar")
|
||||
fi
|
||||
|
||||
# 检查 gzip
|
||||
if ! command -v gzip &> /dev/null; then
|
||||
missing_deps+=("gzip")
|
||||
fi
|
||||
|
||||
# 检查 docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
missing_deps+=("docker")
|
||||
fi
|
||||
|
||||
if [[ ${#missing_deps[@]} -gt 0 ]]; then
|
||||
log_error "缺少以下依赖工具: ${missing_deps[*]}"
|
||||
log_error "请运行 install.sh 安装依赖"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "依赖检查完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 加载配置
|
||||
###############################################################################
|
||||
|
||||
load_config() {
|
||||
log_info "加载配置文件: ${CONFIG_FILE}"
|
||||
|
||||
if [[ ! -f "${CONFIG_FILE}" ]]; then
|
||||
log_error "配置文件不存在: ${CONFIG_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 读取备份基础配置
|
||||
OUTPUT_DIR=$(yq eval '.backup.output_dir' "${CONFIG_FILE}")
|
||||
BACKUP_PREFIX=$(yq eval '.backup.prefix' "${CONFIG_FILE}")
|
||||
|
||||
# 读取清理策略
|
||||
RETENTION_ENABLED=$(yq eval '.backup.retention.enabled' "${CONFIG_FILE}")
|
||||
KEEP_DAYS=$(yq eval '.backup.retention.keep_days' "${CONFIG_FILE}")
|
||||
|
||||
# 读取文件夹备份配置
|
||||
FOLDERS_ENABLED=$(yq eval '.folders.enabled' "${CONFIG_FILE}")
|
||||
|
||||
# 读取 MySQL 配置
|
||||
MYSQL_ENABLED=$(yq eval '.mysql.enabled' "${CONFIG_FILE}")
|
||||
MYSQL_CONTAINER=$(yq eval '.mysql.container_name' "${CONFIG_FILE}")
|
||||
MYSQL_USERNAME=$(yq eval '.mysql.username' "${CONFIG_FILE}")
|
||||
MYSQL_PASSWORD=$(yq eval '.mysql.password' "${CONFIG_FILE}")
|
||||
|
||||
# 读取日志配置
|
||||
LOGGING_ENABLED=$(yq eval '.logging.enabled' "${CONFIG_FILE}")
|
||||
LOG_FILE=$(yq eval '.logging.log_file' "${CONFIG_FILE}")
|
||||
|
||||
# 创建输出目录
|
||||
mkdir -p "${OUTPUT_DIR}"
|
||||
|
||||
# 创建日志目录
|
||||
if [[ "${LOGGING_ENABLED}" == "true" ]] && [[ -n "${LOG_FILE}" ]]; then
|
||||
mkdir -p "$(dirname "${LOG_FILE}")"
|
||||
fi
|
||||
|
||||
log_info "配置加载完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 备份文件夹
|
||||
###############################################################################
|
||||
|
||||
backup_folders() {
|
||||
if [[ "${FOLDERS_ENABLED}" != "true" ]]; then
|
||||
log_info "文件夹备份未启用,跳过"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "开始备份文件夹..."
|
||||
|
||||
# 创建临时目录
|
||||
local temp_backup_dir="${TEMP_DIR}/folders"
|
||||
mkdir -p "${temp_backup_dir}"
|
||||
|
||||
# 获取要备份的文件夹数量
|
||||
local source_count=$(yq eval '.folders.sources | length' "${CONFIG_FILE}")
|
||||
|
||||
if [[ "${source_count}" == "0" ]] || [[ "${source_count}" == "null" ]]; then
|
||||
log_warn "未配置要备份的文件夹"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 构建排除参数
|
||||
local exclude_args=""
|
||||
local exclude_count=$(yq eval '.folders.excludes | length' "${CONFIG_FILE}")
|
||||
|
||||
if [[ "${exclude_count}" != "0" ]] && [[ "${exclude_count}" != "null" ]]; then
|
||||
for i in $(seq 0 $((exclude_count - 1))); do
|
||||
local exclude_pattern=$(yq eval ".folders.excludes[$i]" "${CONFIG_FILE}")
|
||||
exclude_args+=" --exclude='${exclude_pattern}'"
|
||||
done
|
||||
fi
|
||||
|
||||
# 备份每个文件夹
|
||||
local folders_tar="${temp_backup_dir}/folders.tar.gz"
|
||||
local tar_sources=""
|
||||
|
||||
for i in $(seq 0 $((source_count - 1))); do
|
||||
local source_dir=$(yq eval ".folders.sources[$i]" "${CONFIG_FILE}")
|
||||
|
||||
if [[ ! -d "${source_dir}" ]]; then
|
||||
log_warn "源目录不存在,跳过: ${source_dir}"
|
||||
continue
|
||||
fi
|
||||
|
||||
tar_sources+=" ${source_dir}"
|
||||
log_info "添加备份源: ${source_dir}"
|
||||
done
|
||||
|
||||
if [[ -z "${tar_sources}" ]]; then
|
||||
log_warn "没有有效的备份源目录"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 执行打包
|
||||
log_info "开始打包文件夹..."
|
||||
eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" 2>&1 | while read line; do
|
||||
log_info "$line"
|
||||
done
|
||||
|
||||
if [[ -f "${folders_tar}" ]]; then
|
||||
log_info "文件夹备份完成: ${folders_tar}"
|
||||
echo "${folders_tar}"
|
||||
else
|
||||
log_error "文件夹备份失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 备份 MySQL 数据库
|
||||
###############################################################################
|
||||
|
||||
backup_mysql() {
|
||||
if [[ "${MYSQL_ENABLED}" != "true" ]]; then
|
||||
log_info "MySQL 备份未启用,跳过"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "开始备份 MySQL 数据库..."
|
||||
|
||||
# 检查容器是否存在且运行中
|
||||
if ! docker ps --format '{{.Names}}' | grep -q "^${MYSQL_CONTAINER}$"; then
|
||||
log_error "MySQL 容器不存在或未运行: ${MYSQL_CONTAINER}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 创建临时目录
|
||||
local temp_mysql_dir="${TEMP_DIR}/mysql"
|
||||
mkdir -p "${temp_mysql_dir}"
|
||||
|
||||
# 获取要备份的数据库列表
|
||||
local databases=$(yq eval '.mysql.databases' "${CONFIG_FILE}")
|
||||
|
||||
local mysql_dump="${temp_mysql_dir}/mysql.sql.gz"
|
||||
|
||||
if [[ "${databases}" == "all" ]] || [[ "${databases}" == "null" ]]; then
|
||||
# 备份所有数据库
|
||||
log_info "备份所有数据库..."
|
||||
docker exec "${MYSQL_CONTAINER}" mysqldump \
|
||||
--single-transaction \
|
||||
--quick \
|
||||
--skip-lock-tables \
|
||||
-u"${MYSQL_USERNAME}" \
|
||||
-p"${MYSQL_PASSWORD}" \
|
||||
--all-databases \
|
||||
| gzip > "${mysql_dump}"
|
||||
else
|
||||
# 备份指定数据库
|
||||
local db_count=$(yq eval '.mysql.databases | length' "${CONFIG_FILE}")
|
||||
local db_list=""
|
||||
|
||||
for i in $(seq 0 $((db_count - 1))); do
|
||||
local db_name=$(yq eval ".mysql.databases[$i]" "${CONFIG_FILE}")
|
||||
db_list+=" ${db_name}"
|
||||
log_info "添加数据库: ${db_name}"
|
||||
done
|
||||
|
||||
log_info "备份数据库: ${db_list}"
|
||||
docker exec "${MYSQL_CONTAINER}" mysqldump \
|
||||
--single-transaction \
|
||||
--quick \
|
||||
--skip-lock-tables \
|
||||
-u"${MYSQL_USERNAME}" \
|
||||
-p"${MYSQL_PASSWORD}" \
|
||||
--databases ${db_list} \
|
||||
| gzip > "${mysql_dump}"
|
||||
fi
|
||||
|
||||
if [[ -f "${mysql_dump}" ]]; then
|
||||
log_info "MySQL 备份完成: ${mysql_dump}"
|
||||
echo "${mysql_dump}"
|
||||
else
|
||||
log_error "MySQL 备份失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 合并备份文件
|
||||
###############################################################################
|
||||
|
||||
merge_backups() {
|
||||
local folders_tar=$1
|
||||
local mysql_dump=$2
|
||||
|
||||
log_info "开始合并备份文件..."
|
||||
|
||||
# 生成时间戳
|
||||
local timestamp=$(date '+%Y%m%d-%H%M%S')
|
||||
local final_backup="${OUTPUT_DIR}/${BACKUP_PREFIX}-${timestamp}.tar.gz"
|
||||
|
||||
# 要打包的文件列表
|
||||
local files_to_pack=""
|
||||
|
||||
if [[ -n "${folders_tar}" ]] && [[ -f "${folders_tar}" ]]; then
|
||||
files_to_pack+=" ${folders_tar}"
|
||||
fi
|
||||
|
||||
if [[ -n "${mysql_dump}" ]] && [[ -f "${mysql_dump}" ]]; then
|
||||
files_to_pack+=" ${mysql_dump}"
|
||||
fi
|
||||
|
||||
if [[ -z "${files_to_pack}" ]]; then
|
||||
log_error "没有需要打包的文件"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 合并打包
|
||||
tar -czf "${final_backup}" -C "${TEMP_DIR}" \
|
||||
$(basename "${folders_tar}" 2>/dev/null || true) \
|
||||
$(basename "${mysql_dump}" 2>/dev/null || true)
|
||||
|
||||
if [[ -f "${final_backup}" ]]; then
|
||||
local file_size=$(du -h "${final_backup}" | cut -f1)
|
||||
log_info "备份完成: ${final_backup} (大小: ${file_size})"
|
||||
echo "${final_backup}"
|
||||
else
|
||||
log_error "合并备份失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 清理旧备份
|
||||
###############################################################################
|
||||
|
||||
cleanup_old_backups() {
|
||||
if [[ "${RETENTION_ENABLED}" != "true" ]]; then
|
||||
log_info "自动清理未启用,跳过"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "开始清理旧备份..."
|
||||
|
||||
if [[ "${KEEP_DAYS}" != "null" ]] && [[ "${KEEP_DAYS}" =~ ^[0-9]+$ ]]; then
|
||||
log_info "删除 ${KEEP_DAYS} 天前的备份文件..."
|
||||
|
||||
# 查找并删除旧文件
|
||||
find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -mtime +${KEEP_DAYS} -print | while read old_file; do
|
||||
log_info "删除旧备份: ${old_file}"
|
||||
rm -f "${old_file}"
|
||||
done
|
||||
fi
|
||||
|
||||
log_info "清理完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 主函数
|
||||
###############################################################################
|
||||
|
||||
main() {
|
||||
log_info "=========================================="
|
||||
log_info "Docker Backup 开始执行"
|
||||
log_info "=========================================="
|
||||
|
||||
# 检查依赖
|
||||
check_dependencies
|
||||
|
||||
# 加载配置
|
||||
load_config
|
||||
|
||||
# 创建临时目录
|
||||
TEMP_DIR=$(mktemp -d -t docker-backup.XXXXXX)
|
||||
log_info "临时目录: ${TEMP_DIR}"
|
||||
|
||||
# 备份文件夹
|
||||
local folders_tar=$(backup_folders)
|
||||
|
||||
# 备份 MySQL
|
||||
local mysql_dump=$(backup_mysql)
|
||||
|
||||
# 合并备份
|
||||
local final_backup=$(merge_backups "${folders_tar}" "${mysql_dump}")
|
||||
|
||||
# 清理旧备份
|
||||
cleanup_old_backups
|
||||
|
||||
log_info "=========================================="
|
||||
log_info "Docker Backup 执行完成"
|
||||
log_info "备份文件: ${final_backup}"
|
||||
log_info "=========================================="
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
main "$@"
|
||||
249
bin/cleanup.sh
Executable file
249
bin/cleanup.sh
Executable file
@@ -0,0 +1,249 @@
|
||||
#!/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# Docker Backup Cleanup Script
|
||||
# 功能:清理旧的备份文件
|
||||
###############################################################################
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# 脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# 配置文件路径(系统级配置)
|
||||
CONFIG_FILE="${CONFIG_FILE:-/etc/docker-backup/config.yml}"
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
###############################################################################
|
||||
# 日志函数
|
||||
###############################################################################
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $@"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $@"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $@"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 检查依赖
|
||||
###############################################################################
|
||||
|
||||
check_dependencies() {
|
||||
if ! command -v yq &> /dev/null; then
|
||||
log_error "缺少依赖工具: yq"
|
||||
log_error "请运行 install.sh 安装依赖"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 加载配置
|
||||
###############################################################################
|
||||
|
||||
load_config() {
|
||||
log_info "加载配置文件: ${CONFIG_FILE}"
|
||||
|
||||
if [[ ! -f "${CONFIG_FILE}" ]]; then
|
||||
log_error "配置文件不存在: ${CONFIG_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OUTPUT_DIR=$(yq eval '.backup.output_dir' "${CONFIG_FILE}")
|
||||
BACKUP_PREFIX=$(yq eval '.backup.prefix' "${CONFIG_FILE}")
|
||||
RETENTION_ENABLED=$(yq eval '.backup.retention.enabled' "${CONFIG_FILE}")
|
||||
KEEP_DAYS=$(yq eval '.backup.retention.keep_days' "${CONFIG_FILE}")
|
||||
KEEP_COUNT=$(yq eval '.backup.retention.keep_count' "${CONFIG_FILE}")
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 清理旧备份(按天数)
|
||||
###############################################################################
|
||||
|
||||
cleanup_by_days() {
|
||||
local keep_days=$1
|
||||
|
||||
log_info "删除 ${keep_days} 天前的备份文件..."
|
||||
|
||||
local deleted_count=0
|
||||
|
||||
while IFS= read -r old_file; do
|
||||
log_info "删除: ${old_file}"
|
||||
rm -f "${old_file}"
|
||||
((deleted_count++))
|
||||
done < <(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -mtime +${keep_days})
|
||||
|
||||
log_info "共删除 ${deleted_count} 个旧备份文件"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 清理旧备份(按数量)
|
||||
###############################################################################
|
||||
|
||||
cleanup_by_count() {
|
||||
local keep_count=$1
|
||||
|
||||
log_info "保留最近 ${keep_count} 个备份文件..."
|
||||
|
||||
# 获取所有备份文件,按时间排序
|
||||
local all_backups=($(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p\n' | sort -rn | awk '{print $2}'))
|
||||
|
||||
local total_count=${#all_backups[@]}
|
||||
local deleted_count=0
|
||||
|
||||
if [[ ${total_count} -le ${keep_count} ]]; then
|
||||
log_info "当前备份数量 ${total_count} 不超过保留数量 ${keep_count},无需清理"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 删除超出数量的备份
|
||||
for ((i=${keep_count}; i<${total_count}; i++)); do
|
||||
local old_file="${all_backups[$i]}"
|
||||
log_info "删除: ${old_file}"
|
||||
rm -f "${old_file}"
|
||||
((deleted_count++))
|
||||
done
|
||||
|
||||
log_info "共删除 ${deleted_count} 个旧备份文件"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 列出所有备份
|
||||
###############################################################################
|
||||
|
||||
list_backups() {
|
||||
log_info "=========================================="
|
||||
log_info "备份文件列表"
|
||||
log_info "=========================================="
|
||||
|
||||
if [[ ! -d "${OUTPUT_DIR}" ]]; then
|
||||
log_warn "备份目录不存在: ${OUTPUT_DIR}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local backup_files=($(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p %s\n' | sort -rn))
|
||||
|
||||
if [[ ${#backup_files[@]} -eq 0 ]]; then
|
||||
log_info "没有找到备份文件"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local count=0
|
||||
while IFS=' ' read -r timestamp filepath size; do
|
||||
local file_date=$(date -d "@${timestamp}" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || date -r "${timestamp}" '+%Y-%m-%d %H:%M:%S')
|
||||
local file_size=$(numfmt --to=iec-i --suffix=B "${size}" 2>/dev/null || echo "${size} bytes")
|
||||
((count++))
|
||||
printf "%3d. %s %s %s\n" "${count}" "${file_date}" "${file_size}" "$(basename "${filepath}")"
|
||||
done < <(find "${OUTPUT_DIR}" -name "${BACKUP_PREFIX}-*.tar.gz" -type f -printf '%T@ %p %s\n' | sort -rn)
|
||||
|
||||
log_info "=========================================="
|
||||
log_info "总计: ${count} 个备份文件"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 显示使用帮助
|
||||
###############################################################################
|
||||
|
||||
show_usage() {
|
||||
cat << EOF
|
||||
Docker Backup 清理工具
|
||||
|
||||
用法: $0 [选项]
|
||||
|
||||
选项:
|
||||
-h, --help 显示此帮助信息
|
||||
-l, --list 列出所有备份文件
|
||||
-d, --days DAYS 删除 N 天前的备份文件
|
||||
-c, --count COUNT 只保留最近 N 个备份文件
|
||||
-a, --auto 使用配置文件中的清理策略自动清理
|
||||
|
||||
示例:
|
||||
$0 --list # 列出所有备份
|
||||
$0 --days 7 # 删除 7 天前的备份
|
||||
$0 --count 10 # 只保留最近 10 个备份
|
||||
$0 --auto # 使用配置文件的策略清理
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 主函数
|
||||
###############################################################################
|
||||
|
||||
main() {
|
||||
# 检查依赖
|
||||
check_dependencies
|
||||
|
||||
# 加载配置
|
||||
load_config
|
||||
|
||||
# 解析参数
|
||||
if [[ $# -eq 0 ]]; then
|
||||
show_usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_usage
|
||||
exit 0
|
||||
;;
|
||||
-l|--list)
|
||||
list_backups
|
||||
exit 0
|
||||
;;
|
||||
-d|--days)
|
||||
if [[ -z "$2" ]] || [[ ! "$2" =~ ^[0-9]+$ ]]; then
|
||||
log_error "无效的天数参数: $2"
|
||||
exit 1
|
||||
fi
|
||||
cleanup_by_days "$2"
|
||||
exit 0
|
||||
;;
|
||||
-c|--count)
|
||||
if [[ -z "$2" ]] || [[ ! "$2" =~ ^[0-9]+$ ]]; then
|
||||
log_error "无效的数量参数: $2"
|
||||
exit 1
|
||||
fi
|
||||
cleanup_by_count "$2"
|
||||
exit 0
|
||||
;;
|
||||
-a|--auto)
|
||||
if [[ "${RETENTION_ENABLED}" != "true" ]]; then
|
||||
log_warn "配置文件中未启用自动清理"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${KEEP_DAYS}" != "null" ]] && [[ "${KEEP_DAYS}" =~ ^[0-9]+$ ]]; then
|
||||
cleanup_by_days "${KEEP_DAYS}"
|
||||
elif [[ "${KEEP_COUNT}" != "null" ]] && [[ "${KEEP_COUNT}" =~ ^[0-9]+$ ]]; then
|
||||
cleanup_by_count "${KEEP_COUNT}"
|
||||
else
|
||||
log_error "配置文件中未设置有效的清理策略"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "未知选项: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
main "$@"
|
||||
76
config/backup.yml.example
Normal file
76
config/backup.yml.example
Normal file
@@ -0,0 +1,76 @@
|
||||
# Docker Backup 配置文件示例
|
||||
# 使用前请复制此文件为 backup.yml 并根据实际情况修改配置
|
||||
|
||||
# 备份基础配置
|
||||
backup:
|
||||
# 备份文件存放目录(绝对路径)
|
||||
output_dir: "/var/backups/docker-backup"
|
||||
|
||||
# 备份文件名前缀
|
||||
prefix: "backup"
|
||||
|
||||
# 旧备份清理策略
|
||||
retention:
|
||||
# 是否启用自动清理
|
||||
enabled: true
|
||||
# 保留最近 N 天的备份
|
||||
keep_days: 7
|
||||
# 或者保留最近 N 个备份文件(如果设置了 keep_days,此项将被忽略)
|
||||
# keep_count: 10
|
||||
|
||||
# 文件夹备份配置
|
||||
folders:
|
||||
# 是否启用文件夹备份
|
||||
enabled: true
|
||||
|
||||
# 需要备份的文件夹列表(支持多个)
|
||||
sources:
|
||||
- "/var/lib/docker/volumes"
|
||||
- "/opt/app/data"
|
||||
|
||||
# 需要排除的文件夹/文件模式(相对于 sources 的路径)
|
||||
excludes:
|
||||
- "*/logs"
|
||||
- "*/temp"
|
||||
- "*/cache"
|
||||
- "*/.git"
|
||||
- "*/node_modules"
|
||||
|
||||
# MySQL 数据库备份配置
|
||||
mysql:
|
||||
# 是否启用 MySQL 备份
|
||||
enabled: true
|
||||
|
||||
# MySQL 容器名称
|
||||
container_name: "mysql"
|
||||
|
||||
# 数据库连接配置
|
||||
username: "root"
|
||||
password: "your_password_here"
|
||||
|
||||
# 要备份的数据库列表(留空表示备份所有数据库)
|
||||
databases:
|
||||
- "database1"
|
||||
- "database2"
|
||||
# 或者设置为 "all" 备份所有数据库
|
||||
# databases: "all"
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
# 是否启用日志
|
||||
enabled: true
|
||||
# 日志文件路径
|
||||
log_file: "/var/log/docker-backup.log"
|
||||
# 日志级别:DEBUG, INFO, WARN, ERROR
|
||||
level: "INFO"
|
||||
|
||||
# 通知配置(可选)
|
||||
notification:
|
||||
# 是否启用通知
|
||||
enabled: false
|
||||
# 通知方式:email, webhook
|
||||
method: "webhook"
|
||||
# Webhook URL(用于发送备份状态)
|
||||
webhook_url: "https://example.com/webhook"
|
||||
# 仅在备份失败时通知
|
||||
on_failure_only: true
|
||||
554
install.sh
Executable file
554
install.sh
Executable file
@@ -0,0 +1,554 @@
|
||||
#!/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# Docker Backup 远程安装脚本
|
||||
# 功能:安装依赖、下载文件、配置 systemd 服务
|
||||
# 使用:bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
###############################################################################
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Gitea 仓库地址
|
||||
REPO_URL="https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main"
|
||||
|
||||
# 安装路径
|
||||
BIN_DIR="/usr/local/bin"
|
||||
CONFIG_DIR="/etc/docker-backup"
|
||||
SYSTEMD_DIR="/etc/systemd/system"
|
||||
|
||||
# 默认服务名称
|
||||
DEFAULT_SERVICE_NAME="docker-backup"
|
||||
SERVICE_NAME="${SERVICE_NAME:-$DEFAULT_SERVICE_NAME}"
|
||||
|
||||
# 默认定时计划
|
||||
DEFAULT_SCHEDULE="*-*-* 02:00:00" # 每天凌晨 2 点
|
||||
SCHEDULE="${SCHEDULE:-$DEFAULT_SCHEDULE}"
|
||||
|
||||
###############################################################################
|
||||
# 日志函数
|
||||
###############################################################################
|
||||
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $@"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $@"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $@"
|
||||
}
|
||||
|
||||
log_step() {
|
||||
echo -e "\n${BLUE}==>${NC} $@"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 检查是否以 root 权限运行
|
||||
###############################################################################
|
||||
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "此脚本需要 root 权限运行"
|
||||
log_info "请使用: sudo bash <(curl -sL ...)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 检测操作系统
|
||||
###############################################################################
|
||||
|
||||
detect_os() {
|
||||
if [[ -f /etc/os-release ]]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
OS_VERSION=$VERSION_ID
|
||||
else
|
||||
log_error "无法检测操作系统类型"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "检测到操作系统: $OS $OS_VERSION"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 安装 yq
|
||||
###############################################################################
|
||||
|
||||
install_yq() {
|
||||
log_step "检查 yq 是否已安装..."
|
||||
|
||||
if command -v yq &> /dev/null; then
|
||||
log_info "yq 已安装: $(yq --version)"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "yq 未安装,正在安装..."
|
||||
|
||||
# 检测系统架构
|
||||
local arch=$(uname -m)
|
||||
case $arch in
|
||||
x86_64)
|
||||
arch="amd64"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
arch="arm64"
|
||||
;;
|
||||
armv7l)
|
||||
arch="arm"
|
||||
;;
|
||||
*)
|
||||
log_error "不支持的系统架构: $arch"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# 下载并安装 yq
|
||||
local yq_version="v4.40.5"
|
||||
local yq_url="https://github.com/mikefarah/yq/releases/download/${yq_version}/yq_linux_${arch}"
|
||||
|
||||
log_info "下载 yq ${yq_version} for ${arch}..."
|
||||
|
||||
if command -v wget &> /dev/null; then
|
||||
wget -q "${yq_url}" -O /usr/local/bin/yq
|
||||
elif command -v curl &> /dev/null; then
|
||||
curl -sL "${yq_url}" -o /usr/local/bin/yq
|
||||
else
|
||||
log_error "需要 wget 或 curl 来下载 yq"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
chmod +x /usr/local/bin/yq
|
||||
|
||||
if command -v yq &> /dev/null; then
|
||||
log_info "yq 安装成功: $(yq --version)"
|
||||
else
|
||||
log_error "yq 安装失败"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 安装其他依赖
|
||||
###############################################################################
|
||||
|
||||
install_dependencies() {
|
||||
log_step "检查并安装依赖工具..."
|
||||
|
||||
local deps=("tar" "gzip" "docker" "find")
|
||||
local missing_deps=()
|
||||
|
||||
for dep in "${deps[@]}"; do
|
||||
if ! command -v "$dep" &> /dev/null; then
|
||||
missing_deps+=("$dep")
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#missing_deps[@]} -eq 0 ]]; then
|
||||
log_info "所有依赖工具已安装"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_warn "缺少以下工具: ${missing_deps[*]}"
|
||||
|
||||
case $OS in
|
||||
ubuntu|debian)
|
||||
log_info "使用 apt 安装依赖..."
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq "${missing_deps[@]}" docker.io
|
||||
;;
|
||||
centos|rhel|fedora)
|
||||
log_info "使用 yum/dnf 安装依赖..."
|
||||
if command -v dnf &> /dev/null; then
|
||||
dnf install -y -q "${missing_deps[@]}" docker
|
||||
else
|
||||
yum install -y -q "${missing_deps[@]}" docker
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
log_error "不支持的操作系统,请手动安装: ${missing_deps[*]}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
log_info "依赖安装完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 下载并部署文件
|
||||
###############################################################################
|
||||
|
||||
deploy_files() {
|
||||
log_step "从远程仓库下载文件..."
|
||||
|
||||
# 创建必要的目录
|
||||
mkdir -p "${BIN_DIR}"
|
||||
mkdir -p "${CONFIG_DIR}"
|
||||
mkdir -p "${SYSTEMD_DIR}"
|
||||
|
||||
# 下载备份脚本
|
||||
log_info "下载 backup.sh..."
|
||||
if command -v wget &> /dev/null; then
|
||||
wget -q "${REPO_URL}/bin/backup.sh" -O "${BIN_DIR}/docker-backup"
|
||||
else
|
||||
curl -sL "${REPO_URL}/bin/backup.sh" -o "${BIN_DIR}/docker-backup"
|
||||
fi
|
||||
chmod +x "${BIN_DIR}/docker-backup"
|
||||
|
||||
# 下载清理脚本
|
||||
log_info "下载 cleanup.sh..."
|
||||
if command -v wget &> /dev/null; then
|
||||
wget -q "${REPO_URL}/bin/cleanup.sh" -O "${BIN_DIR}/docker-backup-cleanup"
|
||||
else
|
||||
curl -sL "${REPO_URL}/bin/cleanup.sh" -o "${BIN_DIR}/docker-backup-cleanup"
|
||||
fi
|
||||
chmod +x "${BIN_DIR}/docker-backup-cleanup"
|
||||
|
||||
# 下载配置文件示例
|
||||
if [[ ! -f "${CONFIG_DIR}/config.yml" ]]; then
|
||||
log_info "下载配置文件示例..."
|
||||
if command -v wget &> /dev/null; then
|
||||
wget -q "${REPO_URL}/config/backup.yml.example" -O "${CONFIG_DIR}/config.yml"
|
||||
else
|
||||
curl -sL "${REPO_URL}/config/backup.yml.example" -o "${CONFIG_DIR}/config.yml"
|
||||
fi
|
||||
log_warn "请编辑配置文件: ${CONFIG_DIR}/config.yml"
|
||||
else
|
||||
log_info "配置文件已存在,跳过"
|
||||
fi
|
||||
|
||||
log_info "文件部署完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 配置 systemd 服务
|
||||
###############################################################################
|
||||
|
||||
setup_systemd() {
|
||||
log_step "配置 systemd 服务..."
|
||||
|
||||
# 生成 service 文件
|
||||
log_info "生成 ${SERVICE_NAME}.service..."
|
||||
cat > "${SYSTEMD_DIR}/${SERVICE_NAME}.service" << EOF
|
||||
[Unit]
|
||||
Description=Docker Backup Service
|
||||
Documentation=https://gitea.bcde.io/wangdefa/docker-backup
|
||||
After=network.target docker.service
|
||||
Requires=docker.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=root
|
||||
Group=root
|
||||
|
||||
# 执行备份脚本
|
||||
ExecStart=${BIN_DIR}/docker-backup
|
||||
|
||||
# 标准输出和错误输出
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
# 超时设置(30分钟)
|
||||
TimeoutStartSec=1800
|
||||
|
||||
# 资源限制
|
||||
Nice=19
|
||||
IOSchedulingClass=idle
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# 生成 timer 文件
|
||||
log_info "生成 ${SERVICE_NAME}.timer..."
|
||||
cat > "${SYSTEMD_DIR}/${SERVICE_NAME}.timer" << EOF
|
||||
[Unit]
|
||||
Description=Docker Backup Timer
|
||||
Documentation=https://gitea.bcde.io/wangdefa/docker-backup
|
||||
Requires=${SERVICE_NAME}.service
|
||||
|
||||
[Timer]
|
||||
# 定时执行时间
|
||||
OnCalendar=${SCHEDULE}
|
||||
|
||||
# 如果错过了执行时间,启动时立即执行一次
|
||||
Persistent=true
|
||||
|
||||
# 随机延迟(0-10分钟),避免多个任务同时执行
|
||||
RandomizedDelaySec=10min
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
EOF
|
||||
|
||||
# 重新加载 systemd
|
||||
log_info "重新加载 systemd..."
|
||||
systemctl daemon-reload
|
||||
|
||||
log_info "systemd 服务配置完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 启用并启动服务
|
||||
###############################################################################
|
||||
|
||||
enable_service() {
|
||||
log_step "启用 systemd 服务..."
|
||||
|
||||
# 启用 timer
|
||||
log_info "启用 ${SERVICE_NAME}.timer..."
|
||||
systemctl enable "${SERVICE_NAME}.timer"
|
||||
|
||||
# 启动 timer
|
||||
log_info "启动 ${SERVICE_NAME}.timer..."
|
||||
systemctl start "${SERVICE_NAME}.timer"
|
||||
|
||||
# 检查状态
|
||||
log_info "服务状态:"
|
||||
systemctl status "${SERVICE_NAME}.timer" --no-pager || true
|
||||
|
||||
log_info "定时任务已启用"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 测试备份
|
||||
###############################################################################
|
||||
|
||||
test_backup() {
|
||||
log_step "测试备份功能..."
|
||||
|
||||
read -p "是否立即执行一次备份测试? (y/n) " -n 1 -r
|
||||
echo
|
||||
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
log_info "执行备份测试..."
|
||||
"${BIN_DIR}/docker-backup" || log_error "备份测试失败,请检查配置和日志"
|
||||
else
|
||||
log_info "跳过备份测试"
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 显示安装信息
|
||||
###############################################################################
|
||||
|
||||
show_info() {
|
||||
cat << EOF
|
||||
|
||||
${GREEN}╔═══════════════════════════════════════════════════════════════╗
|
||||
║ Docker Backup 安装完成! ║
|
||||
╚═══════════════════════════════════════════════════════════════╝${NC}
|
||||
|
||||
${BLUE}安装信息:${NC}
|
||||
- 备份脚本: ${BIN_DIR}/docker-backup
|
||||
- 清理脚本: ${BIN_DIR}/docker-backup-cleanup
|
||||
- 配置文件: ${CONFIG_DIR}/config.yml
|
||||
- 服务名称: ${SERVICE_NAME}
|
||||
|
||||
${BLUE}常用命令:${NC}
|
||||
# 查看定时任务状态
|
||||
systemctl status ${SERVICE_NAME}.timer
|
||||
|
||||
# 查看定时计划
|
||||
systemctl list-timers ${SERVICE_NAME}.timer
|
||||
|
||||
# 手动执行备份
|
||||
docker-backup
|
||||
|
||||
# 列出所有备份
|
||||
docker-backup-cleanup --list
|
||||
|
||||
# 清理旧备份
|
||||
docker-backup-cleanup --auto
|
||||
|
||||
# 停止定时任务
|
||||
systemctl stop ${SERVICE_NAME}.timer
|
||||
|
||||
# 禁用定时任务
|
||||
systemctl disable ${SERVICE_NAME}.timer
|
||||
|
||||
${YELLOW}重要提示:${NC}
|
||||
1. 请编辑配置文件以适应您的环境:
|
||||
vi ${CONFIG_DIR}/config.yml
|
||||
|
||||
2. 修改配置后无需重启服务,下次执行时自动生效
|
||||
|
||||
3. 查看下次执行时间:
|
||||
systemctl list-timers | grep ${SERVICE_NAME}
|
||||
|
||||
4. 查看备份日志:
|
||||
journalctl -u ${SERVICE_NAME}.service -f
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 卸载函数
|
||||
###############################################################################
|
||||
|
||||
uninstall() {
|
||||
log_step "卸载 Docker Backup..."
|
||||
|
||||
# 停止并禁用服务
|
||||
if systemctl is-active --quiet "${SERVICE_NAME}.timer"; then
|
||||
log_info "停止 ${SERVICE_NAME}.timer..."
|
||||
systemctl stop "${SERVICE_NAME}.timer"
|
||||
fi
|
||||
|
||||
if systemctl is-enabled --quiet "${SERVICE_NAME}.timer"; then
|
||||
log_info "禁用 ${SERVICE_NAME}.timer..."
|
||||
systemctl disable "${SERVICE_NAME}.timer"
|
||||
fi
|
||||
|
||||
# 删除 systemd 文件
|
||||
log_info "删除 systemd 文件..."
|
||||
rm -f "${SYSTEMD_DIR}/${SERVICE_NAME}.service"
|
||||
rm -f "${SYSTEMD_DIR}/${SERVICE_NAME}.timer"
|
||||
|
||||
# 重新加载 systemd
|
||||
systemctl daemon-reload
|
||||
|
||||
# 删除脚本文件
|
||||
log_info "删除脚本文件..."
|
||||
rm -f "${BIN_DIR}/docker-backup"
|
||||
rm -f "${BIN_DIR}/docker-backup-cleanup"
|
||||
|
||||
# 删除配置文件
|
||||
read -p "是否删除配置目录 ${CONFIG_DIR}? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
log_info "删除配置目录..."
|
||||
rm -rf "${CONFIG_DIR}"
|
||||
else
|
||||
log_info "保留配置目录"
|
||||
fi
|
||||
|
||||
log_info "卸载完成"
|
||||
exit 0
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 显示使用帮助
|
||||
###############################################################################
|
||||
|
||||
show_usage() {
|
||||
cat << EOF
|
||||
Docker Backup 远程安装脚本
|
||||
|
||||
用法: bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) [选项]
|
||||
|
||||
选项:
|
||||
-h, --help 显示此帮助信息
|
||||
-n, --name NAME 指定服务名称 (默认: ${DEFAULT_SERVICE_NAME})
|
||||
-s, --schedule SCHEDULE 指定定时计划 (默认: ${DEFAULT_SCHEDULE})
|
||||
-u, --uninstall 卸载 Docker Backup
|
||||
|
||||
定时计划示例:
|
||||
"daily" 每天执行
|
||||
"*-*-* 02:00:00" 每天凌晨 2 点
|
||||
"Mon *-*-* 02:00:00" 每周一凌晨 2 点
|
||||
"*-*-01 02:00:00" 每月 1 号凌晨 2 点
|
||||
"hourly" 每小时执行
|
||||
|
||||
示例:
|
||||
# 默认安装
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
|
||||
# 自定义服务名称
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --name mybackup
|
||||
|
||||
# 自定义定时计划(每天早上 6 点)
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --schedule "*-*-* 06:00:00"
|
||||
|
||||
# 卸载
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 主函数
|
||||
###############################################################################
|
||||
|
||||
main() {
|
||||
# 解析参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_usage
|
||||
exit 0
|
||||
;;
|
||||
-n|--name)
|
||||
SERVICE_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
-s|--schedule)
|
||||
SCHEDULE="$2"
|
||||
shift 2
|
||||
;;
|
||||
-u|--uninstall)
|
||||
check_root
|
||||
uninstall
|
||||
;;
|
||||
*)
|
||||
log_error "未知选项: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 显示欢迎信息
|
||||
cat << EOF
|
||||
${GREEN}╔═══════════════════════════════════════════════════════════════╗
|
||||
║ 欢迎使用 Docker Backup 安装程序 ║
|
||||
╚═══════════════════════════════════════════════════════════════╝${NC}
|
||||
|
||||
安装配置:
|
||||
- 服务名称: ${SERVICE_NAME}
|
||||
- 定时计划: ${SCHEDULE}
|
||||
- 配置目录: ${CONFIG_DIR}
|
||||
- 脚本目录: ${BIN_DIR}
|
||||
|
||||
EOF
|
||||
|
||||
# 检查 root 权限
|
||||
check_root
|
||||
|
||||
# 检测操作系统
|
||||
detect_os
|
||||
|
||||
# 安装 yq
|
||||
install_yq
|
||||
|
||||
# 安装其他依赖
|
||||
install_dependencies
|
||||
|
||||
# 部署文件
|
||||
deploy_files
|
||||
|
||||
# 配置 systemd
|
||||
setup_systemd
|
||||
|
||||
# 启用服务
|
||||
enable_service
|
||||
|
||||
# 测试备份
|
||||
test_backup
|
||||
|
||||
# 显示安装信息
|
||||
show_info
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
main "$@"
|
||||
67
llmdoc/architecture/backup-engine-architecture.md
Normal file
67
llmdoc/architecture/backup-engine-architecture.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# 备份执行引擎架构
|
||||
|
||||
## 1. 身份识别
|
||||
|
||||
- **目的**:一个高度可配置的 Docker 备份解决方案,支持文件夹和 MySQL 数据库的备份
|
||||
- **核心功能**:自动备份、日志记录、临时文件管理和备份保留策略
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
- `bin/backup.sh`(主备份脚本):
|
||||
- 负责协调整个备份流程
|
||||
- 主要功能包括依赖检查、配置加载、文件备份、数据库备份和清理
|
||||
|
||||
## 3. 执行流程(LLM 检索图)
|
||||
|
||||
备份执行流程遵循以下关键步骤:
|
||||
|
||||
1. **依赖检查**:`check_dependencies()`
|
||||
- 验证所需工具 (yq, tar, gzip, docker)
|
||||
- 如缺少依赖,脚本将终止执行
|
||||
|
||||
2. **配置加载**:`load_config()`
|
||||
- 读取 `/etc/docker-backup/config.yml`
|
||||
- 配置备份输出目录、前缀和保留策略
|
||||
|
||||
3. **临时目录准备**
|
||||
- 使用 `mktemp` 创建唯一临时目录
|
||||
- 注册清理 `trap`,确保资源释放
|
||||
|
||||
4. **文件夹备份**:`backup_folders()`
|
||||
- 支持多源目录备份
|
||||
- 使用 `tar` 打包
|
||||
- 可配置排除规则
|
||||
|
||||
5. **数据库备份**:`backup_mysql()`
|
||||
- 通过 `docker exec` 调用 `mysqldump`
|
||||
- 支持全库或指定库备份
|
||||
- 使用 `gzip` 压缩
|
||||
|
||||
6. **备份合并**:`merge_backups()`
|
||||
- 合并文件夹和数据库备份
|
||||
- 生成时间戳文件名
|
||||
- 输出单个 `.tar.gz` 文件
|
||||
|
||||
7. **备份清理**:`cleanup_old_backups()`
|
||||
- 按配置的保留天数清理旧备份
|
||||
|
||||
## 4. 设计原理
|
||||
|
||||
- **模块化**:每个功能封装为独立函数
|
||||
- **可配置性**:通过 YAML 文件灵活配置
|
||||
- **错误处理**:严格的错误捕获和日志记录
|
||||
- **安全性**:最小权限原则,临时文件自动清理
|
||||
|
||||
## 5. 关键配置点
|
||||
|
||||
- 备份源目录
|
||||
- 数据库备份范围
|
||||
- 输出目录和文件前缀
|
||||
- 日志配置
|
||||
- 备份保留策略
|
||||
|
||||
## 6. 局限性和注意事项
|
||||
|
||||
- 依赖外部工具(yq, docker, tar, gzip)
|
||||
- 需要正确配置 MySQL 容器访问权限
|
||||
- 备份过程中需要足够的临时存储空间
|
||||
35
llmdoc/architecture/configuration-system.md
Normal file
35
llmdoc/architecture/configuration-system.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 配置系统架构
|
||||
|
||||
## 1. 身份识别
|
||||
|
||||
- **定义**:一个灵活、层次清晰的 YAML 配置系统,支持细粒度的备份策略定制
|
||||
- **目的**:通过声明式配置,控制 Docker 备份的各个方面
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
- `/etc/docker-backup/config.yml`: 系统配置文件(安装时从 `config/backup.yml.example` 创建)
|
||||
- `bin/backup.sh`: 读取并解析配置的主脚本
|
||||
- `yq`: 用于 YAML 配置解析的关键工具
|
||||
|
||||
## 3. 执行流程(LLM 检索图)
|
||||
|
||||
1. **配置加载**:
|
||||
- 读取 `/etc/docker-backup/config.yml`
|
||||
- 使用 `yq` 解析配置项
|
||||
|
||||
2. **依赖性验证**:
|
||||
- 检查必要工具(`yq`, `tar`, `docker`)
|
||||
- 验证配置文件有效性
|
||||
- 校验备份源和容器可用性
|
||||
|
||||
3. **配置解析**:
|
||||
- 提取备份基础配置 (`backup`)
|
||||
- 处理文件夹备份设置 (`folders`)
|
||||
- 解析 MySQL 备份参数 (`mysql`)
|
||||
- 配置日志和通知 (`logging`, `notification`)
|
||||
|
||||
## 4. 设计原理
|
||||
|
||||
- **灵活性**:通过 YAML 配置提供高度可定制的备份策略
|
||||
- **最小侵入**:仅依赖常见的 Unix 工具链
|
||||
- **安全性**:配置项有严格的验证机制
|
||||
45
llmdoc/architecture/installation-architecture.md
Normal file
45
llmdoc/architecture/installation-architecture.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# Docker Backup 安装架构
|
||||
|
||||
## 1. 身份与目的
|
||||
|
||||
- **目标**:自动化 Docker 容器和卷的备份部署
|
||||
- **关键功能**:依赖检测、文件部署、服务配置、定时任务管理
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
- `install.sh`(主安装脚本):整个安装流程的协调者,支持远程下载和部署
|
||||
- 动态生成的 systemd 服务文件(不再使用模板)
|
||||
|
||||
## 3. 执行流程图(LLM检索映射)
|
||||
|
||||
### 3.1 环境准备阶段
|
||||
- **权限验证**:`check_root()`,确保以 root 权限运行
|
||||
- **操作系统检测**:`detect_os()`,确定系统类型和版本
|
||||
|
||||
### 3.2 依赖安装阶段
|
||||
- **工具检测**:`install_yq()`,安装 YAML 解析工具
|
||||
- **依赖检查**:`install_dependencies()`
|
||||
- 检测并安装:tar, gzip, docker, find
|
||||
- 根据操作系统使用不同的包管理器 (apt/yum/dnf)
|
||||
|
||||
### 3.3 文件部署阶段
|
||||
- **远程下载**:`deploy_files()`
|
||||
- 从 Gitea 仓库下载 `backup.sh` 和 `cleanup.sh`
|
||||
- 安装到 `/usr/local/bin/docker-backup` 和 `/usr/local/bin/docker-backup-cleanup`
|
||||
- 设置可执行权限
|
||||
- 下载配置文件模板到 `/etc/docker-backup/config.yml`
|
||||
|
||||
### 3.4 服务配置阶段
|
||||
- **Systemd 服务生成**:`setup_systemd()`
|
||||
- 动态生成 `.service` 文件到 `/etc/systemd/system/`
|
||||
- 动态生成 `.timer` 文件,定义执行计划
|
||||
- **服务启用**:`enable_service()`
|
||||
- 重新加载 systemd 守护进程
|
||||
- 启用并启动 systemd timer
|
||||
|
||||
## 4. 设计原则
|
||||
|
||||
- **模块化**:每个函数职责单一,便于维护
|
||||
- **跨平台兼容**:支持主流 Linux 发行版
|
||||
- **安全性**:要求 root 权限,预防权限问题
|
||||
- **灵活性**:支持自定义安装目录、服务名称和执行计划
|
||||
37
llmdoc/architecture/systemd-integration.md
Normal file
37
llmdoc/architecture/systemd-integration.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Systemd 集成架构
|
||||
|
||||
## 1. 身份与目的
|
||||
|
||||
- **定义**:Docker 备份项目的 Systemd 集成层
|
||||
- **目的**:通过 Systemd 单元提供可配置、高效的自动备份机制
|
||||
|
||||
## 2. 核心组件
|
||||
|
||||
- `systemd/docker-backup.service.template`: Service 单元模板
|
||||
- `systemd/docker-backup.timer.template`: Timer 单元模板
|
||||
|
||||
## 3. 执行流程(LLM 检索路径)
|
||||
|
||||
### 定时触发
|
||||
1. **Timer 激活**:`docker-backup.timer` 根据配置的 `OnCalendar` 触发
|
||||
2. **服务启动**:触发 `docker-backup.service`
|
||||
3. **备份脚本执行**:运行 `bin/backup.sh`
|
||||
|
||||
### 依赖关系
|
||||
```
|
||||
docker-backup.timer
|
||||
└── Requires: docker-backup.service
|
||||
└── Requires: docker.service
|
||||
```
|
||||
|
||||
## 4. 资源管理策略
|
||||
|
||||
- **CPU 管理**:`Nice=19` - 最低优先级
|
||||
- **IO 管理**:`IOSchedulingClass=idle` - 仅在系统空闲时执行
|
||||
- **超时控制**:`TimeoutStartSec=1800` - 30分钟超时保护
|
||||
|
||||
## 5. 设计原理
|
||||
|
||||
- **模块化**:通过模板实现灵活配置
|
||||
- **动态替换**:使用 `__INSTALL_DIR__` 和 `__SCHEDULE__` 变量
|
||||
- **日志集成**:通过 systemd 日志系统(journald)收集日志
|
||||
81
llmdoc/guides/how-to-configure-backups.md
Normal file
81
llmdoc/guides/how-to-configure-backups.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# 如何配置备份
|
||||
|
||||
## 准备工作
|
||||
|
||||
安装后,配置文件位于 `/etc/docker-backup/config.yml`。
|
||||
|
||||
1. **编辑配置文件**
|
||||
```bash
|
||||
sudo vi /etc/docker-backup/config.yml
|
||||
```
|
||||
|
||||
2. **基础备份配置**
|
||||
编辑 `backup` 区块:
|
||||
```yaml
|
||||
backup:
|
||||
output_dir: "/path/to/backup/destination" # 指定备份存储位置
|
||||
prefix: "mybackup" # 可选,自定义备份文件前缀
|
||||
retention:
|
||||
enabled: true # 启用自动清理
|
||||
keep_days: 7 # 保留最近 7 天备份
|
||||
```
|
||||
|
||||
3. **配置文件夹备份**
|
||||
```yaml
|
||||
folders:
|
||||
enabled: true
|
||||
sources:
|
||||
- "/var/lib/docker/volumes"
|
||||
- "/opt/important/data"
|
||||
excludes:
|
||||
- "*/logs" # 排除日志目录
|
||||
- "*/.git" # 排除 Git 仓库
|
||||
```
|
||||
|
||||
4. **配置 MySQL 备份**
|
||||
```yaml
|
||||
mysql:
|
||||
enabled: true
|
||||
container_name: "mysql_container"
|
||||
username: "root"
|
||||
password: "your_password"
|
||||
databases:
|
||||
- "database1" # 指定具体数据库
|
||||
# 或使用 "all" 备份所有数据库
|
||||
```
|
||||
|
||||
5. **日志和通知**
|
||||
```yaml
|
||||
logging:
|
||||
enabled: true
|
||||
log_file: "/var/log/docker-backup.log"
|
||||
level: "INFO"
|
||||
|
||||
notification:
|
||||
enabled: true
|
||||
method: "webhook"
|
||||
webhook_url: "https://example.com/webhook"
|
||||
```
|
||||
|
||||
## 验证配置
|
||||
|
||||
运行以下命令测试备份功能:
|
||||
```bash
|
||||
docker-backup
|
||||
```
|
||||
|
||||
查看配置是否生效:
|
||||
```bash
|
||||
# 查看备份日志
|
||||
sudo journalctl -u docker-backup.service -f
|
||||
|
||||
# 查看生成的备份文件
|
||||
docker-backup-cleanup --list
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
- 确保所有路径正确
|
||||
- 检查 MySQL 容器名称和凭据
|
||||
- 权限问题:确保脚本有足够权限访问备份源
|
||||
- 配置文件权限:`sudo chmod 600 /etc/docker-backup/config.yml`
|
||||
101
llmdoc/guides/how-to-install.md
Normal file
101
llmdoc/guides/how-to-install.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# 如何安装 Docker Backup
|
||||
|
||||
## 1. 系统要求
|
||||
|
||||
- **操作系统**:Linux(推荐 Ubuntu, Debian, CentOS, RHEL, Fedora)
|
||||
- **权限**:需要 root/sudo 权限
|
||||
- **预安装依赖**:
|
||||
- Docker
|
||||
- Bash (4.0+)
|
||||
- 网络工具(wget 或 curl)
|
||||
|
||||
## 2. 一键远程安装
|
||||
|
||||
### 2.1 执行安装命令
|
||||
|
||||
使用以下命令直接从远程仓库安装:
|
||||
|
||||
```bash
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
安装脚本会自动完成:
|
||||
- 检测操作系统类型
|
||||
- 安装依赖工具(yq 等)
|
||||
- 从远程仓库下载脚本文件
|
||||
- 安装到系统目录(`/usr/local/bin`、`/etc/docker-backup`)
|
||||
- 创建配置文件模板
|
||||
- 配置并启动 systemd 服务
|
||||
- 启动定时任务
|
||||
|
||||
### 2.2 配置备份
|
||||
|
||||
1. 编辑配置文件
|
||||
```bash
|
||||
sudo vi /etc/docker-backup/config.yml
|
||||
```
|
||||
|
||||
2. 配置关键参数:
|
||||
- `output_dir`:备份文件存储位置
|
||||
- `folders.sources`:需要备份的文件夹列表
|
||||
- `mysql.container_name`:MySQL 容器名称
|
||||
- `retention.keep_days`:备份保留天数
|
||||
|
||||
## 3. 高级安装选项
|
||||
|
||||
### 3.1 自定义服务名称
|
||||
|
||||
```bash
|
||||
# 为服务指定自定义名称
|
||||
SERVICE_NAME=my-docker-backup bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
```
|
||||
|
||||
### 3.2 自定义执行计划
|
||||
|
||||
```bash
|
||||
# 每天早上 6 点执行备份
|
||||
SCHEDULE="*-*-* 06:00:00" bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh)
|
||||
|
||||
# 支持的计划格式:
|
||||
# "daily" 每天
|
||||
# "*-*-* 02:00:00" 每天凌晨 2 点
|
||||
# "Mon *-*-* 02:00:00" 每周一凌晨 2 点
|
||||
# "*-*-01 02:00:00" 每月 1 号
|
||||
# "hourly" 每小时
|
||||
```
|
||||
|
||||
## 4. 验证安装
|
||||
|
||||
1. 检查服务状态
|
||||
```bash
|
||||
systemctl status docker-backup.timer
|
||||
```
|
||||
|
||||
2. 手动测试备份
|
||||
```bash
|
||||
docker-backup
|
||||
```
|
||||
|
||||
3. 查看备份文件
|
||||
```bash
|
||||
docker-backup-cleanup --list
|
||||
```
|
||||
|
||||
## 5. 卸载
|
||||
|
||||
```bash
|
||||
# 卸载 Docker Backup
|
||||
bash <(curl -sL https://gitea.bcde.io/wangdefa/docker-backup/raw/branch/main/install.sh) --uninstall
|
||||
```
|
||||
|
||||
## 6. 常见问题
|
||||
|
||||
- **权限问题**:确保使用 `sudo` 运行脚本
|
||||
- **依赖缺失**:脚本会自动尝试安装依赖
|
||||
- **配置错误**:仔细检查 `backup.yml` 配置
|
||||
|
||||
## 7. 建议
|
||||
|
||||
- 首次安装后,建议立即测试备份功能
|
||||
- 定期检查备份日志:`journalctl -u docker-backup.service`
|
||||
- 根据实际需求调整备份策略
|
||||
60
llmdoc/guides/how-to-manage-systemd-service.md
Normal file
60
llmdoc/guides/how-to-manage-systemd-service.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# 如何管理 Docker 备份 Systemd 服务
|
||||
|
||||
## 1. 服务状态检查
|
||||
|
||||
1. **查看服务状态**
|
||||
```bash
|
||||
systemctl status docker-backup.service
|
||||
```
|
||||
|
||||
2. **查看 Timer 状态**
|
||||
```bash
|
||||
systemctl status docker-backup.timer
|
||||
```
|
||||
|
||||
## 2. 启动和停止服务
|
||||
|
||||
1. **启动服务**
|
||||
```bash
|
||||
systemctl start docker-backup.service
|
||||
systemctl enable docker-backup.timer # 开机自启
|
||||
```
|
||||
|
||||
2. **停止服务**
|
||||
```bash
|
||||
systemctl stop docker-backup.service
|
||||
systemctl disable docker-backup.timer # 取消开机自启
|
||||
```
|
||||
|
||||
## 3. 修改定时计划
|
||||
|
||||
1. **编辑 Timer 配置**
|
||||
使用 `systemctl edit docker-backup.timer` 或直接编辑 `/etc/systemd/system/docker-backup.timer`
|
||||
|
||||
2. **常见调度示例**
|
||||
- 每天凌晨 2 点:`OnCalendar=*-*-* 02:00:00`
|
||||
- 每周一凌晨 2 点:`OnCalendar=Mon *-*-* 02:00:00`
|
||||
- 每月 1 号凌晨 2 点:`OnCalendar=*-*-01 02:00:00`
|
||||
|
||||
3. **重载配置**
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl restart docker-backup.timer
|
||||
```
|
||||
|
||||
## 4. 查看服务日志
|
||||
|
||||
1. **查看最近日志**
|
||||
```bash
|
||||
journalctl -u docker-backup.service
|
||||
```
|
||||
|
||||
2. **实时监控日志**
|
||||
```bash
|
||||
journalctl -f -u docker-backup.service
|
||||
```
|
||||
|
||||
3. **查看指定时间范围日志**
|
||||
```bash
|
||||
journalctl -u docker-backup.service --since "1 hour ago"
|
||||
```
|
||||
114
llmdoc/guides/how-to-perform-backup.md
Normal file
114
llmdoc/guides/how-to-perform-backup.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# 如何执行备份
|
||||
|
||||
## 前提条件
|
||||
|
||||
1. 已安装必要的工具:
|
||||
- Docker
|
||||
- yq
|
||||
- tar
|
||||
- gzip
|
||||
|
||||
## 配置备份
|
||||
|
||||
1. **编辑配置文件**:`/etc/docker-backup/config.yml`
|
||||
|
||||
```yaml
|
||||
# 备份基本设置
|
||||
backup:
|
||||
output_dir: /path/to/backup # 备份文件输出目录
|
||||
prefix: docker-backup # 备份文件名前缀
|
||||
retention:
|
||||
enabled: true # 是否启用自动清理
|
||||
keep_days: 30 # 保留最近 30 天的备份
|
||||
|
||||
# 文件夹备份配置
|
||||
folders:
|
||||
enabled: true # 是否启用文件夹备份
|
||||
sources: # 要备份的文件夹列表
|
||||
- /path/to/folder1
|
||||
- /path/to/folder2
|
||||
excludes: # 可选:排除的文件/目录模式
|
||||
- '*.log'
|
||||
- '.git/'
|
||||
|
||||
# MySQL 备份配置
|
||||
mysql:
|
||||
enabled: true # 是否启用 MySQL 备份
|
||||
container_name: mysql_container
|
||||
username: backup_user
|
||||
password: backup_password
|
||||
databases: # 要备份的数据库
|
||||
- database1
|
||||
- database2
|
||||
# 或使用 'all' 备份所有数据库
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
enabled: true
|
||||
log_file: /path/to/backup.log
|
||||
```
|
||||
|
||||
## 执行备份
|
||||
|
||||
1. **手动备份**:
|
||||
```bash
|
||||
docker-backup
|
||||
```
|
||||
|
||||
2. **自动备份**(使用 systemd timer,安装时已配置):
|
||||
```bash
|
||||
# 查看定时任务状态
|
||||
systemctl status docker-backup.timer
|
||||
|
||||
# 查看下次执行时间
|
||||
systemctl list-timers docker-backup.timer
|
||||
|
||||
# 立即触发一次备份
|
||||
systemctl start docker-backup.service
|
||||
```
|
||||
|
||||
3. **查看备份结果**:
|
||||
```bash
|
||||
# 列出所有备份文件
|
||||
docker-backup-cleanup --list
|
||||
|
||||
# 查看备份日志
|
||||
sudo journalctl -u docker-backup.service -n 50
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
1. **常见错误**:
|
||||
- 检查配置文件权限和路径
|
||||
- 验证 Docker 容器状态
|
||||
- 查看日志文件 `log_file`
|
||||
|
||||
2. **依赖检查**:
|
||||
```bash
|
||||
# 脚本会自动检查,但可手动验证
|
||||
which yq tar gzip docker
|
||||
```
|
||||
|
||||
## 备份恢复
|
||||
|
||||
1. 解压备份文件
|
||||
```bash
|
||||
tar -xzvf backup-YYYYMMDD-HHMMSS.tar.gz
|
||||
```
|
||||
|
||||
2. 恢复文件夹
|
||||
```bash
|
||||
tar -xzvf folders.tar.gz -C /restore/path
|
||||
```
|
||||
|
||||
3. 恢复 MySQL 数据库
|
||||
```bash
|
||||
# 假设使用 Docker MySQL 容器
|
||||
zcat mysql.sql.gz | docker exec -i mysql_container mysql -u root -p
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 备份前关闭正在写入的应用
|
||||
- 定期测试备份和恢复流程
|
||||
- 保护备份文件和配置文件的安全
|
||||
62
llmdoc/index.md
Normal file
62
llmdoc/index.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# Docker 备份工具文档中心
|
||||
|
||||
## 项目简介
|
||||
|
||||
Docker 备份工具是一个功能强大、易于使用的 Docker 数据备份解决方案,专为 Linux 系统设计。提供全面的备份和管理功能,帮助用户轻松备份 Docker 容器中的文件夹和数据库。
|
||||
|
||||
## 文档组织结构
|
||||
|
||||
我们的文档分为四个主要类别,旨在帮助用户和开发者快速找到所需信息:
|
||||
|
||||
### 1. 项目概述 (Overview)
|
||||
- 了解项目背景、目标和核心功能
|
||||
- 文档位置:`/llmdoc/overview/`
|
||||
|
||||
### 2. 指南 (Guides)
|
||||
- 提供具体的操作步骤和实践指南
|
||||
- 文档位置:`/llmdoc/guides/`
|
||||
|
||||
### 3. 架构 (Architecture)
|
||||
- 深入探讨系统设计、组件交互和关键流程
|
||||
- 文档位置:`/llmdoc/architecture/`
|
||||
|
||||
### 4. 参考 (Reference)
|
||||
- 提供详细的技术规格、配置细节和编码约定
|
||||
- 文档位置:`/llmdoc/reference/`
|
||||
|
||||
## 文档目录
|
||||
|
||||
### 项目概述
|
||||
- [`project-overview.md`](/llmdoc/overview/project-overview.md): Docker 备份工具的核心目标、功能和技术栈概述
|
||||
|
||||
### 指南
|
||||
1. 安装和配置
|
||||
- [`how-to-install.md`](/llmdoc/guides/how-to-install.md): 安装 Docker 备份工具的详细步骤
|
||||
- [`how-to-configure-backups.md`](/llmdoc/guides/how-to-configure-backups.md): 配置备份策略和参数
|
||||
2. 服务管理
|
||||
- [`how-to-manage-systemd-service.md`](/llmdoc/guides/how-to-manage-systemd-service.md): 管理和控制 systemd 服务
|
||||
- [`how-to-perform-backup.md`](/llmdoc/guides/how-to-perform-backup.md): 执行手动备份和恢复操作
|
||||
|
||||
### 架构
|
||||
1. 系统架构
|
||||
- [`installation-architecture.md`](/llmdoc/architecture/installation-architecture.md): 安装过程和系统集成架构
|
||||
- [`configuration-system.md`](/llmdoc/architecture/configuration-system.md): 配置系统的设计和实现
|
||||
- [`systemd-integration.md`](/llmdoc/architecture/systemd-integration.md): systemd 服务集成细节
|
||||
- [`backup-engine-architecture.md`](/llmdoc/architecture/backup-engine-architecture.md): 备份引擎的技术架构
|
||||
|
||||
### 参考
|
||||
1. 约定和规范
|
||||
- [`git-conventions.md`](/llmdoc/reference/git-conventions.md): 项目 Git 提交和协作约定
|
||||
- [`coding-conventions.md`](/llmdoc/reference/coding-conventions.md): 代码编写和风格指南
|
||||
2. 配置
|
||||
- [`configuration-schema.md`](/llmdoc/reference/configuration-schema.md): 配置文件的详细架构和参数说明
|
||||
|
||||
## 开始使用
|
||||
|
||||
- 新用户请首先阅读[项目概述](/llmdoc/overview/project-overview.md)
|
||||
- 安装指南请参考[如何安装](/llmdoc/guides/how-to-install.md)
|
||||
- 遇到问题?查看具体的指南和架构文档
|
||||
|
||||
## 许可证
|
||||
|
||||
本项目采用 MIT License,欢迎在遵守许可条款的前提下自由使用和二次开发。
|
||||
61
llmdoc/overview/project-overview.md
Normal file
61
llmdoc/overview/project-overview.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Docker 备份工具 - 项目概述
|
||||
|
||||
## 1. 项目简介
|
||||
|
||||
Docker 备份工具是一个功能强大、易于使用的 Docker 数据备份解决方案,专为 Linux 系统(支持 systemd)设计。该工具提供全面的备份和管理功能,帮助用户轻松备份 Docker 容器中的文件夹和数据库。
|
||||
|
||||
## 2. 主要功能
|
||||
|
||||
- 文件夹备份
|
||||
- 打包指定文件夹为压缩文件
|
||||
- 支持排除特定目录和文件模式
|
||||
- MySQL 数据库备份
|
||||
- 备份 Docker 容器中的 MySQL 数据库
|
||||
- 支持备份指定或全部数据库
|
||||
- 备份文件管理
|
||||
- 合并文件夹和数据库备份
|
||||
- 自动清理旧备份文件
|
||||
- 按天数或数量保留备份
|
||||
|
||||
## 3. 技术栈
|
||||
|
||||
- **编程语言**: Bash Shell
|
||||
- **核心工具**:
|
||||
- tar: 文件打包
|
||||
- gzip: 文件压缩
|
||||
- docker: 容器交互
|
||||
- yq: YAML 配置解析
|
||||
- **系统集成**: systemd (定时任务和服务管理)
|
||||
|
||||
## 4. 项目结构
|
||||
|
||||
```
|
||||
docker-backup/
|
||||
├── bin/
|
||||
│ ├── backup.sh # 主备份脚本
|
||||
│ └── cleanup.sh # 备份清理脚本
|
||||
├── config/ # 配置文件目录
|
||||
├── systemd/ # systemd 服务模板
|
||||
├── install.sh # 安装脚本
|
||||
└── README.md # 项目文档
|
||||
```
|
||||
|
||||
## 5. 使用场景
|
||||
|
||||
- 需要定期备份 Docker 容器数据的开发者和系统管理员
|
||||
- 个人服务器和小型企业基础设施
|
||||
- 需要自动化备份和管理备份文件的场景
|
||||
- 对 MySQL 数据库和文件系统数据有备份需求的项目
|
||||
|
||||
## 6. 关键特性
|
||||
|
||||
- 一键安装和配置
|
||||
- 灵活的备份策略
|
||||
- 完善的日志记录
|
||||
- 自动清理备份文件
|
||||
- 支持自定义备份计划
|
||||
- 安全性考虑(如权限控制)
|
||||
|
||||
## 7. 许可证
|
||||
|
||||
MIT License - 开源且自由使用
|
||||
90
llmdoc/reference/coding-conventions.md
Normal file
90
llmdoc/reference/coding-conventions.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Bash 脚本编码约定
|
||||
|
||||
## 1. 脚本结构约定
|
||||
|
||||
### 1.1 基本骨架
|
||||
- 必须以 `#!/bin/bash` 开头
|
||||
- 使用 `set -e` 和 `set -o pipefail` 启用严格错误处理
|
||||
- 按照以下顺序组织脚本:
|
||||
1. Shebang
|
||||
2. 文件描述注释
|
||||
3. 变量和常量定义
|
||||
4. 日志和颜色输出函数
|
||||
5. 主要功能函数
|
||||
6. 主函数(`main()`)
|
||||
7. 主函数调用
|
||||
|
||||
### 1.2 错误处理
|
||||
- 使用 `set -e` 在任何命令执行失败时立即退出脚本
|
||||
- 使用 `set -o pipefail` 确保管道命令链任何一个失败都返回失败状态
|
||||
- 对于可能失败的操作,编写明确的错误检查和日志记录机制
|
||||
|
||||
## 2. 命名约定
|
||||
|
||||
### 2.1 变量命名
|
||||
- 全局变量使用大写,单词间使用下划线分隔
|
||||
- 正确: `SCRIPT_DIR`, `DEFAULT_INSTALL_DIR`
|
||||
- 局部变量使用小写,单词间使用下划线分隔
|
||||
- 正确: `backup_type`, `temp_backup_dir`
|
||||
|
||||
### 2.2 函数命名
|
||||
- 使用小写,单词间使用下划线分隔
|
||||
- 动词 + 名词的形式
|
||||
- 正确: `install_dependencies()`, `check_root()`
|
||||
- 错误: `Dependencies()`, `rootCheck()`
|
||||
|
||||
## 3. 日志记录约定
|
||||
|
||||
### 3.1 日志级别
|
||||
- 使用以下日志级别函数:
|
||||
- `log_info()`: 普通信息
|
||||
- `log_warn()`: 警告信息
|
||||
- `log_error()`: 错误信息
|
||||
|
||||
### 3.2 日志输出
|
||||
- 日志应包含时间戳
|
||||
- 使用颜色区分不同日志级别
|
||||
- 日志消息应简洁明了,描述当前操作或状态
|
||||
|
||||
## 4. 注释风格
|
||||
|
||||
### 4.1 文件头注释
|
||||
- 使用 `###############################################################################`
|
||||
- 包含脚本名称和简要功能描述
|
||||
|
||||
### 4.2 函数注释
|
||||
- 在函数定义前使用块注释
|
||||
- 描述函数的目的和关键行为
|
||||
|
||||
### 4.3 行内注释
|
||||
- 仅在代码复杂或不明显时使用
|
||||
- 解释 "为什么" 而非 "做什么"
|
||||
|
||||
## 5. 参数和配置处理
|
||||
|
||||
### 5.1 参数解析
|
||||
- 使用 `case` 语句处理命令行参数
|
||||
- 提供帮助选项(`-h`, `--help`)
|
||||
- 对无效参数给出明确错误提示
|
||||
|
||||
### 5.2 配置加载
|
||||
- 使用配置文件(如 YAML)管理可配置参数
|
||||
- 提供合理的默认值
|
||||
- 在加载配置时进行有效性检查
|
||||
|
||||
## 6. 性能和安全最佳实践
|
||||
|
||||
### 6.1 依赖检查
|
||||
- 在脚本开始检查所有必需的外部工具
|
||||
- 为缺失的依赖提供明确的安装指导
|
||||
|
||||
### 6.2 权限管理
|
||||
- 对于需要特权的脚本,明确检查 root 权限
|
||||
- 谨慎处理文件和目录权限
|
||||
|
||||
## 7. 示例项目特定约定
|
||||
|
||||
本项目脚本特有的一些约定:
|
||||
- 使用 `BASH_SOURCE[0]` 获取脚本所在目录
|
||||
- 支持通过环境变量覆盖默认配置
|
||||
- 使用 `trap` 注册清理函数
|
||||
62
llmdoc/reference/configuration-schema.md
Normal file
62
llmdoc/reference/configuration-schema.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# 配置架构参考
|
||||
|
||||
## 配置项概览
|
||||
|
||||
### `backup` 区块
|
||||
|
||||
| 配置项 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| `output_dir` | 字符串 | 是 | `/var/backups/docker-backup` | 备份文件存储目录 |
|
||||
| `prefix` | 字符串 | 否 | `backup` | 备份文件名前缀 |
|
||||
| `retention.enabled` | 布尔 | 否 | `true` | 是否启用自动清理 |
|
||||
| `retention.keep_days` | 整数 | 否 | `7` | 保留最近 N 天备份 |
|
||||
| `retention.keep_count` | 整数 | 否 | `null` | 保留最近 N 个备份文件 |
|
||||
|
||||
### `folders` 区块
|
||||
|
||||
| 配置项 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| `enabled` | 布尔 | 否 | `true` | 是否启用文件夹备份 |
|
||||
| `sources` | 字符串数组 | 是 | `[]` | 需备份的文件夹路径列表 |
|
||||
| `excludes` | 字符串数组 | 否 | 预定义排除模式 | 排除的文件/文件夹模式 |
|
||||
|
||||
### `mysql` 区块
|
||||
|
||||
| 配置项 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| `enabled` | 布尔 | 否 | `true` | 是否启用 MySQL 备份 |
|
||||
| `container_name` | 字符串 | 是 | 无 | MySQL 容器名称 |
|
||||
| `username` | 字符串 | 是 | 无 | 数据库用户名 |
|
||||
| `password` | 字符串 | 是 | 无 | 数据库密码 |
|
||||
| `databases` | 字符串数组或字符串 | 是 | 无 | 要备份的数据库,可以是具体库名或 `"all"` |
|
||||
|
||||
### `logging` 区块
|
||||
|
||||
| 配置项 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| `enabled` | 布尔 | 否 | `true` | 是否启用日志 |
|
||||
| `log_file` | 字符串 | 是 | `/var/log/docker-backup.log` | 日志文件路径 |
|
||||
| `level` | 字符串 | 否 | `"INFO"` | 日志级别 (`DEBUG`, `INFO`, `WARN`, `ERROR`) |
|
||||
|
||||
### `notification` 区块
|
||||
|
||||
| 配置项 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| `enabled` | 布尔 | 否 | `false` | 是否启用通知 |
|
||||
| `method` | 字符串 | 条件必填 | 无 | 通知方式 (`email`, `webhook`) |
|
||||
| `webhook_url` | 字符串 | 条件必填 | 无 | Webhook 地址 |
|
||||
| `on_failure_only` | 布尔 | 否 | `true` | 是否仅在备份失败时通知 |
|
||||
|
||||
## 配置依赖和约束
|
||||
|
||||
1. 互斥配置:
|
||||
- `retention.keep_days` 和 `retention.keep_count` 互斥
|
||||
|
||||
2. 必要条件:
|
||||
- MySQL 备份需要 `container_name`、`username`、`password`
|
||||
- 通知需要 `method` 和相应的地址
|
||||
|
||||
3. 验证规则:
|
||||
- 文件夹备份需要至少一个有效的 `sources`
|
||||
- 检查路径有效性
|
||||
- 验证工具依赖(`yq`, `tar`, `docker`)
|
||||
88
llmdoc/reference/git-conventions.md
Normal file
88
llmdoc/reference/git-conventions.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# Git 约定
|
||||
|
||||
## 1. 分支策略
|
||||
|
||||
### 主分支
|
||||
- **主分支名称**:`main`
|
||||
- **主分支规则**:
|
||||
- 始终保持稳定和可部署状态
|
||||
- 直接对应生产环境
|
||||
- 受保护分支,需要代码审查才能合并
|
||||
|
||||
### 开发分支类型
|
||||
- `feature/[功能名称]`:新功能开发
|
||||
- `bugfix/[问题描述]`:修复特定 bug
|
||||
- `hotfix/[紧急问题]`:生产环境紧急修复
|
||||
- `docs/[文档内容]`:文档更新
|
||||
- `refactor/[模块名称]`:代码重构
|
||||
|
||||
## 2. 提交消息格式
|
||||
|
||||
提交消息应遵循语义化提交规范:
|
||||
|
||||
```
|
||||
<type>(<scope>): <description>
|
||||
|
||||
[可选的详细描述]
|
||||
|
||||
- 可选的脚注信息
|
||||
```
|
||||
|
||||
### 类型 (Type)
|
||||
- `feat`: 新功能
|
||||
- `fix`: 修复 bug
|
||||
- `docs`: 文档变更
|
||||
- `style`: 代码格式调整
|
||||
- `refactor`: 代码重构
|
||||
- `test`: 测试相关
|
||||
- `chore`: 构建过程或辅助工具变更
|
||||
|
||||
### 示例提交消息
|
||||
```
|
||||
feat(auth): 添加用户注册功能
|
||||
|
||||
- 实现基于电子邮件的用户注册流程
|
||||
- 集成用户验证机制
|
||||
```
|
||||
|
||||
## 3. 推荐工作流程
|
||||
|
||||
1. 从 `main` 创建功能分支
|
||||
```bash
|
||||
git checkout -b feature/new-feature main
|
||||
```
|
||||
|
||||
2. 进行开发并频繁提交
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "feat(module): 描述具体变更"
|
||||
```
|
||||
|
||||
3. 推送分支到远程仓库
|
||||
```bash
|
||||
git push -u origin feature/new-feature
|
||||
```
|
||||
|
||||
4. 创建 Pull Request
|
||||
- 目标分支:`main`
|
||||
- 包含详细的变更说明
|
||||
- 等待代码审查和批准
|
||||
|
||||
5. 合并后清理分支
|
||||
```bash
|
||||
git checkout main
|
||||
git pull
|
||||
git branch -d feature/new-feature
|
||||
```
|
||||
|
||||
## 4. 其他最佳实践
|
||||
|
||||
- 保持提交原子化和有意义
|
||||
- 编写清晰、简洁的提交消息
|
||||
- 避免在一个提交中包含多个无关的变更
|
||||
- 使用 `.gitignore` 排除不需要版本控制的文件
|
||||
|
||||
## 5. 推荐工具
|
||||
|
||||
- Git 提交检查:`pre-commit`
|
||||
- 代码审查:GitHub/GitLab Pull Request
|
||||
Reference in New Issue
Block a user