diff --git a/Dockerfile b/Dockerfile index 8121832..75f4b76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build \ FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:3.23 ENV TZ=Asia/Shanghai \ - MANAGED_PORTAL_HTTP_ADDR=:8080 \ + MANAGED_PORTAL_HTTP_ADDR=:9080 \ MANAGED_PORTAL_REGISTRY_PATH=/app/managed_services.yaml RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ @@ -32,6 +32,6 @@ WORKDIR /app COPY --from=builder /build/managed-portal /app/managed-portal COPY managed_services.yaml /app/managed_services.yaml -EXPOSE 8080 +EXPOSE 9080 CMD ["/app/managed-portal"] diff --git a/README.md b/README.md index 6c91de4..b7b67fa 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,51 @@ -# Managed Portal +# Managed Portal 管理端 -Standalone management portal for: +`managed-portal` 是从原 `video_recognition_local` 项目中拆出的独立管理端,负责管理“被管理服务”和“网页设备”两类能力。它不依赖原 `3000` 端口主项目运行,默认以前端 `13000` 端口对外提供入口,后端默认监听 `9080`。 -- managed child services -- web device scanning and proxy access -- copied child service source under `managed/` +## 功能范围 -## Status +- 被管理服务:查看服务列表、服务详情、容器状态、RTSP 配置、重启容器、结果摘要、结果文件预览和下载 +- 网页设备:扫描本机所在网段的 80 端口网页设备,生成代理访问地址和直连转发地址 +- 子服务源码:已内置 `store_dwell_alert` 和 `people_flow_project` 两个子项目源码 -This repository is being split out from `video_recognition_local`. +## 目录结构 -Current target shape: +```text +managed-portal/ +├── cmd/managed-portal/ # Go 后端入口 +├── internal/ # Go 后端模块 +├── web/ # Vue3 + Element Plus 前端 +├── managed/ # 被管理子服务源码 +│ ├── store_dwell_alert/ +│ └── people_flow_project/ +├── deploy/ # Docker Compose 部署文件 +├── managed_services.yaml # 被管理服务注册表 +└── Dockerfile # 门户后端镜像 +``` -- backend: Go service on `:8080` -- frontend: Vue 3 + Element Plus -- public entry: `:13000` +## 默认端口 -## Planned local commands +- 门户后端:`9080` +- 门户前端:`13000` +- `store-dwell-alert` 子服务 API:`18081` +- `people-flow-project` 子服务 API:`18082` -Backend: +后端端口可通过环境变量覆盖: + +```bash +MANAGED_PORTAL_HTTP_ADDR=:9080 +``` + +## 本机开发 + +后端: ```bash go test ./... go run ./cmd/managed-portal ``` -Frontend: +前端: ```bash cd web @@ -34,27 +54,53 @@ pnpm dev pnpm build ``` -Docker: +本机开发时,前端默认会把 `/api` 和 `/proxy` 代理到 `http://localhost:9080`。如果后端用其他端口启动,可以覆盖: + +```bash +VITE_API_PROXY_TARGET=http://127.0.0.1:9080 pnpm dev --host 127.0.0.1 --port 13000 +``` + +## Docker 部署 + +完整独立栈包含四个服务: + +- `managed-portal` +- `managed-portal-web` +- `store-dwell-alert` +- `people-flow-project` + +启动: ```bash cd deploy docker compose --env-file managed-portal.env up -d --build ``` -## Child services +访问: -The child service source is part of this repository: +```text +http://<服务器IP>:13000/ +``` -- `managed/store_dwell_alert` -- `managed/people_flow_project` +## 模型权重 -The default Compose stack builds and starts both child services alongside the portal. - -Before building the child service images, provide the runtime weights expected by -their Dockerfiles: +子服务镜像构建前需要以下权重文件: - `managed/store_dwell_alert/weights/yolo11n.pt` - `managed/people_flow_project/weights/yolo11n.pt` - `managed/people_flow_project/weights/deepface/age_model_weights.h5` - `managed/people_flow_project/weights/deepface/gender_model_weights.h5` - `managed/people_flow_project/weights/deepface/retinaface.h5` + +这些权重文件体积较大,默认被子项目 `.gitignore` 忽略,不会随 Git 提交上传。部署机器上需要提前放到对应路径,或通过制品仓库、对象存储、Git LFS 等方式分发。 + +## 被管理服务注册表 + +`managed_services.yaml` 描述门户要管理的子服务。Docker Compose 部署时,默认通过容器 DNS 访问: + +```yaml +api_base_url: http://store-dwell-alert:18081 +api_base_url: http://people-flow-project:18082 +``` + +如果改成本机进程方式运行子服务,可以把地址调整为 `http://127.0.0.1:18081` 和 `http://127.0.0.1:18082`。 diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index a7c6ecc..6dfeffc 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -13,7 +13,7 @@ services: - people-flow-project environment: TZ: ${TZ:-Asia/Shanghai} - MANAGED_PORTAL_HTTP_ADDR: ":8080" + MANAGED_PORTAL_HTTP_ADDR: ":9080" MANAGED_PORTAL_REGISTRY_PATH: "/app/managed_services.yaml" volumes: - /var/run/docker.sock:/var/run/docker.sock diff --git a/internal/config/config.go b/internal/config/config.go index c3b8e5d..d61fc8f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -10,7 +10,7 @@ type Config struct { func Load() *Config { cfg := &Config{ - HTTPAddr: ":8080", + HTTPAddr: ":9080", WebDistDir: "web/dist", RegistryPath: "managed_services.yaml", } diff --git a/web/nginx.conf b/web/nginx.conf index fedc0a8..6876423 100644 --- a/web/nginx.conf +++ b/web/nginx.conf @@ -14,7 +14,7 @@ server { } location /api/ { - proxy_pass http://managed-portal:8080/api/; + proxy_pass http://managed-portal:9080/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; @@ -29,7 +29,7 @@ server { } location ^~ /proxy/ { - proxy_pass http://managed-portal:8080/proxy/; + proxy_pass http://managed-portal:9080/proxy/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; diff --git a/web/vite.config.js b/web/vite.config.js index 2855f31..33ad928 100644 --- a/web/vite.config.js +++ b/web/vite.config.js @@ -3,7 +3,7 @@ import vue from "@vitejs/plugin-vue"; import { resolve } from "path"; const devPort = Number(process.env.VITE_DEV_PORT || 13000); -const apiTarget = process.env.VITE_API_PROXY_TARGET || "http://localhost:8080"; +const apiTarget = process.env.VITE_API_PROXY_TARGET || "http://localhost:9080"; export default defineConfig({ plugins: [vue()],