Docs
安装

手动安装

安装主控和被控的其他各种方式:在每台服务器上用发布包、先下载安装脚本、用 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_643rmonitor-linux-amd64
aarch643rmonitor-linux-arm64
armv7l3rmonitor-linux-arm
i686、i3863rmonitor-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 status

hardening.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

几秒钟后,这台服务器会出现在面板的 服务器 列表里。

会创建哪些内容

主控被控
程序/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 能访问
用户3rmonitor3rmonitor-agent
守护进程3rmonitor-master(带 3rmonitor-master.service.d/hardening.conf)、3rmonitor-update.path 和 3rmonitor-update.service3rmonitor-agent、3rmonitor-helper

升级和卸载

和用 install.sh 安装之后一样。主控在面板里升级,或者在新发布包的目录里执行 sudo bash install.sh upgrade;被控会自动更新。要卸载,执行 sudo bash /opt/3rmonitor/install.sh uninstall,加 --purge 会连配置和数据一起删除。见升级与卸载。

本页目录