141 lines
3.5 KiB
Markdown
141 lines
3.5 KiB
Markdown
|
|
# MineSentinel 部署指南
|
|||
|
|
|
|||
|
|
MineSentinel 是一个 Minecraft 服务器守护进程,每 10 秒检测服务器端口状态,发现崩溃时自动重启。
|
|||
|
|
|
|||
|
|
## 环境要求
|
|||
|
|
|
|||
|
|
- **操作系统**: Linux (systemd)
|
|||
|
|
- **Ruby**: >= 3.0(用到了 `Timeout.timeout` 和 `Process.spawn`)
|
|||
|
|
- **权限**: root(需要执行 `systemctl` 管理 Minecraft 服务)
|
|||
|
|
- **Minecraft 服务**: 已注册为 systemd 服务,服务名为 `minecraft`
|
|||
|
|
|
|||
|
|
## 文件结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/opt/minesentinel/ # 推荐部署目录
|
|||
|
|
├── main.rb # 主程序入口
|
|||
|
|
├── method_executor.rb # 日志系统 + 重启逻辑
|
|||
|
|
├── server_status_detector.rb # TCP 端口检测
|
|||
|
|
└── uni_log_path.rb # 日志路径工具(可选)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 部署步骤
|
|||
|
|
|
|||
|
|
### 1. 创建目录并复制文件
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
mkdir -p /opt/minesentinel
|
|||
|
|
cp main.rb method_executor.rb server_status_detector.rb /opt/minesentinel/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果要用 `uni_log_path.rb` 也一并复制。
|
|||
|
|
|
|||
|
|
### 2. 确认 Minecraft systemd 服务存在
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
systemctl status minecraft
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果你的 Minecraft 服务名不是 `minecraft`,需要修改 `method_executor.rb` 中所有 `systemctl xxx minecraft` 为你的实际服务名。
|
|||
|
|
|
|||
|
|
### 3. 手动测试
|
|||
|
|
|
|||
|
|
先前台跑一次确认无报错:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /opt/minesentinel
|
|||
|
|
ruby main.rb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
观察日志输出,确认能正常检测端口、识别服务状态。按 `Ctrl+C` 退出。
|
|||
|
|
|
|||
|
|
调试模式(输出更详细):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
LOG_LEVEL=debug ruby main.rb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 注册为 systemd 服务
|
|||
|
|
|
|||
|
|
创建 `/etc/systemd/system/minesentinel.service`:
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
[Unit]
|
|||
|
|
Description=MineSentinel - Minecraft Server Auto-Restart Daemon
|
|||
|
|
After=network.target
|
|||
|
|
|
|||
|
|
[Service]
|
|||
|
|
Type=simple
|
|||
|
|
WorkingDirectory=/opt/minesentinel
|
|||
|
|
ExecStart=/usr/bin/ruby /opt/minesentinel/main.rb
|
|||
|
|
Restart=always
|
|||
|
|
RestartSec=5
|
|||
|
|
StandardOutput=journal
|
|||
|
|
StandardError=journal
|
|||
|
|
Environment=LOG_LEVEL=info
|
|||
|
|
|
|||
|
|
[Install]
|
|||
|
|
WantedBy=multi-user.target
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
systemctl daemon-reload
|
|||
|
|
systemctl enable minesentinel
|
|||
|
|
systemctl start minesentinel
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 查看日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 实时日志
|
|||
|
|
journalctl -u minesentinel -f
|
|||
|
|
|
|||
|
|
# 最近 50 条
|
|||
|
|
journalctl -u minesentinel -n 50
|
|||
|
|
|
|||
|
|
# 只看错误
|
|||
|
|
journalctl -u minesentinel -p err
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 日志级别说明
|
|||
|
|
|
|||
|
|
通过 `Environment=LOG_LEVEL=xxx` 控制:
|
|||
|
|
|
|||
|
|
| 级别 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| `debug` | 全部输出,含每次巡检结果、TCP 响应时间 |
|
|||
|
|
| `info` | 启动/重启/恢复等关键操作 |
|
|||
|
|
| `warn` | 服务器异常、超时、强制终止 |
|
|||
|
|
| `error` | 重启失败、重试次数耗尽 |
|
|||
|
|
|
|||
|
|
默认 `info`,生产环境推荐 `info`;排查问题时临时改为 `debug`。
|
|||
|
|
|
|||
|
|
## 工作流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
每 10 秒循环:
|
|||
|
|
├─ TCP 连接 127.0.0.1:25565
|
|||
|
|
├─ 端口开放 → debug 日志,继续等待
|
|||
|
|
├─ 端口关闭 → 记录 warn,触发重启
|
|||
|
|
│ └─ systemctl restart minecraft(最多重试 10 次)
|
|||
|
|
│ ├─ 30 秒内完成 → 成功,计数器归零
|
|||
|
|
│ └─ 超时 → kill -9 → systemctl kill → systemctl start
|
|||
|
|
└─ 10 次全部失败 → 进入空闲等待,直到手动恢复
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
**Q: 报 `Errno::EPERM`?**
|
|||
|
|
A: 需要 root 权限执行。确认 systemd service 以 root 运行,或 `sudo ruby main.rb`。
|
|||
|
|
|
|||
|
|
**Q: 如何修改检测端口?**
|
|||
|
|
A: 编辑 `server_status_detector.rb` 第 52 行,修改 `test_port` 的端口参数。
|
|||
|
|
|
|||
|
|
**Q: 如何修改检测间隔?**
|
|||
|
|
A: 编辑 `main.rb` 第 33 行,修改 `sleep 10` 的值。
|
|||
|
|
|
|||
|
|
**Q: 如何修改重启超时时间?**
|
|||
|
|
A: 编辑 `method_executor.rb` 第 9 行,修改 `PERSISTENCE_PERIOD`。
|