跳到主要内容

单机部署(Docker Compose)

适用于 HAP 单机模式。整套运维平台共用单一镜像 ops-allinone,各服务靠 ROLE 区分角色,只需拉取一个镜像,离线交付也是一个文件。

前置条件

运维平台是旁路观测系统,它不自带被监控对象,装之前请确认:

前置项说明
一套已部署并跑起来的 HAP单机或集群均可。运维平台观测的是这套 HAP 及其依赖的中间件
被监控的中间件已就绪MongoDB / MySQL / Redis / Kafka / Elasticsearch,按实际部署的填,没有的可以不填
中间件账号权限部署总览。MongoDB 基础采集需 clusterMonitor;若要用慢查询诊断,还需目标库的 dbAdmin(平台会为其开启 profiling),完整示例见数据源
资源4C / 8G / 100G+ 磁盘

观测范围:主机资源、上述中间件的运行指标、HAP 各微服务日志、MongoDB 慢查询诊断、以及基于这些数据的告警。不观测 HAP 内部的业务数据(工作表内容、用户数据等)。

单机部署不含链路追踪

调用链路(APM)需要 HAP 集群侧的上报能力,单机部署没有链路数据,「链路追踪」页会是空的,这是预期行为、不是故障。需要链路追踪请用集群部署

HDP、Flink 是可选项:部署了就填对应地址接进来,没部署留空即可,不影响其余功能。

第 1 步:确定安装位置

不要和 HAP 安装器的目录混用

HAP 私有部署安装器会独占并重写 /data/hap/script/ 目录。把运维平台的 ops.yaml 和数据卷也放进去,遇到 HAP 重装 / 覆盖安装时会互相破坏(7.3.x 安装器在该目录已存在时还会把模板嵌套进 script/.script/,安装报错且现场信息误导性很强,7.4.0 已修)。

请把运维平台放在独立目录,例如 /data/hap/mdis/,再通过下面的 networks 段接入 HAP 所在的 Docker 网络——这样既能用服务名访问 HAP 的中间件,又与安装器互不干扰。

运维平台的数据卷统一收在 volume/data/mdis/ 一层之下(指标 / 日志 / 链路 / 告警库各一个子目录)。这样做的好处:清理、备份、单独挂数据盘都只需操作一个目录;也不会和 HAP 的目录混在一起——HAP 的业务库是 volume/data/mongodb,与本平台的 volume/data/mdis/mongo 只差两个字母,放在同级极易误删。

先确认 HAP 所在的网络名(通常是 script_default):

docker network ls

