在群暉的 Docker 環(huán)境中運(yùn)行甜糖星愿服務(wù)
前段時(shí)間在網(wǎng)上看到了一個(gè)叫 “甜糖星愿計(jì)劃” 的東西,聲稱可以通過(guò)貢獻(xiàn)閑置帶寬來(lái)獲得積分。正好我有個(gè) NAS,正好我的寬帶一天從白天閑到黑夜,不如利用起來(lái),少少掙一些零花錢。

2021/12/26 更新:
甜糖星愿官方推出了x86平臺(tái)的可執(zhí)行文件,所以不再需要配置QEMU模擬環(huán)境了。
請(qǐng)直接移步我的鏡像的GitHub倉(cāng)庫(kù):https://github.com/boris1993/tiantang-x86-docker,然后參考README啟動(dòng)即可。

需要注意的一點(diǎn)是,本文提到的鏡像僅在我的群暉DS218+
?上測(cè)試過(guò),雖然鏡像中未使用任何群暉限定的依賴,理論上適用于任何 x86 架構(gòu)的平臺(tái),但并不保證運(yùn)行效果。而且本文目標(biāo)平臺(tái)是 x86,如果你擁有 ARM 平臺(tái)的機(jī)器,那根本不需要廢這個(gè)勁,你可以直接運(yùn)行甜糖星愿的可執(zhí)行程序。
本文提到的操作全部基于 Docker,故在按照本文操作前,請(qǐng)先確保你已經(jīng)擁有足夠的知識(shí)來(lái)使用?Docker
?和?docker-compose
。
我的網(wǎng)絡(luò)環(huán)境
因?yàn)檫@個(gè)鏡像相關(guān)的一些配置是以我的網(wǎng)絡(luò)結(jié)構(gòu)為基礎(chǔ)的,所以我覺(jué)得有必要簡(jiǎn)單說(shuō)一下我的網(wǎng)絡(luò)結(jié)構(gòu)是什么樣的。
簡(jiǎn)單來(lái)說(shuō),我的網(wǎng)絡(luò)就是這樣子的。雖然網(wǎng)絡(luò)里還有別的設(shè)備,但是因?yàn)榕c本文無(wú)關(guān),我就略掉了。
[公網(wǎng)] -- [光貓] -- [群暉]
其中光貓負(fù)責(zé)撥號(hào),所以它也是最外層的一個(gè)路由器,光貓的 IP 地址是?192.168.1.1
,它下面有一個(gè)?192.168.1.0/24
?的子網(wǎng),群暉與光貓直連,有一個(gè)?192.168.1.0/24
?子網(wǎng)下的 IP 地址。在群暉的 Docker 中,會(huì)有一個(gè)?macvlan
?驅(qū)動(dòng)的網(wǎng)絡(luò),與物理網(wǎng)卡共享同一個(gè)子網(wǎng)。甜糖星愿的容器將會(huì)接入到這個(gè)?macvlan
?網(wǎng)絡(luò),在接入時(shí)我會(huì)手動(dòng)為其分配一個(gè) IP 地址。
安裝 Docker 及配置網(wǎng)絡(luò)
因?yàn)楸疚氖峭ㄟ^(guò) Docker 來(lái)實(shí)現(xiàn)的,所以第一步當(dāng)然是安裝 Docker。群暉嘛就從套件商店安裝,其他平臺(tái)就用自己平臺(tái)的方法安裝,總之裝上 Docker 就行。安裝好 Docker 之后,進(jìn)入控制面板 -- 網(wǎng)絡(luò) -- 網(wǎng)絡(luò)界面
,選擇連接公網(wǎng)的接口,如局域網(wǎng)1
,點(diǎn)擊管理 -- Open vSwitch設(shè)置
,勾選啟用 Open vSwitch
。
然后我們需要在 Docker 里面創(chuàng)建一個(gè)?macvlan
?驅(qū)動(dòng)的網(wǎng)絡(luò),命令如:
sudo docker network create \
? ? -d macvlan \
? ? --subnet=192.168.1.0/24 \
? ? --gateway=192.168.1.1 \
? ? -o parent=ovs_eth0 \
? ? macvlan
上面命令中?subnet
?的值替換成群暉所在網(wǎng)絡(luò)的子網(wǎng),gateway
?指向該子網(wǎng)的網(wǎng)關(guān),parent
?指向要綁定的物理網(wǎng)卡,最后面的?macvlan
?是網(wǎng)絡(luò)名,可以按需修改。
準(zhǔn)備二進(jìn)制翻譯器
接下來(lái),我們要借助 QEMU 的力量,放一個(gè)幻術(shù)。畢竟,甜糖星愿只給了 ARM 平臺(tái)的可執(zhí)行程序,直接在 x86 平臺(tái)跑肯定是跑不起來(lái)的,所以我們要向內(nèi)核注冊(cè)一個(gè)翻譯器,這樣 Docker 在執(zhí)行其他平臺(tái)的機(jī)器碼時(shí)就可以通過(guò)這個(gè)翻譯器將其翻譯成 x86 指令來(lái)執(zhí)行了。是的,我知道這玩意效率不高,我已經(jīng)體驗(yàn)過(guò)了。
首先,克隆這個(gè)鏡像的源碼倉(cāng)庫(kù)?[2],找到?resources/qemu-aarch64-static
,或者你直接從 GitHub 下載 qemu-aarch64-static也行,把這個(gè)文件放到?$PATH
?指定的目錄,賦予執(zhí)行權(quán)限。
然后施法吟唱,很簡(jiǎn)單,就一句話:
sudo docker run --rm --privileged multiarch/qemu-user-static:register
但是,這個(gè)幻術(shù)在群暉重啟之后就會(huì)消失,幻術(shù)沒(méi)了,甜糖星愿就起不來(lái)。所以我們還得配一個(gè)開(kāi)機(jī)后的自啟動(dòng)任務(wù),讓群暉幫我們自動(dòng)吟唱。操作也很簡(jiǎn)單,首先將本倉(cāng)庫(kù)的?set_qemu_user_static.sh
?放到一個(gè)合適的位置,比如我放到了?/var/services/homes/boris1993/scripts,然后
前往控制面板 -- 任務(wù)計(jì)劃
,按照如下說(shuō)明新增一個(gè)任務(wù)計(jì)劃:
任務(wù)名稱:可自選
用戶賬號(hào):root
事件:開(kāi)機(jī)
任務(wù)設(shè)置頁(yè)面的運(yùn)行命令:
/var/services/homes/boris1993/scripts/set_qemu_user_static.sh
如果要看這個(gè)腳本的日志的話,在運(yùn)行命令
里面把腳本輸出重定向到一個(gè)文件就可以了。
運(yùn)行鏡像
進(jìn)入本倉(cāng)庫(kù)所在目錄,或者下載?docker-compose.yml?到一個(gè)合適的目錄下,然后稍微編輯一下,以符合你的網(wǎng)絡(luò)狀況。主要要檢查的就是?networks.macvlan.ipv4_address
?的值,要確保它處在上面創(chuàng)建的那個(gè)?macvlan
?網(wǎng)絡(luò)的子網(wǎng)中。
確認(rèn)無(wú)誤后,執(zhí)行?sudo docker-compose up -d
,Docker 就會(huì)自動(dòng)拉取鏡像,并啟動(dòng)一個(gè)名為?tiantang
?的容器。
容器內(nèi)的甜糖星愿在首次啟動(dòng)時(shí)會(huì)自動(dòng)退出,這是因?yàn)樗谧晕腋拢ㄎ揖筒徽f(shuō)這個(gè)操作一開(kāi)始給了我多大的困擾了)。不要怕,容器里面有一個(gè)每分鐘執(zhí)行一次的定時(shí)任務(wù),在沒(méi)有發(fā)現(xiàn)甜糖星愿的進(jìn)程時(shí)會(huì)自動(dòng)將它啟動(dòng)。
除此之外,我會(huì)在容器啟動(dòng)兩分鐘后,檢測(cè)甜糖星愿監(jiān)聽(tīng)了哪些端口,然后通過(guò)腳本自動(dòng)設(shè)置路由器上的 UPnP 規(guī)則,這樣你就不需要將甜糖星愿容器的 IP 放到 DMZ 里,也不需要手動(dòng)配置端口轉(zhuǎn)發(fā)了。當(dāng)然這個(gè)操作的前提是,你的路由器支持 UPnP,并且你啟用了 UPnP,如果沒(méi)有的話,那你只能手動(dòng)操作了?;蛘?,如果你不想讓腳本自動(dòng)配置 UPnP,或者客觀條件下不允許你這么做,那么你可以把?docker-compose.yml
?中?SKIP_UPNP_AUTOCONFIG
?這一環(huán)境變量置為?true
,這樣腳本就不會(huì)執(zhí)行了。
在甜糖星愿穩(wěn)定運(yùn)行,且端口轉(zhuǎn)發(fā)規(guī)則也配置成功后,就可以通過(guò)手機(jī)客戶端綁定這個(gè)節(jié)點(diǎn)了。但是這里有個(gè)問(wèn)題,就是手機(jī)與甜糖星愿必須處在同一個(gè)子網(wǎng)里才能自動(dòng)發(fā)現(xiàn),如果因?yàn)楦鞣N原因沒(méi)能自動(dòng)發(fā)現(xiàn),那么你可以在?tiantang
?這個(gè)容器中打開(kāi)一個(gè)?bash
?終端,執(zhí)行?ttnode_168 -p /data
,在輸出中會(huì)打印出這個(gè)節(jié)點(diǎn)的 UID,將其復(fù)制到任意二維碼生成工具中生成一個(gè)二維碼,然后用手機(jī)端掃描這個(gè)二維碼,即可完成綁定。
在這之后,就沒(méi)什么我們能做的了。我們就慢慢等著甜糖星愿給你分配任務(wù)吧。我是等了大概有兩三天才開(kāi)始跑流量的。如果在配置好 UPnP 后,手機(jī)端仍提示 “未配置網(wǎng)絡(luò)”,那有可能是在配置 UPnP 的腳本啟動(dòng)時(shí),甜糖星愿尚未打開(kāi)所有端口,導(dǎo)致 UPnP 規(guī)則不完整。你可以前往路由器的 UPnP 頁(yè)面,將頁(yè)面顯示結(jié)果與?netstat -nlp | grep qemu
?命令的輸出做對(duì)比,如果不一致的話,重新手動(dòng)運(yùn)行?set-port-forwarding.sh
?腳本即可。
深入了解
如果你不止?jié)M足于把它跑起來(lái),還想要了解這個(gè)鏡像背后的運(yùn)作方式,那么你可以前往這個(gè)鏡像的 GitHub 倉(cāng)庫(kù)?[3]?閱讀該鏡像相關(guān)的源碼。在源碼中我也寫了注釋,可以方便你理解我的想法。
我的邀請(qǐng)碼
如果我的鏡像幫到了你,或者我的這篇文章幫到了你,那么如果你愿意的話,你可以在手機(jī)客戶端的填寫邀請(qǐng)碼
處,填上我的邀請(qǐng)碼804744
,這樣你可以獲得 15 張加成卡,當(dāng)然我也會(huì)得到一些加成。反正互利互惠,我的加成不會(huì)從你的身上扣掉,何樂(lè)而不為呢?
終于開(kāi)始正常跑流量了
從搭起來(lái)到現(xiàn)在,差不多已經(jīng)有1.5星期,這兩天終于開(kāi)始跑流量了,也算不辜負(fù)我一直掛著機(jī)。不過(guò)要說(shuō)收益么,到現(xiàn)在一共才拿了三顆星,不在意,就當(dāng)掛著玩了。話不多說(shuō),放柱狀圖和設(shè)備詳情頁(yè)。
另外, 請(qǐng)不要在意那60%的CPU占用率,那是因?yàn)槲疫€跑著BOINC,那玩意是CPU消耗大戶。



甜糖星愿官方網(wǎng)站?(http://m.tiantang.mogencloud.com/)
tiantang-x86-docker - Docker Hub(https://hub.docker.com/repository/docker/boris1993/tiantang-x86-docker)
tiantang-x86-docker - GitHub?(https://github.com/boris1993/tiantang-x86-docker)

本文原文發(fā)表于我的個(gè)人博客(https://www.boris1993.com/others/run-tiantang-on-synology-docker.html),根據(jù)CC-BY-SA 4.0協(xié)議共享,允許在協(xié)議許可范圍內(nèi)分享及轉(zhuǎn)載。