###### tags: `minecraft` --- # File Sharing Server ## 簡介 * 2D2C 的伺服器系統龐大,插件和伺服器核心版本維護不易。 * 日前發現可以用 Symbolic Link (捷徑) 的方式讓不同的伺服器**共享插件的 .jar 檔案** 和 **server.jar(即伺服器核心 - purpur)**。 * 因此在 Pterodactyl 架構上建置了一個小型的 File Sharing Server。如此一來,更新插件檔案和伺服器核心僅需要在這個 server 上進行,即可同步到有使用共享服務的伺服器上。 ## 使用與安裝說明 * 請伺服器後台管理人員一定要仔細讀過這個使用與安裝的說明,以免發生嚴重錯誤。 ### File Sharing Server * `./plugins` * 這個資料夾放置所有需要共享的插件。 * 上傳插件的注意事項: * 需要將版本等資訊移除,ex: `CoreProtect-20.1.jar` -> `CoreProtect.jar` * 如果要替換舊的插件,**請先確認運行該插件的伺服器皆已關閉**。否則會造成==嚴重後果!== * `./purpur` * 這個資料夾放置 purpur 最新的版本(請至 [purpur 官方網站](https://purpurmc.org/) 下載)。 * 上傳伺服器核心的注意事項: * 需要重新命名為 **server.jar**,否則不會有作用。 * 如果要替換舊的伺服器核心,**請先確認運行該核心的伺服器皆已關閉**。否則會造成==嚴重後果!== * `./utils/mount-manager.sh` * 這是 jerrycool123 寫的腳本,要在**其他需要共享插件的伺服器**上執行。 * 所以,你需要先把它下載並上傳到其他伺服器。 ### 其他需要共享服務的伺服器 * 除非必要,對於已經啟用共享服務的伺服器,==請不要在上面手動安裝其他插件和伺服器核心==(意即直接上傳插件或 **server.jar**),以免造成**管理困難**。 #### 安裝步驟 * 將 `./mount-manager.sh` 的 permission 改為 **744**。這樣腳本才能執行,有興趣的人可以研究看看 [Unix File Permissions](https://www.tutorialspoint.com/unix/unix-file-permission.htm)。 * ![](https://i.imgur.com/ivDyA42.png) * 把伺服器關掉。到 Admin Page -> Startup -> Startup command 改為 `./mount-manager.sh #原本的command`。 * 這樣的意義是利用 command 的 "#" 後面會被認為是**註解**,不會被讀取到,同時又能保留原本的指令。 * ![](https://i.imgur.com/TddCKy3.png) * Admin Page -> Mounts -> 找到 `shared-plugins` 這一行,最右邊的**綠色加號**點下去,看到狀態變成 **Mounted** 即可。 * ![](https://i.imgur.com/BFEi7vi.png) * 以上步驟,除了改變 Startup command 外,一個伺服器只要做第一次就可以了。在未來也可以透過變動 Startup command 的方式來啟動 Plugin Manager 的腳本。 #### 使用說明 * 第一次使用,請將伺服器需要共享的原始檔案( `./plugins` 資料夾的 **插件.jar**,或是 **server.jar**)全數刪除。==請不要刪除插件資料夾,那些是設定檔案,不會共享,刪掉就完蛋了!== * 重新啟動伺服器,Console 會看到以下畫面: * ![](https://i.imgur.com/ss6HC7a.png) * 輸入 `1` 檢視可以共享的插件列表 * 顯示各插件「已經被安裝到這個伺服器上與否」。由於剛才已經將 `./plugins` 的 **插件.jar**,所有的欄位應該都會顯示 `False`。(下圖是已經安裝完後的結果,才會都是 `true`) * ![](https://i.imgur.com/h5ANVOa.png) * 輸入 `2` 進行個別插件的安裝 * 腳本會對每一個**尚未安裝在這個伺服器上**的插件問你要不要安裝,輸入 `y` 以安裝,`n` 或其他鍵都會取消安裝。 * ![](https://i.imgur.com/j1fdYJM.png) * 輸入 `3` 進行所有插件的安裝 * 腳本會問你要不要**一次安裝所有尚未安裝在這個伺服器上的插件**。輸入 `y` 以安裝,`n` 或其他鍵都會取消安裝。 * ![](https://i.imgur.com/SeFRFR1.png) * **\[新增\]** 輸入 `4` 安裝 **server.jar** * 應該不用多餘解釋,和安裝插件原理相同。 * 如果 **server.jar** 已經存在,會提示你已經安裝過了。 * 安裝完畢後,請將 Startup command 改回原本的,然後再重新啟動伺服器就可以了。 #### 移除插件或伺服器核心 * 可以直接在各伺服器的 `./plugins` 資料夾將不再使用的 **插件.jar** 刪除,也可以直接刪除 **server.jar**。 * 這個行為不會影響到其他伺服器,因為在各伺服器上安裝的檔案只是 symbolic link 而已,未來也可以再次透過 `./mount-manager.sh` 重新安裝。 ## 原理 * 以下請斟酌閱讀,需要一些 Unix 系統和 Docker、Pterodactyl 的知識基礎。 * 日前發現 Server Docker 在主機上會 mount 到特定的目錄下:`/var/lib/pterodactyl/volumes/{uuid}`。 * 所以我就在主機建立了 symbolic link `/srv/ddcc-plugins` 指向 File Sharing Server 的 `./plugins` 資料夾在主機上的真實位置。 * 然後再透過一些設定,使得 `/srv/ddcc-plugins` 可以透過 pterodactyl mount 到 container 的 `/shared-plugins` 目錄。 * 而 `/srv/ddcc-purpur` 則對應到 `/shared-purpur` 目錄。 * 最後,`mount-manager.sh` 的作用是: * 對伺服器的 `/home/container/plugins` 裡面建立 symbolic link,使其指向 `/shared-plugins` 目錄。 * 對伺服器的 `/home/container/server.jar` 建立 symbolic link ,使其指向 `/shared-purpur/server.jar`。 * 所以,整個路徑就是: * plugins * Other server container `/home/container/plugins` => * Other server container `/shared-plugins` => * 2D2C host `/srv/ddcc-plugins` => * 2D2C host `/var/lib/pterodactyl/volumes/{file sharing server's uuid}/plugins` = File Sharing Server container `/home/container/plugins` * purpur * Other server container `/home/container/server.jar` => * Other server container `/shared-purpur/server.jar` => * 2D2C host `/srv/ddcc-purpur/server.jar` => * 2D2C host `/var/lib/pterodactyl/volumes/{file sharing server's uuid}/purpur/server.jar` = File Sharing Server container `/home/container/purpur/server.jar` ## 展望與問題 * 理論上 plugin 是唯獨的,所以共享才不會有問題,也希望他未來也不要有問題。 * `install` 模式很麻煩,需要一個個打 y/n 選擇需要安裝哪些插件。但因為沒有 GUI,這是不得已的作法。 * Pterodactyl 上不支援 GUI 建立 symbolic link,且對不熟悉 Unix 指令的管理員並不友善;甚至連熟的人也要每個插件都打過一次。這也是為什麼會需要 `mount-manager.sh` 來半自動化這些流程。 * 理想上還是希望 config 檔案也能共享,但問題是有些是 server-dependent 的設定,且每個插件的目錄架構皆不同,並不是很容易就能共享。