# spms **Repository Path**: pior/spms ## Basic Information - **Project Name**: spms - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-28 - **Last Updated**: 2026-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SPMS 一体化部署(All-in-One 单容器) 将前端(Vue)、后端(Spring Boot)、MySQL、Redis、Mosquitto 全部打包进**一个 Docker 容器**,由 supervisord 统一编排。宿主机只需安装 Docker,无需单独部署任何依赖。 ## 架构 ``` 浏览器 :8008 ──► Nginx(容器内 :8008) ├── 静态文件 (dist/) └── /api /oauth2 ──► Spring Boot(容器内 :8001) ├── MySQL (127.0.0.1:3306) ├── Redis (127.0.0.1:6379 db5) └── Mosquitto(127.0.0.1:1883) ``` 所有内部依赖通过 `127.0.0.1` 互相访问,不对外暴露(MySQL/Redis/MQTT 仅在容器内可达)。 ## 端口约定 | 端口 | 说明 | 宿主机映射 | |------|------|-----------| | `8008` | 前端 Nginx(对外唯一入口) | `宿主机:8008 → 容器:8008` | | `8001` | 后端 Spring Boot(可直接访问 API 调试) | `宿主机:8001 → 容器:8001` | | `3306/6379/1883` | MySQL / Redis / MQTT | 仅容器内,不映射 | ## 文件说明 | 文件 | 作用 | |------|------| | `Dockerfile` | 多阶段构建:前端 `node:20-alpine` build → 后端 `maven` build → 运行镜像(JRE + nginx + supervisor + mysql/redis/mosquitto) | | `nginx.conf` | 托管 `dist`,`/api/`、`/oauth2/` 反代到同容器 `127.0.0.1:8001` | | `supervisord.conf` | 编排 `mysql / redis / mosquitto / nginx / spms` 五个进程(后端启动前轮询等待内部端口就绪) | | `mysql-init.sql` | 首次启动建 `spms` 库与 `spms` 用户(密码 `spms`,mysql_native_password 兼容 JDBC) | | `mysql-run.sh` | MySQL 启动包装脚本:数据目录为空时初始化,并用 `--init-file` 执行建库 SQL,带 `--skip-name-resolve` 前台运行 | | `mosquitto.conf` | Mosquitto 监听本地 `1883`,匿名可连 | | `deploy.sh` | 构建镜像并启动容器 | | `update.sh` | 拉代码(如有 git 仓库)+ 重建镜像 + 重启容器(复用数据卷,不丢数据) | | `.dockerignore` | 排除 `node_modules` / `target` / `dist` / `.git` 等,缩小构建上下文 | ## 部署步骤 在 **Ubuntu 22.04**(或其他装有 Docker 的 Linux)上,从项目根目录执行: ```bash chmod +x deploy.sh update.sh ./deploy.sh ``` 部署完成后访问:`http://<服务器IP>:8008` ## 更新 ```bash ./update.sh ``` `update.sh` 会重建镜像并重启容器,**MySQL 数据卷 `spms_mysql_data` 与上传文件卷 `spms_static` 会保留,业务数据不丢失**。 ## 回滚 ```bash docker tag spms-all:prev spms-all:latest docker rm -f spms-all ./deploy.sh ``` ## 数据持久化 - `spms_mysql_data`:MySQL 数据(Docker 命名卷,容器重建不丢) - `spms_static`:前端上传文件(Docker 命名卷) > 如需彻底重置数据库:`docker rm -f spms-all && docker volume rm spms_mysql_data`,再 `./deploy.sh` 重新初始化空库。 ## 关键环境变量(由 deploy.sh 注入容器) | 变量 | 值 | |------|----| | `SERVER_PORT` | `8001` | | `SPRING_DATASOURCE_URL` | `jdbc:mysql://127.0.0.1:3306/spms?...` | | `SPRING_DATASOURCE_USERNAME` / `PASSWORD` | `spms` / `spms` | | `SPRING_DATA_REDIS_HOST` / `PORT` / `DATABASE` | `127.0.0.1` / `6379` / `5` | | `AIRPOWER_MQTT_HOST` / `PORT` | `127.0.0.1` / `1883` | ## 常见问题 **启动报 `Access denied for user 'spms'@'localhost'`** 旧数据卷中账户状态异常,或 mysqld 未以 `--skip-name-resolve` 启动(该参数已在 `mysql-run.sh` 写入)。重置数据库卷后重新部署即可: ```bash docker rm -f spms-all && docker volume rm spms_mysql_data && ./deploy.sh ``` **构建报错 `EEXIST: yarn`** `node:20-alpine` 已自带 yarn,Dockerfile 前端阶段不再执行 `npm install -g yarn`,如复现请 `git pull` 最新 Dockerfile 后重建。 **查看日志** ```bash docker logs -f spms-all # 容器总日志 docker exec spms-all supervisorctl status # 各进程状态 docker exec spms-all supervisorctl tail spms # 后端日志 ```