diff --git a/README.md b/README.md index 3c83189..a8f1572 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ 现代化数据中心(IDC)设备管理系统,提供机房、机柜、设备的全生命周期管理,具备 3D 可视化展示功能。 -**GitHub**: https://github.com/gituib/idc_assest -**Gitee**: https://gitee.com/zhang96110/idc_assest +**GitHub**: +**Gitee**: ---- +*** ## 目录 @@ -39,30 +39,30 @@ - [贡献指南](#贡献指南) - [许可证](#许可证) ---- +*** ## 功能特性 -| 模块 | 描述 | -|------|------| -| 机房管理 | 多机房管理,平面图可视化 | -| 机柜管理 | 机柜增删改查,3D 可视化,批量导入导出 | -| 设备管理 | 全生命周期管理,自定义字段,批量导入导出 | -| 端口管理 | 设备端口配置,网卡绑定,批量管理 | -| 线缆管理 | 线缆连接管理,可视化追踪 | -| 网络拓扑 | 拓扑可视化展示(ReactFlow) | -| 工单管理 | 故障报修,维护工单全流程 | -| 耗材管理 | 库存管理,SN 序列号追踪,日志归档 | -| 盘点管理 | 盘点计划与执行,待审核设备 | -| 空闲设备 | 空闲设备转入/激活 | -| 数据看板 | 实时监控,功率监控,趋势图表 | -| 3D 可视化 | 三维机柜展示,LOD 优化 | -| 机房平面图 | Canvas 渲染,拖拽编辑 | -| 操作日志 | 审计追踪,统计分析 | -| 备份管理 | 本地/远程备份,自动定时 | -| 系统配置 | 自定义字段,背景配置 | -| 用户权限 | RBAC 角色控制 | -| API 文档 | Swagger 交互式文档 | +| 模块 | 描述 | +| ------ | -------------------- | +| 机房管理 | 多机房管理,平面图可视化 | +| 机柜管理 | 机柜增删改查,3D 可视化,批量导入导出 | +| 设备管理 | 全生命周期管理,自定义字段,批量导入导出 | +| 端口管理 | 设备端口配置,网卡绑定,批量管理 | +| 线缆管理 | 线缆连接管理,可视化追踪 | +| 网络拓扑 | 拓扑可视化展示(ReactFlow) | +| 工单管理 | 故障报修,维护工单全流程 | +| 耗材管理 | 库存管理,SN 序列号追踪,日志归档 | +| 盘点管理 | 盘点计划与执行,待审核设备 | +| 空闲设备 | 空闲设备转入/激活 | +| 数据看板 | 实时监控,功率监控,趋势图表 | +| 3D 可视化 | 三维机柜展示,LOD 优化 | +| 机房平面图 | Canvas 渲染,拖拽编辑 | +| 操作日志 | 审计追踪,统计分析 | +| 备份管理 | 本地/远程备份,自动定时 | +| 系统配置 | 自定义字段,背景配置 | +| 用户权限 | RBAC 角色控制 | +| API 文档 | Swagger 交互式文档 | ### 项目截图 @@ -89,10 +89,25 @@ ---- +*** ## 快速开始 +### Docker 部署(推荐) + +> 适用于新服务器上快速部署,无需安装 Node.js 等运行时环境,只需 Docker 即可。 + +**详细教程**:[Docker 部署指南](docs/docker-deployment-guide.md) + +**架构**:3 个容器(Nginx + 前端静态文件 | Backend | MySQL),通过 Docker Compose 编排。 + +- **Nginx 容器**:提供前端静态页面 + 反向代理 `/api` 到后端 +- **Backend 容器**:Node.js Express 应用,端口 8000 +- **MySQL 容器**:数据库,数据持久化到 Docker 卷 + +**访问地址**:`http://服务器IP` +**首次使用**:注册页面注册的第一个账号自动成为管理员 + ### Linux 一键部署 ```bash @@ -108,6 +123,7 @@ curl -fsSL https://gitee.com/zhang96110/idc_assest/raw/main/install.sh | bash ``` **install.sh 自动完成**: + - 自动检测 Linux 发行版(Ubuntu/Debian/CentOS/Arch) - 自动安装 Node.js 20.x - 自动安装系统依赖(git、curl) @@ -152,30 +168,30 @@ cd backend && node scripts/init-database.js cd .. && npm start ``` -**访问地址**:http://localhost:3000 +**访问地址**: **默认账号**:首次注册自动成为管理员 ---- +*** ## 环境要求 -| 项目 | 最低要求 | 推荐配置 | -|------|----------|----------| -| **操作系统** | Windows 10+、macOS 12+、Linux | 同最低 | -| **Node.js** | ≥14.0.0 | 20.x LTS | -| **npm** | ≥6.0.0 | 10.x | -| **内存** | 4GB | 8GB+ | -| **磁盘** | 2GB | 10GB+ | +| 项目 | 最低要求 | 推荐配置 | +| ----------- | --------------------------- | -------- | +| **操作系统** | Windows 10+、macOS 12+、Linux | 同最低 | +| **Node.js** | ≥14.0.0 | 20.x LTS | +| **npm** | ≥6.0.0 | 10.x | +| **内存** | 4GB | 8GB+ | +| **磁盘** | 2GB | 10GB+ | **生产环境额外要求**: -| 项目 | 要求 | -|------|------| -| 数据库 | MySQL 8.0+(推荐)或 SQLite | -| Web 服务器 | Nginx 1.18+ | -| 进程管理 | PM2 5.x+ | +| 项目 | 要求 | +| ------- | ---------------------- | +| 数据库 | MySQL 8.0+(推荐)或 SQLite | +| Web 服务器 | Nginx 1.18+ | +| 进程管理 | PM2 5.x+ | ---- +*** ## 脚本命令参考 @@ -230,6 +246,7 @@ node update.js --help ``` **智能检测功能**: + - 依赖安装智能跳过(检测 package.json 变化) - 前端构建智能跳过(检测源码变化) - 数据库自动备份(支持回滚) @@ -261,7 +278,7 @@ node uninstall.js --dry-run node uninstall.js --help ``` ---- +*** ## 部署指南 @@ -283,13 +300,11 @@ FLUSH PRIVILEGES; **服务器要求参考**: -| 规模 | CPU | 内存 | 磁盘 | -|------|-----|------|------| -| 小型(<100 设备) | 2 核心 | 4GB | 40GB | -| 中型(100-500 设备) | 4 核心 | 8GB | 80GB | -| 大型(>500 设备) | 8 核心+ | 16GB+ | 100GB+ | - - +| 规模 | CPU | 内存 | 磁盘 | +| -------------- | ----- | ----- | ------ | +| 小型(<100 设备) | 2 核心 | 4GB | 40GB | +| 中型(100-500 设备) | 4 核心 | 8GB | 80GB | +| 大型(>500 设备) | 8 核心+ | 16GB+ | 100GB+ | ### Nginx 配置 @@ -362,7 +377,7 @@ sudo rm -f /etc/nginx/sites-enabled/default sudo nginx -t && sudo nginx -s reload ``` ---- +*** ## 系统维护 @@ -411,7 +426,7 @@ cd backend && node scripts/backup.js cd backend && node scripts/restore.js ``` ---- +*** ## 常见问题 @@ -431,6 +446,7 @@ PORT=8001 # 方案2:停止占用进程 sudo kill $(lsof -t -i:8000) ``` +
@@ -440,6 +456,7 @@ sudo kill $(lsof -t -i:8000) 2. 检查端口监听:`netstat -tulpn | grep 8000` 3. 检查 Nginx 配置:`nginx -t` 4. 查看错误日志:`tail /var/log/nginx/error.log` +
@@ -455,16 +472,19 @@ rm -rf node_modules dist npm install npm run build ``` +
4. 数据库连接失败 **MySQL**: + - 检查服务状态:`sudo systemctl status mysql` - 验证连接参数(主机、端口、用户名、密码) - 确认数据库已创建:`SHOW DATABASES;` - 检查用户权限:`SHOW GRANTS FOR 'idc_user'@'localhost';` +
@@ -477,6 +497,7 @@ sudo chown -R $(whoami):$(whoami) /path/to/idc_assest # 上传目录权限 sudo chmod -R 777 backend/uploads ``` +
@@ -489,6 +510,7 @@ node_args: "--max-old-space-size=4096" # 或命令行 pm2 restart idc-backend --update-env ``` +
@@ -502,6 +524,7 @@ npm cache clean --force rm -rf node_modules package-lock.json npm install ``` +
@@ -513,11 +536,12 @@ pm2 start ecosystem.config.js pm2 save pm2 startup ``` +
---- +*** ## 项目结构 @@ -553,15 +577,15 @@ idc_assest/ └── README.md # 本文件 ``` ---- +*** ## API 文档 -完整交互式 API 文档访问:**http://localhost:8000/api-docs** +完整交互式 API 文档访问:**** 基于 Swagger/OpenAPI 3.0 标准,支持在线认证测试和 API 调试。 ---- +*** ## 贡献指南 @@ -588,33 +612,35 @@ git push origin feature/your-feature **提交信息规范**: -| 类型 | 说明 | -|------|------| -| feat | 新功能 | -| fix | Bug 修复 | -| docs | 文档更新 | -| style | 代码格式 | -| refactor | 重构 | -| perf | 性能优化 | -| test | 测试 | -| chore | 构建/工具 | +| 类型 | 说明 | +| -------- | ------ | +| feat | 新功能 | +| fix | Bug 修复 | +| docs | 文档更新 | +| style | 代码格式 | +| refactor | 重构 | +| perf | 性能优化 | +| test | 测试 | +| chore | 构建/工具 | **开发规范**: + - 使用 ES6+ 语法 - 遵循 React Hooks 规范 - 使用 async/await 处理异步 - 遵循 ESLint + Prettier 代码规范 ---- +*** ## 许可证 本项目基于 **MIT 许可证**开源。 ---- +*** **⭐ 如果这个项目对您有帮助,请给我们一个 Star!** -- Gitee Issues: https://gitee.com/zhang96110/idc_assest/issues -- GitHub Issues: https://github.com/gituib/idc_assest/issues +- Gitee Issues: +- GitHub Issues: - QQ 群:1081123775 + diff --git a/docs/docker-deployment-guide.md b/docs/docker-deployment-guide.md index 30a387e..3679a0d 100644 --- a/docs/docker-deployment-guide.md +++ b/docs/docker-deployment-guide.md @@ -10,7 +10,7 @@ - [一、前置要求](#一前置要求) - [二、服务器准备](#二服务器准备) -- [三、拉取项目与配置](#三拉取项目与配置) +- [三、创建部署目录与配置](#三创建部署目录与配置) - [四、生产环境配置](#四生产环境配置) - [五、启动容器](#五启动容器) - [六、验证部署](#六验证部署) @@ -29,7 +29,6 @@ | **服务器** | Linux 系统(推荐 Ubuntu 20.04+ / Debian 11+ / CentOS 7+) | | **Docker** | 20.10 及以上版本 | | **Docker Compose** | v2 及以上 | -| **Git** | 用于拉取项目代码 | | **网络** | 服务器能访问阿里云容器镜像服务 | ### 1.2 架构说明 @@ -66,123 +65,42 @@ docker --version docker compose version ``` -部署目录会在第三节"克隆项目代码"步骤中直接创建到 `/opt/idc_assest`,无需提前创建。 - --- -## 三、拉取项目与配置 +## 三、创建部署目录与配置 -### 3.1 克隆项目代码 +> 本部署方式**不需要 git clone** 整个项目仓库。只需在服务器上手动创建需要的配置文件和持久化目录即可。 +> +> 需要创建的内容只有 3 个部分: +> 1. **配置文件**:`docker-compose.yml` + 项目根目录 `.env` + `backend/.env` +> 2. **持久化目录**:`backend/uploads/`、`backend/logs/`、`backend/backups/`、`backend/temp/` -> 注意:克隆代码是为了获取 `docker-compose.prod.yml` 和 `.env` 配置模板,**不是用来构建镜像的**(镜像已由 CI/CD 自动构建好,部署服务器无需 Node.js 源码)。 +### 3.1 创建部署目录结构 ```bash -# 直接克隆到部署目录 -git clone https://github.com/gituib/idc_assest.git /opt/idc_assest +# 创建部署根目录和所有持久化目录 +mkdir -p /opt/idc_assest/backend/{uploads,logs,backups,temp} cd /opt/idc_assest + +# 查看目录结构 +tree /opt/idc_assest -L 2 ``` -克隆完成后,整个项目目录就是部署目录。多余的源代码(`backend/`、`frontend/` 源码)不影响运行,运行时只会用到 `docker-compose.prod.yml`、`.env` 和持久化目录。 +预期输出: -### 3.2 持久化目录 - -通过 `git clone` 完整克隆项目后,`backend/uploads/`、`backend/temp/`、`backend/logs/`、`backend/backups/` 四个持久化目录已经在仓库中预留(包含 `.gitkeep` 占位文件),**无需手动创建**。 - -### 3.3 配置 .env 文件 - -> **重要:项目中有两个 `.env` 文件,作用完全不同,不要混淆。** - -| 文件位置 | 谁读取 | 作用 | -|----------|--------|------| -| `/opt/idc_assest/.env` | Docker Compose | 配置 MySQL 容器自身(密码、用户名等) | -| `/opt/idc_assest/backend/.env` | 后端 Node.js 应用 | 配置后端业务参数(数据库连接、JWT 等) | - -**`backend/.env`** 完整配置内容: - -```ini -# ============================================== -# 服务器配置 -# ============================================== -PORT=8000 -NODE_ENV=production - -# ============================================== -# 数据库配置 -# ============================================== -# 方式一:使用 Docker 本地 MySQL 容器(推荐新部署) -DB_TYPE=mysql -MYSQL_HOST=mysql # Docker 服务名,不是 localhost -MYSQL_PORT=3306 -MYSQL_USERNAME=idc_user -MYSQL_PASSWORD=这里改成MySQL容器密码 -MYSQL_DATABASE=idc_management - -# 方式二:使用远程 MySQL(已有数据库的情况) -# DB_TYPE=mysql -# MYSQL_HOST=远程MySQL地址 -# MYSQL_PORT=3306 -# MYSQL_USERNAME=数据库用户名 -# MYSQL_PASSWORD=数据库密码 -# MYSQL_DATABASE=数据库名 - -# ============================================== -# JWT 密钥(重要!必须手动设置) -# 生产环境不能留空,生成命令: -# node -e "console.log(require('crypto').randomBytes(64).toString('base64'))" -# ============================================== -JWT_SECRET=这里填入生成的密钥,至少32位 - -# ============================================== -# 其他配置(保持默认即可) -# ============================================== -TOKEN_EXPIRY=24h -SALT_ROUNDS=12 -MAX_LOGIN_ATTEMPTS=3 -LOCK_TIME_MINUTES=15 -PASSWORD_MIN_LENGTH=8 -USERNAME_MIN_LENGTH=4 -USERNAME_MAX_LENGTH=30 -API_TIMEOUT=20000 -DB_QUERY_TIMEOUT=15000 -DEFAULT_PAGE_SIZE=20 -MAX_PAGE_SIZE=500 -MAX_FILE_SIZE_MB=30 -MAX_AVATAR_SIZE_MB=2 -MAX_RETRIES=5 -RETRY_DELAY=2000 -LOG_LEVEL=info -LOG_DIR=./logs -LOG_MAX_FILE_SIZE=20m -LOG_MAX_FILES=30d +``` +/opt/idc_assest +└── backend + ├── uploads/ + ├── logs/ + ├── backups/ + └── temp/ ``` ---- - -## 四、生产环境配置 - -部署方式分两种,选择其中一种: - -### 方式A:使用 Docker 本地 MySQL(推荐新部署) - -> MySQL 作为容器运行在 Docker 内部,数据卷持久化到主机。 - -**步骤 1:编辑 `backend/.env`,确认 MySQL 配置如下:** - -```ini -DB_TYPE=mysql -MYSQL_HOST=mysql # Docker 服务名 -MYSQL_PORT=3306 -MYSQL_USERNAME=idc_user # 必须跟 MYSQL_USER 一致 -MYSQL_PASSWORD=你的密码 -MYSQL_DATABASE=idc_management -``` - -**步骤 2:用完整配置覆盖 `docker-compose.prod.yml`** - -直接执行以下命令**覆盖**文件,避免手动编辑时缩进/拼写出错: +### 3.2 创建 docker-compose.yml ```bash -cat > /opt/idc_assest/docker-compose.prod.yml << 'EOF' +cat > /opt/idc_assest/docker-compose.yml << 'YAMLEOF' # ============================================ # IDC 设备管理系统 - 生产环境配置 # 从镜像仓库拉取预构建镜像,无 build 指令 @@ -252,33 +170,169 @@ networks: volumes: mysql_data: -EOF +YAMLEOF ``` -完成后可以用 `cat` 验证一下文件最后部分(确认 `mysql_data:` 后面有冒号且文件正常结束): +> **注意**:如果使用远程 MySQL(已有数据库),请在创建后编辑此文件,注释掉 `mysql` 服务部分。 + +### 3.3 创建项目根目录 .env 文件 + +> 这个文件是给 Docker Compose 读取的,用于配置 MySQL 容器本身的账号密码。 ```bash -tail -10 /opt/idc_assest/docker-compose.prod.yml -``` - -**步骤 3:创建项目根目录的 `.env`**(供 Docker Compose 读取,配置 MySQL 容器自身): - -```bash -cat > /opt/idc_assest/.env << 'EOF' -MYSQL_ROOT_PASSWORD=root密码 +cd /opt/idc_assest +cat > .env << 'EOF' +MYSQL_ROOT_PASSWORD=这里填MySQL root密码 MYSQL_USER=idc_user -MYSQL_PASSWORD=用户密码(与 backend/.env 中 MYSQL_PASSWORD 一致) +MYSQL_PASSWORD=这里填MySQL用户密码(与 backend/.env 中 MYSQL_PASSWORD 一致) MYSQL_DATABASE=idc_management EOF ``` -> 注意:这个文件**不是**给后端读的,是给 Docker Compose 解析 `${MYSQL_ROOT_PASSWORD}` 等占位符用的。 +### 3.4 创建 backend/.env 文件 -### 方式B:使用远程 MySQL(已有数据库) +> **重要**:这个文件是后端 Node.js 应用读取的,配置数据库连接、JWT 等业务参数。不要与项目根目录的 `.env` 混淆。 -> 保持现有的远程 MySQL 实例,不需要本地 MySQL 容器。 +```bash +cd /opt/idc_assest -`docker-compose.prod.yml` 保持原样(MySQL 部分保持注释),`.env` 中配置远程数据库地址即可: +# 先生成 JWT 密钥(确保已执行 4.1 节的命令) +# JWT_SECRET=$(openssl rand -base64 64) + +# 创建 backend/.env(注意:使用 << EOF 而非 << 'EOF',使变量可以被展开) +cat > backend/.env << EOF +# ============================================== +# 服务器配置 +# ============================================== +PORT=8000 +NODE_ENV=production + +# ============================================== +# 数据库配置 +# ============================================== +# 方式一:使用 Docker 本地 MySQL 容器(推荐新部署) +DB_TYPE=mysql +MYSQL_HOST=mysql # Docker 服务名,不是 localhost +MYSQL_PORT=3306 +MYSQL_USERNAME=idc_user +MYSQL_PASSWORD=这里改成MySQL用户密码 +MYSQL_DATABASE=idc_management + +# 方式二:使用远程 MySQL(已有数据库的情况) +# DB_TYPE=mysql +# MYSQL_HOST=远程MySQL地址 +# MYSQL_PORT=3306 +# MYSQL_USERNAME=数据库用户名 +# MYSQL_PASSWORD=数据库密码 +# MYSQL_DATABASE=数据库名 + +# ============================================== +# JWT 密钥(重要!通过变量自动注入,无需手动填写) +# ============================================== +JWT_SECRET=${JWT_SECRET} + +# ============================================== +# 其他配置(保持默认即可) +# ============================================== +TOKEN_EXPIRY=24h +SALT_ROUNDS=12 +MAX_LOGIN_ATTEMPTS=3 +LOCK_TIME_MINUTES=15 +PASSWORD_MIN_LENGTH=8 +USERNAME_MIN_LENGTH=4 +USERNAME_MAX_LENGTH=30 +API_TIMEOUT=20000 +DB_QUERY_TIMEOUT=15000 +DEFAULT_PAGE_SIZE=20 +MAX_PAGE_SIZE=500 +MAX_FILE_SIZE_MB=30 +MAX_AVATAR_SIZE_MB=2 +MAX_RETRIES=5 +RETRY_DELAY=2000 +LOG_LEVEL=info +LOG_DIR=./logs +LOG_MAX_FILE_SIZE=20m +LOG_MAX_FILES=30d +EOF +``` + +### 3.5 验证文件结构 + +创建完成后,部署目录的文件结构应为: + +``` +/opt/idc_assest/ +├── docker-compose.yml # Docker Compose 配置 +├── .env # Docker Compose 环境变量(MySQL 账号密码) +└── backend/ + ├── .env # 后端应用配置(数据库连接、JWT 等) + ├── uploads/ # 上传文件持久化目录 + ├── logs/ # 运行日志持久化目录 + ├── backups/ # 数据库备份持久化目录 + └── temp/ # 临时文件目录 +``` + +--- + +## 四、生产环境配置 + +### 4.1 生成并配置 JWT_SECRET + +直接在创建 `backend/.env` 时用变量注入,避免手动复制粘贴: + +```bash +# 生成 JWT 密钥并保存到变量 +JWT_SECRET=$(openssl rand -base64 64) + +# 后续创建 backend/.env 时引用该变量即可 +# 见下方 3.4 节示例中的 JWT_SECRET=${JWT_SECRET} +``` + +> 如果服务器没有 `openssl`,也可以用 `node -e "console.log(require('crypto').randomBytes(64).toString('base64'))"` 生成。 + +### 4.2 确认账号密码一致性 + +> MySQL 容器的账号密码**必须**在两个 `.env` 文件中保持一致: + +| 配置项 | 文件位置 | 说明 | +|--------|----------|------| +| `MYSQL_USER=idc_user` | `/opt/idc_assest/.env` | 指定 MySQL 容器创建的用户名 | +| `MYSQL_USERNAME=idc_user` | `/opt/idc_assest/backend/.env` | 后端连接数据库用的用户名 | +| `MYSQL_PASSWORD=xxx` | 两个文件各有一处 | 密码必须相同 | + +可以用以下命令快速对比两个文件中的用户和密码是否一致: + +```bash +cd /opt/idc_assest +echo "=== 根目录 .env ===" && grep -E "MYSQL_USER|MYSQL_PASSWORD" .env +echo "" +echo "=== backend/.env ===" && grep -E "MYSQL_USERNAME|MYSQL_PASSWORD" backend/.env +``` + +预期输出(用户名为 `idc_user`,密码两处相同即表示一致): + +``` +=== 根目录 .env === +MYSQL_USER=idc_user +MYSQL_PASSWORD=MyPassw0rd! + +=== backend/.env === +MYSQL_USERNAME=idc_user +MYSQL_PASSWORD=MyPassw0rd! +``` + +### 4.3 方式B:使用远程 MySQL(可选) + +> 如果已有远程 MySQL 实例,不想在 Docker 中运行 MySQL 容器,请执行以下操作: + +**步骤 1**:编辑 `/opt/idc_assest/docker-compose.yml`,注释掉 `mysql` 服务部分: + +```bash +# 用 sed 注释 mysql 服务(从 services: 末尾到文件末尾) +# 或者手动编辑,将 mysql: 到文件末尾的内容用 # 注释掉 +``` + +**步骤 2**:修改 `/opt/idc_assest/backend/.env`,配置远程数据库地址: ```ini DB_TYPE=mysql @@ -297,37 +351,28 @@ MYSQL_DATABASE=数据库名 ```bash cd /opt/idc_assest - -# 方式A(本地 MySQL) -docker compose -f docker-compose.prod.yml pull - -# 方式B(远程 MySQL) -docker compose -f docker-compose.prod.yml pull +docker compose -f docker-compose.yml pull ``` ### 5.2 启动服务 ```bash -# 方式A(本地 MySQL) -docker compose -f docker-compose.prod.yml up -d - -# 方式B(远程 MySQL) -docker compose -f docker-compose.prod.yml up -d +docker compose -f docker-compose.yml up -d ``` ### 5.3 查看启动状态 ```bash # 查看所有容器状态 -docker compose -f docker-compose.prod.yml ps +docker compose -f docker-compose.yml ps # 实时查看日志 -docker compose -f docker-compose.prod.yml logs -f +docker compose -f docker-compose.yml logs -f # 单独查看某个容器的日志 docker logs idc-backend docker logs idc-frontend -docker logs idc-mysql # 仅方式A +docker logs idc-mysql ``` ### 5.4 等待初始化完成 @@ -358,7 +403,7 @@ docker logs -f idc-backend ### 6.1 检查容器状态 ```bash -docker compose -f docker-compose.prod.yml ps +docker compose -f docker-compose.yml ps ``` 所有容器都应该是 `Up` 状态: @@ -402,19 +447,19 @@ curl http://服务器IP/health ```bash # 查看状态 -docker compose -f docker-compose.prod.yml ps +docker compose -f docker-compose.yml ps # 查看日志 -docker compose -f docker-compose.prod.yml logs -f +docker compose -f docker-compose.yml logs -f # 重启服务 -docker compose -f docker-compose.prod.yml restart +docker compose -f docker-compose.yml restart # 停止服务 -docker compose -f docker-compose.prod.yml down +docker compose -f docker-compose.yml down # 停止并删除数据卷(数据会丢失!慎用) -docker compose -f docker-compose.prod.yml down -v +docker compose -f docker-compose.yml down -v ``` ### 7.2 备份数据库 @@ -434,10 +479,10 @@ docker stats idc-backend idc-frontend idc-mysql ### 7.4 更新服务配置 -修改 `.env` 后,需要重启后端容器才能生效: +修改 `backend/.env` 后,需要重启后端容器才能生效: ```bash -docker compose -f docker-compose.prod.yml restart backend +docker compose -f docker-compose.yml restart backend ``` --- @@ -448,10 +493,10 @@ docker compose -f docker-compose.prod.yml restart backend ```bash # 1. 拉取最新镜像 -docker compose -f docker-compose.prod.yml pull +docker compose -f docker-compose.yml pull # 2. 重新创建容器 -docker compose -f docker-compose.prod.yml up -d +docker compose -f docker-compose.yml up -d # 3. 清理旧镜像(可选) docker image prune -a @@ -463,7 +508,7 @@ docker image prune -a # 用 v2.1.0 版本的镜像启动 BACKEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-backend:v2.1.0 \ FRONTEND_IMAGE=crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com/idc-assest/idc-frontend:v2.1.0 \ -docker compose -f docker-compose.prod.yml up -d +docker compose -f docker-compose.yml up -d ``` --- @@ -481,14 +526,14 @@ docker compose -f docker-compose.prod.yml up -d docker logs idc-backend # 常见错误: -# - JWT_SECRET 未配置 → 在 .env 中设置 JWT_SECRET +# - JWT_SECRET 未配置 → 在 backend/.env 中设置 JWT_SECRET # - MySQL 连接被拒 → 检查 MYSQL_HOST / MYSQL_PASSWORD # - 端口被占用 → 检查 80 端口是否已被其他程序占用 ``` ### 9.2 端口被占用 -如果 80 端口被其他服务占用,可以修改 `docker-compose.prod.yml` 中的端口映射: +如果 80 端口被其他服务占用,可以修改 `docker-compose.yml` 中的端口映射: ```yaml ports: @@ -511,14 +556,11 @@ ping crpi-c807itn6exy37e7d.cn-hangzhou.personal.cr.aliyuncs.com ### 9.4 初始化后没有默认管理员账号 -后端首次启动会自动创建默认管理员账号: +系统**不内置默认管理员账号**,采用"首个注册用户自动成为管理员"机制。 -| 账号 | 说明 | -|------|------| -| `admin` | 管理员 | -| `admin` | 管理员密码 | +首次访问系统时,转到注册页面创建第一个账号,该账号会自动被授予管理员权限。 -如果登录失败,检查后端日志是否有初始化相关的错误信息。 +> **注意**:项目根目录 `docker-compose.yml` 中的 `ADMIN_USERNAME` 和 `ADMIN_PASSWORD` 等环境变量仅用于特定部署脚本,实际后端代码不依赖这些变量创建用户。 ### 9.5 上传文件后访问 404 @@ -529,56 +571,7 @@ ls -la /opt/idc_assest/backend/uploads/ chmod 755 /opt/idc_assest/backend/uploads/ ``` -### 9.6 yaml 解析错误:`did not find expected key` - -**常见原因:** - -1. **缩进错误**:YAML 严格依赖缩进,每个 service 下的属性必须比 service 名多 2 个空格。例如: - - ```yaml - services: - backend: # ← 2 个空格 - image: ... # ← 4 个空格(比 backend 多 2 个) - mysql: # ← 2 个空格 - image: mysql:8.0 # ← 4 个空格 - ``` - -2. **拼写错误**:例如把 `networks` 写成 `netorks`。 - -**解决方法:** - -```bash -# 用 yamllint 检查 -pip install yamllint -yamllint /opt/idc_assest/docker-compose.prod.yml -``` - -或者直接对照文档第四章的完整 `docker-compose.prod.yml` 内容复制。 - -### 9.7 错误:`env file /opt/idc_assest/backend/.env not found` - -**原因:** `docker-compose.prod.yml` 里 backend 服务配置了 `env_file: ./backend/.env`,但这个文件不存在。 - -**解决方法:** - -```bash -# 创建 backend/.env 文件(参考 3.3 节) -cat > /opt/idc_assest/backend/.env << 'EOF' -PORT=8000 -NODE_ENV=production -DB_TYPE=mysql -MYSQL_HOST=mysql -MYSQL_PORT=3306 -MYSQL_USERNAME=idc_user -MYSQL_PASSWORD=你的密码 -MYSQL_DATABASE=idc_management -JWT_SECRET=64位随机密钥 -TOKEN_EXPIRY=24h -...(其他配置) -EOF -``` - -### 9.8 后端连不上 MySQL 容器 +### 9.6 后端连不上 MySQL 容器 **排查步骤:** @@ -597,3 +590,15 @@ grep MYSQL_HOST /opt/idc_assest/backend/.env # 4. 进入 MySQL 容器验证 docker exec -it idc-mysql mysql -u idc_user -p ``` + +### 9.7 如何在已有部署基础上添加新配置 + +如果已经在运行中,需要补充某个配置项: + +```bash +# 1. 编辑 backend/.env 补充配置 +vim /opt/idc_assest/backend/.env + +# 2. 重启后端容器 +docker compose -f docker-compose.yml restart backend +```