---
# System prepended metadata

title: File Sharing Server
tags: [minecraft]

---

###### 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 的設定，且每個插件的目錄架構皆不同，並不是很容易就能共享。