Skip to content
Velox Logo
Go back

✨[实战] 打造 Polaris 探针Web面板

Edit page

一句话:用 Go 标准库做的私有 VPS 监控台,单管理员、探针上报,不对外开面板端口。

登录页


为什么要自己写一个 🧭

市面上监控方案很多:Prometheus + Grafana 全家桶、各种 SaaS 探针、宝塔类面板……对「就几台小鸡、自己用」来说,往往偏重:

我想要的很简单:

  1. 自己看自己的机器(CPU / 内存 / 磁盘 / 负载 / 流量 / TCP 探测)
  2. Agent 不 SSH、不 root 也能报
  3. 面板只走 Cloudflare Tunnel + Turnstile
  4. 二进制嵌入 UI,部署像丢一个盒子

于是有了 Polaris(北极星)。


它现在能做什么 🛰️

探针侧(polaris-agent)

面板侧(polaris)


UI 展示页

手机总览 手机节点详情

UI 展示页是节点总览,上面一张是PC局部浏览图,下面两张是手机上的样子:左边是手机总览,右边是点进单个节点后的手机节点详情,CPU、内存、下行、上行、VPS 详情、三网 TCP 建连延迟都在里面.

手机:加到主屏幕 📱

浏览器加到主屏幕就是一个独立的 Web 应用,打开没有地址栏,跟 App 差不多。

注意两点:加到主屏幕后打开还是要登录,人机验证一样要过;如果以后图标、启动图换了,iOS 那边删了重加一次才生效,只改服务器是刷不掉旧图标的。隧道加载要几秒,打开先是深色底,那是在加载数据,不是死了。


架构一览 🏗️

┌─────────────┐      HTTPS 上报 / 15s      ┌──────────────────┐
│ polaris-agent│ ─────────────────────────► │  polaris (Go)    │
│  (无特权)    │  POST /api/v1/report       │  嵌入式 Web UI   │
└─────────────┘  Token 哈希校验            │  store / session │
                                           │  数据卷: /data   │
                                           │  nodes · history │
                                           └────────┬─────────┘
                                                    │
                    ┌───────────────────────────────┼──────────────┐
                    │ 仅 Compose 内网               │ 通知         │
                    ▼                               ▼
           ┌────────────────┐              ┌──────────────┐
           │  cloudflared   │              │  Telegram    │
           │  (CF Tunnel)   │              └──────────────┘
           └────────┬───────┘
                    ▲ HTTPS
                    │
           用户浏览器 / Turnstile

设计原则可以概括成三句:

  1. 标准库优先:HTTP、模板、嵌入、压缩,尽量少拉第三方。
  2. 探针可信边界清晰:Token 只存哈希;原始 Token 创建时看一次,丢了就重建节点。
  3. 公网只暴露隧道入口:面板端口不对宿主机发布。

一、装前:先拿到两个东西

后面 setup-secrets.sh 问的密钥、Token,全是从下面这两处来的,先建好再装,不要边装边找。

1. 建 Tunnel,拿隧道 Token

  1. 进 Cloudflare 控制台, Networks → Tunnels → Create a tunnel,选 Remotely managed。
  2. 给隧道起个名字,创建后会给一段隧道 Token,先复制保存好,后面 setup 会问。
  3. 在隧道里加一条 Public Hostname:子域名填面板域名,Service 选 HTTP,URL 填 http://polaris:8080。
  4. DNS 那条记录 Cloudflare 会自己处理,不用手动再加。

2. 建 Turnstile,拿 Site Key 和 Secret Key

  1. 进 Cloudflare 控制台,Application Security → Turnstile → Add widget。
  2. 域名填面板域名,模式用默认的 Managed 就行。
  3. 创建后会给 Site Key 和 Secret Key,两个都要保存好。
  4. 后面 setup 问 Turnstile Secret 时填两遍。

二、安装 🚀

0. 先装 Docker 环境

sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker --version
docker compose version

1. 初始化密钥

