monitor

部署

Docker 部署

10 MB 的 scratch 镜像,一条 docker run。

镜像是 FROM scratch 里放同一个 musl 静态二进制加一份 zoneinfo,约 10 MB,以 uid 65534 运行。

docker run -d --name monitor -p 28080:28080 \
  -v monitor-data:/data -e TZ=Asia/Shanghai \
  ghcr.io/stqfdyr/monitor
bash

首次启动的应急密码在日志里:

docker logs monitor | grep Emergency
bash

compose

services:
  monitor:
    image: ghcr.io/stqfdyr/monitor
    container_name: monitor
    restart: unless-stopped
    # 127.0.0.1 而不是 0.0.0.0:容器端口只对本机开,域名由反代接进来。
    ports:
      - "127.0.0.1:28080:28080"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - monitor-data:/data
 
volumes:
  monitor-data:
yaml

反代照反向代理那一页配,上游写 127.0.0.1:28080

TZ 必须设

TZ 要设成 hub 所在的时区。 日流量和账单周期按本地日期切换,不设就按 UTC 算—— 到点不归零,也不会有任何报错。这是这个镜像唯一一个「不设就静默算错」的地方。

数据

数据库和主题目录都在 /data,就是二进制部署里 /opt/monitor/data 的那一份。

挂主机目录代替 named volume 时,先把属主改对——镜像里没有 shell,容器也不以 root 跑, mkdirchown 都做不了:

sudo mkdir -p /srv/monitor && sudo chown 65534:65534 /srv/monitor
docker run -d --name monitor -p 127.0.0.1:28080:28080 \
  -v /srv/monitor:/data -e TZ=Asia/Shanghai ghcr.io/stqfdyr/monitor
bash

容器里为什么绑通配符

镜像的 ENTRYPOINT 不带 --listen,用的是二进制自己的默认值 [::]:28080。 容器里绑回环,-p 就映射不进去。

所以对外的那道闸交给 -p:写 127.0.0.1:28080:28080 而不是 28080:28080, 效果和一键脚本装出来的一样——端口只在本机可达,公网要经过反代。

升级

docker pull ghcr.io/stqfdyr/monitor
docker rm -f monitor && docker run -d ...   # 同一条命令,数据在 volume 里
bash

agent 不提供镜像

这是有意的。agent 是一个无运行时依赖、常驻几 MiB 的静态二进制,而它要装的地方通常是那批 资源最少的 VPS。为它引入一整套容器运行时,账算不过来。

被监控的机器直接跑安装命令就好。