David-Nahorniak/s3-object-lock-extension-docker

GitHub: David-Nahorniak/s3-object-lock-extension-docker

自动延长启用对象锁的S3存储桶保留期的Docker工具,专为restic备份仓库设计以满足数据保护合规要求。

Stars: 0 | Forks: 0

S3 Object Lock Extension Logo
# S3 对象锁扩展 Docker 脚本 自动延长启用了对象锁的 S3 存储桶的对象锁保留期。专为 restic 备份仓库设计,以确保数据保护合规性。 ## 功能特性 - 按可配置的天数延长对象锁保留期 - 支持多个存储桶和前缀 - 兼容任何 S3 兼容存储(AWS S3、IDrive E2、MinIO 等) - 试运行模式用于测试 - Uptime Kuma 集成用于监控 - Docker 支持,可选 cron 调度 ## 前置条件 - 启用了对象锁的 S3 存储 - 包含 S3 凭据的 rclone 配置文件 - Docker(用于容器化执行) ## 快速开始 ``` # 克隆/下载文件 # 使用您的 S3 凭据编辑 rclone.conf # 编辑 docker-compose.yml 以配置存储桶和设置 # 测试运行(dry-run 模式) docker-compose run --rm -e DRY_RUN=true -e DEBUG_MODE=true s3-object-lock # 实际运行 docker-compose up # 使用 cron 计划运行(每周日凌晨 3 点) docker-compose run -d -e CRON_SCHEDULE="0 3 * * 0" s3-object-lock ``` ## 配置 ### 环境变量 | 变量 | 描述 | 默认值 | 必填 | |----------|-------------|---------|----------| | `RCLONE_CONFIG` | rclone 配置文件路径 | `/app/rclone.conf` | 否 | | `BUCKETS` | 空格分隔的存储桶列表(格式:`config_name:bucket_name`) | `test:test` | 是 | | `PREFIXES` | 要处理的前缀空格分隔列表 | `data/ keys/ snapshots/ index/` | 否 | | `EXTEND_DAYS` | 延长保留期的天数 | `3` | 否 | | `RETENTION_MODE` | 保留模式:`GOVERNANCE` 或 `COMPLIANCE` | `GOVERNANCE` | 否 | | `AWS_PROFILE` | AWS 配置文件名称 | `default` | 否 | | `DRY_RUN` | 启用试运行模式(无更改) | `false` | 否 | | `DEBUG_MODE` | 启用调试日志 | `false` | 否 | | `UPTIME_KUMA_URL` | Uptime Kuma 推送 URL 用于监控 | (空) | 否 | | `CRON_SCHEDULE` | 自动运行的 Cron 计划 | (空) | 否 | | `PARALLEL_ENABLED` | 启用并行处理 | `true` | 否 | | `PARALLEL_WORKERS` | 并行工作线程数 | `5` | 否 | | `API_DELAY_MS` | API 调用之间的延迟(毫秒) | `100` | 否 | ### rclone.conf 格式 ``` [config_name] type = s3 provider = Other access_key_id = YOUR_ACCESS_KEY secret_access_key = YOUR_SECRET_KEY endpoint = https://s3.example.com region = us-east-1 ``` ### 存储桶配置 存储桶在 `BUCKETS` 变量中指定为空格分隔的值: ``` # 单个存储桶 - BUCKETS=myconfig:my-bucket # 多个存储桶 - BUCKETS=prod:backup-bucket prod:archive-bucket test:test-bucket ``` 格式:`rclone_config_name:bucket_name` ### 前缀 默认前缀针对 restic 备份仓库进行了优化: - `data/` - 备份数据块 - `keys/` - 加密密钥(关键) - `snapshots/` - 快照元数据 - `index/` - 索引文件 故意排除 `locks/` 目录,因为锁文件是临时的。 ### 并行处理(性能优化) 脚本支持并行处理以显著提高性能: | 变量 | 描述 | 默认值 | |----------|-------------|---------| | `PARALLEL_ENABLED` | 启用并行处理 | `true` | | `PARALLEL_WORKERS` | 并行工作线程数 | `5` | | `API_DELAY_MS` | API 调用之间的延迟(毫秒) | `100` | **性能提升:** - **CPU 降低 85%** - 预计算保留日期,单次 jq 解析 - **速度提升 10 倍** - 可配置工作线程的并行处理 - **API 调用减少 50%** - 移除了不必要的 get-object-retention 调用 ``` # 高性能配置 - PARALLEL_ENABLED=true - PARALLEL_WORKERS=10 - API_DELAY_MS=50 # 保守配置(适用于速率受限的端点) - PARALLEL_ENABLED=true - PARALLEL_WORKERS=3 - API_DELAY_MS=200 ``` ### 保留模式 - **GOVERNANCE**:具有特殊权限的用户可以绕过或修改保留期 - **COMPLIANCE**:无法绕过或修改保留期(更严格) ### Cron 计划 使用标准 cron 格式:`minute hour day month weekday` ``` # 每周日凌晨 3 点 - CRON_SCHEDULE=0 3 * * 0 # 每天凌晨 2 点 - CRON_SCHEDULE=0 2 * * * # 每 6 小时 - CRON_SCHEDULE=0 */6 * * * ``` ## Docker 使用方法 ### 构建 ``` docker-compose build ``` ### 运行一次 ``` docker-compose up ``` ### 使用自定义配置运行 ``` docker-compose run --rm \ -e BUCKETS="prod:my-backup" \ -e EXTEND_DAYS=7 \ -e RETENTION_MODE=COMPLIANCE \ s3-object-lock ``` ### 使用 Cron 运行 在 `docker-compose.yml` 中设置 `CRON_SCHEDULE`: ``` environment: - CRON_SCHEDULE=0 3 * * 0 ``` 然后运行: ``` docker-compose up -d ``` ### 查看日志 ``` # 查看日志 docker-compose logs -f # 查看运行中容器的日志 docker logs s3-object-lock-extension-docker ``` ### 在现有容器中运行 如果容器已经在运行 cron 调度,您可以手动触发运行: ``` # 在运行中的容器中执行脚本(dry-run) docker exec s3-object-lock-extension-docker /app/file-lock.sh # 使用不同设置执行 docker exec -e DRY_RUN=true -e DEBUG_MODE=true s3-object-lock-extension-docker /app/file-lock.sh # 在容器中打开交互式 shell docker exec -it s3-object-lock-extension-docker /bin/bash ``` ## 监控 ### Uptime Kuma 集成 设置 `Uptime Kuma URL` 以接收推送通知: ``` - UPTIME_KUMA_URL=https://uptime-kuma.example.com/api/push/xxxxx ``` 脚本将发送: - 带摘要的成功通知 - 错误时的失败通知 ## 文件 | 文件 | 描述 | |------|-------------| | `file-lock.sh` | 主脚本 | | `entrypoint.sh` | Docker 入口点(处理 cron) | | `Dockerfile` | Docker 镜像定义 | | `docker-compose.yml` | Docker Compose 配置 | | `rclone.conf` | S3 凭据配置 | ## 示例 docker-compose.yml ``` version: '3.8' services: s3-object-lock: build: . container_name: s3-object-lock-extension-docker restart: always # init: true is recommended when using CRON_SCHEDULE # It enables Docker's init process (tini) which: # 1. Reaps zombie processes spawned by cron jobs # 2. Properly forwards signals (SIGTERM) for graceful shutdown init: true volumes: - ./rclone.conf:/app/rclone.conf:ro environment: - RCLONE_CONFIG=/app/rclone.conf - BUCKETS=prod:backup-bucket - PREFIXES=data/ keys/ snapshots/ index/ - EXTEND_DAYS=7 - RETENTION_MODE=GOVERNANCE - AWS_PROFILE=default - DRY_RUN=false - UPTIME_KUMA_URL=https://uptime-kuma.example.com/api/push/xxxxx - DEBUG_MODE=false - TZ=Europe/Prague - CRON_SCHEDULE=0 3 * * 0 logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` ### 查看日志 ``` docker logs s3-object-lock-extension-docker docker logs -f s3-object-lock-extension-docker # follow ``` ## 故障排除 ### 启用调试模式 ``` docker-compose run --rm -e DEBUG_MODE=true s3-object-lock ``` ### 测试无更改 ``` docker-compose run --rm -e DRY_RUN=true s3-object-lock ``` ### 常见问题 1. **"rclone config file not found"(找不到 rclone 配置文件)** - 确保 `rclone.conf` 存在且挂载正确 - 检查 `RCLONE_CONFIG` 路径 2. **"Access Denied"(访问被拒绝)错误** - 验证 `rclone.conf` 中的 S3 凭据 - 确保存储桶已启用对象锁 3. **"Bucket not found"(找不到存储桶)** - 检查 `BUCKETS` 变量中的存储桶名称 - 验证 `rclone.conf` 中的端点 URL 4. **容器立即退出** - 检查日志:`docker logs s3-object-lock-extension-docker` - 验证 rclone.conf 挂载是否正确 5. **Cron 未运行** - 确保已设置 `CRON_SCHEDULE` - 使用 `TZ` 变量检查时区 6. **S3 连接错误** - 验证 rclone.conf 凭据 - 检查端点 URL 是否正确 7. **镜像拉取错误** - 确保镜像在 GitHub Container Registry 中是公开的 - 进入 Package 设置 → 将可见性更改为 Public(公开) ## 许可证 MIT 许可证
标签:AWS S3, cron, Cutter, Docker, IDrive E2, MinIO, ProjectDiscovery, rclone, restic, S3兼容存储, S3对象锁, Uptime Kuma, 云存储, 人工智能安全, 合规性, 备份恢复, 存储管理, 安全合规, 安全防御评估, 定时任务, 应用安全, 数据 retention, 数据保护, 版权保护, 网络代理, 网络调试, 自动化, 请求拦截, 运维工具