前言
通过 Apline 搭建的docker环境建站虽然没有宝塔面板方便但是对系统环境影响最小,可是备份是个问题。如果用的是大厂云服务器可以通过设置定时系统快照任务来备份,但是轻量云却不支持设置定时快照(腾讯云),宝塔面板自带很多易用的备份插件,我常用的是 OneDrive 备份,于是想到可以通过 Rclone 在服务器上挂载 google drive,然后编写一个简易备份脚本配合 Cron 任务来实现定时备份。
下载安装
Apline系统直接使用命令安装吧!
apk add rclone
初始化配置
安装完成后输入:
rclone config
可以看到:
No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q> n name> googledrive
输入 n
新建一个配置,name
为你的配置名称,可以自定义,这里我输入的是 googledrive
。
然后会出现挂载的服务类型,如下:
Option Storage. Type of storage to configure. Choose a number from below, or type in your own value. 1 / 1Fichier \ (fichier) 2 / Akamai NetStorage \ (netstorage) 3 / Alias for an existing remote \ (alias) 4 / Amazon Drive \ (amazon cloud drive) 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, RackCorp, SeaweedFS, and Tencent COS \ (s3) 6 / Backblaze B2 \ (b2) 7 / Better checksums for other remotes \ (hasher) 8 / Box \ (box) 9 / Cache a remote \ (cache) 10 / Citrix Sharefile \ (sharefile) 11 / Compress a remote \ (compress) 12 / Dropbox \ (dropbox) 13 / Encrypt/Decrypt a remote \ (crypt) 14 / Enterprise File Fabric \ (filefabric) 15 / FTP Connection \ (ftp) 16 / Google Cloud Storage (this is not Google Drive) \ (google cloud storage) 17 / Google Drive \ (drive) 18 / Google Photos \ (google photos) 19 / Hadoop distributed file system \ (hdfs) 20 / Hubic \ (hubic) 21 / In memory object storage system. \ (memory) 22 / Jottacloud \ (jottacloud) 23 / Koofr, Digi Storage and other Koofr-compatible storage providers \ (koofr) 24 / Local Disk \ (local) 25 / Mail.ru Cloud \ (mailru) 26 / Mega \ (mega) 27 / Microsoft Azure Blob Storage \ (azureblob) 28 / Microsoft OneDrive \ (onedrive) 29 / OpenDrive \ (opendrive) 30 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH) \ (swift) 31 / Pcloud \ (pcloud) 32 / Put.io \ (putio) 33 / QingCloud Object Storage \ (qingstor) 34 / SSH/SFTP Connection \ (sftp) 35 / Sia Decentralized Cloud \ (sia) 36 / Storj Decentralized Cloud Storage \ (storj) 37 / Sugarsync \ (sugarsync) 38 / Transparently chunk/split large files \ (chunker) 39 / Union merges the contents of several upstream fs \ (union) 40 / Uptobox \ (uptobox) 41 / Webdav \ (webdav) 42 / Yandex Disk \ (yandex) 43 / Zoho \ (zoho) 44 / http Connection \ (http) 45 / premiumize.me \ (premiumizeme) 46 / seafile \ (seafile) Storage> 17
输入你要挂载的网盘序号,我要挂载的 googledrive 是 17,
⚠️注意:序号不固定,请自行确认
client_id
和 client_secret
直接回车默认即可,(也可以自行创建,怎么创建我就不说了,有点麻烦。可以看官方文章:https://rclone.org/drive/ )
然后会出现 权限 选择,如下:
Option scope. Scope that rclone should use when requesting access from drive. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Full access all files, excluding Application Data Folder. \ (drive) 2 / Read-only access to file metadata and file contents. \ (drive.readonly) / Access to files created by rclone only. 3 | These are visible in the drive website. | File authorization is revoked when the user deauthorizes the app. \ (drive.file) / Allows read and write access to the Application Data folder. 4 | This is not visible in the drive website. \ (drive.appfolder) / Allows read-only access to file metadata but 5 | does not allow any access to read or download file content. \ (drive.metadata.readonly) scope> 1
然后是选择是否进行高级配置,保持默认回车即可:
Edit advanced config? y) Yes n) No (default)
接着是自动配置选择,如下:
Use auto config? * Say Y if not sure * Say N if you are working on a remote or headless machine y) Yes (default) n) No
[blockquote2 name=’洛维花’]因为你的服务器并没有图形化界面无法使用浏览器打开网页,这里需要选择 n,[/tip]
这里需要获取授权码并输入:
Option config_token. For this to work, you will need rclone available on a machine that has a web browser available. For more help and alternate methods see: https://rclone.org/remote_setup/ Execute the following on the machine with the web browser (same rclone version recommended): rclone authorize "drive" "eyJjbGllbnRfaWQ1iOiIyOTE1ODgwMjc5MzctdWUzbm52b2tmdnYzcHBqYjVpcjZhdmdibGlzMWEyZ3EuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJjbGllbnRfc2VjcmV0IjoiR09DU1BYLUtYUnRmLXpxOXNtX2FObEQ2sbjJDaHg2ZzZKR1oiLCJzY29wZSI6ImRyaXZlIn0" Then paste the result. Enter a value. config_token>
授权码需要在本地电脑上获取,访问 https://rclone.org/downloads/
根据你的电脑系统版本下载对应的 Rclone,下载完成后解压,这边用的是mac系统,所以需要下载的是mac版本。
打开终端
进入到下载的rclone目录。
cd downloads cd rclone-v1.60.1-osx-amd64 ./rclone authorize "drive" "eyJjbGllbnRfaWQ1iOiIyOTE1ODgwMjc5MzctdWUzbm52b2tmdnYzcHBqYjVpcjZhdmdibGlzMWEyZ3EuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJjbGllbnRfc2VjcmV0IjoiR09DU1BYLUtYUnRmLXpxOXNtX2FObEQ2sbjJDaHg2ZzZKR1oiLCJzY29wZSI6ImRyaXZlIn0"
浏览器应该会自动打开,如果浏览器没有打开可以根据提示复制地址访问。如果浏览器登录了 googledrive 的话会直接显示授权确认信息,如果没有登录的话会弹出登录页面,登录 googledrive 后也会显示授权确认信息。选择 接受 后在本地命令行会显示一串 JSON 格式的授权信息,复制授权信息包括首尾的 {},到 Linux 终端粘贴。
然后,直接回车默认
Configure this as a Shared Drive (Team Drive)? y) Yes n) No (default) y/n>
确认无误后输入 y 或者直接回车,接着会显示你选择的配置信息,确认无误后输入 y 保存配置。
备份脚本
备份脚本摘抄自,秋水逸冰 博客。原文链接:https://teddysun.com/469.html
- 下载该脚本并赋予执行权限
wget --no-check-certificate https://github.com/teddysun/across/raw/master/backup.sh chmod +x backup.sh
- 修改并配置脚本
请使用 vim 或 nano 等工具来修改。
ENCRYPTFLG
(加密FLG,true 为加密,false 为不加密,默认是加密)
BACKUPPASS
(加密密码,重要,务必要修改)
LOCALDIR
(备份目录,可自己指定)
TEMPDIR
(备份目录的临时目录,可自己指定)
LOGFILE
(脚本运行产生的日志文件路径)
MYSQL_ROOT_PASSWORD
(MySQL/MariaDB/Percona 的 root 用户密码)
MYSQL_DATABASE_NAME
(指定 MySQL/MariaDB/Percona 的数据库名,留空则是备份所有数据库)
[blockquote2 name=’洛维花’] ※ MYSQL_DATABASE_NAME
是一个数组变量,可以指定多个。举例如下:[/tip]
MYSQL_DATABASE_NAME[0]="phpmyadmin" MYSQL_DATABASE_NAME[1]="test"
BACKUP
(需要备份的指定目录或文件列表,留空就是不备份目录或文件)
[blockquote2 name=’洛维花’] ※ BACKUP
是一个数组变量,可以指定多个。举例如下:[/tip]
BACKUP[0]="/data/www/default/test.tgz" BACKUP[1]="/data/www/default/test/" BACKUP[2]="/data/www/default/test2/"
LOCALAGEDAILIES
(指定多少天之后删除本地旧的备份文件,默认为 7 天)
DELETE_REMOTE_FILE_FLG
(删除 Google Drive 或 FTP 上备份文件的 FLG,true 为删除,false 为不删除)
RCLONE_NAME
(设置 rclone config 时设定的 remote 名称,务必要指定)
RCLONE_FOLDER
(指定备份时设定的 remote 的目录名称,该目录名在 Google Drive 不存在时则会自行创建。默认为空,也就是根目录)
RCLONE_FLG
(上传本地备份文件至 Google Drive 的 FLG,true 为上传,false 为不上传)
FTP_FLG
(上传文件至 FTP 服务器的 FLG,true 为上传,false 为不上传)
FTP_HOST
(连接的 FTP 域名或 IP 地址)
FTP_USER
(连接的 FTP 的用户名)
FTP_PASS
(连接的 FTP 的用户的密码)
FTP_DIR
(连接的 FTP 的远程目录,比如: public_html)
一些注意事项的说明:
1)脚本需要用 root 用户来执行;
2)脚本需要用到 openssl 来加密,请事先安装好;
3)脚本默认备份所有的数据库(全量备份);
4)备份文件的解密命令如下:
openssl enc -aes256 -in [ENCRYPTED BACKUP] -out decrypted_backup.tgz -pass pass:[BACKUPPASS] -d -md sha1
5)备份文件解密后,解压命令如下:
tar -zxPf [DECRYPTION BACKUP FILE]
解释一下参数 -P:
tar 压缩文件默认都是相对路径的。加个 -P 是为了 tar 能以绝对路径压缩文件。因此,解压的时候也要带个 -P 参数。
[blockquote2 name=’洛维花’]因为疯子使用的系统是:Apline系统,所以需要安装:bash
,tar
,openssl
,安装命令如下:[/tip]
apk add bash apk add tar apk add openssl
3、运行脚本开始备份
./backup.sh
脚本默认会显示备份进度,并在最后统计出所需时间。
如果你想将脚本加入到 cron 自动运行的话,就不需要前台显示备份进度,只写日志就可以了。
这个时候你需要稍微改一下脚本中的 log 函数。
log() { echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1" echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE} }
改为:
log() { echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE} }
Apline定时备份
关于如何使用 cron 自动备份,网上有一堆教程,这里以Apline 来举例说明。
首先alpine内嵌的是BusyBox,使用alpine的crontab实际就是使用BusyBox的crond服务,那么下来就简单介绍下如何使用吧,网上教程还是比较多的:
- 配置文件存放位置:
配置文件是在如下目录中的
/var/spool/cron/crontabs/
- 使用方式
向crontab的配置文件中添加配置
vi /var/spool/cron/crontabs/root # 或者 crontab -e # 填入如下内容,最后一行为我添加的任务 # do daily/weekly/monthly maintenance # min hour day month weekday command */15 * * * * run-parts /etc/periodic/15min 0 * * * * run-parts /etc/periodic/hourly 0 2 * * * run-parts /etc/periodic/daily 0 3 * * 6 run-parts /etc/periodic/weekly 0 5 1 * * run-parts /etc/periodic/monthly 30 1 * * * cd /root/ && ./backup.sh
以上表示,每天凌晨 1 点 30 分,进入root目录执行一次 backup.sh 脚本。
注意:
一定要修改其中的 PATH 和 HOME 变量的值。
尤其是 HOME 变量,rclone 命令能否正确执行,是要依赖于其配置文件的。用 root 用户配置的话,其配置文件夹应该是 /root/.config/rclone ,所以要更改 HOME 的值。
最后,欢迎交流和提出意见。
如果是系统,那么会报错。
- 报错:
sh: 0: unknown operand backup.sh: line 53: MYSQL_DATABASE_NAME[0]=: not found backup.sh: line 59: BACKUP[0]=/qinglong: not found backup.sh: line 120: syntax error: unexpected "(" (expecting "fi")
- 先查看一下:
首先登录到容器内,查看sh的版本,(通常有ash、bash、sh等),
bash-4.3# ls -l /bin/*sh lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/ash ->/bin/busybox -rwxr-xr-x 1 root root 682128 Apr 20 2017 /bin/bash lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/fdflush->/bin/busybox lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/sh ->/bin/busybox
发现alpine中的sh使用的是bin/busybox(命令展示结果最后一行),因此需要将sh切换到/bin/bash下
下面给出解决思路:
-
删除原有链接;
-
新建一个软链接指向/bin/bash,
脚本实现如下:
cd /bin && rm -f sh && ln -s /bin/bash sh
最后再执行脚本,能正常运行,问题解决,当然可以将其写入到容器构建中,做成新的镜像,以后使用该镜像创建出来的容器都不会再出现这类问题了。