Link Search Menu Expand Document

以github備份模擬圖檔

Table of contents

背景

  • 異地備援是很重要的一個課題。此處將模擬結果圖檔,以github為中介進行每日的異地備援。主要考量有幾:
    • github有最高的安全規格,不論上載或下載均有良好管制。
    • github目前尚未被公司網管列入禁止傳輸檔案的對象,作為日常的傳輸並無阻攔,無須另外申請。
    • 雖然github支援大檔的傳輸(見Git Large File Storage (LFS) 筆記),但此處所要傳遞的是圖檔,經壓縮後一個檔案尚在100MB之內,也在github允許範圍。
    • github具有足夠之頻寬,適合公開發布。
  • 需要解決的是如何在遠端創設(與刪除)github的repo

自動執行

  • 因網管時間之設定,每天工作時間(8:00~17:30)才開放github。
  • 而此時所有預報及後處理都已經結束,可以將圖檔上傳。
0  8  *  *  * /home/kuang/GitHubRepos/cp_timebar.cs  >& ~/GitHubRepos/cp_timebar.out 2>&1

腳本內容分段說明

基本設定

  • 由於crontab在執行的時候不會自行套用路徑環境,因此需用絕對路徑來執行
  • $GH_TOKENgh指令所需要之金鑰。
GIT=/usr/bin/git
GH=/usr/bin/gh
gtd=~/GitHubRepos
TOKEN=$(cat ~/bin/git.token)
export GH_TOKEN=$TOKEN
today=$(date +%Y%m%d)
rundate=$(date -d "$today +0day" +%Y%m%d)
BEGD=$(date -d "$today -1day" +%Y-%m-%d)
dates=();datep=()
for id in {0..11};do
  dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y-%m-%d) )
  datep=( ${datep[@]} $(date -d "$BEGD +${id}days" +%Y%m%d) )
done
GRD=( 'grid45'     'grid09'  'grid03' )

複製檔案

  • 將內部網路磁碟機的內容,複製一份到當天的repo之下,準備上傳。
    • 3個範圍10天的地面PM2.5模擬結果圖檔,經壓縮後共143MB
    • 3個範圍10天的地面風場、HPBL檔案共428MB
    • .git目錄也有約500MB。因無更新、變動的需求,這個目錄的內容可以刪除。
repo=cmaq_$rundate
mkdir -p ${gtd}/${repo}
cd ${gtd}/${repo}
cp /nas3/cmaqruns/2022fcst/grid45/cctm.fcst/daily/png1_${BEGD}.tar.gz .
cp /nas2/cmaqruns/2022fcst/grid09/cctm.fcst/daily/png2_${BEGD}.tar.gz .
cp /nas3/cmaqruns/2022fcst/grid03/cctm.fcst/daily/png3_${BEGD}.tar.gz .
for id in {0..11};do
  cp /nas2/backup/data/NOAA/NCEP/GFS/YYYY/TWEPA_3k/U10V10_d03_${dates[$id]}_00:00:00 .
  cp /nas2/backup/data/NOAA/NCEP/GFS/YYYY/tw_CWBWRF_45k/U10V10_d0?_${dates[$id]}_00:00:00 .
  done

開創github上的新目錄

  • 基本上github上的存放目錄是一份json檔案控制的內容,因此,開創一個新的目錄必須在https://api.github.com/user/repos目錄下新增一個json檔案,並將檔案的所有權轉給本人。
  • 指令使用詳見git and github筆記說明
cmd="/home/anaconda3/bin/curl -u sinotec2:$TOKEN https://api.github.com/user/repos -d '{\"name\":\"${repo}\"}'"
eval $cmd
  • curl -d內容是個字串,如有環境變數會無法在命令列直接執行。需改以eval方式執行。

檔案上傳

  • 因檔案介於50~100MB,大檔傳輸git lfs相關指令也可不執行。但如要執行,需先安裝lfs功能,見筆記說明。
$GIT init

#large file storage
$GIT lfs install
$GIT lfs track "*.tar.gz"

$GIT add .
cmd="$GIT commit -m 'create $repo'"
eval $cmd
$GIT push -f https://sinotec2:$TOKEN@github.com/sinotec2/${repo}.git master
  • git commit其後的字串如有變數,會影響其顯示。改以eval方式來執行。

刪除舊有目錄與內容

  • 雖然github並沒有設定上傳總容量限制,但每天約1.1G的份量,久了也會塞爆github的硬碟。
  • 此處設定保留4天的份額,每天將4天前的備份予以刪除。
  • 刪除使用gh repo delete指令,有關gh的安裝、金鑰設定、指令使用等詳見git and github筆記說明
last4d=$(date -d "$today -4day" +%Y%m%d)
repo=cmaq_$last4d
$GH repo delete https://github.com/sinotec2/${repo}.git --yes
cd ..;rm -fr $repo
  • 一次刪除多日的存檔
for id in {0..8};do 
  rundate=$(date -d "$BEGD +${id}day" +%Y%m%d)
  repo=cmaq_$rundate
  $GH repo delete https://github.com/sinotec2/${repo}.git --yes
  echo $rundate;done

檔案下載