Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

文件和文件夹的加密与备份,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 里的镜像 
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

参考内容

  1. RCLONE - Script download and install
  2. Object Storage - Tools - rclone
  3. OpenSSL - enc
  4. The GNU Privacy Handbook - Encrypting and decrypting documents
  5. How can I backup a Docker-container with its data-volumes?
  6. Back up, restore, or migrate data volumes
  7. How do I save terminal output to a file?
  8. How to Back Up Your Docker Volumes

评论