利用Dropbox备份/恢复个人VPS
几天前,搭建自己WordPress博客的个人VPS被毁,好在更早前得知Dropbox能运行于Linux VPS上用于备份文件内容,所以本博没有太大损失,除了重搭VPS环境所花的时间。
Dropbox得用https方式来访问,不然的话连接会跟本域名lordong.net一样被重置,另外为了防止域名解析被污染(即DNS污染),建议使用国外的DNS服务器,比如Google的8.8.8.8和8.8.4.4。
Dropbox我就不多说了,通过邀请注册机制可以双方同时增加一定量的免费空间(以前是250MB,现在是500MB),默认是2GB,这是我的邀请:http://db.tt/TryEACjD
因为我已经有了备份,这里主要说我恢复的经过,恢复完了也就完成了备份的准备了。
第一步,通过ssh终端(我用的putty)连到VPS上安装Dropbox,这里是Linux的各个版本:For Linux。如果没有合适的版本或者想直接在VPS上编译安装的话只需要在ssh终端粘帖下面一行即可完成:
1
|
cd ~ && wget -O - "http://www.dropbox.com/download?plat=lnx.x86" | tar xzf - |
这是32bit的版本,64bit可以在上面的链接找到。
第二步,手动在当前用户的目录下建Dropbox的文件夹,因为我备份的时候是通过目录链接的方式把网站的内容链到Dropbox的同步目录的,所以恢复时需要先链接完再开启同步,这样从Dropbox服务器上恢复的文件直接恢复到网站的目录,命令:
1
|
mkdir ~ /Dropbox |
第三步,使用ln -s命令把网站的目录链到Dropbox目录下,前提是已经安装好网站比如PHP等,我这里的网站部署在/home/www和/home/ssl目录,Dropbox对应的目录是website/www和website/ssl,所以我这样操作:
1
2
3
4
5
|
cd ~ /Dropbox mkdir website cd website ln -s /home/www www ln -s /home/ssl ssl |
其它目录也用同样的方法建链接,这样在VPS上不就不会存在多份文件内容了。
第四步,在VPS上第一次运行Dropbox,会在ssh终端上不断的打出一串链接,复制(复制方法是用鼠标选择然后按右键完成拷贝)到本地的浏览器上运行,输入自己Dropbox的帐户和密码完成绑定,绑定成功后按Ctrl+C退出。第一次运行的命令:
1
|
~/.dropbox-dist /dropboxd |
以后后台运行的命令:
1
|
~/.dropbox-dist /dropbox & |
第五步,后台运行Dropbox等到数据恢复完成(可以输入top看进程,开始时dropbox进程会占比较多 的CPU,等到CPU恢复正常后可以按q退出进程查看界面),进入/home把刚才同步回来的网站目录www和ssl授权给建网站的用户,我这里是www 组www用户,使用下面的命令:
1
2
3
|
cd /home chown -R www:www www chown -R www:www ssl |
到这里恢复完成,下面补充一下如何自动备份。
第六步,创建自动运行和停止dropbox的bash脚本,把下面的内容写到~/.dropbox-dist/dropbox.sh文件中(我这里是root用户,如果不是这个用户记得改一下对应的目录,没试过相对目录~,不知道行不行):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/bin/sh start() { echo starting dropbox /root/ .dropbox-dist /dropbox & } stop() { echo stopping dropbox pkill dropbox } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; esac |
然后把dropbox.sh设成可以执行:
1
|
chmod +x ~/.dropbox-dist /dropbox .sh |
第七步,把上面的dropbox.sh添加到计划任务表:
1
|
crontab -e |
添加的内容:
1
2
|
30 0 * * * ~/.dropbox-dist /dropbox .sh start >> /dev/null 2>&1 40 0 * * * ~/.dropbox-dist /dropbox .sh stop >> /dev/null 2>&1 |
意思是每天服务器时间0点30分启动dropbox,0点40分停止dropbox,也就是每天只执行一次,每次10分钟,把修改的内容备份就行。
第八步,创建自动备份mysql的数据库脚本,放到需要备份的应用下,比如wordpress目录下,文件名backup.php:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<?php header( 'Content-Type:text/html;charset=utf-8' ); header( "Expires: 0" ); header( 'Cache-Control: no-cache, must-revalidate' ); header( 'Pragma: no-cache' ); $host = "localhost" ; $user = "数据库用户名" ; $password = "数据库用户密码" ; $dbname = "数据库名" ; $destination_folder = 'db/' ; if (! file_exists ( $destination_folder )) { mkdir ( $destination_folder ); } mysql_connect( $host , $user , $password ); mysql_select_db( $dbname ); $mysql = "set charset utf8;\r\n" ; $q1 =mysql_query( "show tables" ); while ( $t =mysql_fetch_array( $q1 )){ $table = $t [0]; $q2 =mysql_query( "show create table `$table`" ); $sql =mysql_fetch_array( $q2 ); $mysql .= $sql [ 'Create Table' ]. ";\r\n\r\n" ; $q3 =mysql_query( "select * from `$table`" ); while ( $data =mysql_fetch_assoc( $q3 )){ $keys = array_keys ( $data ); $keys = array_map ( 'addslashes' , $keys ); $keys =join( '`,`' , $keys ); $keys = "`" . $keys . "`" ; $vals = array_values ( $data ); $vals = array_map ( 'addslashes' , $vals ); $vals =join( "','" , $vals ); $vals = "'" . $vals . "'" ; $mysql .= "insert into `$table`($keys) values($vals);\r\n" ; } $mysql .= "\r\n" ; } $filename = $destination_folder . date ( 'YmdH' ) . ".sql" ; $fp = fopen ( $filename , 'w' ); fputs ( $fp , $mysql ); fclose( $fp ); echo "数据备份成功,生成备份文件" . $filename . "" ; ?> |
第九步,建一个自动运行的cron php脚本,文件名dbcron.php:
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
|
<?php function doCron( $url ) { if ( empty ( $url )) { exit ( '请先配置cron.php' ); } $ch = curl_init( $url ); if (isset( $_GET [ 'echo' ])) { curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); } if ( strstr ( $url , 'https://' )) { curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, 0); curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, 2); } curl_exec( $ch ); curl_close( $ch ); } //这里一定要填写正确的地址 doCron( "http://域名/wordpress目录/backup.php" ); ?> |
第十步,把dbcron.php添加到计划任务表,同第七步:
1
|
0 0,12 * * * php /home/www/wordpress 目录 /dbcron .php >> /dev/null 2>&1 |
意思是服务器时间每天的0点和12点执行一次数据库备份,备份到本地的db目录下,由dropbox同步到Dropbox服务器。
最后,为了安全起见,不允许从外部访问这些备份的sql文件,需要在db目录下新建一个.htaccess文件用于限制浏览器访问,内容如下:
1
2
|
order allow,deny deny from all |
另外,这个db目录下每天会多出两个文件,适当的时候要去删除旧的文件。
原文:http://lordong.me/wp/post/1374.html
==========
利用Shell脚本实现自动备份VPS数据到Dropbox
之前发生过几次VPS宕机的故障,经询问托管商,解释是宿主机硬盘出问题,好在数据都在存储上,没有大碍。但却给自己敲了一个警钟,那就是得自己做好VPS的数据备份,尤其是Blog的目录和数据库。
但是VPS远在美国,手动下载备份文件速度会非常慢,于是我想到了Dropbox,它是目前美国名气最大的免费网络硬盘站点,在经过了一系列的搜索和失败 的尝试之后,我终于发现了一个Shell脚本,无需安装任何Dropbox客户端程序,就可以实现自动备份VPS数据到Dropbox的功能。
相关截图如下
执行脚本后的显示:
在Dropbox中成功备份:
以下便是脚本的相关内容:
# vim DropboxBackup.sh
# chmod +x DropboxBackup.sh
# crontab -e //设置为每个月执行一次备份,具体时间可以根据需要进行修改
00 02 1 * * /bin/bash /home/rainbow/DropboxBackup.sh
01 |
#!/bin/bash |
02 |
DROPBOX_USER= "guosuiyu@gmail.com" //Dropbox的账号 |
03 |
DROPBOX_PASS= "12345678" //Dropbox的密码 |
04 |
DROPBOX_DIR= "/backups" //Dropbox中的文件夹名称 |
05 |
BACKUP_SRC= "/blog/rainbow /home /data" //需要备份的文件夹路径,可以同时指定多个 |
06 |
BACKUP_DST= "/home/rainbow/backup" //用来存放备份的文件夹路径 |
07 |
MYSQL_SERVER= "127.0.0.1" //连接本地MySQL |
08 |
MYSQL_USER= "root" //本地MySQL的用户 |
09 |
MYSQL_PASS= "12345678" //本地MySQL的密码 |
10 |
11 |
# |
12 |
# Stop editing here. |
13 |
NOW=$( date + "%Y.%m.%d" ) |
14 |
DESTFILE= "$BACKUP_DST/$NOW.tgz" |
15 |
16 |
# |
17 |
# Upload a file to Dropbox. |
18 |
# $1 = Source file |
19 |
# $2 = Destination file. |
20 |
function dropboxUpload |
21 |
{ |
22 |
# |
23 |
# Code based on DropBox Uploader 0.6 from http://www.andreafabrizi.it/?dropbox_uploader |
24 |
LOGIN_URL= "https://www.dropbox.com/login" |
25 |
HOME_URL= "https://www.dropbox.com/home" |
26 |
UPLOAD_URL= "https://dl-web.dropbox.com/upload" |
27 |
COOKIE_FILE= "/tmp/du_cookie_$RANDOM" |
28 |
RESPONSE_FILE= "/tmp/du_resp_$RANDOM" |
29 |
30 |
UPLOAD_FILE=$1 |
31 |
DEST_FOLDER=$2 |
32 |
33 |
# Login |
34 |
echo - ne " > Logging in..." |
35 |
curl -s -i -c $COOKIE_FILE -o $RESPONSE_FILE --data "login_email=$DROPBOX_USER&login_password=$DROPBOX_PASS&t=$TOKEN" "$LOGIN_URL" |
36 |
grep "location: /home" $RESPONSE_FILE > /dev/null |
37 |
38 |
if [ $? - ne 0 ]; then |
39 |
echo -e " Failed!" |
40 |
rm -f "$COOKIE_FILE" "$RESPONSE_FILE" |
41 |
exit 1 |
42 |
else |
43 |
echo -e " OK" |
44 |
fi |
45 |
46 |
# Load home page |
47 |
echo - ne " > Loading Home..." |
48 |
curl -s -i -b "$COOKIE_FILE" -o "$RESPONSE_FILE" "$HOME_URL" |
49 |
50 |
if [ $? - ne 0 ]; then |
51 |
echo -e " Failed!" |
52 |
rm -f "$COOKIE_FILE" "$RESPONSE_FILE" |
53 |
exit 1 |
54 |
else |
55 |
echo -e " OK" |
56 |
fi |
57 |
58 |
# Get token |
59 |
TOKEN=$( cat "$RESPONSE_FILE" | tr -d '\n' | sed 's/.*<form action="https:\/\/dl-web.dropbox.com\/upload"[^>]*>\s*<input type="hidden" name="t" value="\([a-z 0-9]*\)".*/\1/' ) |
60 |
61 |
# Upload file |
62 |
echo - ne " > Uploading '$UPLOAD_FILE' to 'DROPBOX$DEST_FOLDER/'..." |
63 |
curl -s -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DEST_FOLDER" -F "t=$TOKEN" -F "file=@$UPLOAD_FILE" "$UPLOAD_URL" |
64 |
grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null |
65 |
66 |
if [ $? - ne 0 ]; then |
67 |
echo -e " Failed!" |
68 |
rm -f "$COOKIE_FILE" "$RESPONSE_FILE" |
69 |
exit 1 |
70 |
else |
71 |
echo -e " OK" |
72 |
rm -f "$COOKIE_FILE" "$RESPONSE_FILE" |
73 |
fi |
74 |
} |
75 |
76 |
# Backup files. |
77 |
echo "Dumping databases..." |
78 |
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$NOW-Databases.sql" |
79 |
echo "Packing files..." |
80 |
tar czf "$DESTFILE" $BACKUP_SRC "$NOW-Databases.sql" |
81 |
82 |
dropboxUpload "$DESTFILE" "$DROPBOX_DIR" |
83 |
84 |
echo "Cleaning the backups..." |
85 |
rm -f "$NOW-Databases.sql" |
86 |
find $BACKUP_DST -mtime +31 -delete //这里的时间可以根据需要进行修改 |
参考资料:http://davehope.co.uk/Blog/backup-your-linux-vps-to-dropbox/
版权所有© mcsrainbow,保留所有原创日志的权利。转载请注明出处:http://heyLinux.com 。
==========
Linux VPS备份教程:完美脚本备份至Dropbox云盘
要是先看到这个方法我就不需要磨磨唧唧的写前面这篇”免费利用Dropbox定时备份“,因为这篇文章花费了我半天时间,测试的VPS前前后后重新装了不下5次,最好还是半推半就的解决问题。在文章写到最后的时候看到老外的一篇快速备份VPS数据至Dropbox的方法,不得不佩服老外的能力。
下面老左就实战操作这个方法,至少我要先用到可以使用,才会分享给大家,浪费我的时间不要紧,不能浪费大家的时间,因为我希望每一篇文章都是有用的,能给大家找到解决方法,而不是测试后不好用然后骂我。
第一步,下载脚本,然后把参数修改成我们自己的,脚本我就不贴出来了,直接下载完整版本
http://myvps-scripts.googlecode.com/files/dropbox.sh
我建议不熟悉VI命令的站长,还是下载到本地,然后编辑好FTP上传到root目录下
第二步,赋予权限,运行脚本测试
chmod +x dropbox.sh
sh dropbox.sh
看到上面的界面说明没有问题,然后我们登陆到Dropbox中会看到已经下载完毕后我们本地客户端,只要复制走就可以完成备份。
第三步,定时备份设置
每次需要我们手工执行命令也不是个办法,我们可以设置定时来操作
chmod +x dropbox.sh #执行文件赋予权限
crontab -e
00 00 * * * dropbox.sh # i命令符回车后插入前面的脚本,意思是每天半夜12点备份数据
只需要这么简单的三步,全部OK解决问题。从操作的难以程度看,我建议用这种方法,如果你有FTP主机多余,也可以采用”数据库/网站文件自动定时备份“的方法,备份至我们的FTP空间和邮箱中。