cd /opt
git clone https://github.com/pwenxiang51-wq/Polaris
cd /opt/Polaris
bash ./scripts/setup-secrets.sh

按提示填:面板域名、管理员账号、管理员密码、Turnstile Site Key、Turnstile Secret key、Telegram Token(可选)、Telegram Chat ID、Cloudflare Tunnels Token。

删旧 TG,删完面板显示 Telegram: 未开启:

cd /opt/Polaris
: > secrets/telegram-bot-token
: > secrets/telegram-chat-id
docker compose up -d --force-recreate polaris

补新 TG,补完面板显示 Telegram: 已开启:

cd /opt/Polaris
printf '%s\n' '你的 Telegram Token' > secrets/telegram-bot-token
printf '%s\n' '你的 Chat ID' > secrets/telegram-chat-id
chown root:10001 secrets/telegram-bot-token secrets/telegram-chat-id
chmod 440 secrets/telegram-bot-token secrets/telegram-chat-id
docker compose up -d --force-recreate polaris

在 VPS 终端里跑,只 restart 不够,必须 force-recreate。

2. 启动

docker compose up -d --build
docker compose ps

polaris-polaris-1 应为 Up (healthy),polaris-cloudflared-1 为 Up。重编镜像必须带 --build,只用 --force-recreate 是只重建容器、不重编镜像。

3. 下载 Go,版本跟面板用的 1.27 对得上就行

下面第 3 步和第 4 步,面板机和新加的 VPS 都要做。面板机做完第 1 步和第 2 步,再做第 3 步和第 4 步。新加的 VPS 不做第 1 步和第 2 步,直接做第 3 步和第 4 步,不跑 setup-secrets.sh,不用 docker compose。新加 VPS 之前,先在面板上添加这台 VPS,把整段探针配置复制下来,再去这台 VPS 上做第 3 步和第 4 步。每个 VPS 用自己的 Token,别拿已建好那台 VPS 的 Token 去复用。

wget https://go.dev/dl/go1.27.3.linux-amd64.tar.gz -O /tmp/go.tgz

ARM 机子把 linux-amd64 换成 linux-arm64。

4. 装探针

探针在主机上编,面板在 Docker 里编,探针运行只需要编出来的几 MB 文件。

  1. 先把主机上旧 Go 删干净再解压:
rm -rf /usr/local/go
tar -C /usr/local -xzf /tmp/go.tgz
export PATH=$PATH:/usr/local/go/bin
  1. 进仓库目录。面板机第 1 步已经克隆过了,直接进目录就行。新加的 VPS 还没有仓库,先克隆,再进目录:

面板机:

cd /opt/Polaris

新加的 VPS:

cd /opt
git clone https://github.com/pwenxiang51-wq/Polaris
cd /opt/Polaris

安装命令必须在 /opt/Polaris 这个目录里跑,当前目录里必须同时有 polaris-agent 和 scripts/install-agent.sh,在 /root 里直接跑会报找不到文件。

  1. 编探针,一次粘贴整句,不要在 -o 后面断行:
CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o polaris-agent ./cmd/polaris-agent
ls -lh polaris-agent
  1. 编出来看到几 MB 的文件才算编成,别的架构大小会不一样,不用死卡 5.2M。然后装探针:
sudo bash ./scripts/install-agent.sh
  1. 第一次会停下,让你改环境文件:
sudoedit /etc/polaris-agent.env
  1. 把面板上复制的整段探针配置原样粘贴进去,服务器地址、节点 ID、节点名、Token 全替换,不要只换 Token 一行。保存退出,再执行一次:
sudo bash ./scripts/install-agent.sh

第二次跑之前脚本会查占位词和 Token 长度(面板 Token 是 43 位,合理范围 40-256 位),有占位词就直接停下,不启动;没占位词就启动,看到 active (running),面板 50 秒内在线。

登录面板,面板在线就说明装好了,可以点看板的小铅笔填写 VPS 详情与套餐信息。

