322 lines
11 KiB
Markdown
322 lines
11 KiB
Markdown
# hy-app-monitor
|
||
|
||
部署在 `deploy` 机器上的统一入口监控面板。
|
||
|
||
- 对外入口端口:`2026`
|
||
- 登录入口:`http://43.164.75.199:2026/login`
|
||
- 入口选择页:`http://43.164.75.199:2026/select`
|
||
- Yumi 入口:`http://43.164.75.199:2026/yumi/`
|
||
- 通用入口:`http://43.164.75.199:2026/common/`
|
||
- HaiYi 入口:`http://43.164.75.199:2026/haiyi/`
|
||
- MySQL 兼容入口:`http://43.164.75.199:2026/mysql/`
|
||
- 内部实例:`gateway:2026`、`yumi:2027`、`haiyi:2028`
|
||
- 服务健康:直接探测各业务服务健康接口
|
||
- 主机资源:通过 `SSH` 采集 `CPU / 内存 / 磁盘 / 进程数`
|
||
- Nacos:直连 Nacos OpenAPI,列出命名空间、服务和注册实例
|
||
- MongoDB:直连 Mongo,采集 `serverStatus / listDatabases / replSetGetStatus`,并提供库表浏览、分页查询、CRUD、聚合、Distinct、索引管理
|
||
- MySQL:直连云 MySQL,提供运行状态、库表浏览、100 条分页查询、CRUD、列/索引变更和 SQL 工作台
|
||
- CDN:直连腾讯云 CDN,支持 `URL / 目录` 刷新和最近任务查询;当前限制域名 `https://h5.haiyihy.com/`
|
||
- 宿主机运维:日志、滚动重启、compose 同步、服务更新统一走 `SSH`
|
||
- 带外引导:只在打通 `deploy -> target:22` 时使用 `TAT`
|
||
|
||
## 目录
|
||
|
||
- `server.py`:gateway 入口
|
||
- `yumi_server.py`:Yumi 内部实例入口
|
||
- `haiyi_server.py`:HaiYi 内部实例入口
|
||
- `entry/`:统一登录、入口选择页和反代
|
||
- `core/`:共享配置、鉴权、缓存和路径工具
|
||
- `monitors/yumi/`:Yumi 监控与运维实现
|
||
- `monitors/haiyi/`:HaiYi 占位实例
|
||
- `config/targets.json`:监控目标和实例 ID
|
||
- `static/`:前端页面
|
||
- `scripts/`:启停、自启安装、前台运行脚本
|
||
- `systemd/`:systemd unit
|
||
- `ops/`:SSH 引导、放行和部署脚本
|
||
- `.env.example`:运行配置模板
|
||
|
||
## 运行配置
|
||
|
||
项目根目录 `.env` 是唯一运行配置源,不入库。
|
||
|
||
最少需要:
|
||
|
||
```bash
|
||
APP_BIND=0.0.0.0
|
||
APP_PORT=2026
|
||
YUMI_INTERNAL_HOST=127.0.0.1
|
||
YUMI_INTERNAL_PORT=2027
|
||
HAIYI_INTERNAL_HOST=127.0.0.1
|
||
HAIYI_INTERNAL_PORT=2028
|
||
INTERNAL_PROXY_SHARED_SECRET=***
|
||
AUTH_DB_PATH=/opt/hy-app-monitor/run/auth.sqlite3
|
||
AUTH_SESSION_TTL_HOURS=24
|
||
DEFAULT_REFRESH_INTERVAL_SECONDS=10
|
||
REFRESH_INTERVAL_OPTIONS=5,10,15,30,60
|
||
NACOS_BASE_URL=http://10.2.1.17:8848
|
||
NACOS_NAMESPACE_ID=...
|
||
MONGO_URI=mongodb://...
|
||
MYSQL_HOST=10.x.x.x
|
||
MYSQL_PORT=3306
|
||
MYSQL_USER=readonly_or_admin
|
||
MYSQL_PASSWORD=***
|
||
MYSQL_DEFAULT_DATABASE=
|
||
DEPLOY_REGION=me-saudi-arabia
|
||
DEPLOY_INSTANCE_ID=
|
||
TENCENT_SECRET_ID=***
|
||
TENCENT_SECRET_KEY=***
|
||
GATEWAY_CLB_LOAD_BALANCER_ID=lb-xxxxxxxx
|
||
GATEWAY_CLB_LISTENER_IDS=lbl-http,lbl-https
|
||
CDN_ALLOWED_DOMAINS=h5.haiyihy.com
|
||
CDN_PURGE_TASK_LIMIT=20
|
||
GATEWAY_CLB_POLL_SECONDS=2
|
||
GATEWAY_CLB_TASK_TIMEOUT_SECONDS=120
|
||
GATEWAY_CLB_DRAIN_SECONDS=0
|
||
SSH_USER=root
|
||
SSH_PORT=22
|
||
SSH_PRIVATE_KEY_PATH=/opt/hy-app-monitor/run/ssh/id_ed25519
|
||
```
|
||
|
||
如果你要直接在页面里做“构建镜像 -> 推 Harbor -> 更新服务”,还需要补这几项:
|
||
|
||
```bash
|
||
HARBOR_REGISTRY=10.2.1.3:18082
|
||
HARBOR_PROJECT=likei
|
||
HARBOR_USERNAME=***
|
||
HARBOR_PASSWORD=***
|
||
JAVA_REPO_ROOT=/opt/deploy/sources/chatapp3-java
|
||
GOLANG_REPO_ROOT=/opt/deploy/sources/chatapp3-golang
|
||
SERVICE_BUILD_CACHE_ROOT=/opt/deploy/build-cache
|
||
JAVA_MAVEN_THREADS=1C
|
||
JAVA_IMAGE_BUILD_MAX_WORKERS=3
|
||
UPDATE_DEFAULT_JAVA_GIT_REF=main
|
||
UPDATE_DEFAULT_GO_GIT_REF=main
|
||
UPDATE_DEFAULT_ADMIN_GIT_REF=main
|
||
DEPLOY_SSH_HOST=10.2.x.x
|
||
DEPLOY_SSH_USER=root
|
||
DEPLOY_SSH_PORT=22
|
||
DEPLOY_SSH_IDENTITY_FILE=~/.ssh/xxx
|
||
```
|
||
|
||
如果你还要直接发布 admin 前端静态站点,再补这几项:
|
||
|
||
```bash
|
||
ADMIN_FRONTEND_ENABLED=1
|
||
ADMIN_FRONTEND_REPO_URL=git@gitea.haiyihy.com:hy/chatapp3-admin.git
|
||
ADMIN_FRONTEND_REPO_ROOT=/opt/deploy/sources/chatapp3-admin
|
||
ADMIN_FRONTEND_HOST=admin-platform
|
||
ADMIN_FRONTEND_IP=10.2.1.2
|
||
ADMIN_FRONTEND_INSTANCE_ID=ins-p11begwe
|
||
ADMIN_FRONTEND_SSH_HOST=10.2.1.2
|
||
ADMIN_FRONTEND_SSH_USER=root
|
||
ADMIN_FRONTEND_SSH_PORT=22
|
||
ADMIN_FRONTEND_REMOTE_DIR=/opt/yumi-admin/frontend-admin
|
||
ADMIN_FRONTEND_SITE_DIR=/opt/yumi-admin/frontend-admin/site
|
||
ADMIN_FRONTEND_COMPOSE_FILE=/opt/yumi-admin/frontend-admin/docker-compose.yml
|
||
ADMIN_FRONTEND_COMPOSE_SERVICE=caddy
|
||
ADMIN_FRONTEND_RELEASE_META_PATH=/opt/yumi-admin/frontend-admin/.hy-app-monitor-admin-release.json
|
||
ADMIN_FRONTEND_BUILD_SCRIPT=build:antdv-next
|
||
ADMIN_FRONTEND_DIST_DIR=apps/dist
|
||
ADMIN_FRONTEND_PUBLIC_URL=https://yumi-admin.haiyihy.com
|
||
```
|
||
|
||
可以直接复制模板:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
如需放到 HTTPS 反代后再启用 `Secure Cookie`,可在 `.env` 追加:
|
||
|
||
```bash
|
||
AUTH_COOKIE_SECURE=1
|
||
```
|
||
|
||
MySQL 工作台可选参数:
|
||
|
||
```bash
|
||
MYSQL_CACHE_TTL_SECONDS=10
|
||
MYSQL_CONNECT_TIMEOUT_SECONDS=5
|
||
MYSQL_READ_TIMEOUT_SECONDS=15
|
||
MYSQL_WRITE_TIMEOUT_SECONDS=15
|
||
MYSQL_DEFAULT_PAGE_SIZE=100
|
||
MYSQL_MAX_PAGE_SIZE=200
|
||
MYSQL_QUERY_MAX_ROWS=500
|
||
```
|
||
|
||
CDN 刷新工具可选参数:
|
||
|
||
```bash
|
||
CDN_ALLOWED_DOMAINS=h5.haiyihy.com
|
||
CDN_PURGE_TASK_LIMIT=20
|
||
```
|
||
|
||
## 本地运行
|
||
|
||
```bash
|
||
bash scripts/start.sh
|
||
bash scripts/status.sh
|
||
```
|
||
|
||
访问:
|
||
|
||
```bash
|
||
http://127.0.0.1:2026/
|
||
```
|
||
|
||
未登录会自动跳到:
|
||
|
||
```bash
|
||
http://127.0.0.1:2026/login
|
||
```
|
||
|
||
登录后会进入:
|
||
|
||
```bash
|
||
http://127.0.0.1:2026/select
|
||
```
|
||
|
||
## systemd 开机自启
|
||
|
||
在远端项目目录执行:
|
||
|
||
```bash
|
||
bash scripts/install_systemd.sh
|
||
```
|
||
|
||
常用命令:
|
||
|
||
```bash
|
||
bash scripts/restart.sh
|
||
bash scripts/status.sh
|
||
bash scripts/uninstall_systemd.sh
|
||
```
|
||
|
||
## 通过 TAT 引导 SSH
|
||
|
||
```bash
|
||
python3 ops/bootstrap_ssh_via_tat.py
|
||
```
|
||
|
||
默认会:
|
||
|
||
1. 在 `deploy` 机生成专用 SSH 密钥对
|
||
2. 通过 `TAT` 给目标机写入公钥并准备 `sshd`
|
||
3. 只允许 `deploy -> target:22`
|
||
4. 把目标机本机防火墙和安全组都限制到 `deploy` 私网 IP
|
||
|
||
如果 `.env` 里开启了 `ADMIN_FRONTEND_ENABLED=1`,脚本也会把 admin 前端机器一起纳入这轮 SSH 引导,即使它不在 `config/targets.json` 里。
|
||
|
||
如果你只需要放开监控面板端口,仍然可以使用:
|
||
|
||
```bash
|
||
python3 ops/open_port_via_tat.py
|
||
```
|
||
|
||
## 通过 SSH 远端部署
|
||
|
||
```bash
|
||
python3 ops/deploy_via_ssh.py
|
||
```
|
||
|
||
默认会:
|
||
|
||
1. 让远端主机从 Git 拉取指定分支到 `/opt/hy-app-monitor`
|
||
2. 把本地项目 `.env` 同步到远端项目 `.env`
|
||
3. 创建远端 `.venv`
|
||
4. 安装 `requirements-ops.txt`
|
||
5. 安装并启用三套 `systemd` unit
|
||
6. 重启 `gateway / yumi / haiyi`
|
||
7. 检查 `2026` 监听
|
||
|
||
`ops/deploy_via_tat.py` 仍可保留成带外兜底,不建议继续作为日常主链路。
|
||
|
||
日常链路应先把本地改动提交并推送到远端仓库,再执行部署脚本,让 deploy 机按同一分支 `git pull`:
|
||
|
||
```bash
|
||
git push origin main
|
||
python3 ops/deploy_via_ssh.py --repo-ref main
|
||
```
|
||
|
||
## 维护完整 Compose
|
||
|
||
默认只刷新本地完整模板:
|
||
|
||
```bash
|
||
python3 ops/sync_runtime_compose.py
|
||
```
|
||
|
||
如果要把完整模板同步到远端业务主机:
|
||
|
||
```bash
|
||
python3 ops/sync_runtime_compose.py --sync-remote
|
||
```
|
||
|
||
模板文件会写到本地 `run/compose_templates/`。
|
||
滚动重启在真正执行 `docker compose up -d --force-recreate --no-deps <service>` 之前,也会先把对应宿主机的完整 `docker-compose.yml` 同步到远端,避免线上 compose 被裁剪成子集。
|
||
|
||
## 服务日志
|
||
|
||
页面里的服务详情支持按实例查看容器日志:
|
||
|
||
1. 预览固定最近 `1000` 条
|
||
2. 导出支持自定义条数
|
||
3. 导出条数会按 `SERVICE_LOG_EXPORT_MAX_LINES` 限制
|
||
4. 日志命令走目标机 `docker logs --tail N`
|
||
|
||
## 服务更新
|
||
|
||
页面里的“服务更新”会直接在当前机器上执行这条链路:
|
||
|
||
1. Java 服务会在 `SERVICE_BUILD_CACHE_ROOT/<repo>/<git-ref>` 下复用固定构建工作区;Golang 仍按临时 `git worktree` 构建
|
||
2. 本地构建镜像并推送到 Harbor
|
||
3. 取回 Harbor `digest`
|
||
4. 用新 `digest` 更新本地完整 compose 模板
|
||
5. 通过 `SSH` 把完整 compose 下发到目标宿主机
|
||
6. 通过 `SSH` 先在目标机 `docker pull` 新镜像
|
||
7. 最后只对你选中的服务执行 `docker compose up -d --force-recreate --no-deps <service>`
|
||
|
||
如果选中的是 `gateway`,在真正重建单节点之前还会额外执行:
|
||
|
||
1. 读取 `GATEWAY_CLB_LOAD_BALANCER_ID` + `GATEWAY_CLB_LISTENER_IDS` 下当前节点的全部后端绑定
|
||
2. 把这些绑定的权重统一改成 `0`,避免新请求继续打到待重启节点
|
||
3. 可选按 `GATEWAY_CLB_DRAIN_SECONDS` 额外等待连接自然排空
|
||
4. 等实例本身 HTTP / Nacos 恢复后,再轮询 CLB 健康检查恢复
|
||
5. 最后把每条绑定恢复到摘流前的原权重
|
||
|
||
如果选中 `admin` 前端目标,则会改走:
|
||
|
||
1. 在 deploy 机拉取 / 更新 `chatapp3-admin`
|
||
2. 执行 `corepack pnpm install --frozen-lockfile`
|
||
3. 执行 `pnpm run build:antdv-next`
|
||
4. 通过 `SSH + SCP` 把 `apps/dist` 同步到 admin 机 `site` 目录
|
||
5. 备份旧站点文件并原地替换内容
|
||
6. 执行 `docker compose up -d caddy`
|
||
7. 把本次发布的 `gitRef / commit / 时间` 写到远端元数据文件,页面后续可直接看到当前已部署版本
|
||
|
||
说明:
|
||
|
||
- `other` 现在也按 Harbor 业务镜像更新,不再继续依赖本地 `./other/service.jar` 挂载
|
||
- `gateway` 发布现在强依赖 CLB 摘流配置;缺少 `GATEWAY_CLB_LOAD_BALANCER_ID` 或 `GATEWAY_CLB_LISTENER_IDS` 时,页面会给 warning,实际执行也会直接失败而不是冒险重启
|
||
- Java Maven 默认走增量 `package`,并支持通过 `JAVA_MAVEN_THREADS` 开启 reactor 并行
|
||
- 多个 Java 服务会按 `JAVA_IMAGE_BUILD_MAX_WORKERS` 受限并行执行 `docker build + push`
|
||
- `admin` 前端不会走 Harbor 镜像链路,而是直接发布静态文件到 `site`
|
||
- 页面里的“滚动重启”仍然保留,适合只想让配置生效、不涉及代码构建的场景
|
||
- 这条链路默认假设 `hy-app-monitor` 就运行在打包机 / deploy 机上,并且本机已经能访问业务仓、Docker 和 Harbor
|
||
|
||
## 页面内容
|
||
|
||
- 主机:`CPU / 内存 / 磁盘 / 进程数`,带阈值颜色分级
|
||
- 服务:Java / Golang 健康检查和耗时
|
||
- Nacos:命名空间、服务、注册实例、健康状态
|
||
- Nacos 配置:读取当前 namespace 下的配置列表,支持格式校验、在线编辑保存
|
||
- Golang 配置:读取 app 节点当前运行中的 `service.env`,展示 `chatapp3-golang` 实际消费的环境变量并支持保存
|
||
- 服务日志:按实例查看最近日志并导出
|
||
- 服务更新:本地构建选中服务、推送 Harbor、更新完整 compose,并只重建选中的服务
|
||
- 滚动重启:可按服务选择 Java / Golang 节点,逐台重启并等待健康恢复
|
||
- MongoDB:连接、内存、网络、操作计数、复制集、数据库统计
|
||
- Mongo 工作页:列出所有数据库和集合,文档默认每页 `100` 条,支持 `find / insertOne / insertMany / replaceOne / updateOne / updateMany / deleteOne / deleteMany / aggregate / distinct / createIndex / dropIndex / dropIndexes / createCollection / renameCollection / dropCollection / dropDatabase`
|
||
- MySQL:连接状态、版本、当前/最大连接数、QPS/TPS、数据库大小、主从/只读状态
|
||
- MySQL 工作页:列出所有数据库和表,默认每页 `100` 条,支持筛选排序、行级增删改、增加/删除列、增加/删除索引、常用 SQL 快捷操作和单语句 SQL 执行
|
||
- 自动刷新:前端可切换刷新间隔,并保存在浏览器本地
|