利用Dropbox备份/恢复个人VPS

2012年9月17日 | 分类: 搭建博客 | 标签: ,

几天前,搭建自己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云盘

看到上面的界面说明没有问题,然后我们登陆到Dropbox中会看到已经下载完毕后我们本地客户端,只要复制走就可以完成备份。

第三步,定时备份设置

每次需要我们手工执行命令也不是个办法,我们可以设置定时来操作

chmod +x dropbox.sh #执行文件赋予权限
crontab -e
00 00 * * * dropbox.sh # i命令符回车后插入前面的脚本,意思是每天半夜12点备份数据

只需要这么简单的三步,全部OK解决问题。从操作的难以程度看,我建议用这种方法,如果你有FTP主机多余,也可以采用”数据库/网站文件自动定时备份“的方法,备份至我们的FTP空间和邮箱中。

本文固定链接: http://www.laozuo.org/519.html | 老左博客

目前还没有任何评论.