Docker 服务迁移完整指南

Teslamate 迁移
lsky兰空图床搭建
lskypro迁移

目录

  1. 迁移策略判断方法
  2. TeslaMate 迁移指南
  3. Lsky Pro 图床迁移指南
  4. 常用命令详解
  5. 故障排查

迁移策略判断方法

如何判断使用哪种迁移方式

方法1:直接复制目录(最简单快速)

适用条件(必须同时满足):

  • ✅ 使用本地目录挂载(bind mount)

  • ✅ 配置中使用绝对路径,如:

    1
    volumes:  - /path/to/data:/var/lib/data
  • ✅ 数据量较大,目录结构简单

  • ✅ 新旧服务器可以保持相同的目录结构

典型例子:Lsky Pro

1
2
3
volumes:
- /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data:/var/www/html
- /media/bsuperstation/biG_RU/docker_data/lsky-bed/db:/var/lib/mysql

方法2:数据库导出 (pg_dump/mysqldump)

适用条件(满足任一):

  • ✅ 使用 Docker volumes(命名卷)

    1
    volumes:  teslamate-db:  # 这是命名卷
  • ✅ 需要跨版本迁移数据库

  • ✅ 需要选择性恢复数据

  • ✅ 数据库与应用可以分离备份

典型例子:TeslaMate

1
2
volumes:
- teslamate-db:/var/lib/postgresql/data # 命名卷

方法3:Volume 备份(最完整)

适用条件:

  • ✅ 使用 Docker volumes
  • ✅ 需要完整保留所有数据和配置
  • ✅ 有多个相互依赖的 volumes
  • ✅ 包含二进制数据或复杂配置

快速判断流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
检查 docker-compose.yml 中的 volumes 配置

├─ 是绝对路径 (/xxx/xxx) ────────────────► 方法1:直接复制目录

├─ 是命名卷 (volume_name:)
│ │
│ ├─ 仅数据库服务 ─────────────────────► 方法2:数据库导出
│ │
│ └─ 多个服务/复杂依赖 ────────────────► 方法3:Volume 备份

└─ 混合使用
└─ 分别处理:
- 绝对路径部分 ────► 直接复制
- 命名卷部分 ──────► Volume备份或数据库导出

三种方式对比

特性 直接复制目录 数据库导出 Volume备份
速度 ⭐⭐⭐ 最快 ⭐⭐ 中等 ⭐ 较慢
操作难度 ⭐⭐⭐ 最简单 ⭐⭐ 中等 ⭐ 较复杂
数据完整性 ⭐⭐ 中等 ⭐⭐⭐ 最好 ⭐⭐⭐ 最好
版本兼容 ⭐ 可能有问题 ⭐⭐⭐ 最好 ⭐⭐ 中等
选择性恢复 ❌ 不支持 ✅ 支持 ❌ 不支持
跨平台 ⚠️ 需注意 ✅ 无问题 ⚠️ 需注意

TeslaMate 迁移指南

服务架构分析

1
2
3
4
5
6
# TeslaMate 使用命名卷(Docker volumes)
volumes:
teslamate-db: # PostgreSQL 数据
teslamate-grafana-data: # Grafana 配置和仪表板
mosquitto-conf: # MQTT 配置
mosquitto-data: # MQTT 数据

推荐策略: 数据库导出 (pg_dump) + Volume 备份混合方案

方法1:使用 pg_dump(推荐用于数据库)

1. 旧服务器备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入 docker-compose.yml 所在目录
cd /path/to/teslamate

# 停止服务(可选但推荐)
docker compose stop

# 备份数据库(压缩)
docker compose exec -T database pg_dump -U teslamate teslamate | gzip > teslamate-db-backup.sql.gz

# 备份配置文件和 import 目录
tar czf teslamate-config-backup.tar.gz docker-compose.yml .env import/

# 查看备份文件
ls -lh *.tar.gz *.sql.gz

命令详解:

  • docker compose exec - 在运行中的容器内执行命令
  • -T - 禁用伪终端(必须!否则输出会包含控制字符导致备份损坏)
  • database - docker-compose.yml 中的服务名
  • pg_dump - PostgreSQL 备份工具
  • -U teslamate - 使用 teslamate 用户
  • teslamate - 数据库名
  • | gzip - 通过管道压缩输出
  • > file.sql.gz - 保存到文件

2. 传输到新服务器

1
2
3
4
5
6
7
8
# 使用 rsync(推荐,支持断点续传)
rsync -avzP teslamate-*.gz user@new-server:/opt/teslamate/

