就是记录一下设置 Wiki 的自动备份,在 Wiki 所在的 VPS 上定时对资料目录打包,然后从备份用 VPS 把打包好的文件传输过去。
之前遭遇过多次 VPS 挂掉而数据灭失的惨剧,最近一次就是幸苦写了十多个页面之后的个人 Wiki… 然后到现在都还木有把那些内容全部给补回来…虽然说现在使用了几乎不用考虑升级(也就大大减少了手贱的几率)的 Slackware
系统,但是以防万一还是做个异地备份的好。
异地备份重于泰山。
为了方便设置备份时间和文件传输的安全性考虑,我把所有参与备份的服务器设置为了同一时区,并且使用 scp
命令来通过 SSH 完成文件传输。至于备份的脚本,设置为使用 cron
任务定期执行。
我的个人 Wiki 放在一台跑着 Slackware 13.37
的低配 VPS 上面,用的是 MoinMoin
Wiki 系统,所有数据都保存在文件系统中而不需要数据库,所以只要给 Moin 文件夹打包就可以备份全部内容了。
先是在 Slackware
下面调整时区,我用 tzselect
不知为何木有作用,最后用了这个命令解决:
1 |
zic -l Asia/Shanghai |
然后 vi /usr/local/share/moinbackup.sh 编写备份脚本:
1 2 3 4 |
#!/bin/bash rm /usr/local/share/moindailyback.zip -Rf zip /usr/local/share/moindailyback.zip /usr/local/share/moin -r |
这个脚本会删除前一天的备份并将 Moin
所在目录打包。
然后需要把脚本放到 cron 里并赋予执行权限,让它能够每日自动运行。这里我让它每日备份一次:
1 2 |
cp /usr/local/share/moinbackup.sh /etc/cron.daily/moin.sh chmod +x /etc/cron.daily/moin.sh |
之后是设置 cron job 的执行时间,执行 crontab -e 即可编辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# If you don't want the output of a cron job mailed to you, you have to direct # any output to /dev/null. We'll do this here since these jobs should run # properly on a newly installed system, but if they don't the average newbie # might get quite perplexed about getting strange mail every 5 minutes. :^) # # Run the hourly, daily, weekly, and monthly cron jobs. # Jobs that need different timing may be entered into the crontab as before, # but most really don't need greater granularity than this. If the exact # times of the hourly, daily, weekly, and monthly cron jobs do not suit your # needs, feel free to adjust them. # # Run hourly cron jobs at 47 minutes after the hour: 47 * * * * /usr/bin/run-parts /etc/cron.hourly 1> /dev/null # # Run daily cron jobs at 03:40 every day: 40 3 * * * /usr/bin/run-parts /etc/cron.daily 1> /dev/null # # Run weekly cron jobs at 4:30 on the first day of the week: 30 4 * * 0 /usr/bin/run-parts /etc/cron.weekly 1> /dev/null # # Run monthly cron jobs at 4:20 on the first day of the month: 20 4 1 * * /usr/bin/run-parts /etc/cron.monthly 1> /dev/null |
修改时间后保存退出。
这个时候可以手动运行一下脚本看能不能正确打包文件。
然后到备份服务器做设置。我的备份服务器运行的是 CentOS 5 32bit.
出于安全考虑,不能把备份文件放在 web 服务器可访问的地方,所以就不能用 wget
来下载到备份机,所以想到了用 SSH
来传输文件。
首先要给两台服务器配置证书认证。先在备份机执行
ssh-keygen , 全部默认设置就行,在本机生成一个 key. 然后到 /root/.ssh/
目录下,把这个文件传输到生产机:
1 |
scp /root/.ssh/id_rsa.pub root@wiki.atr.me:/root/.ssh/authorized_keys |
按照提示保存密钥并且输入密码过后就可以完成传输了。然后这个时候再尝试用 ssh
命令登录,应该就不再需要密码了。
如果提示 scp
命令找不到,安装 openssh-client
即可。
然后开始配置 cron job.
首先编辑备份用脚本
vi /etc/cron.daily/moin.sh :
1 2 3 4 5 6 7 |
#!/bin/bash # Define the time NOW=$(date +"%Y-%m-%d") # Get the file scp root@wiki.atr.me:/usr/local/share/moindailyback.zip /home/back/moin-back_$NOW.zip |
然后同样地,用
chmod +x /etc/cron.daily/moin.sh 赋予其运行权限,之后就要配置 cron 了。
CentOS 5 下不能用
crontab -e 来编辑配置,因为系统默认的 cron 程序不同。这里要直接编辑
vi /etc/crontab :
1 2 3 4 5 6 7 8 9 10 |
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 18 * * * * root run-parts /etc/cron.hourly 26 4 * * * root run-parts /etc/cron.daily 19 1 * * 0 root run-parts /etc/cron.weekly 49 5 23 * * root run-parts /etc/cron.monthly |
注意这台备份机的时区也是 Asia/Shanghai
. 我把每日运行时间设置成生产机的大约40分钟过后,保证生产机已经执行备份打包操作完毕,然后从备份机运行脚本将打包好的每日备份传输到本地并按照日期重命名存放。
以上设置目前已经成功运行。
--- TODO ---
还没有搞清楚自动导出 MySQL 数据库应该怎样操作,下一步是折腾带数据库应用的自动备份。
说不定还可以搞整下 Dropbox 上传w
配置好ssh 密钥登陆
然后用本地rsync远程文件夹到dropbox文件夹里面就可以了
表示不会 rsync…
google看几个例子,看下手册,然后自己试试就搞定了
我路由里面的wiki是file base的,所以同步只要笔记本定时rsync文件到dropbox就行了, blog也是写完markdown编译成html后rsync到vps的
同步备份显然rsync更专业,试下吧
唔…考完试先><