# Docker Volume 冷备份

`docker_volume_cold_restic.sh` 用于备份 Docker named volume。它会先停止当前运行中的容器，再导出 volume，用 restic 上传，最后只启动备份前正在运行的容器。

适合可以接受短暂停机的个人服务器。MySQL 这类数据库卷也可以通过这种冷备方式降低损坏风险。

## 使用前配置

编辑脚本顶部配置：

```bash
export RESTIC_REPOSITORY="s3:s3.ap-east-1.amazonaws.com/your-bucket-name/docker-volumes"
export RESTIC_PASSWORD="change-this-restic-password"
export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_KEY"
```

S3 兼容服务示例：

```bash
export RESTIC_REPOSITORY="s3:https://your-endpoint.example.com/your-bucket/docker-volumes"
```

## 常用命令

备份全部 named volumes：

```bash
sudo ./docker_volume_cold_restic.sh backup
```

只备份指定 volume：

```bash
sudo ./docker_volume_cold_restic.sh backup --include caddy_data,mysql_data
```

排除指定 volume：

```bash
sudo ./docker_volume_cold_restic.sh backup --exclude cache_volume,tmp_volume
```

查看快照：

```bash
sudo ./docker_volume_cold_restic.sh snapshots
```

恢复到不存在的 volume：

```bash
sudo ./docker_volume_cold_restic.sh restore latest --include caddy_data
```

强制覆盖已有 volume：

```bash
sudo ./docker_volume_cold_restic.sh restore latest --force --include caddy_data
```

查看本机 volumes：

```bash
sudo ./docker_volume_cold_restic.sh list-volumes
```

## 定时任务

每周日 03:00 执行：

```cron
0 3 * * 0 /usr/bin/env bash /opt/scripts/docker_volume_cold_restic/docker_volume_cold_restic.sh backup
```

## 注意事项

- 备份期间会停机。
- 不要用 `docker export` 备份 named volume，它不包含 volume 数据。
- `restore` 默认不覆盖已有 volume。
- `restore --force` 会清空同名 volume 后再导入，请先确认快照正确。
- 日志目录：`/var/log/docker-volume-cold-restic`。
- 临时备份目录：`/var/tmp/docker-volume-cold-restic`。

## 检查脚本

```bash
bash -n docker_volume_cold_restic.sh
shellcheck docker_volume_cold_restic.sh
shfmt -d docker_volume_cold_restic.sh
./docker_volume_cold_restic.sh --help
```
