樹莓網誌伺服器 3. 實做備份 @ FreelimbO | Saturday, Aug 7, 2021 | 8 minutes read | Update at Saturday, Aug 7, 2021

軟體: samba, deja-dup, git, GitHub, and systemd service.

3. 定期備份

b. Deja-Dup差異備份到NAS

假設你跟我一樣也有顆陳年老 NAS,那麼一起把他掛載到樹莓派伺服器上當作備份媒介吧。如果你沒有NAS,那再接一顆磁盤硬碟,跳過掛載NAS的步驟也可以。接續上一篇我們已經使用$ ssh -Y <new username>@<the designated LAN ip>登入樹莓派。

$ cd /media; sudo mkdir NAS
$ cd ~; vi mountNAS.sh

第一行進入/media資料夾並且創建一個資料夾NAS,第三行回到家目錄並且建立掛載NAS資料夾的指令寫成一個bash script,這樣就不用記憶繁瑣的參數語法。接著把下面兩行寫進去

#!/bin/bash
sudo mount -t cifs //<the NAS' ip>/<share folder name> /media/NAS -o vers=1.0 -o user=<username on NAS> -o password=<pwd on NAS>;

第一行指明使用bash執行這個script,第二行就是掛載CIFS 1.0硬碟的指令,如果你的NAS沒這麼老,可能可以略過-o vers=1.0

$ sudo chmod +x mountNAS.sh
$ ./mountNAS.sh

儲存離開以後變更這個script為可執行。第二行就執行這個script把NAS上的<share folder name>掛載到/media/NAS,我們可以使用$ ls /media/NAS來檢查掛載有沒有成功(空資料夾裡有沒有出現NAS上的檔案)。

我們將使用deja-dup備份,而一個Linux系統上只能有一個deja-dup task,所以目標資料夾,我就改為整個家目錄,而不是只有HUGO網站目錄。另外deja-dup還有個特性,就是硬碟空間耗盡才會開始覆蓋舊的備份,但這個軟體本身偏偏 沒辦法自己限制使用硬碟的額度 ,所以我們需要在NAS上創建一個固定大小的檔案,將齊轉換為ext4硬碟,然後將這個區塊掛載到樹莓派上。

$ cd /media/NAS/; sudo mkdir Backup
$ cd Backup; touch Area200GB
$ truncate -s 200G Area200GB
$ mke2fs -t ext4 -F Area200GB

第一行進入NAS創見一個儲存備份的資料夾名為Backup,第二行進入Backup並且產生一個名為Area200GB的空檔案,第三行限制這個檔案的最大硬碟空間為200GB,第四行將這個空檔案內部轉為ext4檔案系統。如此一來我們就能掛載這個假的硬碟並且用他的有限容量給deja-dup進行備份。

$ cd ../..; sudo mkdir DejaDup200GB
$ sudo chown <new user name> DejaDup200GB
$ cd ~; vi mountNAS.sh

第一行退回/media並且創建deja-dup專屬的備份檔案資料夾(我們會掛載200GB的假硬碟到這個資料夾),第二行變更DejaDup200GB所有者為之前改好的新帳號,第三行回到家目錄並且編輯mountNAS.shscript。把以下兩行加到檔案末尾。

sleep 2
sudo mount /media/NAS/Backup/Area200GB /media/DejaDup200GB

第一行要求系統等待兩秒讓NAS硬碟掛載完成,第二行掛載假的ext4硬碟到/media/DejaDupBkp。儲存後再執行這個script一次。

$ ./mountNAS.sh

現在我們可以使用$ ls /media/DejaDupBkp來檢查裡面是否多出一個lost+found空資料夾,這是mke2fs創建的,存在的話就表示目前為止的步驟都正確執行了。

差點忘了本站的中心思想,要讓未來免維護就必須創建一個systemd service來代替我們在每次開機後都自動掛載NAS與這顆200GB假硬碟呀。

$ sudo /etc/systemd/system/mount_nas.service

把以下幾行修改必要的路徑之後貼進這個service裡頭