# 参数说明:
# -a: archive 模式(保留权限、时间戳等)
# -v: verbose 显示详细信息
# -z: 压缩传输数据
# -P: 显示进度 + 支持断点续传

3. 新服务器恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cd /opt/teslamate

# 解压配置文件
tar xzf teslamate-config-backup.tar.gz

# 启动数据库服务
docker compose up -d database

# 等待数据库启动(重要!)
echo "等待数据库启动..."
sleep 15

# 检查数据库是否就绪
docker compose exec database pg_isready -U teslamate

# 恢复数据库
gunzip -c teslamate-db-backup.sql.gz | docker compose exec -T database psql -U teslamate teslamate

# 启动所有服务
docker compose up -d

# 查看日志
docker compose logs -f

恢复命令详解:

  • gunzip -c - 解压并输出到标准输出(-c 保留原文件)
  • psql - PostgreSQL 命令行客户端
  • -U teslamate teslamate - 用户名和数据库名

4. 验证迁移结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 检查容器状态
docker compose ps

# 检查数据量
docker compose exec database psql -U teslamate teslamate -c "
SELECT
'cars' as table_name, COUNT(*) as count FROM cars
UNION ALL
SELECT 'drives', COUNT(*) FROM drives
UNION ALL
SELECT 'charging_processes', COUNT(*) FROM charging_processes
UNION ALL
SELECT 'positions', COUNT(*) FROM positions
ORDER BY table_name;
"

# 检查最新记录
docker compose exec database psql -U teslamate teslamate -c "
SELECT MAX(start_date) as latest_drive FROM drives;
"

# 访问服务
# TeslaMate: http://new-server-ip:4000
# Grafana: http://new-server-ip:3000

方法2:Volume 完整备份(备选方案)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 旧服务器:备份所有 volumes
docker compose stop

docker run --rm \
-v teslamate_teslamate-db:/source \
-v $(pwd):/backup \
alpine tar czf /backup/volume-teslamate-db.tar.gz -C /source .

docker run --rm \
-v teslamate_teslamate-grafana-data:/source \
-v $(pwd):/backup \
alpine tar czf /backup/volume-grafana-data.tar.gz -C /source .

# 新服务器:恢复 volumes
docker volume create teslamate_teslamate-db

docker run --rm \
-v teslamate_teslamate-db:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/volume-teslamate-db.tar.gz -C /target

docker compose up -d

自动化备份脚本

创建 backup-teslamate.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# TeslaMate 自动备份脚本

BACKUP_DIR="./teslamate-backups"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

echo "=== 开始备份 TeslaMate ==="
echo "备份时间: $DATE"

# 备份数据库
echo "备份数据库..."
docker compose exec -T database pg_dump -U teslamate teslamate | \
gzip > $BACKUP_DIR/teslamate-db-$DATE.sql.gz

# 备份配置
echo "备份配置..."
tar czf $BACKUP_DIR/teslamate-config-$DATE.tar.gz \
docker-compose.yml .env import/

