在校內(nèi)搭建的 Git 倉(cāng)庫(kù),有時(shí)候需要在校外訪問操作创葡。因?yàn)槭褂玫氖?Gogs 搭建浙踢,所以只需要同步 data 文件夾即可,網(wǎng)上關(guān)于雙向同步的方案有很多灿渴,但是都很麻煩洛波,而且經(jīng)常會(huì)“打架”,文件沖突骚露。
所以本文使用一些比較奇葩的辦法解決這個(gè)問題蹬挤,那就是使用 webdav 傳輸,因?yàn)槲译娔X本地裝有 Nextcloud 的客戶端棘幸,服務(wù)器裝有 Nextcloud 的服務(wù)端焰扳,而服務(wù)端自帶 Webdav 接口,所以我只需要把 Gogs 容器的數(shù)據(jù)卷掛載到本地 Nextcloud 同步文件夾中误续,Nextcloud就會(huì)上傳到服務(wù)器吨悍。
而服務(wù)器使用 davfs 掛載一個(gè) webdav 文件夾用于掛載服務(wù)器上的 Gogs 容器數(shù)據(jù)卷,這樣兩個(gè)跨主機(jī) Gogs 容器就共享一個(gè)數(shù)據(jù)卷了女嘲。
這種辦法的好處就是把文件沖突交給 Nextcloud 處理畜份,這種私人云存儲(chǔ)在處理文件沖突時(shí)還是很有一套的,最重要的是不會(huì)陷入“掐架”或者“死循環(huán)”中欣尼。
關(guān)于 Docker 數(shù)據(jù)卷跨主機(jī)共享其實(shí)有專門的插件可以實(shí)現(xiàn),例如:Flocker停蕉,但是本文不想折騰得太復(fù)雜愕鼓,盡量用現(xiàn)成的服務(wù)實(shí)現(xiàn),所以選擇 Webdav 雙向同步傳輸慧起。
- 本地:一個(gè) Nextcloud 客戶端菇晃,一個(gè) Gogs 容器,數(shù)據(jù)卷掛載到 Nextcloud 客戶端的同步文件夾中蚓挤。
- 服務(wù)器:一個(gè) Nextcloud 容器磺送,一個(gè) Gogs 容器驻子,Gogs 數(shù)據(jù)卷使用 davfs2 通過 webdav 服務(wù)連接到 Nextcloud。
之所以不使用直接掛載 Nextcloud 容器的數(shù)據(jù)卷是因?yàn)?Nextcloud 上傳文件時(shí)需要在 Mysql 中記錄歷史記錄估灿,直接掛載 Gogs 數(shù)據(jù)卷到 Nextcloud 數(shù)據(jù)卷中會(huì)破壞 Nextcloud 的結(jié)構(gòu)崇呵,不能形成雙向同步。
安裝 davfs2
sudo apt install davfs2
配置 davfs2
注意馅袁,下面操作是完全在 root 用戶下進(jìn)行的域慷,如果你不是 root 用戶,需要把當(dāng)前用戶加入到 davfs2 的用戶組汗销。例如:sudo usermod -aG davfs2 你的用戶名
接下來配置 davfs2:
mkdir ~/.davfs2/
cp /etc/davfs2/secrets ~/.davfs2/secrets
chmod 0600 ~/.davfs2/secrets
修改 ~/.davfs2/secrets 文件:
vim ~/.davfs2/secrets
在最后一行添加 webdav 地址和賬號(hào)密碼:
https://cloud.example.com/remote.php/webdav/ username password
掛載 webdav 文件夾
上面配置了 davfs2 之后犹褒,我們還要修改 /etc/fstab 這個(gè)文件。
https://cloud.example.com/remote.php/webdav/ /your/local/path davfs user,noauto,uid=username,file_mode=600,dir_mode=700 0 1
在該文件最后一行添加上面的一句弛针,注意修改網(wǎng)址以及掛載 webdav 的路徑叠骑。
注意要先創(chuàng)建 /your/local/path 這個(gè)路徑,確保文件夾存在削茁。
啟動(dòng) Gogs 容器
本地和服務(wù)器啟動(dòng)一個(gè) Gogs宙枷,使用同一份 Compose 即可。
version: '2'
services:
gogs:
container_name: gogs
image: gogs/gogs
volumes:
- ./:/data
ports:
- "3000:3000"
- "3022:22"
restart: always
networks:
default:
external:
name: nginx
接下來兩個(gè)容器會(huì)通過 webdav 實(shí)現(xiàn)數(shù)據(jù)共享付材。
需要提醒的是 Nextcloud 的客戶端并非是“實(shí)時(shí)同步”(大概延遲 30 秒)朦拖,如果你很在乎“即時(shí)同步”,可以在本地也安裝 davfs2厌衔,然后本地掛載 webdav 文件夾璧帝,但是不建議在有認(rèn)證的網(wǎng)絡(luò)中使用這個(gè)辦法,這會(huì)導(dǎo)致你開不了機(jī)富寿,因?yàn)殚_機(jī)時(shí)會(huì)卡在 /etc/fstab 那里睬隶,畢竟無法聯(lián)網(wǎng),也就無法掛載页徐。
最后說一下這種辦法的一個(gè)很大的弊端苏潜,就是 umount 操作時(shí)要等一段時(shí)間:
waiting while mount.davfs (pid 31325) synchronizes the cache
如果經(jīng)常有 umount 操作就不要使用這種辦法了”溆拢總而言之給我感覺并不是很好恤左,期待路過的大神給個(gè)方案,不要 rsync 之類的工具搀绣,根本不能解決沖突飞袋。