2017年5月18日 星期四

利用 sitecopy 經由FTP同步網站

enter image description here

環境參數:

  • OS:FreeBSD i386 , 10.3-RELEASE-p11
  • CPU:Intel(R) Core(TM)2 Duo CPU @ 3.00GHz
  • RAM:4096 MB
  • sitecopy :0.16.6

sitecopy 自動同步網站內容

安裝 sitecopy

FreeBSD:

$ pkg install sitecopy-0.16.6_4

Ubuntu:

$ apt-get install sitecopy

建立 sitecopy 檔案快照目錄及設定檔

sitecopy啟用前,需建立檔案快照資料庫( .sitecopyrc)及編輯相關設定( /usr/local/etc/sitecopy/~)才能正常運行。

建立快照資料庫的目錄(自訂路徑即可)

.sitecopy 是用來儲存sitecopy比對檔案異同時的資料庫,一般建立在設定目錄下,當然可依自己規劃來設定。

$ mkdir /usr/local/etc/.sitecopy
$ chmod 0700 /usr/local/etc/.sitecopy

sitecopyrc 設定檔

本例以mydomain.conf為設定檔範例,網址相對則為 mydomain,遠端虛擬主機IP為1.2.3.4。以這些資料來進行設定:

$ touch /usr/local/etc/sitecopyrc/mydomain.conf
$ chmod 600 /usr/local/etc/sitecopyrc/mydomain.conf
$ vi /usr/local/etc/sitecopyrc/mydomain.conf

# sitecopyrc : mydomain
#----------------------------------------------------------
site mydomain # 網址1設定
   server 1.2.3.4 # FTP Server IP
   protocol ftp
   url http:/mydomain
   username username
   password password
   local /var/www/mydomain # 本機檔案路徑路
   remote ~/public_html/mydomain # 遠端(FTP)路徑
   permissions all
    # 排除 temp, cache 目錄底下檔案不上傳更新或下戴
    # 含有底線 _ 的檔案或資料夾也不更新
   exclude temp
   exclude cache
   exclude *_*
site newdomain # 網址2設定
   server 1.2.3.4 # FTP Server IP
   protocol ftp
   url http:/newdomain
   username username
   password password
   local /var/www/newdomain # 本機檔案路徑路
   remote ~/public_html/newdomain # 遠端(FTP)路徑
   permissions all

輸入vi指令: wq存檔離開編輯界面。

檢查本地端快照資料

$ sitecopy -r /usr/local/etc/sitecopyrc/mydomain.conf -p /usr/local/etc/.sitecopy mydomain
sitecopy: Error: No storage file for `mydomain'.
sitecopy: Use --init, --catchup or --fetch to create a storage file.
sitecopy: Skipping site `mydomain'.
sitecopy: No valid sites specified.
Try `sitecopy --help' for more information.

由上可知資料庫尚未建立,所以需要先初始化

初始化 ( -i,即 –initialize)

$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -i  mydomain
sitecopy: Initializing site `mydomain' (on 1.2.3.4 in ~/public_html/mydomain/)
sitecopy: All the files and directories are marked as NOT updated remotely.

本地端 FTP 同步上傳到遠端主機

一開始我們要先確定本地端的檔案都已經上傳至虛擬主機目錄下,方法有很多種,選擇自己熟悉方便的即可。

1.打包後自行上傳,利用 tar -zcvf 指令壓縮打包後上傳再解壓,可以節省一點時間。
2.利用ftp軟體直接目錄對目錄慢慢上傳,簡單但耗時。
3..利用 sitecopy 指令上傳 ( -u ,即 –update),練習指令的好機會,利用(-u,即 –update)參數直接更新遠端檔案:

$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -u  mydomain

測試新增本地端檔案後,再更新遠端檔案

驗証是否在本地端新增檔案後,會自動上傳到遠端?

$ echo "new file" > /var/www/mydomain/new.html
$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -u  mydomain
sitecopy: Updating site `mydomain' (on 1.2.3.4 in ~/public_html/mydomain/)
Uploading new.html: [.] done. (100% finished)
Setting permissions on new.html: done.
sitecopy: Update completed successfully.

成功上傳了。

遠端 FTP 同步下戴到本地端主機

  1. 先列出遠端的檔案(-f,即 –fetch)
$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -f  mydomain
sitecopy: Fetching site `mydomain' (on 1.2.3.4 in ~/public_html/mydomain/)
File: new.html - size 11
File: index.html - size 10
sitecopy: Fetch completed successfully.

