# HAOVP 1Panel 单机部署指南 本文档面向一台服务器上的 1Panel 部署。目标是用 1Panel 的容器编排启动后端、基础设施、前端 Nginx,并用 1Panel 网站/OpenResty 对外提供域名访问。 ## 1. 部署结构 默认编排文件: ```text backend/docker-compose.1panel.yml ``` 配套文件: ```text backend/.env.1panel.example backend/Dockerfile.service.1panel backend/config/rocketmq/broker-1panel.conf frontend/video-frontend-web/Dockerfile.1panel frontend/video-frontend-web/deploy/nginx.1panel.conf frontend/video-frontend-admin/Dockerfile.1panel frontend/video-frontend-admin/deploy/nginx.1panel.conf ``` 默认服务分层: | 层级 | 服务 | | --- | --- | | 基础设施 | MySQL, Redis, Redis Sentinel, Nacos, RocketMQ, MinIO, Sentinel Dashboard | | 后端 | video-gateway, video-auth, video-user, video-content, video-comment, video-recommend, video-admin | | 前端 | frontend-web, frontend-admin | | 可选监控 | Prometheus, Grafana, exporters,默认不启动 | ## 2. 服务器要求 建议配置: | 用途 | 建议 | | --- | --- | | CPU | 最低 4 核,建议 8 核 | | 内存 | 最低 8 GB,建议 16 GB | | 磁盘 | 最低 80 GB,视频上传环境建议更大 | | 系统 | Debian 12 / Ubuntu 22.04+ / CentOS Stream 类系统 | 1Panel 需已安装 Docker 和 OpenResty。首次构建后端镜像会下载 Maven 依赖,耗时较长。 ## 3. 端口策略 1Panel 版默认不直接占用公网 `80/443`,避免和 1Panel OpenResty 冲突。 默认端口绑定: | 服务 | 宿主机绑定 | 说明 | | --- | --- | --- | | 用户前端 | `127.0.0.1:18080` | 给 1Panel 网站反代 | | 管理前端 | `127.0.0.1:18081` | 给 1Panel 网站反代 | | API Gateway | `127.0.0.1:9000` | 调试用,不建议公网开放 | | Nacos | `127.0.0.1:8848` | 控制台,仅本机 | | MinIO API | `127.0.0.1:9100` | 对象存储 API,仅本机 | | MinIO Console | `127.0.0.1:9101` | 控制台,仅本机 | | Sentinel | `127.0.0.1:8880` | 控制台,仅本机 | | Prometheus | `127.0.0.1:9090` | 可选监控 | | Grafana | `127.0.0.1:3000` | 可选监控 | 生产环境防火墙建议只放行: ```text 80/tcp 443/tcp 1Panel 面板端口 SSH 端口 ``` 不要把 MySQL、Redis、Nacos、RocketMQ、MinIO Console 直接暴露到公网。 如确需临时从外部访问前端容器端口,可在 `.env.1panel` 中把: ```env FRONTEND_BIND_ADDR=127.0.0.1 ``` 改为: ```env FRONTEND_BIND_ADDR=0.0.0.0 ``` 不建议在生产长期这样配置。 ## 4. 上传项目 在服务器上准备项目目录,例如: ```bash cd /opt git clone <你的仓库地址> HAOVP cd /opt/HAOVP/backend ``` 如果通过 1Panel 文件管理上传压缩包,保证目录结构仍然是: ```text /opt/HAOVP/backend /opt/HAOVP/frontend ``` 因为 `docker-compose.1panel.yml` 会从 `../frontend/...` 构建前端镜像。 ## 5. 配置环境变量 复制示例文件: ```bash cd /opt/HAOVP/backend cp .env.1panel.example .env.1panel ``` 必须修改这些值: ```env MYSQL_ROOT_PASSWORD=强密码 MYSQL_APP_PASSWORD=强密码 REDIS_PASSWORD=强密码 MINIO_SECRET_KEY=强密码 USER_JWT_SECRET=至少32字节随机字符串 ADMIN_JWT_SECRET=至少32字节随机字符串 SERVICE_AUTH_TOKEN=至少32字节随机字符串 ADMIN_INIT_PASSWORD=后台管理员初始密码 NACOS_AUTH_TOKEN=Base64编码且解码后至少32字节的随机字符串 GRAFANA_ADMIN_PASSWORD=强密码 ``` 生成 Nacos token: ```bash openssl rand -base64 32 ``` 示例值: ```env NACOS_AUTH_TOKEN=U0VDUkVUS0VZMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw ``` 国内服务器建议保留默认 Maven 镜像: ```env MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public ``` 如果服务器网络能稳定访问 Maven Central,也可以改成: ```env MAVEN_MIRROR_URL=https://repo.maven.apache.org/maven2 ``` 首次部署建议保持: ```env NACOS_USERNAME=nacos NACOS_PASSWORD=nacos ``` 原因:Nacos 默认初始化用户是 `nacos/nacos`。如果想改 Nacos 密码,先部署成功,再进入 Nacos 控制台修改用户密码,并同步更新 `.env.1panel` 后重启后端微服务。 ## 6. 在 1Panel 创建编排 进入 1Panel: ```text 容器 -> 编排 -> 创建编排 ``` 推荐配置: | 项 | 值 | | --- | --- | | 名称 | `haovp-1panel` | | 工作目录 | `/opt/HAOVP/backend` | | Compose 文件 | `docker-compose.1panel.yml` | | 环境变量文件 | `.env.1panel` | 创建后启动编排。 首次构建会执行: | 镜像 | 构建内容 | | --- | --- | | 后端微服务 | Maven 多阶段构建 | | 用户前端 | Node 构建 Vue/Vite,然后 Nginx 托管 | | 管理前端 | Node 构建 Vue/Vite,然后 Nginx 托管 | | Sentinel Dashboard | 下载并打包 Sentinel Dashboard | 如果服务器网络访问 Maven/npm/Docker Hub 较慢,首次构建可能需要较长时间。 ## 7. 配置 1Panel 网站反代 推荐用两个域名: ```text www.example.com -> 用户端 admin.example.com -> 管理端 ``` ### 用户端 在 1Panel 创建反向代理网站: | 项 | 值 | | --- | --- | | 主域名 | `www.example.com` | | 代理地址 | `http://127.0.0.1:18080` | ### 管理端 在 1Panel 创建反向代理网站: | 项 | 值 | | --- | --- | | 主域名 | `admin.example.com` | | 代理地址 | `http://127.0.0.1:18081` | 然后在两个网站里申请 HTTPS 证书。 前端容器内部已经处理: | 路径 | 转发目标 | | --- | --- | | 用户端 `/api/*` | `video-gateway:9000/*` | | 管理端 `/api/admin/*` | `video-gateway:9000/admin/*` | | `/media/*` | `minio:9000/*` | 所以 1Panel OpenResty 只需要代理到前端容器端口,不需要再单独配置 `/api`。 ## 8. 启动验证 在服务器执行: ```bash cd /opt/HAOVP/backend docker compose --env-file .env.1panel -f docker-compose.1panel.yml ps ``` 查看关键日志: ```bash docker logs -f haovp-mysql docker logs -f haovp-nacos docker logs -f haovp-video-gateway docker logs -f haovp-video-content ``` 本机健康检查: ```bash curl http://127.0.0.1:18080/health curl http://127.0.0.1:18081/health curl http://127.0.0.1:9000/actuator/health ``` 浏览器访问: ```text https://www.example.com https://admin.example.com ``` Nacos 控制台仅建议本机 SSH 隧道或 1Panel 终端访问: ```text http://127.0.0.1:8848/nacos ``` ## 9. 可选启用监控 默认不会启动 Prometheus/Grafana,节省单机资源。 命令行启用: ```bash cd /opt/HAOVP/backend COMPOSE_PROFILES=monitoring docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d ``` 1Panel 中可在环境变量里增加: ```env COMPOSE_PROFILES=monitoring ``` Grafana 默认本机端口: ```text http://127.0.0.1:3000 ``` 不建议直接公网开放 Grafana。 ## 10. 更新部署 拉取代码后重新构建: ```bash cd /opt/HAOVP git pull cd backend docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d --build ``` 只重启某个服务: ```bash docker compose --env-file .env.1panel -f docker-compose.1panel.yml restart video-gateway ``` 查看资源占用: ```bash docker stats ``` ## 11. 数据备份 先加载部署环境变量: ```bash cd /opt/HAOVP/backend set -a source .env.1panel set +a ``` MySQL: ```bash docker exec haovp-mysql mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases > haovp_mysql_$(date +%F).sql ``` Redis: ```bash docker exec haovp-redis redis-cli -a "$REDIS_PASSWORD" BGSAVE docker cp haovp-redis:/data/dump.rdb haovp_redis_$(date +%F).rdb ``` MinIO: ```bash docker run --rm --network haovp-1panel_haovp-network -v "$PWD/backup:/backup" minio/mc sh -c \ "mc alias set local http://minio:9000 $MINIO_ACCESS_KEY $MINIO_SECRET_KEY && mc mirror local/$MINIO_BUCKET /backup/$MINIO_BUCKET" ``` 也可以直接备份 Docker volume,但数据库类服务建议优先使用逻辑备份。 ## 12. 常见问题 ### 首次启动很慢 后端镜像会在 Docker 构建阶段执行 Maven 构建,前端镜像会执行 npm 构建。国内服务器建议提前配置 Docker、Maven、npm 镜像源,或在 CI 中构建镜像后推送到私有镜像仓库。 ### Maven 依赖下载失败 如果日志里出现: ```text Unknown host repo.maven.apache.org Non-resolvable parent POM ``` 说明后端镜像构建阶段无法访问 Maven Central。1Panel 版后端 Dockerfile 已支持 Maven 镜像源,默认: ```env MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public ``` 修改 `.env.1panel` 后,需要在 1Panel 中重新构建编排。 ### Nacos 显示 unhealthy 如果 1Panel 日志出现: ```text dependency failed to start: container haovp-nacos is unhealthy ``` 新版编排不再让业务服务等待 Nacos `healthy`,也不再给 Nacos 配置 Docker healthcheck。这样可以避免 1Panel 因 Nacos 启动慢而判定整个编排失败。同步新版 `docker-compose.1panel.yml` 后,需要删除失败编排或重新创建容器,让新的依赖策略生效。 如果仍失败,查看 Nacos 容器内部日志: ```bash docker logs --tail 200 haovp-nacos ``` 重点检查: | 问题 | 处理 | | --- | --- | | `NACOS_AUTH_TOKEN` 相关报错 | 确认 `.env.1panel` 中 `NACOS_AUTH_TOKEN` 是 Base64,且解码后至少 32 字节 | | `No DataSource set` | 先确认服务器上的 `backend/config/nacos/application-1panel.properties` 是“文件”而不是目录,再确认它被挂载到 `/home/nacos/conf/application.properties`,最后用 `--force-recreate` 重建 `haovp-nacos` | | 数据库连接失败 | 确认 `haovp-mysql` 正常,且首次初始化没有被中断 | | 端口占用 | 确认宿主机 `8848` 未被其他服务占用,或修改 `NACOS_HTTP_PORT` | 推荐的检查顺序: ```bash ls -l /opt/HAOVP/backend/config/nacos/application-1panel.properties docker inspect haovp-nacos --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}' docker rm -f haovp-nacos docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d --force-recreate nacos docker logs --tail 200 haovp-nacos ``` 如果 `application-1panel.properties` 在服务器上不存在,Docker 可能会把挂载源当成目录处理,Nacos 就还是读不到数据源配置。 ### 拉取 `haovp/video-*` 镜像失败 如果 1Panel 报错类似: ```text pull access denied for haovp/video-auth ``` 说明当前编排文件里仍然带有旧版本地构建镜像名。1Panel 会先按 `image:` 拉取远程镜像,而 `haovp/video-*` 并不是公开镜像仓库。 解决方式: 1. 使用新版 `backend/docker-compose.1panel.yml`。 2. 确认 `video-auth`、`video-user`、`video-content`、`frontend-web` 等本地构建服务只有 `build:`,没有 `image: haovp/...`。 3. 在 1Panel 中重新加载编排文件后再启动。 ### 后端连接 RocketMQ 失败 1Panel 版已使用单机配置: ```text backend/config/rocketmq/broker-1panel.conf NAMESRV_ADDR=rmqnamesrv:9876 ``` 如果仍失败,检查: ```bash docker logs haovp-rmqnamesrv docker logs haovp-rmqbroker docker logs haovp-video-content ``` ### 前端接口 404 确认前端环境变量没有改错: | 前端 | 构建参数 | | --- | --- | | 用户端 | `VITE_API_BASE_URL=/api` | | 管理端 | `VITE_API_BASE_URL=/api/admin` | 前端 Nginx 会把用户端 `/api/auth/login` 转发为网关 `/auth/login`,把管理端 `/api/admin/auth/login` 转发为网关 `/admin/auth/login`。 ### 图片或视频无法访问 前端使用: ```text VITE_MEDIA_BASE_URL=/media/video-platform ``` 前端 Nginx 会把 `/media/video-platform/...` 转发到 MinIO 的 `/video-platform/...`。确认 `minio-init` 已成功创建 bucket: ```bash docker logs haovp-minio-init ``` ### Nacos 密码修改后服务启动失败 如果在 Nacos 控制台改了 `nacos` 用户密码,必须同步修改 `.env.1panel`: ```env NACOS_PASSWORD=新密码 ``` 然后重启后端服务: ```bash docker compose --env-file .env.1panel -f docker-compose.1panel.yml restart video-gateway video-auth video-user video-content video-comment video-recommend video-admin ``` ### 内存不足 降低 `.env.1panel` 中各服务 JVM 参数,例如: ```env CONTENT_JAVA_OPTS=-Xms128m -Xmx384m AUTH_JAVA_OPTS=-Xms96m -Xmx192m ``` 同时不要启用 `monitoring` profile。