[Unit]
Description=Mount NAS service

[Service]
Type=forking
ExecStart=/home/<new username>/mountNAS.sh

[Install]
WantedBy=default.target

這裡使用的service type為forking即使上游service停止了,這個service也能執行。接著我們執行一次這個service。

$ sudo umount /media/DejaDup200GB
$ sudo umount /media/NAS
$ sudo systemctl start mount_nas
$ sudo systemctl enable mount_nas

前兩行卸載兩顆硬碟,第三行執行一次這個service,第四行允許每次開機都讓樹莓派執行這個service。我們可以用$ ls /media/DejaDup200GB來確認是否有檔案或資料夾出現在這個目錄裡。重啟樹莓派之後如果這兩顆硬碟都掛載成功,那這個service就是正常運作中。

接著我們使用deja-dup設定備份。

$ deja-dup&

你的Pi OS可能沒有預載deja-dup,那就先用指令安裝一下$ sudo apt install deja-dup,然後在執行它,命令末尾加上&符號使該命令以背景執行,讓我們可以繼續使用命令行。等待幾秒後正在操作的電腦應該就會把deja-dup的X11圖形界面傳到正在使用的這台電腦上。

deja-dup_0 deja-dup_1
deja-dup overview deja-dup folder to save
deja-dup_2 deja-dup_3
deja-dup folders to ignore deja-dup storage location
deja-dup_4
deja-dup scheduling

Deja-dup五個分頁,從第二個開始設定到最後,然後回到第一頁點擊"Back Up Now…",他會問你是否在將來回復的時候需要輸入密碼,看個人喜好。至於回復的部份,點擊"Restore…“就可以進去選時間點,操作起來相當直覺。這樣我們就完成了第二份克隆啦。

c. GitHub版本控制與備份

