Grafana
pg addon install grafana 以受管容器方式运行 Grafana——开源可观测性面板——直接跑官方上游镜像。与 pgAdmin 一样,它是顶层插件:不依附于任何单个 PostgreSQL 实例,也不会自动前置它们——数据源和仪表盘都在 Web UI 里自己添加。v1 是纯 Web UI:配置只经环境变量(GF_*)交付,不挂载任何 datasource/dashboard 的 provisioning。
Web 登录密码在首次安装时自动生成、打印一次、存入 pg.yaml,之后用 pg addon password grafana 取回。与 pgAdmin 不同,Listen 默认 0.0.0.0:监控面板天然要给别的机器看,而容器跑在宿主网络上。暴露面由自动生成的强密码与关闭自助注册兜底——只想本机访问就传 --listen 127.0.0.1。
平台:Linux 是已实测的平台。设计上也支持 macOS(镜像多架构;容器在
pgcli-netbridge 上以发布端口的方式跑在 podman machine 里),但尚未在 Mac 上验证过。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--name |
grafana |
实例名(map 键) |
--image |
docker.io/grafana/grafana:13.2.4 |
覆盖镜像 |
--port |
自动(基址 3000) | Web 宿主端口;自 grafana_start_port 自动分配 |
--listen |
0.0.0.0 |
绑定地址——默认开放全部网卡;127.0.0.1 收紧为仅回环 |
--admin-user |
admin |
Web 登录账号(GF_SECURITY_ADMIN_USER) |
--password |
自动生成 | Web 登录密码(GF_SECURITY_ADMIN_PASSWORD;缺省时生成,只在首次启动时生效,见下) |
--data-dir |
自动 | 覆盖数据目录(默认在 base 目录下) |
--force |
false | 即使正在运行也重建——用于应用改动的端口、凭据或监听地址 |
数据目录存放 Grafana 自己的 sqlite 元数据库(grafana.db):仪表盘、数据源、用户与设置都在里面。它跨 pg addon remove 存活(用 --clean-data 才删除),重装同名实例即复活一切。镜像的 entrypoint 不做属主修复(它以固化的 uid 472、root 组运行,目录不可写时只会告警),所以 pgcli 在创建容器前先在宿主上把数据目录 chown 过去:rootless podman 下经 podman unshare chown 472:0,rootful 宿主且 pgcli 以 root 运行时直接递归 chown。
安装
命令会按需拉取镜像、创建容器,并打印 URL 与登录密码:
用浏览器打开 URL,以打印的凭据登录。在 UI 里添加 PostgreSQL 数据源(Connect data → PostgreSQL;每个受管实例的宿主端口在其 pg.yaml 条目里,或由 pg status <instance> 显示),再基于它搭建仪表盘。
GF_SECURITY_ADMIN_USER / GF_SECURITY_ADMIN_PASSWORD 只在 grafana.db 不存在时生效——它们初始化登录,不覆盖登录。在保留的数据目录上重装,Web 登录仍是原来的;此次打印的密码无效(install 会明说)。要修改既有存储的登录,进容器跑 grafana-cli admin reset-admin-password <new>(pg exec 风格:podman exec -it <container> ...),或 --clean-data 移除后重装。
重复 install 会复用运行中的容器、启动已停的容器——配置改动只有 remove + 重装或 --force 之后才生效。
监听与暴露
Grafana 的 Listen 默认 0.0.0.0:容器共享宿主网络命名空间,所以面板在宿主每个网卡的分配端口上可达。这是有意为之——监控面板就是给别的机器看的——并由自动生成的强 admin 密码加 GF_USERS_ALLOW_SIGN_UP=false(关闭自助注册)保护。想要仅回环的部署,传 --listen 127.0.0.1(用 --force 重建);pg addon list 会显示 http://127.0.0.1:<port>/。--listen <addr> 也接受任意指定网卡的地址。
取回 Web 登录
这个登录是 Grafana 的 Web 签名,与任何 PostgreSQL 角色无关。随时可重读密码:
它也存于 pg.yaml(addons.grafana.<name>.password)。
端口
每个 Grafana 实例占有一个端口:Web UI。它取自以 grafana_start_port(默认 3000——Grafana 惯例端口;从 3000 起步是因为书签和文档都默认它)为基址的端口池,每多一个实例递增,并跳过任何已被受管容器或 used_ports 列表占用的端口。分配结果写入 pg.yaml,所以重装绝不会把别的插件在用的端口再发一遍:
Grafana 的端口池基址与其他任何插件都不重号;显式 --port 仍然优先。
配置
配置只经环境变量(GF_*)交付:镜像内的 grafana.ini 从宿主上不可编辑。pgcli 设置的变量有:登录对、监听器(端口 + 绑定地址)、关闭上报(GF_ANALYTICS_REPORTING_ENABLED / GF_ANALYTICS_CHECK_FOR_UPDATES)、GF_USERS_ALLOW_SIGN_UP=false。更多配置不在 v1 范围内;需要不同构建就用 --image 覆盖镜像。
列出
默认不显示密码以保持列表可安全粘贴;pg addon list --show-password 揭示明文,pg addon password grafana 则为脚本裸打印单个密码。
启停
容器以 podman 的 unless-stopped 重启策略运行,宿主重启后随 podman 服务自动回来。start/stop 显式管理它们:
开机自启
要让 Grafana 实例在宿主开机时自动启动,开启它:
这会在 pg.yaml 里给实例打标记,并安装/刷新一个开机服务(Linux 上是 systemd --user unit,macOS 上是 LaunchAgent)来执行 pg start --autostart。开机启动只负责把容器拉起来——数据目录在创建时已 chown 过,除 podman 本身外不需要任何宿主特权。完整机制、状态与关闭方式见 开机自启。
移除
rootless podman 下,--clean-data 经 podman unshare rm 删除数据目录——Grafana 以容器内 uid(472)写文件,它映射到宿主的 subordinate uid,宿主用户无法直接 rm。
日志
排障
install失败于 “chowning Grafana data dir … to 472:0” —— 镜像以 uid 472 运行且从不自己修复属主,所以 pgcli 在创建容器前先把宿主数据目录 chown 过去:rootless podman 下经podman unshare chown(映射后的 subordinate uid 才是正确目标),rootful 宿主且 pgcli 自身以 root 运行时(sudo podman,或以 root 跑pg)直接递归chown。pgcli 是直接调用podmanCLI,所以只在这两种情形之外才会失败——例如非 root 的pg被显式指向别人的 rootful daemon。遇到时以 root 跑 install,或改用 rootless podman;单纯sudo chown -R 472:0 <data-dir>不能消除该错误,因为每次 install 都会重新校验属主。- 登录密码不对 ——
GF_SECURITY_ADMIN_PASSWORD只在grafana.db不存在时初始化登录。对既有存储用容器内grafana-cli admin reset-admin-password <new>,或pg addon remove grafana --clean-data+ 重装(会清掉仪表盘)。 - 从别的机器打不开面板 ——
Listen默认0.0.0.0,端口在宿主所有网卡上是开的;打不开就是宿主防火墙的问题,不是绑定地址。用pg addon list确认端口,然后放行。 - 端口已被分配 —— 已分配的端口记在
pg.yaml里并为后续实例跳过;先pg addon remove释放,或用--port N另选一个。 - 数据加载失败 / 容器以权限告警退出 —— 数据目录必须保持 uid 472 所有;在宿主上手动
chown过、或用错误属主恢复过备份都会破坏它。重跑 install(--force)重新应用属主修复。
已知限制
- v1 是裸 Web UI:没有 datasource/dashboard provisioning,不支持反代子路径(没有
--root-urlflag——GF_SERVER_ROOT_URL不设置,所以要在根路径上用 nginx 前置),且是明文 HTTP(TLS 终止是 nginx 插件的职责)。 - 宿主侧的属主 chown 在 rootless podman(
podman unshare chown)下自动完成,pgcli 以 root 跑在 rootful 宿主上也自动完成(直接chown)。非 root 的 pgcli 连接一个显式配置的远程 rootful daemon 时没有自动路径。 - macOS 上容器跑在 podman machine 里;目前只在 Linux 上验证过。