首頁 > 軟體

Linux Shell指令碼之Atlassian confluence遠端備份方法

2020-06-16 17:54:04

註: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 $confluence_server_ssh_username@$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 $confluence_server_ssh_username@$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 $confluence_server_ssh_username@$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   
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--

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-08/122450.htm


IT145.com E-mail:sddin#qq.com