結果顯示遠端目前有2個檔案:new.html及index.html, 本地端(/var/www/mydomain)則無任何檔案。

  1. 將本地端更新為遠端檔案狀態(-s, 即–synchronize)
$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -s  mydomain
sitecopy: Synchronizing site `mydomain' (on 1.2.3.4 in ~/public_html/mydomain/)
Downloading index.html: [.] done.
Setting permissions on index.html: done.
Downloading new.html: [.] done.
Setting permissions on new.html: done.
sitecopy: Synchronize completed successfully.

成功將遠端檔案下載回本地端。

注意 -s 這個指令會完全將本地端同步成遠端檔案,也就是任何其它存在本地端但卻不存在遠端的檔案會被刪除。

測試:繼上個步驟,如果本地端不小心異動檔案後,想同步為遠端檔案?

$ touch > /var/www/mydomain/new.html #不小心更改了new.html這佪檔案
$ sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -s  mydomain
sitecopy: Synchronizing site `mydomain' (on 1.2.3.4 in ~/public_html/mydomain/)
Downloading new.html: [.] done.
sitecopy: Synchronize completed successfully.

自動偵測到 new.html 與遠端不同,所以將遠端的 new.html 下戴回來。

設定每天凌晨2點自動同步(www權限)

$ crontab -u www -e
0   2   *   *   *   www     sitecopy -o -r /usr/local/etc/sitecopyrc/mydomain.conf  -p /usr/local/etc/.sitecopy -s  mydomain

多個網站如何更新?

依網站名稱分別在sitecopy設定檔中編輯

vi /usr/local/etc/sitecopyrc/mydomain.conf 

script檔案內容

建立一個檔名為sitecopy_update.sh的shell script,構想是達成3個功能:
1.第1個參數:”u”代表上傳網站,”s”則代表下載網站。
2.第2個參數是本地端目錄名稱。(不是網址!
3.自動寫入log檔。

例如想將本地端的目錄 newdomain(sitecopy設定檔中要記得設定) 上傳至虛擬主機,則使用以下指令:

$ sitecopy_update.sh u newdomain

所以每天自動執行上傳的crontab就可以簡化為:

$ crontab -u www -e
0   2   *   *   *   www     sitecopy_update.sh u mydomain
#!/bin/sh#!/bin/sh

# /home/jjnux/mycron/sitecopy_update.sh
#==========================================================
# 2017-5-19 , 00:01
#
# Use Sitecopy to backup the BC3 remote hosts files
#
#==========================================================

# Set Variables
PROG=sitecopy_update
SITECOPY=/usr/local/bin/sitecopy
LOGFILE=/var/log/sitecopy.log
RCFILE_DIR=/usr/local/etc/sitecopyrc
RCDIR=/data/.sitecopy

#=====================================
# Check Variables
#=====================================
WWWROOT=/data/htdocs

if [ -z $1 ] || [ -z $2 ];then
  if  [ ! $1 = "u" ] && [ ! $1 = "s" ];then
    echo " Specify update(u) or synchronize(s) for  vhost!!!"
    echo 
  echo " Usage:" `basename $0` 'method (u for update) ( s for synchornize) hostname'
    exit 0
  fi
else
# Let's Go Here
  Smethod=$1
  SITE=$2
  HTDOC=$WWWROOT/$2
  RCFILE=$RCFILE_DIR/bc3.conf
  if [ ! -d $HTDOC ] || [ ! -f $RCFILE ] ;then
  echo "WWW file or RCFILE not found!"
  exit 0
  fi
  $SITECOPY -o -r ${RCFILE}  -p ${RCDIR} -${1}  $2

# Time Stamp
echo $PROG $1`date '+%Y/%m/%d,%H:%m'` >> ${LOGFILE}
$SITECOPY -no -r ${RCFILE}  -p ${RCDIR} -${1}  $2  >> ${LOGFILE}
fi

那天想查閱更新記錄時,查看log檔即可。

$ more /var/log/sitecopy.log
參考來源:

1.http://www.manyfish.co.uk/sitecopy/2.

本文大網

活本來沒有什麼好與壞,只要你願意怎樣填滿它,它就隨同而行。


EmoticonEmoticon