echo "=== 备份完成 ==="
ls -lh $BACKUP_DIR/*-$DATE.*

创建 restore-teslamate.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# TeslaMate 自动恢复脚本

if [ -z "$1" ]; then
echo "用法: ./restore-teslamate.sh <数据库备份文件.sql.gz>"
exit 1
fi

DB_BACKUP=$1

echo "=== 开始恢复 TeslaMate ==="

# 启动数据库
docker compose up -d database
sleep 15

# 检查就绪
docker compose exec database pg_isready -U teslamate

# 恢复数据
echo "恢复数据库..."
gunzip -c $DB_BACKUP | docker compose exec -T database psql -U teslamate teslamate

# 启动所有服务
docker compose up -d

echo "=== 恢复完成 ==="
docker compose ps

使用方法:

1
2
3
4
5
6
7
8
9
10
# 在旧服务器
chmod +x backup-teslamate.sh
./backup-teslamate.sh

# 传输
rsync -avzP teslamate-backups/ user@new-server:/opt/teslamate/backups/

# 在新服务器
chmod +x restore-teslamate.sh
./restore-teslamate.sh backups/teslamate-db-20250110_120000.sql.gz

重要注意事项

  1. ENCRYPTION_KEY 必须保持一致

    • 这个密钥用于加密 Tesla API tokens
    • 如果更改,将无法解密现有的 tokens
    • 位置:docker-compose.yml.env 文件
  2. 数据库密码保持一致

    • 确保 DATABASE_PASSPOSTGRES_PASSWORD 相同
  3. 端口检查

    1
    2
    # 检查端口是否被占用
    sudo netstat -tulpn | grep -E ':(4000|3000)'
  4. 防火墙设置

    1
    2
    3
    # 如需远程访问
    sudo ufw allow 4000/tcp
    sudo ufw allow 3000/tcp

Lsky Pro 图床迁移指南

服务架构分析

1
2
3
4
# Lsky Pro 使用本地目录挂载(bind mount)
volumes:
- /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data:/var/www/html
- /media/bsuperstation/biG_RU/docker_data/lsky-bed/db:/var/lib/mysql

推荐策略: 直接复制目录(最简单)

方法1:直接复制整个目录(推荐)

1. 旧服务器备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入 docker-compose.yml 所在目录
cd /path/to/lsky-pro

# 停止服务
docker compose stop

# 备份整个数据目录
cd /media/bsuperstation/biG_RU/docker_data
tar czf lsky-bed-backup-$(date +%Y%m%d).tar.gz lsky-bed/

# 备份配置文件
cd /path/to/lsky-pro
tar czf lsky-config-$(date +%Y%m%d).tar.gz docker-compose.yml .env

# 查看备份文件大小
ls -lh *.tar.gz

2. 传输到新服务器

1
2
3
4
5
6
7
# 使用 rsync(推荐大文件传输)
rsync -avzP lsky-bed-backup-*.tar.gz lsky-config-*.tar.gz \
user@new-server:/tmp/

# 或使用 scp
scp lsky-bed-backup-*.tar.gz lsky-config-*.tar.gz \
user@new-server:/tmp/

3. 新服务器恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建相同的目录结构
sudo mkdir -p /media/bsuperstation/biG_RU/docker_data

# 解压数据
cd /media/bsuperstation/biG_RU/docker_data
sudo tar xzf /tmp/lsky-bed-backup-*.tar.gz

# 解压配置
mkdir -p /opt/lsky-pro
cd /opt/lsky-pro
tar xzf /tmp/lsky-config-*.tar.gz

# 启动服务
docker compose up -d

# 查看日志
docker compose logs -f

4. 验证迁移结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 检查容器状态
docker compose ps

# 检查数据库
docker compose exec mysql mysql -u lsky-bs -pbl27855 -e "
USE lsky-bs;
SHOW TABLES;
SELECT COUNT(*) as image_count FROM images;
SELECT COUNT(*) as user_count FROM users;
"

# 检查文件数量
find /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data -type f | wc -l

# 访问网站
curl -I http://localhost:7676

# 浏览器访问
# http://new-server-ip:7676

方法2:分别备份(更灵活)

1
2
3
4
5
6
7
8
9
# 旧服务器
docker compose stop

# 分别备份应用数据和数据库
tar czf lsky-data-$(date +%Y%m%d).tar.gz \
-C /media/bsuperstation/biG_RU/docker_data/lsky-bed lsky_data/

tar czf lsky-db-$(date +%Y%m%d).tar.gz \
-C /media/bsuperstation/biG_RU/docker_data/lsky-bed db/

方法3:使用 mysqldump(数据库单独备份)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 旧服务器备份
docker compose exec -T mysql mysqldump \
-u lsky-bs \
-pbl27855 \
lsky-bs | gzip > lsky-db-$(date +%Y%m%d).sql.gz

# 新服务器恢复
docker compose up -d mysql
sleep 20

gunzip -c lsky-db-*.sql.gz | \
docker compose exec -T mysql mysql -u lsky-bs -pbl27855 lsky-bs

docker compose up -d

mysqldump 命令详解:

  • mysqldump - MySQL 数据库备份工具
  • -u lsky-bs - 用户名
  • -pbl27855 - 密码(注意:-p 和密码之间没有空格
  • lsky-bs - 数据库名

自动化脚本

创建 backup-lsky.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# Lsky Pro 自动备份脚本

BACKUP_DIR="./lsky-backups"
DATE=$(date +%Y%m%d_%H%M%S)
DATA_PATH="/media/bsuperstation/biG_RU/docker_data/lsky-bed"

mkdir -p $BACKUP_DIR

echo "=== 开始备份 Lsky Pro ==="
echo "备份时间: $DATE"

# 停止服务
docker compose stop

# 备份应用数据
echo "备份应用数据..."
tar czf $BACKUP_DIR/lsky-data-$DATE.tar.gz -C $DATA_PATH lsky_data/

# 备份数据库文件
echo "备份数据库..."
tar czf $BACKUP_DIR/lsky-db-$DATE.tar.gz -C $DATA_PATH db/

# 备份配置
echo "备份配置..."
tar czf $BACKUP_DIR/lsky-config-$DATE.tar.gz docker-compose.yml .env 2>/dev/null || \
tar czf $BACKUP_DIR/lsky-config-$DATE.tar.gz docker-compose.yml

echo "=== 备份完成 ==="
ls -lh $BACKUP_DIR/*-$DATE.*

创建 restore-lsky.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
# Lsky Pro 自动恢复脚本

if [ "$#" -lt 1 ]; then
echo "用法: ./restore-lsky.sh <备份时间戳>"
echo "示例: ./restore-lsky.sh 20250110_143000"
exit 1
fi

TIMESTAMP=$1
DATA_PATH="/media/bsuperstation/biG_RU/docker_data/lsky-bed"

echo "=== 开始恢复 Lsky Pro ==="

# 创建目录
sudo mkdir -p $DATA_PATH

# 解压应用数据
echo "恢复应用数据..."
sudo tar xzf lsky-backups/lsky-data-$TIMESTAMP.tar.gz -C $DATA_PATH/

# 解压数据库
echo "恢复数据库..."
sudo tar xzf lsky-backups/lsky-db-$TIMESTAMP.tar.gz -C $DATA_PATH/

# 解压配置
echo "恢复配置..."
tar xzf lsky-backups/lsky-config-$TIMESTAMP.tar.gz

# 启动服务
docker compose up -d

echo "=== 恢复完成 ==="
docker compose ps

路径调整(不同目录结构)

如果新服务器需要使用不同的路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 新服务器使用 /opt/docker/lsky 而不是原路径
NEW_PATH="/opt/docker/lsky"

# 创建新目录
sudo mkdir -p $NEW_PATH

# 解压到新位置
sudo tar xzf /tmp/lsky-bed-backup-*.tar.gz \
--strip-components=1 -C $NEW_PATH/

# 修改 docker-compose.yml
vim docker-compose.yml

# 将以下内容:
# /media/bsuperstation/biG_RU/docker_data/lsky-bed/lsky_data:/var/www/html
# 改为:
# /opt/docker/lsky/lsky_data:/var/www/html

重要注意事项

  1. 权限问题

    1
    2
    3
    4
    5
    6
    # 确保正确的文件权限
    sudo chown -R www-data:www-data $DATA_PATH/lsky_data
    sudo chown -R 999:999 $DATA_PATH/db # MySQL 容器使用 uid 999

    # 或查看原服务器的权限
    ls -ln $DATA_PATH/
  2. 密码安全

    • 配置中的密码是明文(bl27855
    • 迁移后建议修改密码
    1
    2
    3
    4
    5
    6
    # 修改 MySQL 密码
    docker compose exec mysql mysql -u root -pbl27855 -e "
    ALTER USER 'lsky-bs'@'%' IDENTIFIED BY 'new_secure_password';
    FLUSH PRIVILEGES;
    "
    # 同时更新 docker-compose.yml 中的密码
  3. 图片链接更新

    • 如果域名或 IP 变更,需要在 Lsky Pro 后台更新
    • 路径:管理后台 → 系统设置 → 站点设置
  4. 端口冲突检查

    1
    sudo netstat -tulpn | grep 7676

常用命令详解

Docker Compose 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 启动所有服务
docker compose up -d

# 停止所有服务
docker compose stop

# 重启服务
docker compose restart

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f # 实时查看所有服务
docker compose logs -f service_name # 查看特定服务
docker compose logs --tail=100 # 查看最后100行

# 进入容器
docker compose exec service_name bash
docker compose exec service_name sh # 如果没有 bash

# 删除服务和卷(危险!)
docker compose down -v

PostgreSQL 相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 备份数据库
docker compose exec -T database pg_dump -U username dbname > backup.sql
docker compose exec -T database pg_dump -U username dbname | gzip > backup.sql.gz

# 恢复数据库
docker compose exec -T database psql -U username dbname < backup.sql
gunzip -c backup.sql.gz | docker compose exec -T database psql -U username dbname

# 检查数据库连接
docker compose exec database pg_isready -U username

# 进入 psql 命令行
docker compose exec database psql -U username dbname

# psql 常用命令
\l # 列出所有数据库
\dt # 列出所有表
\d table # 查看表结构
\q # 退出

MySQL 相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 备份数据库
docker compose exec -T mysql mysqldump -u username -ppassword dbname > backup.sql
docker compose exec -T mysql mysqldump -u username -ppassword dbname | gzip > backup.sql.gz

# 恢复数据库
docker compose exec -T mysql mysql -u username -ppassword dbname < backup.sql
gunzip -c backup.sql.gz | docker compose exec -T mysql mysql -u username -ppassword dbname

# 检查 MySQL 状态
docker compose exec mysql mysqladmin ping -u root -ppassword

# 进入 MySQL 命令行
docker compose exec mysql mysql -u username -ppassword

# MySQL 常用命令
SHOW DATABASES;
USE database_name;
SHOW TABLES;
DESCRIBE table_name;
EXIT;

Volume 操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 列出所有 volumes
docker volume ls

# 查看 volume 详情
docker volume inspect volume_name

# 创建 volume
docker volume create volume_name

# 删除 volume(危险!)
docker volume rm volume_name

# 备份 volume
docker run --rm \
-v volume_name:/source \
-v $(pwd):/backup \
alpine tar czf /backup/volume-backup.tar.gz -C /source .

# 恢复 volume
docker volume create volume_name
docker run --rm \
-v volume_name:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/volume-backup.tar.gz -C /target

文件传输命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# rsync(推荐)
rsync -avzP source_file user@host:/destination/
# -a: archive 模式(保留权限等)
# -v: 显示详细信息
# -z: 压缩传输
# -P: 显示进度 + 断点续传

# scp
scp file.tar.gz user@host:/destination/
scp -r directory/ user@host:/destination/ # 递归复制目录

# 从远程服务器下载
rsync -avzP user@host:/source/ ./local/
scp user@host:/source/file.tar.gz ./

故障排查

常见问题及解决方案

1. 容器无法启动

1
2
3
4
5
6
7
8
9
10
11
# 查看容器日志
docker compose logs service_name

# 检查容器状态
docker compose ps -a

# 查看详细错误
docker compose up # 不使用 -d,在前台运行查看错误

# 检查配置文件语法
docker compose config

2. 数据库连接失败

1
2
3
4
5
6
7
8
9
# 检查数据库是否就绪
docker compose exec database pg_isready -U username # PostgreSQL
docker compose exec mysql mysqladmin ping -u root -ppassword # MySQL

# 检查网络连接
docker compose exec service_name ping database

# 检查环境变量
docker compose exec service_name env | grep DATABASE

3. 端口被占用

1
2
3
4
5
6
7
8
9
10
# 查看端口占用
sudo netstat -tulpn | grep :PORT
sudo lsof -i :PORT

# 停止占用端口的进程
sudo kill -9 PID

# 或修改 docker-compose.yml 使用其他端口
ports:
- "NEW_PORT:80"

4. 权限问题

1
2
3
4
5
6
7
8
9
10
11
# 检查文件权限
ls -la /path/to/data

# 修改所有者
sudo chown -R user:group /path/to/data

# 修改权限
sudo chmod -R 755 /path/to/data

# 查看容器内运行用户
docker compose exec service_name id

5. Volume 数据丢失

1
2
3
4
5
6
7
8
# 检查 volume 是否存在
docker volume ls | grep volume_name

# 查看 volume 位置
docker volume inspect volume_name

# 检查 volume 内容
docker run --rm -v volume_name:/data alpine ls -la /data

6. 备份文件损坏

1
2
3
4
5
6
7
8
9
10
11
# 测试压缩文件完整性
gzip -t backup.sql.gz
tar -tzf backup.tar.gz # 不解压,仅测试

# 查看文件大小
ls -lh backup.*

# 如果使用 -T 选项问题
# 确保使用了 -T 禁用 TTY
docker compose exec -T database pg_dump ... # 正确
docker compose exec database pg_dump ... # 可能损坏

7. 数据恢复后数据不完整

1
2
3
4
5
6
7
8
9
10
11
# 检查备份时间
ls -lh backup.*

# 对比记录数(旧服务器)
docker compose exec database psql -U user dbname -c "SELECT COUNT(*) FROM table;"

# 对比记录数(新服务器)
docker compose exec database psql -U user dbname -c "SELECT COUNT(*) FROM table;"

# 检查是否在备份时有写入操作
# 确保备份前停止了服务

网络诊断

1
2
3
4
5
6
7
8
9
# 测试容器间网络
docker compose exec service1 ping service2

# 查看网络配置
docker network ls
docker network inspect network_name

# 测试外部连接
docker compose exec service_name curl -I https://example.com

磁盘空间检查

1
2
3
4
5
6
7
8
9
# 检查磁盘空间
df -h

# 检查 Docker 磁盘使用
docker system df

# 清理未使用的资源(谨慎!)
docker system prune -a
docker volume prune

最佳实践

1. 定期备份

1
2
3
4
5
6
7
8
# 创建定时备份脚本
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /path/to/backup-script.sh

# 每周日凌晨 3 点备份
0 3 * * 0 /path/to/backup-script.sh

2. 备份文件管理

1
2
3
4
# 保留最近 7 天的备份
find ./backups/ -name "*.tar.gz" -mtime +7 -delete

# 保留最近