# 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/yumiadmin-acc 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://yumiadmin-acc.global-interaction.com ``` 通用模块里的 `Cron 部署` 用于发布 `chatapp-cron`,需要目标机已有 `docker-compose.yml` 和 `service.env`。部署流程会构建 `week-star-job` 二进制,上传到目标机,再执行 compose 重建: ```bash CHATAPP_CRON_ENABLED=1 CHATAPP_CRON_REPO_URL=git@gitea.haiyihy.com:hy/chatapp-cron.git CHATAPP_CRON_REPO_ROOT=/opt/deploy/sources/chatapp-cron CHATAPP_CRON_DEFAULT_GIT_REF=main CHATAPP_CRON_SERVICE_NAME=chatapp-cron CHATAPP_CRON_HOST=cron-sg-1 CHATAPP_CRON_IP=10.3.1.14 CHATAPP_CRON_INSTANCE_ID=ins-nt6bsay0 CHATAPP_CRON_SSH_HOST=10.3.1.14 CHATAPP_CRON_SSH_USER=root CHATAPP_CRON_SSH_PORT=22 CHATAPP_CRON_SSH_USE_SUDO=0 CHATAPP_CRON_REMOTE_DIR=/opt/likei/cron-sg-1 CHATAPP_CRON_COMPOSE_FILE=/opt/likei/cron-sg-1/docker-compose.yml CHATAPP_CRON_COMPOSE_SERVICE=week-star-job CHATAPP_CRON_BINARY_PATH=/opt/likei/cron-sg-1/week-star-job/service CHATAPP_CRON_RELEASE_META_PATH=/opt/likei/cron-sg-1/.hy-app-monitor-chatapp-cron-release.json ``` 可以直接复制模板: ```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` 或 `CHATAPP_CRON_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 ` 之前,也会先把对应宿主机的完整 `docker-compose.yml` 同步到远端,避免线上 compose 被裁剪成子集。 ## 服务日志 页面里的服务详情支持按实例查看容器日志: 1. 预览固定最近 `1000` 条 2. 导出支持自定义条数 3. 导出条数会按 `SERVICE_LOG_EXPORT_MAX_LINES` 限制 4. 日志命令走目标机 `docker logs --tail N` ## 服务更新 页面里的“服务更新”会直接在当前机器上执行这条链路: 1. Java 服务会在 `SERVICE_BUILD_CACHE_ROOT//` 下复用固定构建工作区;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 ` 如果选中的是 `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 执行 - 自动刷新:前端可切换刷新间隔,并保存在浏览器本地