文件和文件夹的加密与备份,mysql数据库的备份,docker容器,volumes 和镜像备份的一些命令
建议:备份开始前,先暂停要备份的服务
安装 RCLONE,设置 remote
按照官网的步骤安装最新版本,如果不是最新版本,上传的速度可能会受影响
sudo -v ; curl https://rclone.org/install.sh | sudo bash
设置 remote,最好需要查询你的 S3 服务商的文档
文件加密和解密
方法一:
# encrypt
openssl enc -aes-256-ecb -pbkdf2 -base64 -in data-plain.txt -out data-encrypted.txt
# decrypt
openssl aes-256-cbc -d -in encrypted.tar.gz.enc | tar xz
- 根据提示输入你的加密密码
方法二:
gpg --output doc.gpg --encrypt --recipient [email protected] doc
- 在网上看到,如果是 Kleopatra 产生的 gpg 密钥对,会报错,似乎是某个东西的版本问题
方法三:
# encrypt
crypt your_key < clear.file > encrypted.file
# decrypt
crypt your_key < encrypted.file > clear.file
- 这里的
<
和>
要依葫芦画瓢写上去
还可以用 zip
命令
备份文件夹
# 压缩
tar -zcvf backup-$(date +%Y-%m-%d).tar.gz /file/folder
# 加密
openssl enc -aes-256-ecb -pbkdf2 -base64 -in backup-$(date +%Y-%m-%d).tar.gz -out backup-$(date +%Y-%m-%d)-lock.tar.gz
# 上传
rclone sync -P backup-$(date +%Y-%m-%d)-lock.tar.gz <Remote_name>:destination/folder/ --s3-no-head
# 删除本地备份文件
sudo rm backup-$(date +%Y-%m-%d).tar.gz
gzip
只能压缩单个文件,tar
可以压缩文件夹- 这段只适合不需要定期备份的,熟悉一些
rclone
操作rclone sync
会将本地与远端的文件同步,如果远端存在本地没有的文件,也会同步过来- 如果只想将本地文件传上远端,用
rclone copy
备份 MySQL 数据库
这一小节的 MySQL,不是 docker 安装的
# 生成备份文件
mysqldump -u root -p writefreely | gzip > path/to/save/your-file-$(date +%Y-%m-%d).tar.gz
# 上传
rclone sync -P path/to/save/your-file-$(date +%Y-%m-%d).tar.gz your:remote/s3/path/ --s3-no-head
mysqldump -u [user name] –p [password] [options] [database_name] [tablename] > [dumpfilename.sql]
备份 docker 容器及其数据
备份镜像
使用 docker save
docker images
docker save -o filename.tar image-id
ls
备份容器
docker ps -a
# 容器保存为镜像
docker commit -p CONTAINER—_ID new_image_name
# 查看备份是否成功(有无名为 new_image_name 的镜像)
docker images
# 将镜像制作成文件(可能需要使用root权限)
docker save -o filename.tar new_image_name
# 确认文件制作完成
ls
- docker commit:输出不会包括 volume 里的数据
- docker export
- docker save:将容器镜像输出为.tar文件
恢复容器
# 为了验证容器是否能正常导入, 先删除 docker 里的镜像
docker rmi image_name
# 这才是导入
docker load < /folder/to/filename.tar
# 确认导入
docker images
# 运行
sudo docker run -p <port:port> -name container_name -d new_iamge_name
备份容器的数据库(db)
备份 xxx 服务的数据库
# 导出数据库
sudo docker exec <db_container_name> pg_dump -U <db_user> -Fc <db_name> | gzip > xxx-$(date +%Y-%m-%d).tar.gz
- 将 PostgreSQL 数据库内容,提取到自定义文件格式:
pg_dump -Fc mydb > db.dump
备份和恢复容器的媒体文件(volumes)
备份 volume
# 生成和压缩
docker run --rm --volumes-from <container_name> -v $(pwd):/backup ubuntu tar cvf /backup/backup-filename-$(date +%Y-%m-%d).tar <path2>
<container_name>
和<path2>
的参数选择,看 docker-compose.yml / docker-compose.yaml 设置文件里的container_name:
和volumes:
字段如果有
volumes: - ./postgres:/var/lib/postgresql/data
那么
<path2>
参数是/var/lib/postgresql/data
恢复 volume
docker run --rm --volumes-from <container_name> -v $(pwd):/backup ubuntu bash -c "cd <path2> && tar xvf /backup/backup-filename-$(date +%Y-%m-%d).tar --strip 1"
自动备份
首先输入 which bash
,查询自己 bash 的安装位置,确认后发现我的 bash 在 /usr/bin/bash
有的人的 bash 在
/bin/bash
写入 /path/to/backup.sh
,这里备份了 memos 服务的 volume 和 docker-compose.yaml
#! /usr/bin/bash
source /etc/profile
passwd='xxxxx'
target="xxx:xxx"
route1="/path/to/your/backup/folder" # 这里要写完整路径,不能写带有 ~/ 的路径
route2="/path/to/your/service" # 这里要写完整路径,不能写带有 ~/ 的路径
now=$(date "+%Y%m%d-%H%M%S")
echo `date +"%Y-%m-%d %H:%M:%S"` " now starting backup"
/usr/bin/docker run --rm --volumes-from memos -v ${route1}:/backup ubuntu tar cvf /backup/backup-${now}.tar /var/opt/memos
echo `date +"%Y-%m-%d %H:%M:%S"` " add a password now" &&
/usr/bin/zip --password ${passwd} ${route1}/memos-backup-${now}.zip ${route1}/memos-backup-${now}.tar
/usr/bin/zip --password ${passwd} ${route1}/memos-yaml-${now}.zip ${route2}/docker-compose.yaml
echo `date +"%Y-%m-%d %H:%M:%S"` " succeed and upload to s3 now"
/usr/bin/rclone copy ${route1}/memos-backup-${now}.zip ${target} &&
/usr/bin/rclone copy ${route1}/memos-yaml-${now}.zip ${target} &&
echo `date +"%Y-%m-%d %H:%M:%S"` " okay, uploaded to s3"
rm -f ${route1}/memos-backup-${now}.tar ${route1}/memos-backup-${now}.zip ${route1}/memos-yaml-${now}.zip
/usr/bin/rclone --min-age 7d delete ${target}
echo `date +"%Y-%m-%d %H:%M:%S"` " ok all done"
给 bash
脚本赋权
chmod u+x /path/to/backup.sh
对临时存放备份文件的backup
文件夹,修改用户权限,给当前用户赋予操作权限
sudo chown $USER:$USER ./backup
crontab -e
,设置定时执行
# m h dom mon dow command
0 4 * * * /usr/bin/bash /path/to/backup.sh
一定要写上
/usr/bin/bash
,不然我的定时运行不起来参考Crontab教程,上述表示在服务器时间每天4:00执行媒体清理命令
其它操作
切换到 root 用户
sudo -i
移除 volumes
注意,在删除 docker 容器后,对应的 volume 数据不会一起消失
终端输出保存到指定文件
SomeCommand > SomeFile.txt
参考内容
- RCLONE - Script download and install
- Object Storage - Tools - rclone
- OpenSSL - enc
- The GNU Privacy Handbook - Encrypting and decrypting documents
- How can I backup a Docker-container with its data-volumes?
- Back up, restore, or migrate data volumes
- How do I save terminal output to a file?
- How to Back Up Your Docker Volumes