多 VPS 统一监控(五):Portainer(一)初始化与多机接管

这是《多 VPS 统一监控》系列的第五篇。前四篇搭好了 Beszel(看机器)和 Uptime Kuma(盯服务)。这篇讲 Portainer:把四台机器的 Docker 容器接到一个页面里统一管理——看日志、重启容器、更新镜像,不用每台都 SSH 上去敲命令。

管理员账号初始化:三次翻车,一次 API 直建

Portainer 容器第一次启动后,创建初始管理员账号只有 5 分钟窗口,超时就得重启容器重来。我在这个环节翻车了三次:

  • 第一次:在页面上填完信息点创建,5 分钟超时,账号没建上;
  • 第二次:浏览器端校验直接把密码拦了——Portainer 要求密码至少 12 位,输短了;
  • 第三次:密码够长了,点创建后按钮一直转圈。查服务端日志,请求根本没到达 Portainer(当时手机走移动数据访问,网络路径不太稳)。

三次都是浏览器端的问题,服务端其实是好的。于是换路子:重启容器拿回初始化窗口,直接调官方 API 建账号:

# 1. 重启 Portainer,5 分钟初始化窗口重新打开
docker restart portainer

# 2. 趁窗口期用 API 初始化管理员(Portainer 官方接口)
curl -sk -X POST https://manage.nettodata.com/api/users/admin/init \
  -H 'Content-Type: application/json' \
  -d '{"Username":"admin","Password":"16位随机临时密码"}'

# 3. 验证:管理员已存在即初始化成功
curl -sk -o /dev/null -w "%{http_code}\n" \
  https://manage.nettodata.com/api/users/admin/check
# 返回 204 = 成功

第 3 步返回了 204,账号建好了。16 位临时密码当场就发给了我(小缪这边没存档),第一件事就是登录后去右上角 My account → Change password 换成自己的长密码。万一哪天密码丢了,官方有 portainer/helper-reset-password 工具可以重置,不用慌。

小白建议:直接在页面建,密码一次设够 12 位以上,网络稳的时候操作,一般一次就成。我那三次属于叠满了 debuff。

把另外三台接进来

默认 Portainer 只管它自己所在的这台机器(local 环境)。要点进 Environments 才能看到全貌——当时我就纳闷“怎么只有一个 VPS”,就是这个原因。要把另外三台接进来,每台要装一个 Portainer Agent。

Agent 和服务端版本要对应。服务端是 2.45.2,Agent 镜像就用 portainer/agent:2.45.2——注意 portainer/agent:2 这个 tag 不存在,我第一次就写错了,docker 拉镜像直接报错。在每台被管机器上跑:

docker run -d \
  --name portainer_agent \
  --restart=always \
  -p 9001:9001 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  portainer/agent:2.45.2

装完在被管机器上确认 9001 通了,再回到 Portainer 注册 Environment。注册走的是 Portainer API,当时用的命令大致是这样:

# 1. 先拿 JWT(替换成你的 Portainer 管理员密码)
JWT=$(curl -sk -X POST https://manage.nettodata.com/api/auth \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"你的Portainer密码"}' \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['jwt'])")

# 2. 注册 Agent Endpoint
curl -sk -X POST https://manage.nettodata.com/api/endpoints \
  -H "Authorization: Bearer $JWT" \
  -F 'Name=Bandwagon' \
  -F 'URL=tcp://:9001' \
  -F 'TLS=true' -F 'TLSSkipVerify=true' -F 'TLSSkipClientVerify=true'

有三个容易错的点:

  • 接口要的是 multipart 表单(curl 的 -F 参数),不是 JSON,传 JSON 会被拒;
  • Agent 用的是自签证书,要带上 TLS=true、TLSSkipVerify=true、TLSSkipClientVerify=true 三个参数跳过校验;
  • 地址格式是 tcp://IP:9001,要带 tcp:// scheme。

三台注册完,Environments 里变成 4 个:local(博客主机)、Bandwagon、RackNerd-1G、Dedirock,状态全 up:

Portainer 环境列表:四个环境全部 Up
Portainer 的 Environments 页面:4 个环境全部 Up(IP 部分已打码)。红框标出的是顶部的统计——这就是“一个页面管四台”的起点。

下一篇

下一篇《多 VPS 统一监控(六):Portainer(二)排障实录与收尾》讲三个实战坑:Agent 镜像 tag 不存在、107 那台 Docker 转发坏了、Dedirock 密码里的特殊字符把脚本搞炸,以及系列收尾。

发表评论