注:Atlassian confluence是一个较专业的wiki程序,由java语言写成,其详细介绍可以Google it(一点美中不足,java占用内存还是比较大的)。
该脚本的设计思路是根据Atlassian confluence官方提供的文档说明写的,主要是备份一些配置文件,上传的一些附件之类的其他文件以及数据库,其数据库支持多种数据库,这次我采用的是PostgreSQL数据库,你可以使用自己熟悉的数据库,如MySQL。
问题释疑:
1.为什么不使用rsync而是使用scp作为远程文件传输方法?
虽然rsync的设计算法(具体算法可以参考陈皓的博文《rsync 的核心算法》)决定了它更适合作为备份过程中的文件传输,例如支持增量备份和压缩传输,但Atlassian confluence备份并不要求具有实时性,而且在脚本中也做了历史备份的处理(自动删除10天前的备份),脚本中使用的备份方式相当于全备,而是不是增量备份,其次备份多在夜间执行,并且多为内网传输,及时Atlassian confluence放在阿里云上,也是有内网IP地址的,因此不用过度担心流量问题。
2.为什么要在备份机上执行该脚本?
其实这个脚本在备机还是Atlassian confluence机器上运行都是可以的,但是为了减少ssh执行远程命令的次数,将其放在备份机器上执行比较好一些。
3.find后的TODO是为啥?
在实际测试过程中发现,即使find没有进行任何删除操作,也会返回0,即成功。因此后面的校验和提示信息并不能完整的体现find的执行结果。如果日后有了更好的方法,再添加进去。
备份脚本如下:
#!/bin/bash # touch confluence_backup.sh # chmod +x confluence_backup.sh # vim confluence_backup.sh # crontabs -- configuration and scripts for running periodical jobs # SHELL=/bin/bash # PATH=/sbin:/bin:/usr/sbin:/usr/bin # MAILTO=root # HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # m h dom mon dow command # execute on 11:59 per sunday # 59 11 * * */0 $0 >/tmp/confluence_backup_$(date -d "yesterday" +"%Y%m%d%H%M%S").log # or # execute on 23:59 per day # 59 23 * * * $0 >/tmp/confluence_backup_$(date -d "yesterday" +"%Y%m%d%H%M%S").log # xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx # | ssh tunnel | # xxx.xxx.xxx.xxx <==========> xxx.xxx.xxx.xxx # | | # ----------+-----------------------------+------- # | | # +-----+-----+ +------+------+ # | A | | B | # +-----------+ +-------------+ # gitlab server backups clinet # # This shell script will execute on B Server # A and B passed ssh Authentication # A-->B: ssh lan_ip # A-->B: ssh wan_ip # B-->A: ssh lan_ip # B-->A: ssh wan_ip # A-->A: ssh lan_ip # A-->A: ssh wan_ip # B-->B: ssh lan_ip # B-->B: ssh wan_ip # run with root # [ $(id -u) -eq 0 ] || exit 1 # Run as root, of course. [ $UID -eq 0 ] || ( echo "Must be root to run this script." && exit 1 ) # save 10 days save_days=10 # which directory to backup to backup_path=/data/confluence_backup_directory # make backups uniqure and backup per day # backup_path_time_uniq=$(date -d "yesterday" +"%Y%m%d%H%M%S") backup_path_time_uniq=$(date -d "yesterday" +"%Y%m%d") confluence_home_directory=/data/var/atlassian/application-data/confluence # if you have both wan ip and lan ip, you can fill it with all, if you have one ip, you can fill it just with lan ip confluence_server_ipaddress_public=xxx.xxx.xxx.xxx confluence_server_ipaddress_private=xxx.xxx.xxx.xxx # select lan ip first for transmission speed confluence_server_hostname=${confluence_server_ipaddress_private:-$confluence_server_ipaddress_public} confluence_server_ssh_username=root #confluence_server_ssh_port=$(awk ‘/Port/ {print $2}‘ /etc/ssh/sshd_config) confluence_server_ssh_port=$(netstat -anop | awk ‘/sshd/ && /LISTEN/ {print $4}‘ | awk -F ‘:‘ ‘{print $2}‘) confluence_server_ssh_hostname=$confluence_server_hostname # which files and directory backup #backup_files=(confluence.cfg.xml attachments config index) backup_files=(confluence.cfg.xml attachments index) backup_files_num=${#backup_files[@]} [ -d $backup_path/$backup_path_time_uniq ] || mkdir -p $backup_path/$backup_path_time_uniq # do ssh copy for (( i = 0; i < $backup_files_num; i++ )); do scp -r -P$confluence_server_ssh_port [email protected]$confluence_server_ssh_hostname:$confluence_home_directory/${backup_files[i]} $backup_path/$backup_path_time_uniq >/dev/null 2>&1 [ $? -ne 0 ] && echo "$confluence_home_directory/${backup_files[i]} Backup failed! " && exit 1;echo "$confluence_home_directory/${backup_files[i]} Backup successfully! " done # excution postgresql dump # PostgreSQL 9.3.9 Documentation::31.14. Environment Variables # PGHOST=127.0.0.1 # PGHOSTADDR=127.0.0.1 # PGPORT=5432 # PGDATABASE=confluence # PGUSER=confluence # PGPASSWORD=yoursecret # PostgreSQL 9.3.9 Documentation::31.15. The Password File #cat > ~/.pgpass <<eof #127.0.0.1:5432:confluence:confluence:yoursecret #eof # WARNING: password file "/root/.pgpass" has group or world access; permissions should be u=rw (0600) or less #chmod 600 /root/.pgpass #pg_dump -U confluence -d confluence -h 127.0.0.1 -o | head # Important: If your database schema relies on OIDs (for instance, as foreign keys) you must instruct pg_dump to dump the OIDs as well. To do this, use the -o command-line option. echo "PostgreSQL is executing backup operation, please hold on! " ssh -P$confluence_server_ssh_port [email protected]$confluence_server_ssh_hostname "pg_dump -U confluence -d confluence -h 127.0.0.1 -o >/tmp/tmp_confluence_postgresql.sql" [ $? -ne 0 ] && echo "PostgreSQL dump failed! " && exit 1;echo "PostgreSQL dump successfully! " scp -P$confluence_server_ssh_port [email protected]$confluence_server_ssh_hostname:/tmp/tmp_confluence_postgresql.sql $backup_path/$backup_path_time_uniq/confluence_postgresql_$(date -d "yesterday" +"%Y%m%d").sql >/dev/null 2>&1 [ $? -ne 0 ] && echo "PostgreSQL file transmission failed! " && exit 1;echo "PostgreSQL file transmission successfully! " # delete old backups find $backup_path -mtime +$save_days -exec rm -rf {} \; # TODO # returned code always is 0, from find or rm ??? # how to express real result? [ $? -ne 0 ] && echo "Local expired backups remove skipped! ";echo "Local expired backups remove successfully! "
参考:
Production Backup Strategy https://confluence.atlassian.com/display/DOC/Production+Backup+Strategy
Configuring Backups https://confluence.atlassian.com/display/DOC/Configuring+Backups#ConfiguringBackups-EnablingBackupPathConfiguration
Valid Backup File Date Patterns are based on the Java SimpleDateFormat class http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
其他一些官方的建议和变量用词:
Perform_backups Enable
BackupFilename(Sample) backup-2015_08_17
Backup File Prefix backup-
Backup File Date Pattern yyyy_MM_dd
Backup Path /data/var/atlassian/application-data/confluence/backups
Confluence Home directory /data/var/atlassian/application-data/confluence/
tag:confluence备份脚本,confluence备份方法,如何备份confluence,远程备份confluence,远程备份脚本
--end--