提醒對於任何使用或引用本篇文章資訊與操作導致之損失或損害,本人概不負責。
開頭先來一張放了乖乖的伺服器本體照片XD

前言
大概2023年時,有位認識的Minecraft伺服器服主覺得做累了
想找人接手,當時有找上我,討論後我接下硬體+OS層的作業
但伺服器當時已經快沒有玩家了,管理伺服器的大家也都有現實面要顧
在轉交之後很快就倒閉了
曾經能有過輝煌時代,我認為是2020年當時疫情+pewdiepie開玩Minecarft帶來的風潮
以下是當時用Linux架設Minecraft伺服器的筆記
內容偏向Linux及伺服器維運相關內容(因為我對Minecraft Server沒到很熟...)
主要是作法配上簡單的說明,算挺枯燥的
想參考的話,建議對Linux有一定程度的熟悉會比較好
#此篇文章建議以闇黑模式閱讀
0.系統環境
OS
- Debian 12(最小安裝)
Domain Name
- XXXXX.net(MC伺服器位址)
- file.XXXXX.net(filebrowser伺服器檔案傳輸平台)
Minecraft伺服器資訊
- 版本:1.20.1
- JAVA版
- 使用BungeeCord Waterfall將四個Minecraft伺服器串在一起(Waterfall現已結束支援)
硬體設備
- CPU:i5-13500
- RAM:KLEVV BOLT X DDR4 3200 16G X4(64G)
- MotherBoard:ASUS PRIME B760M-A WIFI D4-CSM
- DISK:
PLEXTOR M6 Pro 128GB(sdb)
KIOXIA Exceria G2 1TB(nvme0n1)
WD黑標 2.5 HDD 1TB(sda)
- Power:海韻Seasonic FOCUS PX-550 白金/全模
- Case:CST350 PLUS
- 塔散:DEEPCOOL AG400
磁碟分配如下
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 119.2G 0 disk
├─sdb1 8:17 0 83.8G 0 part
│ └─vg--root--new-lv--root--new 254:2 0 83.8G 0 lvm /
├─sdb2 8:18 0 488M 0 part /boot
├─sdb3 8:19 0 298M 0 part /boot/efi
└─sdb4 8:20 0 34.7G 0 part [SWAP]
sdc 8:32 0 931.5G 0 disk
└─sdc1 8:33 0 931.5G 0 part
└─vg--backup-lv--backup 254:3 0 931.5G 0 lvm /mc/backup
nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 93.1G 0 part
│ └─vg--var-lv--var 254:0 0 93.1G 0 lvm /var
└─nvme0n1p5 259:2 0 763.1G 0 part
└─vg--mc-lv--mc 254:1 0 763.1G 0 lvm /mc/server
1.檔案協作&共享平台 File Browser架設
因為我主要管的還是硬體 & OS層
所以要有方法能讓其他人維護、修改插件
這邊選擇File Browser這套軟體,能夠線上修改檔案,
進而讓其他管理人員能維護插件
這邊使用Docker Compose建立File Browser
並用Nginx Reverse Proxy的方式帶出憑證及Domain
安裝相關套件
apt install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新套件連結
apt update
安裝Docker
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose certbot
寫docker-compose.yml
version: "3.8"
services:
file-browser:
image: filebrowser/filebrowser
container_name: file-browser
user: 1000:1000
restart: always
ports:
- "8080:80"
volumes:
- "/mc/server:/srv"
- "/mc/filebrowser.db:/database.db"
security_opt:
- no-new-privileges:true
建立filebrowser.db檔案,filebrowser.db儲存了File Browser的User相關資訊
touch /mc/filebrowser.db
chmod 666 /mc/filebrowser.db
啟用File Browser
docker-compose up -d
docker-compose基本操作說明
#啟用
docker-compose up -d
#關閉
docker-compose down
#顯示運行中容器
docker-compose ps
Nginx設定
nginx.conf在http層加入以下兩行隱藏Nginx版本號,增加安全性
vim /etc/nginx/nginx.conf
server_tokens off;
fastcgi_param SERVER_SOFTWARE nginx;
Reverse Proxy設定
此設定僅在URL輸入為file.xxxxx.net時,才會有回應
其餘URL不會有任何回應
vim /etc/nginx/conf.d/reverse_proxy.conf
server {
listen 443 ssl;
#需更換為自己的Domain
server_name file.xxxxx.net;
#憑證需更換成自己的憑證路徑
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/certs/server.key;
location ~ {
proxy_pass_header Authorization;
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_buffering off;
client_max_body_size 0;
proxy_read_timeout 36000s;
proxy_redirect off;
}
}
server {
listen 80;
if ($host = file.xxxxx.net) {
return 301 $host$request_uri;
}
}
#不回應使用IP的連線
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
server_name _;
#憑證需更換成自己的憑證路徑
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/certs/server.key;
return 444;
}
2.DB設定
由於接手的Minecraft伺服器有裝不少插件
而且很多插件都會需要用到DB,檢查插件也都支援MySQL
於是就選擇建MariaDB,並將DB資料匯入、修改插件的DB密碼
MariaDB設定
安裝mariadb(backup可選擇要不要裝)
apt install mariadb-server mariadb-backup
mariadb初始化
mariadb-secure-installation
Switch to unix_socket authentication [Y/n] y
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
mariadb簡單的指令操作說明
#登入db
mysql -u root -p
#新增一般使用者,讓root沒必要就不去使用它
CREATE USER 'mc'@'localhost' IDENTIFIED BY 'YourPassword';
#創建資料庫
CREATE DATABASE `120mq`;
#授予mc使用者120mq所有權限
GRANT ALL PRIVILEGES ON 120mq.* TO 'mc'@'localhost';
#授予mc reload權限,以執行mariadbdump
GRANT RELOAD ON *.* TO 'mc'@'localhost';
#匯入資料庫
mysql -u mc -p 120mq < 120mq_*
移動到伺服器插件資料夾
cd 00_login_server/plugins
確認目前插件使用DB密碼,是否和別人告知的一致
grep -ri your_db_pass *
將目前DB密碼取代為現行DB密碼
grep -ril your_db_pass ./ | xargs sed -i 's/your_db_pass/YourPassword/g'
3.備份設定
遊戲伺服器,不能不備份
萬一哪天資料遺失,那就是玩家的心血遺失了
我當時的環境還有一台Debian 12的Home Server
所以先在Minecraft伺服器排程設定自動備份
再由Home Server主動將Minecraft伺服器的備份複製到自己身上
資料庫備份
在root home目錄寫入mysqldump設定
vim ~/.my.cnf
[mysqldump]
user=mc
password=YourPassword
Minecraft 伺服器備份排程
#snar檔是能在tar打包時產生的一個檔案,下次備份時可以參照snar檔,僅備份不同的部分,做到差異備份的效果
#每週一進行完整備份
0 4 * * 1 /usr/bin/tar -zcvp -f "/mc/backup/exchange/$(date '+\%Y-\%m-\%d')_fullbackup.tar.gz" -g "/mc/backup/exchange/fullbackup.snar" /etc/ /home/ /root/ /mc/server /mc/filebrowser.db && /usr/bin/cp -fv "/mc/backup/exchange/fullbackup.snar" "/mc/backup/exchange/fullbackup.snar_1"
#每周二到日進行差異備份
0 4 * * 2-7 /usr/bin/tar -zcvp -f /mc/backup/exchange/"$(date '+\%Y-\%m-\%d')_diffbackup.tar.gz" -g "/mc/backup/exchange/fullbackup.snar_1" /etc/ /home/ /root/ /mc/server /mc/filebrowser.db && /usr/bin/cp -fv "/mc/backup/exchange/fullbackup.snar" "/mc/backup/exchange/fullbackup.snar_1"
#每周一定時刪除原始的snar,避免tar -g時就會直接參照fullbackup.snar,導致完整備份變成差異備份
55 3 * * 1 /usr/bin/rm -f /mc/backup/exchange/fullbackup.snar
#每日進行DB完成備份
0 5 * * * /usr/bin/mariadb-dump --user=mc --lock-tables --all-databases > /mc/backup/exchange/full_mcdbs.sql
手動執行備份指令
#1. 完整備份,並留下附檔名snar的紀錄
tar -zcvp -f "/mc/backup/exchange/$(date '+%Y-%m-%d')_fullbackup.tar.gz" -g "/mc/backup/exchange/$(date '+%Y-%m-%d')_fullbackup.tar.gz.snar" /etc/ /home/ /root/ /mc/server /mc/filebrowser.db
#2. 為了記錄不被覆蓋,需cp另一份
cp -f "/mc/backup/exchange/$(date '+%Y-%m-%d')_fullbackup.tar.gz.snar" "/mc/backup/exchange/$(date '+%Y-%m-%d')_fullbackup.tar.gz.snar_1"
#3. 差異備份,使用另一份的snar紀錄
tar -zcvp -f /mc/backup/exchange/"$(date '+%Y-%m-%d')_diffbackup.tar.gz" -g "/mc/backup/exchange/$(date '+%Y-%m-%d')_fullbackup.tar.gz.snar_1" /etc/ /home/ /root/ /mc/server /mc/filebrowser.db
#解壓縮
tar -zxvp -f backup.tar.gz -C /
mariadb-dump手動執行
#備份user mc的全資料庫
mariadb-dump --user=mc --lock-tables --all-databases > /mc/backup/exchange/full_mcdbs.sql
#備份user mc的特定資料庫
mariadb-dump --user=mc --lock-tables --databases 120mq 120mqjoin mqsv03 mapsql 120marry 120mcmmo 120mysql 120da minecraftlp > /mc/backup/exchange/mcdbs.sql
#還原資料庫
mysql -u minecraft -p < full_mcdbs.sql
在Home server手動拉檔案(需要先設定好ssh key才能用)
如需排程拉檔案,將以下指令寫成Cron Job就能使用
#Home Server拉備份檔案指令
rsync -avzh -e 'ssh -p 11022 -i /root/.ssh/ed25519_backup' yourusername@192.168.1.162:/mc/backup/exchange/ /exdisk/mc_backup
#複製完成後,刪除Source的檔案,此處的Source為"yourusername@192.168.1.162:/mc/backup/exchange/"
rsync -avzh -e 'ssh -p 11022 -i /root/.ssh/ed25519_backup' --remove-source-files yourusername@192.168.1.162:/mc/backup/exchange/ /exdisk/mc_backup
4.啟動Minecraft伺服器
設定了不少東西,總算要來啟動Minecraft伺服器了
安裝corretto-jdk 17
apt-get install software-properties-common ca-certificates apt-transport-https gnupg curl
curl https://apt.corretto.aws/corretto.key | sudo apt-key add -
add-apt-repository 'deb https://apt.corretto.aws stable main'
apt-get update
apt-get install -y java-17-amazon-corretto-jdk libxi6 libxtst6 libxrender1
開通防火牆
firewall-cmd --add-port={80,443,25587}/tcp --permanent
firewall-cmd --reload
安裝tmux,後續啟動伺服器使用
apt install tmux
啟動BungeeCord Waterfall+4個伺服器,以tmux啟動才能在console端下指令做reload等事情
原本我是把各伺服器做成systemd的unit,但這樣就變成是背景執行,無法在Minecraft伺服器的console下指令
以tmux啟用session mcwf
tmux new -s mcwf
在mcwf session中執行
java -Xms1G -Xmx1G -server -jar waterfall-1.20-539.jar
接著就用差不多的方式將4服啟動
如果要跳出tmux session
[Ctrl]+[b]再按d
補充說明:關於告警設定
如果今天伺服器崩潰了,相信會有玩家tag服主
但身為管理伺服器的人,伺服器掛掉自己應該也要知道
而不是等玩家主動告知,尤其我接手的是以BungeeCord將多伺服器串在一起的架構
某些伺服器壞了可能不會立即有玩家發現
當時的作法是用Minecraft伺服器插件做到Email告警
但插件主要不是我處理,所以這邊只能簡單說明一下
結語
在退下Home Server之後,
有整理之前留下的腳本、筆記、YMAL檔
翻到了這個筆記,想想當時自己也挺認真的去玩
當時CPU因為還沒有爆出13-14代災情
所以選擇具備大小核的i5-13500,Linux Kernel要有一定版本才支援大小核調用
所以linux distro選擇Debian,作為Server使用感覺很不錯
Kernael比RedHat系的要新,最小安裝幾乎不帶SELinux、firewalld等東西
可以自己選擇需要的套件,又具備穩定性
話說巴哈不支援Markdown感覺還真不方便,要不要乾脆架自己的部落格網站呢...