🐧 Linux 服务器部署
一句话结论:主流发行版全都兼容,一个脚本自适应发行版、架构、init 系统与防火墙。
为什么不用按发行版准备不同文件?
本程序是 CGO_ENABLED=0 编译的纯静态链接 Go 二进制。实测校验:
program headers: LOAD / NOTE / PHDR / GNU_STACK <- 没有 PT_INTERP、没有 DYNAMIC
PT_INTERP 存在? False
引用 ld-linux? 0 引用 libc.so? 0 引用 ld-musl? 0
即不依赖 glibc 版本、不依赖任何系统库。唯一因发行版而异的,是「怎么注册成开机自启服务」「怎么放行端口」,这两件事脚本已自动适配。
发行版兼容矩阵
| 发行版 | 版本 | 架构 | 支持 |
|---|---|---|---|
| Debian | 10 / 11 / 12+ | amd64 / arm64 | ✅ |
| Ubuntu | 18.04 / 20.04 / 22.04 / 24.04 | amd64 / arm64 | ✅ |
| CentOS | 7 / 8 / Stream | amd64 / arm64 | ✅(CentOS 7 的 glibc 2.17 也没问题) |
| RHEL / Rocky / AlmaLinux | 7 / 8 / 9 | amd64 / arm64 | ✅ |
| Fedora | 最新 | amd64 / arm64 | ✅ |
| openEuler 欧拉 | 20.03 / 22.03 | amd64 / aarch64 | ✅ |
| 麒麟 Kylin / 统信 UOS | V10 / 20 | amd64 / arm64 | ✅ |
| Alpine | 3.x | amd64 / arm64 | ✅(musl 也不依赖) |
| SUSE / openSUSE | 15+ | amd64 / arm64 | ✅ |
脚本对「服务注册 / 端口放行」的适配
| 发行版 | init 系统 | 端口放行 | 脚本行为 |
|---|---|---|---|
| Debian / Ubuntu / UOS / Kylin | systemd | ufw | 装 systemd 单元 + ufw allow |
| CentOS / RHEL / Rocky / Alma / openEuler | systemd | firewalld | 装 systemd 单元 + firewall-cmd;SELinux Enforcing 会 restorecon |
| Alpine | OpenRC | 无 | 生成 /etc/init.d/opsmonitor + rc-update |
| 极小化容器镜像 | 都没有 | 无 | 回退 nohup 常驻(提示重启不自启) |
快速开始
把二进制和 deploy/linux 目录一起传到服务器,然后执行安装脚本:
# 1) 上传(在本地执行)
scp -r deploy/linux opsmonitor-server-linux-amd64 root@10.0.0.5:/root/
# 2) 在服务器上执行
cd /root && chmod +x linux/install.sh
sudo ./linux/install.sh
脚本会自动完成:探测发行版/架构 → 取出对应二进制 → 建低权限用户 opsmonitor →
装到 /opt/opsmonitor/opsmonitor-server → 生成 /etc/opsmonitor/opsmonitor.env →
注册开机自启 → 放行端口 → 打印只显示一次的控制台账号与通信密钥。
记下账号密码
控制台账号与通信密钥只在安装结束时打印一次。没记下也没关系:账号密码在
/etc/opsmonitor/opsmonitor.env,通信密钥可用 --token 重设。
常用参数
sudo ./install.sh --addr :8000 # 换监听端口
sudo ./install.sh --token '你的通信密钥' # 指定采集端要用的密钥
sudo ./install.sh --admin-pass '你的控制台密码' # 指定控制台密码(否则随机生成)
sudo ./install.sh --public-url http://10.0.0.5:9999
sudo ./install.sh --no-firewall # 不动防火墙(自己管理)
sudo ./install.sh -f /tmp/opsmonitor-server-linux-arm64 # 指定二进制
sudo ./install.sh -u https://example.com/opsmonitor-server-linux-amd64 # 在线拉取
sudo ./install.sh --uninstall # 卸载(保留数据与配置)
参数也可用环境变量:OPSM_VERSION / OPSM_PREFIX。
目录规划
| 路径 | 用途 |
|---|---|
/opt/opsmonitor/opsmonitor-server | 主程序(自动更新会替换它,旧版存为 .bak) |
/opt/opsmonitor/data/opsmonitor.db | SQLite 数据库(WAL 模式,备份拷这个目录即可) |
/opt/opsmonitor/releases/ | 采集端发布物缓存(内网主机从这里升级) |
/etc/opsmonitor/opsmonitor.env | 配置(权限 600,密码/密钥都在这里) |
/etc/systemd/system/opsmonitor.service | systemd 单元 |
日常运维
systemctl status opsmonitor --no-pager # 状态
systemctl restart opsmonitor # 重启
systemctl disable --now opsmonitor # 停止并取消开机自启
journalctl -u opsmonitor -f --no-pager # 跟随日志
curl -s http://127.0.0.1:9999/api/health # 健康检查
手工部署(不想用脚本时)
sudo useradd -r -s /sbin/nologin opsmonitor
sudo mkdir -p /opt/opsmonitor/{data,releases} /etc/opsmonitor
sudo install -m0755 opsmonitor-server-linux-amd64 /opt/opsmonitor/opsmonitor-server
sudo cp opsmonitor.env.example /etc/opsmonitor/opsmonitor.env
sudo vi /etc/opsmonitor/opsmonitor.env # 至少改 OPSM_TOKEN 与 OPSM_ADMIN_PASS
sudo chmod 600 /etc/opsmonitor/opsmonitor.env
sudo cp opsmonitor.service /etc/systemd/system/
sudo chown -R opsmonitor:opsmonitor /opt/opsmonitor
sudo systemctl daemon-reload && sudo systemctl enable --now opsmonitor
sudo systemctl status opsmonitor --no-pager
常见排障
| 现象 | 原因与处理 |
|---|---|
journalctl 里 avc: denied | SELinux:semanage fcontext -a -t bin_t '/opt/opsmonitor(/.*)?' && restorecon -R /opt/opsmonitor 后重启 |
permission denied 启动失败 | 属主不对:chown -R opsmonitor:opsmonitor /opt/opsmonitor |
| 本机能开、外面打不开 | firewalld/ufw 未放行,或云服务器安全组未放行 9999 |
address already in use | ss -tlnp | grep 9999 找占用进程,或换 --addr :8000 |
| 日志报「打开数据库失败」 | OPSM_DB 指向的目录不存在或无写权限 |
CentOS 7 systemd 报 Unknown lvalue LimitNOFILE | 老 systemd 语法差异,删掉该行即可(非必需) |
| 想完全离线 | ExecStart 加 -hub=。不能用 OPSM_HUB=(空串会回落默认地址) |
下一步
监控端跑起来后,去控制台「监控 → 添加主机」复制一键安装命令,到目标主机执行即可接入采集端。 详见 接入采集端。