From da0f19d1021036df60a8086498f2380480bfd2ba Mon Sep 17 00:00:00 2001 From: SwTt29 <2055018491@qq.com> Date: Tue, 30 Dec 2025 10:10:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Docker=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 23 +++ Dockerfile | 23 +++ MULTI_PROJECT_DEPLOYMENT.md | 254 ++++++++++++++++++++++++++++ deploy.sh | 48 ++++++ docker-compose.yml | 30 ++++ server-example/DOCKER_DEPLOYMENT.md | 94 ++++++++++ server-example/Dockerfile | 23 +++ server-example/docker-compose.yml | 33 ++++ update.sh | 24 +++ 9 files changed, 552 insertions(+) create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 MULTI_PROJECT_DEPLOYMENT.md create mode 100644 deploy.sh create mode 100644 docker-compose.yml create mode 100644 server-example/DOCKER_DEPLOYMENT.md create mode 100644 server-example/Dockerfile create mode 100644 server-example/docker-compose.yml create mode 100644 update.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3d02dda --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +# 数据库配置 +DB_HOST=mysql +DB_PORT=3306 +DB_NAME=mini_program +DB_USER=mini_program_user +DB_PASSWORD=your_user_password + +# 服务器配置 +PORT=3000 +NODE_ENV=production + +# OSS配置 +OSS_REGION=your-oss-region +OSS_ACCESS_KEY_ID=your-oss-access-key +OSS_ACCESS_KEY_SECRET=your-oss-secret-key +OSS_BUCKET=your-oss-bucket + +# 微信小程序配置 +WECHAT_APPID=your-wechat-appid +WECHAT_SECRET=your-wechat-secret + +# JWT配置 +JWT_SECRET=your-jwt-secret diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..93e07ec --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# 使用官方的Node.js 18镜像作为基础镜像 +FROM node:18-alpine + +# 设置工作目录 +WORKDIR /app + +# 复制package.json和package-lock.json到工作目录 +COPY server-example/package*.json ./ + +# 安装依赖 +RUN npm install --production + +# 复制整个项目到工作目录 +COPY . . + +# 设置环境变量 +ENV NODE_ENV=production + +# 暴露应用端口 +EXPOSE 3000 + +# 运行应用 +CMD ["npm", "start"] \ No newline at end of file diff --git a/MULTI_PROJECT_DEPLOYMENT.md b/MULTI_PROJECT_DEPLOYMENT.md new file mode 100644 index 0000000..c42ba2e --- /dev/null +++ b/MULTI_PROJECT_DEPLOYMENT.md @@ -0,0 +1,254 @@ +# 多项目统一部署方案 + +## 目录结构设计 + +在云服务器上创建以下目录结构: + +``` +/projects/ +├── project1/ +│ ├── source/ # 项目源代码 +│ ├── logs/ # 项目日志 +│ ├── docker/ # Docker相关文件 +│ └── docker-compose.yml +├── project2/ +│ ├── source/ +│ ├── logs/ +│ ├── docker/ +│ └── docker-compose.yml +├── project3/ +│ ├── source/ +│ ├── logs/ +│ ├── docker/ +│ └── docker-compose.yml +├── project4/ +│ ├── source/ +│ ├── logs/ +│ ├── docker/ +│ └── docker-compose.yml +└── scripts/ # 统一管理脚本 + ├── deploy-all.sh # 一键部署所有项目 + ├── update-all.sh # 一键更新所有项目 + ├── restart-all.sh # 一键重启所有项目 + └── status-all.sh # 查看所有项目状态 +``` + +## 部署脚本 + +### 1. 创建目录结构脚本 + +```bash +#!/bin/bash +# create-project-structure.sh + +echo "创建多项目统一部署目录结构..." + +# 创建主目录 +mkdir -p /projects/{project1,project2,project3,project4}/{source,logs,docker} +mkdir -p /projects/scripts + +echo "目录结构创建完成!" +echo "目录结构:" +find /projects -type d | sort +``` + +### 2. 统一部署脚本 + +```bash +#!/bin/bash +# /projects/scripts/deploy-all.sh + +echo "开始部署所有项目..." + +# 项目列表 +projects=("project1" "project2" "project3" "project4") + +for project in "${projects[@]}"; do + echo "\n=== 部署 $project ===" + cd /projects/$project + + # 拉取最新代码 + echo "拉取最新代码..." + cd source + git pull origin BOSS + cd .. + + # 构建并启动容器 + echo "构建并启动容器..." + docker-compose down + docker-compose up -d --build + + echo "$project 部署完成!" +done + +echo "\n所有项目部署完成!" +``` + +### 3. 统一更新脚本 + +```bash +#!/bin/bash +# /projects/scripts/update-all.sh + +echo "开始更新所有项目..." + +# 项目列表 +projects=("project1" "project2" "project3" "project4") + +for project in "${projects[@]}"; do + echo "\n=== 更新 $project ===" + cd /projects/$project + + # 拉取最新代码 + echo "拉取最新代码..." + cd source + git pull origin BOSS + cd .. + + # 重新构建并启动容器 + echo "重新构建并启动容器..." + docker-compose down + docker-compose up -d --build + + echo "$project 更新完成!" +done + +echo "\n所有项目更新完成!" +``` + +### 4. 统一状态查看脚本 + +```bash +#!/bin/bash +# /projects/scripts/status-all.sh + +echo "查看所有项目状态..." + +# 项目列表 +projects=("project1" "project2" "project3" "project4") + +for project in "${projects[@]}"; do + echo "\n=== $project 状态 ===" + cd /projects/$project + docker-compose ps + + echo "\n$project 日志(最近10行):" + docker-compose logs --tail=10 +done + +echo "\n所有项目状态查看完成!" +``` + +### 5. 统一重启脚本 + +```bash +#!/bin/bash +# /projects/scripts/restart-all.sh + +echo "开始重启所有项目..." + +# 项目列表 +projects=("project1" "project2" "project3" "project4") + +for project in "${projects[@]}"; do + echo "\n=== 重启 $project ===" + cd /projects/$project + docker-compose restart + echo "$project 重启完成!" +done + +echo "\n所有项目重启完成!" +``` + +## 项目配置示例 + +### 以当前项目为例,创建docker-compose.yml + +```yaml +# /projects/project1/docker-compose.yml +version: '3.8' + +services: + app: + build: ./source/server-example + container_name: project1-server + restart: always + ports: + - "3000:3000" + environment: + - NODE_ENV=production + volumes: + - ./logs:/app/logs + - ./source/server-example/uploads:/app/uploads + depends_on: + - db + + db: + image: mysql:8.0 + container_name: project1-db + restart: always + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=rootpassword + - MYSQL_DATABASE=wechat_miniprogram + - MYSQL_USER=wechat_user + - MYSQL_PASSWORD=wechat_password + volumes: + - db_data:/var/lib/mysql + +volumes: + db_data: +``` + +## 使用说明 + +1. **创建目录结构**: + ```bash + chmod +x create-project-structure.sh + ./create-project-structure.sh + ``` + +2. **部署项目**: + - 将每个项目的源代码克隆到对应的`/projects/{projectN}/source/`目录 + - 为每个项目创建docker-compose.yml文件 + - 执行统一部署脚本: + ```bash + chmod +x /projects/scripts/*.sh + /projects/scripts/deploy-all.sh + ``` + +3. **管理项目**: + - 更新所有项目:`/projects/scripts/update-all.sh` + - 查看所有项目状态:`/projects/scripts/status-all.sh` + - 重启所有项目:`/projects/scripts/restart-all.sh` + +## 运维最佳实践 + +1. **日志管理**: + - 所有项目的日志统一存储在`/projects/{projectN}/logs/`目录 + - 可以使用ELK等工具进行统一日志收集和分析 + +2. **备份策略**: + - 定期备份数据库: + ```bash + docker exec -t project1-db mysqldump -u wechat_user -p wechat_miniprogram > /projects/backups/project1_db_$(date +%Y%m%d_%H%M%S).sql + ``` + - 定期备份源代码和配置文件 + +3. **监控告警**: + - 使用Prometheus和Grafana监控容器和应用状态 + - 设置告警规则,及时发现问题 + +4. **安全措施**: + - 定期更新容器镜像和依赖 + - 配置防火墙,只开放必要的端口 + - 定期检查系统安全漏洞 + +## 注意事项 + +1. 确保每个项目使用不同的端口,避免端口冲突 +2. 为每个项目的数据库设置强密码 +3. 定期清理无用的容器和镜像:`docker system prune -f` +4. 监控磁盘空间使用情况,及时清理日志文件 +5. 考虑使用CI/CD工具(如Jenkins、GitLab CI)实现自动化部署 diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..1a1adec --- /dev/null +++ b/deploy.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# 部署脚本 - 微信小程序后端服务 + +echo "开始部署微信小程序后端服务..." + +# 检查是否安装了Docker +echo "检查Docker是否安装..." +if ! command -v docker &> /dev/null; then + echo "错误: Docker未安装,请先安装Docker" + exit 1 +fi + +# 检查是否安装了Docker Compose +echo "检查Docker Compose是否安装..." +if ! command -v docker-compose &> /dev/null; then + echo "错误: Docker Compose未安装,请先安装Docker Compose" + exit 1 +fi + +# 创建项目目录 +echo "创建项目目录..." +mkdir -p /opt/project_app/logs /opt/project_app/uploads /opt/project_app/mysql-data + +# 克隆代码仓库 +echo "克隆代码仓库..." +git clone http://8.137.125.67:4000/Swt29/Project_app.git /opt/project_app +cd /opt/project_app + +# 创建.env文件(如果不存在) +echo "配置环境变量..." +if [ ! -f .env ]; then + cp .env.example .env + echo "请编辑.env文件配置数据库和其他参数" + # 这里可以添加自动配置脚本 +fi + +# 构建Docker镜像 +echo "构建Docker镜像..." +docker-compose build + +# 启动服务 +echo "启动服务..." +docker-compose up -d + +echo "部署完成!服务已启动并在后台运行。" +echo "使用以下命令查看服务状态:docker-compose ps" +echo "使用以下命令查看日志:docker-compose logs -f" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c909a53 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,30 @@ +version: '3.8' + +services: + app: + build: . + container_name: mini-program-server + restart: always + ports: + - "3000:3000" + volumes: + - /opt/project_app/logs:/app/server-example/logs + - /opt/project_app/uploads:/app/server-example/uploads + environment: + - NODE_ENV=production + depends_on: + - mysql + + mysql: + image: mysql:8.0 + container_name: mini-program-mysql + restart: always + ports: + - "3306:3306" + volumes: + - /opt/project_app/mysql-data:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD=your_root_password + - MYSQL_DATABASE=mini_program + - MYSQL_USER=mini_program_user + - MYSQL_PASSWORD=your_user_password \ No newline at end of file diff --git a/server-example/DOCKER_DEPLOYMENT.md b/server-example/DOCKER_DEPLOYMENT.md new file mode 100644 index 0000000..cc9b90b --- /dev/null +++ b/server-example/DOCKER_DEPLOYMENT.md @@ -0,0 +1,94 @@ +# 微信小程序后端服务Docker部署指南 + +## 环境准备 + +- 安装Docker和Docker Compose +- 确保云服务器端口3000和3306对外开放 + +## 部署步骤 + +### 1. 克隆仓库 + +```bash +git clone http://8.137.125.67:4000/Swt29/Project_app.git +cd Project_app/server-example +``` + +### 2. 配置环境变量 + +复制并编辑.env文件: + +```bash +cp .env.example.mysql .env +# 编辑.env文件,配置数据库连接等信息 +``` + +### 3. 构建和启动容器 + +```bash +docker-compose up -d +``` + +### 4. 查看容器状态 + +```bash +docker-compose ps +``` + +### 5. 查看日志 + +```bash +docker-compose logs -f +``` + +## 代码更新和部署 + +### 1. 拉取最新代码 + +```bash +git pull origin BOSS +``` + +### 2. 重新构建和启动容器 + +```bash +docker-compose down +docker-compose up -d --build +``` + +## 数据库管理 + +### 进入数据库容器 + +```bash +docker exec -it wechat-miniprogram-db mysql -u wechat_user -p +``` + +### 备份数据库 + +```bash +docker exec -t wechat-miniprogram-db mysqldump -u wechat_user -p wechat_miniprogram > backup.sql +``` + +## 常见问题 + +### 端口冲突 + +如果端口3000或3306已被占用,可以修改docker-compose.yml文件中的端口映射: + +```yaml +ports: + - "8080:3000" # 将宿主机8080端口映射到容器3000端口 +``` + +### 数据库连接失败 + +检查.env文件中的数据库配置是否与docker-compose.yml中的配置一致。 + +### 容器启动失败 + +查看日志以获取详细错误信息: + +```bash +docker-compose logs -f app +``` diff --git a/server-example/Dockerfile b/server-example/Dockerfile new file mode 100644 index 0000000..cd5c21f --- /dev/null +++ b/server-example/Dockerfile @@ -0,0 +1,23 @@ +# 使用Node.js官方镜像作为基础镜像 +FROM node:18-alpine + +# 设置工作目录 +WORKDIR /app + +# 复制package.json和package-lock.json +COPY package*.json ./ + +# 安装依赖 +RUN npm install --production + +# 复制应用代码 +COPY . . + +# 设置环境变量 +ENV NODE_ENV=production + +# 暴露端口 +EXPOSE 3000 + +# 启动命令 +CMD ["npm", "start"] diff --git a/server-example/docker-compose.yml b/server-example/docker-compose.yml new file mode 100644 index 0000000..b9bfd9c --- /dev/null +++ b/server-example/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3.8' + +services: + app: + build: . + container_name: wechat-miniprogram-server + restart: always + ports: + - "3000:3000" + environment: + - NODE_ENV=production + volumes: + - ./logs:/app/logs + - ./uploads:/app/uploads + depends_on: + - db + + db: + image: mysql:8.0 + container_name: wechat-miniprogram-db + restart: always + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=rootpassword + - MYSQL_DATABASE=wechat_miniprogram + - MYSQL_USER=wechat_user + - MYSQL_PASSWORD=wechat_password + volumes: + - db_data:/var/lib/mysql + +volumes: + db_data: diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..002d50e --- /dev/null +++ b/update.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# 更新脚本 - 微信小程序后端服务 + +echo "开始更新微信小程序后端服务..." + +# 进入项目目录 +cd /opt/project_app + +# 拉取最新代码 +echo "拉取最新代码..." +git pull origin BOSS + +# 构建新的Docker镜像 +echo "构建新的Docker镜像..." +docker-compose build --no-cache + +# 重启服务 +echo "重启服务..." +docker-compose up -d + +echo "更新完成!服务已重新启动。" +echo "使用以下命令查看服务状态:docker-compose ps" +echo "使用以下命令查看日志:docker-compose logs -f"