第三份克隆,我們使用GitHub,這樣同時也能作為版本控制工具。首先要註冊一個GitHub帳號,基本上就填寫資料,需要使用一個email address註冊,這個email將用於登入GitHub作為帳號。Email認證完成之後,基於未來可以一勞永逸的原則,我們需要在樹莓派上產生一個關聯於這個email address的SSH金鑰(由特定演算法產出,英數混合一大串文字)。```

$ ssh-keygen -t ed25519 -C <email address>
$ sudo apt install xclip
$ xclip -selection clipboard < ~/.ssh/id_ed25519.pub

第一行指定ed25519演算法產生金鑰到預設資料夾,系統應該會問一些問題,但是都使用預設選項不用打字直接按enter略過即可。第二行安裝了命令行剪貼工具,第三行剪下金鑰傳回本機電腦的剪貼簿。接著我們回到瀏覽器登入GitHub,從右上角點擊自己的帳號圖示,選擇"Settings”,左邊選擇SSH and GPG Keys,把xclip複製來的文字串右鍵貼入文字框中,點擊下方"Add SSH Key"。

Add ssh key
Add SSH Key to GitHub

接著點擊左上角自己的帳號名,然後點擊上方"Repositoies",再點擊右邊的綠色"New"按鈕創建一個新的GitHub案子,這裡需要填寫Repository name,我把我的部落格名稱填進去(也就是上一篇的<your site name>),選擇Private,然後就可以點擊綠色按鈕"Create repository"。

Create repository
GitHub create repository

回到命令行,我們現在可以初始化網站目錄成為一個git版本控制資料夾。

$ cd <HUGO project>/<your site name>
$ git config --global user.email <email address>
$ git init
$ git add .
$ git brance -m main
$ git commit -m "First commit."

第一行進入網站資料夾,第二行設定git在樹莓派上的email帳號,第三行初始化網站目錄成為git控制的資料夾,第四行加入資料夾中所有檔案與資料夾受到git追蹤,第五行為當前的branch改名為main (git預設主要branch名為master,但是GitHub預設主branch名為main),然後第六行進行第一次commit(存檔進去git紀錄的歷史中)。

接著我們回到瀏覽器,進到剛創建的repository裡,點擊中間偏右的綠色按鈕Code,再選擇SSH,複製框框中git@開頭git結尾的一串網址。

SSH git
Copy SSH git

再次回到命令行,輸入

$ git remote add origin <SSH git address>
$ git push -u origin main
$ vi commitToGitHub.sh

其中<SSH git address>就是剛剛從網頁上複製的那串網址。第二行進行第一次push,把網站資料夾推送到GitHub並且設定了往後都推送往同一個main branch。然後我們再寫一個script為自動化備份做準備,把以下六行填入script。

#!/bin/bash
date_time=$(date)
echo $date_time
git add .;
git commit -am "Scheduled commit: $date_time";
git push

第一行BJ4,第二行取得樹莓派系統時間,第三行列印出系統時間,第四行添加所有資料夾中的檔案受git追蹤,第五行commit並且以系同時間作為註釋,第七行push (備份上GitHub)。儲存後離開編輯器。

$ sudo chmod +x commitToGitHub.sh
$ ./commitToGitHub.sh

第一行允許執行這個script,第二行執行這個備份到GitHub的script,理論上不會有錯誤訊息,我們採用SSH金鑰連線上傳到GitHub也是為了避免輸入帳號密碼。現在可以使用$ git status確認是否已經與GitHub端的資料同步,如果出現"Your branch is up to date with ‘origin/main’",就表示成功了。

再來我們使用Linux的systemd來自動化每天的GitHub備份。

$ sudo vi /etc/systemd/system/commit_to_github.service

把以下幾行貼入編輯器

[Unit]
Description=Commit site folder to GitHub service
Wants=commit_to_github.timer

[Service]
Type=oneshot
User=<new username>
WorkingDirectory=/home/<new username>/<HUGO project>/<the site name>
ExecStart=/home/<new username>/<HUGO project>/<the site name>/commitToGitHub.sh

[Install]
WantedBy=default.target

光有service還不夠,需要另外建立一個timer

$ sudo vi /etc/systemd/system/commit_to_github.timer

再把以下幾行貼入

[Unit]
Discription=Backups site folder to GitHub everyday
Requires=commit_to_github.service

[Timer]
Unit=commit_to_github.service
OnCalendar=*-*-* 00:00:00

[Install]
WantedBy=timers.targert

注意這兩個檔案的檔名必須被包含在對方的設定裡,如此timer才能在OnCalendar指定的時間執行service。接著輸入

$ sudo systemctl daemon-reload
$ sudo systemctl start commit2github.service
$ sudo systemctl enable commit2github.service

第一行重載systemd,第二行執行一次service,理論上應該能備份成功,第三行使得開機之後service能夠維持成主動狀態。我們可以使用$ sudo systemctl status commit_to_github.service檢查第一次執行的輸出結果,並且用$ sudo systemctl status commit_to_github.timer檢查是否狀態正處於waiting。如果隔天的service狀態檢查是"Success"並且GitHub頁面可以看到有新的commit紀錄,那麼GitHub定期備份設定成功。備份321原則達成!

下期我們繼續要使用no-ip將網站掛上外網, 再使用commento替每篇網誌增加留言區。

© 2016 - 2025 努力不一定會成功,但是不努力就會很輕鬆

Powered by Hugo with theme Dream.

 總瀏覽
關於 FreelimbO

FreelimbO是個奉行一時開箱一時爽,一直開箱一直爽的3C愛好者,同時也是喜歡折騰自己的自虐者,明知有簡單的方法可以花錢了事,但卻偏偏喜歡走土法炮製路線。

這個網誌開始是作者想要在樹莓派上架站寫網誌紀錄在樹莓派上架站寫網誌,但是之後也會持續分享開箱心得、讀書心得、人工智能相關論文閱讀心得、遊戲心得、還有最慘無人道的各種踩坑排雷心得。敬請加入你的書籤,持續關注最新文章,謝謝。

Social Links
The copyright of the content in this site is protected by DMCA. 本站著作權受美國千禧年法案保護。