如果不想在新加的 VPS 上装 Go,也可以把编好的探针文件直接拷过去,但光拷探针文件不够,还要把仓库克隆过来、把探针文件放到 /opt/Polaris 目录里,再进这个目录跑 install-agent.sh,效果一样,新加的 VPS 上就不用装 Go 了。


三、拉取

仓库脚本、前端改了,不用重装,先拉后编,拉取单独跑一遍:

cd /opt/Polaris
git pull origin main
docker compose up -d --build
docker compose ps

拉取不会动已建好的密钥文件。编完新镜像、容器起来,改动就生效。

语言切换那类前端改动:切完语言按钮,验证框不会立刻变,按 F5 刷新一次,重新生成的验证框才会跟新语言一致。


四、卸载 🧹

面板机卸载:面板、探针、验收三块都做。

新加的 VPS 卸载:只做探针那块,面板那块和 docker 验收不用做,新机子上没有面板容器,docker 那三句查了也是空的。

面板:

cd /opt/Polaris
docker compose down -v
cd /
rm -rf /opt/Polaris
docker rmi polaris:local cloudflare/cloudflared:latest golang:1.27-alpine
docker builder prune -f

探针:

systemctl stop polaris-agent
systemctl disable polaris-agent
rm /etc/systemd/system/polaris-agent.service
systemctl daemon-reload
rm /usr/local/bin/polaris-agent
rm /etc/polaris-agent.env
userdel polaris-agent
rm -rf /usr/local/go
rm -rf /root/go
rm -rf /root/.cache/go-build
rm -f /tmp/go.tgz

go清理缓存:

go clean -cache -modcache

Go 编译缓存 /root/go 第一次编完很小,多次重编才会攒起来,平时稳定运行不涨,盘紧或者攒到 1、2G 再用这条指令平时不用清。

验收:

docker system df
docker ps -a
docker volume ls

全是 0 才算干净。

卸了探针,面板上那台 VPS 不会自动消失,只会变离线,要彻底删还得在面板上把那台 VPS 的条目也删了。


五、误删 VPS 看板后重新添加

面板里把一台 VPS 的条目删了,探针还在机器上跑,但旧 Token 已经作废了,面板会一直离线、报 401。按下面这几步重新加回来,不用重装探针:

  1. 面板里先删掉那条旧的,再新建一条,同名、同额度、同计入模式、同到期日,拿到新 Token,把整段探针配置复制下来。

  2. 到那台 VPS 的终端里,改环境文件,把整段配置原样粘贴进去,服务器地址、节点 ID、节点名、Token 全替换,不要只换 Token 一行:

sudoedit /etc/polaris-agent.env
  1. 保存退出,再跑一次安装脚本:
sudo bash ./scripts/install-agent.sh

如果报找不到文件,是你站错目录了,安装脚本在 /opt/Polaris 里,不在 /root 里,先进目录再看一眼,确认 polaris-agent、scripts/install-agent.sh、deploy/systemd/polaris-agent.service 都在,再跑安装脚本:

cd /opt/Polaris
ls
  1. 安装脚本的 enable --now 只在服务没跑的时候启动,服务已经在跑了,它不会重启,探针还用旧 Token 上报,必须手动重启一次:
systemctl restart polaris-agent.service

重启后 15-30 秒,面板 50 秒内在线。


写在最后 🌟

装好之后日常就很简单:打开面板,看一眼节点在不在线、CPU、内存、流量、到期、三网延迟,有离线、额度、到期提醒 Telegram 会直接发过来,不用经常 SSH 上去查。

Polaris 从一开始就不是给多人、多租户做的,就是给自己几台小鸡用的:私有、轻量、自己编译、自己部署,代码可以公开,实例必须私有。够用,就不往上加东西了。


本文首发于 Velox 的极客空间。


Edit page
Share this post on:

Previous Post
🚀[实战] HyperOS 终极脱敏续篇:314 个系统包全扫一遍,又卸载 6 个系统包
Next Post
🚀[实战] HyperOS 2.0 / 3.0 终极脱敏:免 Root 物理封杀小米内置反诈与遥测