搭建軟體倉庫回源代理拾遺
這次機器升級帶來的服務大遷移過程中,我發現之前設定給 Npm 倉庫、Docker 倉庫專用的代理服務失效了。
之前這臺專供倉庫使用的代理服務,是跑在一臺古老的群暉裝置(DS115j)上的,當我探尋問題登入裝置之後,發現了一件事:不光是代理程式程序消失了、守護程序管理軟體也消失了,這大概率是群暉系統自動升級造成的。
考慮服務穩定性和維護成本,我決定把代理服務從群暉中剝離,正巧前一陣收拾屋子,發現還有一臺“MTK7621”的迅雷下載寶,決定廢物利用一下,做一臺穩定性更高的代理服務裝置。
如果你有閒置路由器或者下載寶,也有類似需求,那麼下面的內容,應該可以幫到你。
更換服務載體的考慮
為什麼選擇類路由裝置的下載寶作為服務載體呢,主要是考慮以下幾個角度:
-
穩定的白盒環境:
- 相比較在低端群暉中使用(非 Docker 容器執行),會受到不確定的系統環境變化影響,開源的 OpenWRT 更值得信賴,從配置到應用軟體,全部都敞開在你的面前。
- 路由器檔案系統多數只讀,保障了環境的穩定。
-
相對夠用的資源:
- 效能足夠,發熱量低。
- 下載寶支援通過 USB 進行儲存擴充套件,當然,使用機身自帶的 SD / MMC 卡槽擴充套件的容量也足夠我們使用了。
- 安靜卻不失小巧:
初始化裝置
編譯韌體,網上講的太多了,這裡就不贅述了,教程在 GitHub 和一些個人博主的日誌上都有,如果實在懶得編譯可以使用網上的韌體,尋找你信任的作者的三方韌體也不是不可以。
我這裡會著重寫一些和常規路由器不同的地方。
由於下載寶只有一個 RJ45 介面,所以他只能作為單臂路由或者普通的網路客戶端使用,這裡我們為了更少的效能損耗和維護成本,會將裝置作為網路客戶端使用。
選擇 BootLoader
在進行韌體重新整理之前,考慮到有可能出現韌體重新整理失敗造成無法啟動、無法再次刷入,建議先了解並刷入一個穩定可靠的 BootLoader ,普遍的選擇是:
- breed
- uboot
我這裡推薦使用Breed
,如果你使用的裝置也是下載寶,那麼可以使用下面的地址:
html
當你將 Bootloader 刷入裝置之後,下載寶啟動進入Breed
和其他的裝置不同,需要長按的不是Reset
按鍵,而是位於Reset
按鍵小孔上方的硬碟彈出按鈕。
斷開裝置電源,長按硬碟彈出按鈕,給裝置供電,等待裝置啟動完畢,訪問http://192.168.1.1/
即可開啟Breed
的管理介面。
在進行刷機過程中,除了選擇你的韌體檔案之外,其他一切保持預設值即可。
預設鑑權
如果你使用的官方配置編譯出的韌體,預設賬號一般是root
, 密碼為admin
。
在登入管理介面之後,需要對Dropbear
提供的SSH
訪問功能中新增你的SSH
金鑰, 以方便後面的操作。
時間相關設定
有的代理軟體考慮重放攻擊,所以會涉及到“當前執行環境時間”這個因素。
為了保障這類軟體的正常使用,我們需要先設定靠譜的 NTP 伺服器,從網上可以找到大量資源,比如:
1.cn.pool.ntp.org ntp1.aliyun.com
選擇你覺得靠譜的,進行設定就好了。
清理無用軟體
考慮到我們只是要一個穩定可靠的代理服務,所以官方韌體、三方韌體中包含的許多內容是可以直接清理掉的,比如我們不需要檔案共享服務等。
bash
可以看到,如果你想連鍋端一些軟體,可以使用--force-removal-of-dependent-packages
這個引數,但是這個引數不是萬能的,對於 CLI 軟體和管理面板脫離的安裝包,還需要額外進行解除安裝操作。
另外,如果你對luci-*
軟體包進行了解除安裝,必須進行重啟,才能夠將管理後臺上的選單完全乾掉。
準備軟體儲存空間
前面提過,路由類裝置的檔案系統多數被設定為了只讀型別,一旦重啟將會把所有修改打回原形,除非執行了一些特殊的命令,將改動同步到裝置中。
並且多數裝置可用快閃記憶體的空間都非常有限,這裡要外儲存器進行一些操作,來擴充套件可用空間。
在進行空間擴充套件之前,需要先了解哪個裝置該被“安排”,使用fdisk
命令:
bash
這裡名為/dev/mmcblk0
的裝置就是外接儲存卡了,使用mkfs.ext4
命令可以對其進行格式化。
bash
當裝置格式化完成之後,我們並不能夠真正的開始使用。
如果你熟悉操作fstab
的話,直接編輯fstab
檔案可以把剛剛格式化好的分割槽進行掛載點分配,如果不熟悉,OpenWRT 管理介面有專門針對掛載點進行設定的頁面。
我這裡將剛剛的儲存卡使用ext4
檔案系統掛載到了/data
目錄。
將裝置設定為網路客戶端
將電腦和下載寶使用網線連線,因為我們不需要將它當路由使用,所以可以在管理介面將 DHCP 服務先進行關閉。
然後開啟介面管理介面,將唯一的介面的網路協議設定為DHCP 客戶端
,這裡需要注意,當你點選儲存後,新版的控制檯會先進行嘗試配置,這個配置是肯定會失敗
的,所以會提示你是否要進行回滾操作
還是繼續進行強制應用
,當然是後者。
在你點選強制應用之後,便可以將下載寶和電腦斷開連線,將下載寶和路由器進行連線,然後直接訪問路由器分配的IP即可繼續進行管理操作。
因為是在內網進行服務,所以可以繼續在介面配置中,將 IPV6 關閉。
安裝OpenWRT離線軟體包
通過SCP
等命令,我們可以將下載好的軟體安裝包傳送到下載寶上,但是當你使用opkg
命令進行安裝的時候,很可能會遇到下面的情況:
bash
解決方案其實很簡單,先通過opkg
命令檢視你支援的軟體包。
bash
可以看到,下載寶支援的軟體包架構是mipsel 24kc
。
而如果你要查詢一些軟體的話,可以從官方的軟體倉庫中獲取:http://archive.openwrt.org/releases/18.06.0/packages/
配置代理軟體
代理軟體有許多種,所以這裡不對具體的軟體進行配置,只是聊一下一些通用的處理。
自動啟動
使用命令列啟動代理軟體很容易,但是如果想達到“判斷程式沒有執行再執行啟動命令”就需要藉助指令碼來實現了。
; then echo 'Start new proxy client.' /data/軟體名稱 & fi] bash
將指令碼儲存到一個固定的位置,比如上文中提到的外接儲存器中/data/check.sh
,然後配置“計劃任務”(crontab) ,然系統每分鐘自動檢查是否應該啟動代理軟體,避免代理軟體崩潰後無法提供服務。
bash
重啟程序
非商業級產品,在長時間執行的過程中,難免出現記憶體洩露等問題,導致資源越用越多,但是提供的服務卻越來越差,甚至完全不提供服務,變成一個殭屍程序。
為了解決這個問題,我們可以使用自動重啟軟體的策略,但是同樣的,這裡也需要編寫一個簡單的指令碼:
; then echo "restart client" echo ${EXIST} | awk 'NR==1{print $1}' | xargs kill -9 /data/軟體名稱 & fi] bash
同樣的,在計劃任務中新增一個新的指令碼,可以做到讓程式每小時自動重啟,避免潛在的資源佔用過多卻不去釋放的問題。
bash
最後
如果你認為你的虛擬機器同樣穩定、或者路由器有大量的冗餘資源,也可以將這個功能放在他們上面,但是個人建議是做成 “單一職責”、“簡單可依賴” 的服務,不搞巨無霸。
—EOF