手动安装
安装主控和被控的其他各种方式:在每台服务器上用发布包、先下载安装脚本、用 wget、自签名证书、SSH、cloud-init 和 Ansible,以及不用 install.sh 的完整手动安装。
添加服务器最快的方式是面板给出的一行命令,见安装被控。本页介绍安装主控和被控的其他所有方式。
| 方式 | 适用场景 |
|---|---|
| 用发布包安装被控 | 程序要来自发布包,而不是从主控下载 |
| 先下载安装脚本 | 想先看过脚本再执行,或者自己回答它的提问 |
| 用 wget 代替 curl | 服务器上没有 curl |
| 主控使用自签名证书 | 面板用 HTTPS,但证书不被服务器信任 |
| 用脚本或工具批量安装 | SSH、cloud-init、Ansible |
| 手动安装主控 | 不能或不想运行 install.sh |
| 手动安装被控 | 同上,在被控上 |
安装被控需要的信息
每种方式都需要主控的地址,以及这台服务器的密钥或绑定密钥。要批准 AI 的修复,还需要主控签名钥匙和你的通行密钥的指纹。最简单的做法是复制面板给出的安装命令,从里面取这些值:
| 值 | 在哪里找 |
|---|---|
主控地址(--master) | 你打开面板用的地址:设置 → 常规 → 面板对外地址 |
密钥(--token) | 服务器 → + 添加服务器 之后显示,以后也可以在 服务器 → ⋯ → 安装命令 里查看。在主控上执行 sudo 3rmonitor server add --name 名称 也会输出一个。 |
绑定密钥(--enroll) | 服务器 → 一条命令接入多台服务器 |
主控指纹、通行密钥指纹(--master-key、--approvers) | 在上面这些命令里,或者 设置 → 通行密钥 → 要核对的指纹。--approvers 列出所有已信任的通行密钥,用逗号分隔;还没有通行密钥时不加这个参数。 |
CPU 架构
安装脚本会自己选择正确的程序。手动安装时,需要知道用哪个文件:
uname -m | 程序 |
|---|---|
x86_64 | 3rmonitor-linux-amd64 |
aarch64 | 3rmonitor-linux-arm64 |
armv7l | 3rmonitor-linux-arm |
i686、i386 | 3rmonitor-linux-386 |
下面这条命令为后面的步骤设置 ARCH:
case "$(uname -m)" in x86_64) ARCH=amd64 ;; aarch64) ARCH=arm64 ;; armv7l) ARCH=arm ;; i?86) ARCH=386 ;; esac; echo "$ARCH"用安装脚本安装被控
用发布包安装被控
像安装主控时一样,把发布包复制到服务器上并解压,然后在解压出的目录里执行:
sudo bash install.sh agent --master 'https://monitor.example.com' --token '密钥' --master-key 主控指纹 --approvers 通行密钥指纹用绑定密钥代替密钥时,服务器会自动登记:
sudo bash install.sh agent --master 'https://monitor.example.com' --enroll '绑定密钥' --master-key 主控指纹 --approvers 通行密钥指纹 --name web-2 --group 生产安装脚本校验程序的 SHA-256 后,直接从发布包安装,而不是下载。其他都和面板给出的命令一样。服务器仍然要能访问主控,用于测试上报和之后的上报;以后照常从主控自动更新。
用发布包安装被控时,要在命令行里给出 --master 和 --token(或 --enroll)。如果改为在菜单里选 1)被控端,安装脚本不会询问这些值,而是停在“写入被控配置失败”。这时程序已经复制好了,执行上面的命令即可完成安装。
先下载安装脚本
想先看过安装脚本再执行,可以从主控下载它。下载链接需要密钥或绑定密钥(?t=):
curl -fsSL -o install.sh 'https://monitor.example.com/dl/install.sh?t=密钥'
less install.sh
sudo bash install.sh agent --master 'https://monitor.example.com' --token '密钥' --master-key 主控指纹 --approvers 通行密钥指纹也可以不加任何选项执行 sudo bash install.sh,然后选 1)被控端。安装脚本会依次询问主控地址、服务器密钥(要用绑定密钥就直接回车)和绑定密钥。这样安装时不会信任任何钥匙:如果要在这台服务器上执行批准过的 AI 修复,之后再执行 sudo 3rmonitor approvers trust。
两种做法都会从主控下载程序并校验 SHA-256。
用 wget 代替 curl
wget -qO- 'https://monitor.example.com/dl/install.sh?t=密钥' | sudo bash -s -- agent --master 'https://monitor.example.com' --token '密钥' --master-key 主控指纹 --approvers 通行密钥指纹没有安装 curl 时,安装脚本自己也会改用 wget。
主控使用自签名证书
下载和被控都要跳过证书校验:给 curl 加 -k(wget 加 --no-check-certificate),给安装脚本加 --insecure:
curl -fsSLk 'https://monitor.example.com/dl/install.sh?t=密钥' | sudo bash -s -- agent --master 'https://monitor.example.com' --token '密钥' --insecure --master-key 主控指纹 --approvers 通行密钥指纹--insecure 会在 agent.conf 里写入 insecure = true,被控之后上报时也跳过校验。
用脚本或工具批量安装
使用批量接入命令:所有服务器用同一条命令,每台会自动登记。加上 -y,安装脚本就什么都不问。名称默认使用服务器的主机名。
for h in web-1 web-2 db-1; do
ssh root@$h "curl -fsSL 'https://monitor.example.com/dl/install.sh?t=绑定密钥' | bash -s -- agent --master 'https://monitor.example.com' --enroll '绑定密钥' --master-key 主控指纹 --approvers 通行密钥指纹 --name $h --group 生产 -y"
done- 把绑定密钥放在工具的机密存储里(例如 Ansible Vault):任何拿到它的人都能向你的面板添加服务器。
- 命令里的指纹必须和当前已信任的通行密钥一致。添加或撤销通行密钥之后,要重新复制命令。如果不一致,被控照样会装好,但安装脚本会提示“没有固定钥匙”,这台服务器不信任任何钥匙:在它上面执行
sudo 3rmonitor approvers trust。
不用 install.sh,全部手动
下面的步骤做的就是 install.sh 做的事,创建的文件和服务也相同。所以之后的升级、被控的自动更新和 install.sh uninstall 都照常可用。把大写或中文的占位值换成你自己的。
AlmaLinux、Rocky、RHEL 和 CentOS
在这些系统上 sudo 不搜索 /usr/local/bin,所以下面的步骤和 install.sh 一样,也在 /usr/bin 里放一个 3rmonitor 命令的链接。没有这个链接,sudo 3rmonitor … 会提示 command not found。
手动安装主控
解压发布包并校验。
tar xzf 3rmonitor-1.1.1.tar.gz && cd 3rmonitor-1.1.1
sha256sum -c --ignore-missing SHA256SUMS每个程序都必须显示 OK。按这台服务器设置 ARCH(见 CPU 架构),例如 ARCH=amd64。
创建用户和目录。 主控以非特权用户 3rmonitor 运行。
sudo useradd --system --home-dir /var/lib/3rmonitor --no-create-home --shell /usr/sbin/nologin 3rmonitor
sudo install -d -m 750 -o 3rmonitor -g 3rmonitor /var/lib/3rmonitor /var/lib/3rmonitor/update
sudo install -d /etc/3rmonitor /opt/3rmonitor/dist安装程序和被控程序包。 被控在安装和更新时从 /opt/3rmonitor/dist 下载程序。被控只会更新到 3R Soft 签名 SHA256SUMS.sig 里列出的程序,所以它也要复制过去。install.sh 要留在 /opt/3rmonitor,供以后升级和卸载用。
sudo install -m 755 3rmonitor-linux-$ARCH /opt/3rmonitor/3rmonitor
sudo ln -sf /opt/3rmonitor/3rmonitor /usr/local/bin/3rmonitor
sudo ln -sf /opt/3rmonitor/3rmonitor /usr/bin/3rmonitor
sudo install -m 755 install.sh /opt/3rmonitor/install.sh
sudo cp 3rmonitor-linux-* SHA256SUMS SHA256SUMS.sig install.sh /opt/3rmonitor/dist/
sudo chmod -R a+rX /opt/3rmonitor/dist
if [ -f geoip-country.mmdb ]; then sudo install -m 640 -o 3rmonitor -g 3rmonitor geoip-country.mmdb /var/lib/3rmonitor/; fi写入配置。 每一项的说明见配置文件。
sudo tee /etc/3rmonitor/master.conf >/dev/null <<'EOF'
listen = 0.0.0.0:8899
data_dir = /var/lib/3rmonitor
dist_dir = /opt/3rmonitor/dist
public_url = http://203.0.113.10:8899/
EOF
sudo chgrp 3rmonitor /etc/3rmonitor/master.conf
sudo chmod 640 /etc/3rmonitor/master.conf创建数据库和管理员。 密码至少 8 个字符。
sudo 3rmonitor init --public-url http://203.0.113.10:8899/ --admin admin --password '强密码'它以 3rmonitor 用户的身份,在 /var/lib/3rmonitor 里创建数据库和主控的签名钥匙。面板的系统语言取自终端的语言;要指定,可以写成例如 sudo MONITOR_LANG=zh 3rmonitor init …(en、es 或 zh)。
创建守护进程:主控本身、它的隔离配置,以及安装你在面板里发起的更新的 root 服务。
sudo tee /etc/systemd/system/3rmonitor-master.service >/dev/null <<'EOF'
[Unit]
Description=3R Monitor master (web panel, checks, alerts)
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=notify
NotifyAccess=main
User=3rmonitor
Group=3rmonitor
ExecStart=/opt/3rmonitor/3rmonitor master -c /etc/3rmonitor/master.conf
Restart=always
RestartSec=3
WatchdogSec=60
TimeoutStartSec=60
LimitNOFILE=65536
AmbientCapabilities=CAP_NET_RAW CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/3rmonitor
[Install]
WantedBy=multi-user.target
EOF
sudo mkdir -p /etc/systemd/system/3rmonitor-master.service.d
sudo tee /etc/systemd/system/3rmonitor-master.service.d/hardening.conf >/dev/null <<'EOF'
[Service]
ProtectSystem=strict
ReadWritePaths=/var/lib/3rmonitor
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectClock=true
ProtectHostname=true
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
LockPersonality=true
MemoryDenyWriteExecute=true
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK
UMask=0027
EOF
sudo tee /etc/systemd/system/3rmonitor-update.path >/dev/null <<'EOF'
[Unit]
Description=3R Monitor one-click update trigger (watches for a request from the panel)
[Path]
PathExists=/var/lib/3rmonitor/update/request
Unit=3rmonitor-update.service
[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/3rmonitor-update.service >/dev/null <<'EOF'
[Unit]
Description=3R Monitor one-click update (verifies the signed package, then runs install.sh upgrade)
[Service]
Type=oneshot
ExecStart=/opt/3rmonitor/3rmonitor apply-update -c /etc/3rmonitor/master.conf
TimeoutStartSec=20min
EOF启动并检查。
sudo systemctl daemon-reload
sudo systemctl enable --now 3rmonitor-master 3rmonitor-update.path
sleep 5
curl -fsS http://127.0.0.1:8899/healthz # {"status":"ok"}
3rmonitor statushardening.conf 让主控除了自己的数据目录哪里都写不了。少数系统(例如某些 LXC 容器)不支持其中的某些设置,主控就起不来(journalctl -u 3rmonitor-master 会写原因)。这时像 install.sh 一样把它删掉:
sudo rm -r /etc/systemd/system/3rmonitor-master.service.d
sudo systemctl daemon-reload && sudo systemctl restart 3rmonitor-master放行端口(服务器开着防火墙时):
sudo ufw allow 8899/tcp # ufw(Ubuntu、Debian)
sudo firewall-cmd --permanent --add-port=8899/tcp && sudo firewall-cmd --reload # firewalld(AlmaLinux、Rocky、RHEL)然后用管理员账号登录。
同时监控主控本身(主控 + 被控)
在主控上登记主控自己,并运行它的被控。它通过 127.0.0.1 向主控上报:
TOKEN=$(sudo 3rmonitor server add --name "$(hostname)" --group '主控服务器' --reuse -q)
sudo 3rmonitor bind --master http://127.0.0.1:8899 --token "$TOKEN"
sudo chmod 600 /etc/3rmonitor/agent.conf
sudo 3rmonitor agent --test
sudo 3rmonitor agent secure
sudo 3rmonitor approvers trust --yes-q 只输出密钥;已经有同名服务器时,--reuse 沿用它的密钥。approvers trust --yes 不经询问直接信任钥匙,因为主控就在这台服务器上。每一步的说明见下一节。
域名和 HTTPS
手动完成 --domain 和 --https 做的事:在 Nginx 或 Apache 里建反向代理,再用 certbot 申请 Let's Encrypt 证书。
sudo tee /etc/nginx/conf.d/3rmonitor.conf >/dev/null <<'EOF'
server {
listen 80;
server_name monitor.example.com;
client_max_body_size 8m;
location / {
proxy_pass http://127.0.0.1:8899;
proxy_http_version 1.1;
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 X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_buffering off;
proxy_read_timeout 1h;
}
}
EOF
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d monitor.example.com --no-redirect需要的话,先安装 certbot 和它的 Nginx 或 Apache 插件(python3-certbot-nginx 或 python3-certbot-apache;AlmaLinux、Rocky 和 RHEL 上来自 EPEL)。然后把 设置 → 常规 → 面板对外地址 改成 https://monitor.example.com/。
--no-redirect是故意的:向http://地址上报的被控照常工作,浏览器则由主控自己跳转到https://。见用 http:// 地址访问时。- 默认的
trust_proxy = auto已经会从同一台服务器上的代理取得访客的真实 IP。 - 要让面板只能通过代理访问,在
master.conf里用listen = 127.0.0.1:8899。但前提是没有其他服务器上的被控向http://IP:8899上报。
手动安装被控
先在面板里登记这台服务器(+ 添加服务器),或者在主控上执行 sudo 3rmonitor server add。然后从它的安装命令里取主控地址、密钥和指纹。
从主控下载程序并校验。 先设置 ARCH(见 CPU 架构)。
MASTER='https://monitor.example.com'
TOKEN='密钥'
mkdir -p /tmp/3rmonitor && cd /tmp/3rmonitor
curl -fsSL -o 3rmonitor-linux-$ARCH "$MASTER/dl/3rmonitor-linux-$ARCH?t=$TOKEN"
curl -fsSL -o SHA256SUMS "$MASTER/dl/SHA256SUMS?t=$TOKEN"
curl -fsSL -o install.sh "$MASTER/dl/install.sh?t=$TOKEN"
sha256sum -c --ignore-missing SHA256SUMS必须显示 3rmonitor-linux-…: OK。用 wget 时,把 curl -fsSL -o 文件 URL 换成 wget -qO 文件 URL。也可以直接用发布包里的这三个文件。
安装。
sudo install -D -m 755 3rmonitor-linux-$ARCH /opt/3rmonitor/3rmonitor
sudo install -m 755 install.sh /opt/3rmonitor/install.sh
sudo ln -sf /opt/3rmonitor/3rmonitor /usr/local/bin/3rmonitor
sudo ln -sf /opt/3rmonitor/3rmonitor /usr/bin/3rmonitor连接到主控。 这一步写入 /etc/3rmonitor/agent.conf:
sudo 3rmonitor bind --master "$MASTER" --token "$TOKEN"
sudo chmod 600 /etc/3rmonitor/agent.conf用绑定密钥时,把 --token 换成 --enroll '绑定密钥' --name web-2 --group 生产。主控用自签名证书时,加上 --insecure。
上报一次。
sudo 3rmonitor agent --test显示“上报成功:主控把这台机器登记为 #N……”。用绑定密钥时,服务器就是在这一步自动登记并保存自己的密钥的。
创建守护进程。
sudo 3rmonitor agent secure它创建用户 3rmonitor-agent(加入 adm 和 systemd-journal 组,以便读取日志),把 agent.conf 改为 root:3rmonitor-agent 0640。装有 setfacl 时,还让这个用户可以读取访问日志。然后创建并启动 root 辅助程序 3rmonitor-helper,以及以这个用户运行的 3rmonitor-agent 守护进程。完成时显示“被控现在以普通用户 3rmonitor-agent 运行……”。
信任钥匙,用于批准过的 AI 修复:
sudo 3rmonitor approvers trust --master-key 主控指纹 --approvers 通行密钥指纹不带指纹时,它会显示指纹并询问:和 设置 → 通行密钥 → 要核对的指纹 对照后输入 yes。
检查。
3rmonitor status
systemctl status 3rmonitor-agent 3rmonitor-helper几秒钟后,这台服务器会出现在面板的 服务器 列表里。
它会显示原因,例如缺少 useradd,或者辅助程序没有启动(journalctl -u 3rmonitor-helper)。排除原因后再执行一次。在此之前被控没有运行。如果实在无法解决,可以像 install.sh 在这种情况下那样以 root 运行被控。这样能监控服务器,但 AI 不会在它上面执行任何操作:
sudo tee /etc/systemd/system/3rmonitor-agent.service >/dev/null <<'EOF'
[Unit]
Description=3R Monitor agent (reports this server to the master)
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=notify
NotifyAccess=main
ExecStart=/opt/3rmonitor/3rmonitor agent -c /etc/3rmonitor/agent.conf
Restart=always
RestartSec=5
WatchdogSec=120
TimeoutStartSec=60
Nice=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now 3rmonitor-agent会创建哪些内容
| 主控 | 被控 | |
|---|---|---|
| 程序 | /opt/3rmonitor/3rmonitor,命令 3rmonitor 在 /usr/local/bin 和 /usr/bin | 相同 |
| 安装脚本,用于升级和卸载 | /opt/3rmonitor/install.sh | 相同 |
| 被控程序包 | /opt/3rmonitor/dist,带 SHA256SUMS 和它的签名 SHA256SUMS.sig | — |
| 配置 | /etc/3rmonitor/master.conf(root:3rmonitor,0640) | /etc/3rmonitor/agent.conf(root:3rmonitor-agent,0640) |
| 数据 | /var/lib/3rmonitor:数据库和签名钥匙,属于 3rmonitor 用户 | /var/lib/3rmonitor-helper:信任的钥匙,只有 root 能访问 |
| 用户 | 3rmonitor | 3rmonitor-agent |
| 守护进程 | 3rmonitor-master(带 3rmonitor-master.service.d/hardening.conf)、3rmonitor-update.path 和 3rmonitor-update.service | 3rmonitor-agent、3rmonitor-helper |
升级和卸载
和用 install.sh 安装之后一样。主控在面板里升级,或者在新发布包的目录里执行 sudo bash install.sh upgrade;被控会自动更新。要卸载,执行 sudo bash /opt/3rmonitor/install.sh uninstall,加 --purge 会连配置和数据一起删除。见升级与卸载。