轉(zhuǎn)至我的個(gè)人博客:https://blognas.hwb0307.com。歡迎關(guān)注!
前言
在Docker系列 搭建密碼管理應(yīng)用bitwarden中沦泌,我們安裝了一個(gè)實(shí)用的Docker應(yīng)用bitwarden
杈抢。用了一段時(shí)間,你會(huì)發(fā)現(xiàn)它是真的好用呀被冒!但同時(shí)你也有一點(diǎn)擔(dān)心:萬(wàn)一bitwarden的數(shù)據(jù)損壞或者丟失了怎么辦军掂?
隨著你安裝的Docker應(yīng)用越來(lái)越多,這種擔(dān)心會(huì)越來(lái)越明顯昨悼。比如蝗锥,我通過(guò)docker進(jìn)行wordpress個(gè)人博客和chevereto圖床的布署。wordpress個(gè)人博客不多說(shuō)率触,就是你現(xiàn)在訪問(wèn)的網(wǎng)站终议。chevereto圖床是我用typora寫markdown時(shí)綁定的圖床,天天在用葱蝗,經(jīng)常要Ctrl+v
粘貼圖片的嘛穴张!本博客的圖片也是托管于我個(gè)人的chevereto圖床:https://chevereto.hwb0307.com/。萬(wàn)一數(shù)據(jù)丟失了怎么辦两曼?比如VPS機(jī)房著火了皂甘、不小rm了、不小心你重置自己的系統(tǒng)了悼凑,甚至是被黑客入侵搞破壞導(dǎo)致數(shù)據(jù)丟失了偿枕。怎么辦呢?
當(dāng)然户辫,你可以寫個(gè)shell腳本進(jìn)行簡(jiǎn)單的備份渐夸。不過(guò)我認(rèn)為,我今天要說(shuō)的duplicati
才是解決這個(gè)問(wèn)題的終極方案渔欢。它的docker鏡像是linuxserver/duplicati
墓塌,由linuxserver
團(tuán)隊(duì)進(jìn)行維護(hù)。用的人還蠻多的奥额,最近還有更新:
這是Github repo的地址苫幢,好像沒(méi)什么人用過(guò):https://github.com/linuxserver/docker-duplicati。是不是大家有更好的選擇呀披坏?求推薦一波态坦!
就我個(gè)人來(lái)說(shuō),duplicati
已經(jīng)足夠好用了棒拂。它可以在本地備份伞梯,也可以通過(guò)WebDAV
協(xié)議備份至阿里云、堅(jiān)果云帚屉、nextcloud等云盤中谜诫。由于個(gè)人的VPS容量是有限的,我就沒(méi)有備份到本地攻旦,只備份到了阿里云盤喻旷。
此外,如果有人不知道WebDAV
是什么的話牢屋,建議還是Google百度一下喔且预!這里我粘貼一段wiki的機(jī)翻:
WebDAV(Web 分布式創(chuàng)作和版本控制)是超文本傳輸協(xié)議(HTTP)的一組擴(kuò)展槽袄,它允許用戶代理通過(guò)提供并發(fā)控制和命名空間操作的設(shè)施,直接在HTTP Web 服務(wù)器中協(xié)作創(chuàng)作內(nèi)容锋谐,從而允許Web被視為可寫的遍尺、協(xié)作的媒體,而不僅僅是只讀媒體涮拗。[1] WebDAV由Internet 工程任務(wù)組(IETF)的一個(gè)工作組在RFC 4918中定義乾戏。 [2]
WebDAV 協(xié)議為用戶在服務(wù)器上創(chuàng)建、更改和移動(dòng)文檔提供了一個(gè)框架三热。最重要的功能包括維護(hù)有關(guān)作者或修改日期的屬性鼓择、命名空間管理、集合和覆蓋保護(hù)就漾。屬性維護(hù)包括文件信息的創(chuàng)建呐能、刪除和查詢等。命名空間管理處理在服務(wù)器命名空間內(nèi)復(fù)制和移動(dòng)網(wǎng)頁(yè)的能力从藤。集合處理各種資源的創(chuàng)建催跪、刪除和列表。最后夷野,覆蓋保護(hù)處理與文件鎖定相關(guān)的方面。它利用了現(xiàn)有技術(shù)荣倾,例如傳輸層安全悯搔、摘要訪問(wèn)身份驗(yàn)證或XML來(lái)滿足這些要求。[3]
許多現(xiàn)代操作系統(tǒng)為 WebDAV提供內(nèi)置客戶端支持舌仍。
我個(gè)人理解妒貌,WebDAV
就是一種被廣泛使用的、基礎(chǔ)的網(wǎng)絡(luò)存儲(chǔ)協(xié)議铸豁。在本文中灌曙,我們會(huì)展示在阿里云盤中展示WebDAV
協(xié)議的使用方案。其它網(wǎng)盤應(yīng)該也類似节芥,我就沒(méi)有試過(guò)了在刺。
如果你沒(méi)有注冊(cè)過(guò)阿里云盤的話,可以手機(jī)或者電腦點(diǎn)我的邀請(qǐng)鏈接注冊(cè):https://pages.aliyundrive.com/mobile-page/web/beinvited.html?code=2061fe1头镊。目前它還在公測(cè)階段蚣驼,我還是比較看好這個(gè)網(wǎng)盤的。這算是夾帶私貨相艇。哈哈颖杏!
可能有小伙伴說(shuō):阿里云盤可能也不安全呀!不用擔(dān)心坛芽,duplicati
備份數(shù)據(jù)可以經(jīng)過(guò)內(nèi)置AES-256算法加密留储,只有知道密碼的人才可以執(zhí)行恢復(fù)數(shù)據(jù)的操作翼抠。這樣一看,也沒(méi)啥問(wèn)題获讳,對(duì)吧阴颖!
duplicati
還有另外一個(gè)我覺(jué)得不錯(cuò)的特性,即增量備份
赔嚎。每一次只備份和上一次備份的差異量膘盖,這對(duì)于節(jié)省VPS流量十分有利呢!我和玩NAS的小伙伴們交流尤误,他們說(shuō)TrueNAS
系統(tǒng)都會(huì)內(nèi)置類似duplicati的應(yīng)用侠畔。所以真的很帥呢!
duplicati
支持很多云傳輸?shù)臉?biāo)準(zhǔn)協(xié)議或者專有服務(wù)损晤。如果你想備份到nas或者其它vps软棺,應(yīng)該可以試試SFTP。當(dāng)然也可以像本文的示范尤勋,用WebDAV
協(xié)議喘落。
我大概的思路是,先基于docker搭配一個(gè)阿里云的Webdav
服務(wù)最冰;然后再搭建Docker版duplicati
瘦棋。
話不多說(shuō),下面我們來(lái)安裝吧暖哨!
測(cè)試環(huán)境
uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
docker --version # Docker version 20.10.5, build 55c4c88
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
安裝aliyundrive-webdav
有自己Webdav服務(wù)或其它專有云盤的可以不用安裝這個(gè)赌朋。
準(zhǔn)備工作
對(duì)于阿里云盤來(lái)說(shuō),你要先獲取一個(gè)REFRESH_TOKEN
篇裁。你可以參考官網(wǎng)提供的方法:
你要記得保管好REFRESH_TOKEN
沛慢。因?yàn)橛辛怂涂梢灾苯釉L問(wèn)你的阿里云盤呢达布!
經(jīng)典的目錄管理:
# 工作目錄請(qǐng)按需修改
work=~/docker/aliyun_webdav && mkdir -p $work && cd $work
# 提前拉取鏡像
docker pull messense/aliyundrive-webdav
# 打開(kāi)防火墻
sudo ufw allow 7569/tcp comment 'apliyun-webdav' && sudo ufw reload
配置yml文件
新建一個(gè)docker-compose.yml
文件:
vim docker-compose.yml
添加以下內(nèi)容团甲。你可以用bitwarden
的生成器來(lái)生成強(qiáng)密碼喔:
version: "3.1"
services:
app:
image: messense/aliyundrive-webdav
environment:
- REFRESH_TOKEN=<你的阿里云的Fresh token> # 按需修改
- WEBDAV_AUTH_USER=test_user # 按需修改
- WEBDAV_AUTH_PASSWORD=test_user_password # 按需修改
volumes:
- ./app:/etc/aliyundrive-webdav
ports:
- 7569:8080 # 按需修改
restart: unless-stopped
networks:
- default
networks:
default:
name: aliyun
上線服務(wù):
docker-compose up -d
NPM設(shè)置https和反代
添加域名:example.com
。類似于:
訪問(wèn):https://example.com
黍聂。會(huì)彈出一個(gè)登陸小窗口
輸入剛剛的帳戶和密碼(這里當(dāng)然是填你自己的帳戶和密碼了):
用戶名:test_user
密碼:test_user_password
就可以登陸進(jìn)去了躺苦。界面類似于(我已經(jīng)有一些文件在里面。你可以在阿里云自己創(chuàng)建新的目錄):
如果你在安裝docker鏡像后才新建文件夾分冈,記得重啟aliyun-webdav的docker容器:
docker-compose restart
如果中途有換域名的操作圾另,可以:
docker-compose down && docker-compose up -d
OK,到這里的話雕沉,阿里云Webdave就準(zhǔn)備好了!
安裝duplicati
準(zhǔn)備工作
# 工具目錄
work=~/docker/duplicati && mkdir -p $work && cd $work
# 提前拉取鏡像
docker pull lscr.io/linuxserver/duplicati:latest
# 打開(kāi)防火墻
sudo ufw allow 8200/tcp comment 'duplicati' && sudo ufw reload
配置yml文件
打開(kāi)Vim
編輯器:
vim $work/docker-compose.yml
將以下內(nèi)容添加到docker-compose.yml
文件中:
version: "2.1"
services:
app:
image: lscr.io/linuxserver/duplicati:latest
restart: unless-stopped
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- ./config:/config
- ./backups:/backups
- /:/source # 這里你完全可以選一個(gè)高一點(diǎn)一目錄集乔。我這里選擇的是根目錄
ports:
- 8200:8200 # 這里可以替換自己喜歡的端口號(hào)。 一般不使用默認(rèn)的。
networks:
- default
networks:
default:
name: duplicati
按:wq
保存并退出扰路。
上線服務(wù):
docker-compose up -d # 我在騰訊云上下載尤溜,非常慢,不知道為什么~換了鏡像源也沒(méi)用
# docker-compose pull # 更新服務(wù)
我們可以觀察一下duplicati
的工作日志:
docker logs -f duplicati_app_1
當(dāng)看到這些字樣:
[services.d] starting services
[services.d] done.
說(shuō)明duplicati
已經(jīng)成功啟動(dòng)汗唱。
NPM設(shè)置https和反代
添加域名domain.com
宫莱。NPM中添加反代。類似于:
第一次登陸duplicati
的后臺(tái)時(shí)哩罪,會(huì)有一個(gè)密碼設(shè)置授霸。我推薦按一下yes,然后用bitwarden設(shè)置一個(gè)強(qiáng)密碼际插。
下次登陸就需要額外的密碼了碘耳。
嘗試使用duplicati
準(zhǔn)備工作
我們不要馬上使用duplicati
。建議創(chuàng)建一些文件夾來(lái)練練手框弛,等整個(gè)流程跑通了辛辨,再來(lái)備份正式的文件!
比如瑟枫,我先在阿里云創(chuàng)建一個(gè)test_user_duplicati
的文件夾專門保存duplicati
的備份文件斗搞。
回到shell,我們創(chuàng)建一些測(cè)試目錄和文件
# 回home目錄
mkdir -p ~/test && cd ~/test
# 創(chuàng)建一個(gè)文本
touch test.txt && echo '我愛(ài)你慷妙!'> test.txt
OK僻焚,搞定!
備份目錄
添加新備份:
我們填入一個(gè)密碼膝擂,比如用bitwarden生成一個(gè)強(qiáng)密碼:QHdH#WZD^J$@QS8*v9S6bQgXF6
溅呢。下一步。
可以按下面的填法猿挚。一般172.17.0.1
是docker0
的局域網(wǎng)ip地址。由于duplicati
和aliyundrive-webdave
裝在同一個(gè)docker中驶鹉,因此可以通過(guò)172.17.0.1:端口號(hào)
來(lái)互相訪問(wèn)绩蜻。NPM的地址設(shè)置172.17.0.1
也是同樣的道理。其它類型的ip設(shè)置我就不細(xì)說(shuō)了室埋,不懂的請(qǐng)?jiān)u論留言办绝。用戶名和密碼就是剛剛安裝阿里云的密碼。建議點(diǎn)一下測(cè)試連接
姚淆,當(dāng)提示連接正常
時(shí)再進(jìn)行下一步孕蝉。
這里多說(shuō)一句。如果你用SFPT(SSH)
的方式來(lái)備份數(shù)據(jù)的話腌逢,通常還會(huì)有請(qǐng)?zhí)砑?--ssh-fingerprint="ssh-ed25519 32 XXXX" 來(lái)信任此主機(jī)降淮。視情況,你也可以使用 --ssh-accept-any-fingerprints (不安全) 進(jìn)行測(cè)試搏讶!
的報(bào)錯(cuò)佳鳖。這個(gè)時(shí)候要在高級(jí)選項(xiàng)里添加--ssh-fingerprint="ssh-ed25519 32 XXXX
值以信任對(duì)方的主機(jī)霍殴。當(dāng)然,在這里的示范是不需要的系吩。
添加源數(shù)據(jù)来庭。在本次示范中,是這樣的:
一般是在sourse里面找穿挨。我在docker-compose中月弛,掛載了根目錄/
。下一步科盛。
計(jì)劃就隨便你了帽衙,自己選吧。選完下一步土涝。
最后是備份的其它設(shè)置佛寿。我覺(jué)得它的智能模式不錯(cuò)。你也可以選其它的但壮。點(diǎn)擊“保存”冀泻。
最后,首頁(yè)會(huì)出現(xiàn)一個(gè)新的備份項(xiàng)目:
我們按下立即運(yùn)行
蜡饵,試試看能不能成功弹渔。因?yàn)槲覀兊奈募苄。芸炀统晒α耍?/p>
我們可以去阿里云看看它的備份文件:
看吧溯祸,并不是原來(lái)的樣子啦肢专!我們?cè)瓉?lái)是test.txt
。所以就算阿里云不安全焦辅,也沒(méi)有太多關(guān)系博杖!
備份增量
下面,我們對(duì)文件進(jìn)行一些改動(dòng)筷登,然后創(chuàng)建一些新文件剃根。
# 目錄
cd ~/test
# 改動(dòng)文件
echo '你知道嗎?' >> test.txt
touch test2.txt && echo '你好呀G胺健狈醉!' > test2.txt
# 觀察文件
ls -hl
文件已經(jīng)發(fā)生了較大的改動(dòng):
total 8.0K
-rw-r--r-- 1 test_user test 16 Apr 22 14:07 test2.txt
-rw-r--r-- 1 test_user test 29 Apr 22 14:07 test.txt
下面,我們?cè)賯浞菀幌禄菹铡:芸炀统晒α耍?/p>
這時(shí)苗傅,我們?nèi)グ⒗镌瓶悼担?/p>
已經(jīng)發(fā)生了備份了!現(xiàn)在我們將本地的內(nèi)容全部刪除:
cd ~/test && rm -r *
然后嘗試恢復(fù)文件班巩。
恢復(fù)文件
嘗試從項(xiàng)目中恢復(fù)渣慕。下一步。
看下面!它可以恢復(fù)你保留的任何版本摇庙。我們已經(jīng)產(chǎn)生了2個(gè)版本:
我們選擇其中那個(gè)最新的吧旱物!選中文件夾,然后點(diǎn)繼續(xù)
卫袒。
下面它會(huì)詢問(wèn)恢復(fù)的位置宵呛。你可以自己選一個(gè)位置。我們這里可以用原位置夕凝,恢復(fù)讀寫權(quán)限宝穗,并覆蓋。這些用法都看實(shí)際情況了:
最后码秉,按恢復(fù)文件
逮矛。成功了!它還打了個(gè)小廣告转砖,不用理踩须鼎。
我們?cè)趕hell里檢查一下:
cd ~/test && ls -hl
看到文件已經(jīng)回來(lái)了。
total 8.0K
-rw-r--r-- 1 test_user test 16 Apr 22 14:07 test2.txt
-rw-r--r-- 1 test_user test 29 Apr 22 14:07 test.txt
看看內(nèi)容的改變情況:
cat test.txt && cat test2.txt
輸出為:
我愛(ài)你府蔗! 你知道嗎晋控? 你好呀!姓赤!
內(nèi)容也沒(méi)有什么改變呀赡译!當(dāng)然,更嚴(yán)謹(jǐn)?shù)淖龇☉?yīng)該是比較恢復(fù)前后文件的md5sum或者是sha-265之類的不铆。不過(guò)我懶得搞了蝌焚。
有沒(méi)有一種自己的文件瞬間很安全的感覺(jué)?你可以試試備份自己的bitwarden
文件夾誓斥、甚至是duplicati
的文件夾喔只洒!操作一下!
某些bug
我的VPS數(shù)據(jù)是備份至我自己的NAS里劳坑,通過(guò)SSL(SFTP)的方式红碑,一直很正常。
不過(guò)泡垃,我的NAS的數(shù)據(jù)是備份至阿里云的,某些數(shù)據(jù)會(huì)出現(xiàn)The remote server returned an error: (500) Internal Server Error
的數(shù)據(jù):
System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
at System.Net.HttpWebRequest.GetResponseFromData (System.Net.WebResponseStream stream, System.Threading.CancellationToken cancellationToken) [0x00146] in <91935ad653254a93b9d73a9f8f2f7a2d>:0
at System.Net.HttpWebRequest.RunWithTimeoutWorker[T] (System.Threading.Tasks.Task`1[TResult] workerTask, System.Int32 timeout, System.Action abort, System.Func`1[TResult] aborted, System.Threading.CancellationTokenSource cts) [0x000f8] in <91935ad653254a93b9d73a9f8f2f7a2d>:0
at Duplicati.Library.Utility.AsyncHttpRequest+AsyncWrapper.GetResponseOrStream () [0x0004d] in <2a3ee711c7c04f6c957360f2cf183a7f>:0
at Duplicati.Library.Utility.AsyncHttpRequest.GetResponse () [0x00044] in <2a3ee711c7c04f6c957360f2cf183a7f>:0
at Duplicati.Library.Backend.WEBDAV.Delete (System.String remotename) [0x0008d] in <5df020eccaa84287a3c79d1a4bf95fc9>:0
at Duplicati.Library.Main.BackendManager.DoDelete (Duplicati.Library.Main.BackendManager+FileEntryItem item) [0x0001c] in <e60bc008dd1b454d861cfacbdd3760b9>:0
并且遠(yuǎn)程連接經(jīng)測(cè)試都是正常的羡鸥。
更奇怪的是蔑穴,并不是所有的記錄都會(huì)出錯(cuò),有一些記錄就是正常運(yùn)作惧浴。而且這些記錄并不是一開(kāi)始就出錯(cuò)存和,而是運(yùn)行了幾次才忽然出錯(cuò)。我感覺(jué)可能是阿里云是否對(duì)這種傳輸進(jìn)行了限制?
目前暫無(wú)頭緒捐腿。持續(xù)觀察中纵朋!
小結(jié)
有了duplicati
,加上阿里云茄袖,基本上可以認(rèn)為是安全無(wú)憂了操软。這里說(shuō)一下,凡是有Webdav的云都支持喔宪祥,比如Nextcloud
聂薪。它上面還支持好多種其它服務(wù),看你自己選了蝗羊。
其實(shí)呢藏澳,duplicati
只是說(shuō)多安一份心而已,一般情況是不會(huì)走到恢復(fù)數(shù)據(jù)這一步啦耀找!如果你遷移docker翔悠,直接scp
到新的VPS就行了,不用專門備份野芒,然后在新的VPS中恢復(fù)蓄愁。
另外,如果我掛載一個(gè)遠(yuǎn)程的aliyun-webdav(基于https)复罐,好像是不能成功的涝登,暫時(shí)也不知道是什么原因。估計(jì)是哪里填寫得不對(duì)效诅。
基本上就是這樣胀滚。有了bitwarden
和duplicati
這兩個(gè)基礎(chǔ)的應(yīng)用,媽媽再也不用擔(dān)心我玩VPS的安全性不夠了乱投!
不過(guò)咽笼,我覺(jué)得如果duplicati
可以有一個(gè)錯(cuò)誤遠(yuǎn)程通知的功能就好了。在一段時(shí)間的使用里戚炫,我發(fā)現(xiàn)duplicati
偶爾不能備份成功剑刑。如果日程備份失敗有郵件或者短信通知的話,應(yīng)該會(huì)更好双肤!
最后施掏,曬一下自己對(duì)duplicati
的日常使用:
以后還會(huì)慢慢分享其它好用的Docker應(yīng)用噢!敬請(qǐng)期待吧茅糜!
本文使用 文章同步助手 同步