第 2 步:拉取镜像(离线包下载

docker pull nocoly/ops-allinone:1.5.7

第 3 步:创建配置文件

mkdir -p /data/hap/mdis && cat > /data/hap/mdis/ops.yaml <<\EOF
x-ops-image: &ops_image nocoly/ops-allinone:1.5.7 # 所有服务共用,靠 ROLE 区分角色

x-common-env: &common_env
TZ: "Asia/Shanghai"
ENV_OPS_TOKEN: "your-ops-access-token-change-me" # 访问令牌,首次部署务必修改
# ENV_OPS_SUB_PATH: /mdis # 反代挂子路径时填,直接端口访问则删

# ⚠️ 被监控对象(MySQL / MongoDB / Redis / Kafka / Elasticsearch / 主机 /
# Flink)不在本文件配置。装完打开「数据源」页添加,
# 或下载 YAML 模板批量导入(导入时会逐条测连接)。详见下方「采集配置从哪里读」。

ENV_PROMETHEUS_SERVER: "http://ops-prometheus:9090"

# 告警子系统(1.4.0)
ENV_OPS_MONGODB_URI: "mongodb://ops-mongo:27017" # 告警自有存储
ENV_MONGODB_COLLECTION_PREFIX: "mdis_"
ENV_ALERT_CRYPTO_KEY: "change-me-to-32-byte-secret" # 凭据加密密钥,务必改随机串

services:
gateway:
image: *ops_image
restart: always
ports:
- "48881:48881"
environment:
<<: *common_env
ROLE: gateway
depends_on:
- ops-prometheus
- ops-grafana
- ops-loki
- ops-tempo
- ops-alloy
- ops-mongo

ops-prometheus:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/prometheus/:/data/mdis/prometheus/
environment:
<<: *common_env
ROLE: prometheus

ops-grafana:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/grafana/:/data/mdis/grafana/
environment:
<<: *common_env
ROLE: grafana
GF_SECURITY_ALLOW_EMBEDDING: "true"
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: Editor
GF_SECURITY_COOKIE_SAMESITE: lax
GF_USERS_DEFAULT_THEME: light

ops-loki:
image: *ops_image
restart: always
ports:
- "3100:3100" # 供 HAP 侧推送服务日志;HAP 与本平台同机时可删掉这行
volumes:
- ./volume/data/mdis/loki/:/data/mdis/loki/
environment:
ROLE: loki
ENV_LOKI_RETENTION: "720h" # 日志保留时长,默认 30 天
# 日志落对象存储(可选,不填用容器本地文件系统)。endpoint 必须是「本容器网络里能解析到」
# 的地址:自建 MinIO 若不在同一个网络(例如另起的 stack 或装在宿主机上),要填宿主机 IP +
# 宿主机映射端口,不能写对方的容器名,否则报 no such host。
# MinIO / US3 用 path style(true);腾讯云 COS 只支持 virtual-hosted,必须填 false。
# ENV_S3_ENDPOINT: "http://192.168.1.12:9000"
# ENV_S3_BUCKET: "mdis-loki"
# ENV_S3_ACCESS_KEY: "your-access-key"
# ENV_S3_SECRET_KEY: "your-secret-key"
# ENV_S3_FORCE_PATH_STYLE: "true"

ops-tempo:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/tempo/:/data/mdis/tempo/
environment:
ROLE: tempo
ENV_TEMPO_RETENTION: "720h" # 链路数据保留时长,默认 30 天
# 注:单机部署不具备链路追踪能力,此处不配置对象存储;链路 + 对象存储属于集群场景,见 K8s 文档。

ops-alloy:
image: *ops_image
restart: always
ports:
# Alloy 的 OTLP 接收端口。单机部署不产生链路数据(见本页前置条件),
# 这两个端口保留但通常用不上,与 HAP 端口冲突时可直接删掉。
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./volume/data/mdis/alloy/:/data/mdis/alloy/
environment:
ROLE: alloy
ENV_TEMPO_GRPC_URL: "http://ops-tempo:4317"
ENV_PROMETHEUS_REMOTE_WRITE_URL: "http://ops-prometheus:9090/prometheus/server/api/v1/write"
ENV_LOKI_PUSH_URL: "http://ops-loki:3100/loki/api/v1/push"

# 告警子系统自有 MongoDB(1.4.0 新增,存规则/状态/历史/渠道/数据源,与被监控目标解耦)
ops-mongo:
image: *ops_image
restart: always
environment:
ROLE: mongo
volumes:
- ./volume/data/mdis/mongo/:/data/mdis/mongo

agent:
image: *ops_image
restart: always
environment:
<<: *common_env
ROLE: agent

nodeagent:
image: *ops_image
restart: always
volumes:
- /:/host:ro,rslave
network_mode: host
pid: host
environment:
<<: *common_env
ROLE: nodeagent

# 直接复用 HAP 所在的网络,这样可以用服务名(如 sc)访问被监控的中间件。
# name 填 docker network ls 里 HAP 那个网络的实际名字。
networks:
default:
external: true
name: script_default
EOF

第 4 步:启动与访问

docker compose -f /data/hap/mdis/ops.yaml up -d # 启动
docker compose -f /data/hap/mdis/ops.yaml down # 停止

浏览器访问 http://部署服务器IP:48881,登录 Token 为 ops.yaml 里的 ENV_OPS_TOKEN

第 5 步:验证

装完建议跑一遍随包提供的端到端回归脚本,确认全链路正常:

pip install playwright && playwright install chromium
python3 mdis_regression.py --base http://<主机IP>:48881 --token <ENV_OPS_TOKEN>

退出码 0 为全部通过。遇到问题先看 UI「数据源」页的采集状态列,再查阅常见问题


装完之后

登记要监控的对象

只有一个地方:UI「数据源」页。 ops.yaml 只描述平台自己要用什么,不描述要监控谁。

新增数据源、改密码、启停都在数据源页,改完即时生效(30 秒内),不用重启任何容器。

批量接入

一次要接十几个实例时,用数据源页右上角的「批量导入」:

  1. 先「下载 YAML 模板」,里面每类数据源各有一条带注释的示例
  2. 改成自己的地址,回到页面上传
  3. 建议先点「仅校验」——只做格式校验和逐条连接探测,不写入任何数据
  4. 确认无误再点「导入」

按「类型 + 名称」幂等:同名条目是更新而不是新建,同一份文件可以反复导入。 更新已有条目时密码留空 = 沿用原密码。探测不通不会阻止导入(配置可以先落地、 服务稍后再起),但结果里会逐条标出来。

自动化部署可以直接调接口,不必经过页面:

curl -X POST "http://部署服务器IP:48881/api/alert/sources/import" \
-H "Content-Type: application/yaml" \
--data-binary @datasources.yaml
1.5.0 起 ops.yaml 不能再配数据源

1.4.x 支持在 ops.yaml 里用 ENV_MYSQL_* / ENV_REDIS_* / ENV_KAFKA_ENDPOINTS 等 配置被监控对象,首次启动播种成数据源。1.5.0 已移除这套机制,这些变量不再被读取 (配了也没用,启动日志会明确列出并提示)。从 1.4.x 升级上来的实例,已有数据源保持不变, 把 ops.yaml 里那些行删掉即可。

接入服务日志与链路

  • 服务日志:HAP 微服务的结构化日志需要在 HAP 侧配 ENV_LOKI_URL 才会推过来, 单机部署填 http://运维平台主机IP:3100。完整说明见接入服务日志
  • 容器日志:装完即有,无需配置。
  • 链路追踪:面向集群部署,单机暂不支持。

还可以做

  • Node Exporter——监控这台机器以外的服务器
  • 对象存储——让日志不受本机磁盘限制、长期留存
  • 功能介绍——资源监控、告警、日志查询、慢查询诊断怎么用