From 8ccbdb09d1e060033e7b6fb6ad8dcadc9085de05 Mon Sep 17 00:00:00 2001 From: dash <1549469775@qq.com> Date: Sat, 22 Nov 2025 23:44:47 +0800 Subject: [PATCH] Add production environment configuration example and remove outdated deployment documentation --- .env.backend.example | 1 + DEPLOY.md | 411 ------------------------------------------ DEPLOYMENT-GUIDE.md | 264 --------------------------- README.md | 33 +--- backend/.dockerignore | 17 -- backend/Dockerfile | 51 ------ backend/database/prod.sqlite3 | Bin 65536 -> 0 bytes deploy.ps1 | 95 ---------- deploy.sh | 90 +++------ docker-compose.yml | 48 ----- docker-deploy.sh | 75 -------- docker-test.bat | 56 ------ docker-test.sh | 53 ------ ecosystem.config.js | 35 ---- fix-sqlite3.sh | 80 -------- frontend/.dockerignore | 14 -- frontend/Dockerfile | 42 ----- nginx.conf | 72 -------- package.json | 2 +- 19 files changed, 29 insertions(+), 1410 deletions(-) create mode 100644 .env.backend.example delete mode 100644 DEPLOY.md delete mode 100644 DEPLOYMENT-GUIDE.md delete mode 100644 backend/.dockerignore delete mode 100644 backend/Dockerfile delete mode 100644 backend/database/prod.sqlite3 delete mode 100644 deploy.ps1 delete mode 100644 docker-compose.yml delete mode 100644 docker-deploy.sh delete mode 100644 docker-test.bat delete mode 100644 docker-test.sh delete mode 100644 ecosystem.config.js delete mode 100644 fix-sqlite3.sh delete mode 100644 frontend/.dockerignore delete mode 100644 frontend/Dockerfile delete mode 100644 nginx.conf diff --git a/.env.backend.example b/.env.backend.example new file mode 100644 index 0000000..995fca4 --- /dev/null +++ b/.env.backend.example @@ -0,0 +1 @@ +NODE_ENV=production \ No newline at end of file diff --git a/DEPLOY.md b/DEPLOY.md deleted file mode 100644 index eace5a8..0000000 --- a/DEPLOY.md +++ /dev/null @@ -1,411 +0,0 @@ -# 部署指南 - -本项目提供多种部署方式,推荐使用 **PM2 一键部署**,简单快捷。 - -## 🚀 方案一:PM2 一键部署(推荐) - -最简单的部署方式,适合 VPS、云服务器等场景。 - -### Windows 部署 - -```powershell -# 1. 运行部署脚本 -.\deploy.ps1 -``` - -### Linux/macOS 部署 - -```bash -# 1. 添加执行权限 -chmod +x deploy.sh - -# 2. 运行部署脚本 -./deploy.sh -``` - -### 部署脚本会自动完成: - -1. ✅ 检查并安装必要工具(Node.js、pnpm、PM2) -2. ✅ 安装项目依赖 -3. ✅ 构建前后端项目 -4. ✅ 创建生产环境配置 -5. ✅ 运行数据库迁移 -6. ✅ 使用 PM2 启动服务 -7. ✅ 配置开机自启动 - -### 常用命令 - -```bash -# 查看服务状态 -pm2 status - -# 查看日志 -pm2 logs - -# 查看指定服务日志 -pm2 logs just-demo-backend -pm2 logs just-demo-frontend - -# 重启服务 -pm2 restart all -pm2 restart just-demo-backend - -# 停止服务 -pm2 stop all - -# 删除服务 -pm2 delete all -``` - -### 访问地址 - -部署成功后,可通过以下地址访问: - -- 前端:http://localhost:5500 -- 后端:http://localhost:3000 - ---- - -## 🐳 方案二:Docker Compose 部署 - -适合需要容器化部署的场景。 - -### 1. 创建 Dockerfile - -**backend/Dockerfile:** - -```dockerfile -FROM node:18-alpine - -WORKDIR /app - -# 安装 pnpm -RUN npm install -g pnpm - -# 复制依赖文件 -COPY package.json pnpm-lock.yaml ./ - -# 安装依赖 -RUN pnpm install --prod - -# 复制构建产物 -COPY dist ./dist -COPY database ./database -COPY knexfile.js ./ - -# 创建上传目录 -RUN mkdir -p uploads - -EXPOSE 3000 - -CMD ["node", "dist/app.js"] -``` - -**frontend/Dockerfile:** - -```dockerfile -FROM node:18-alpine - -WORKDIR /app - -# 安装 serve -RUN npm install -g serve - -# 复制构建产物 -COPY dist ./dist - -EXPOSE 5500 - -CMD ["serve", "dist", "-p", "5500", "-s"] -``` - -### 2. 创建 docker-compose.yml - -```yaml -version: '3.8' - -services: - backend: - build: - context: ./backend - dockerfile: Dockerfile - ports: - - "3000:3000" - environment: - - NODE_ENV=production - - PORT=3000 - - JWT_SECRET=${JWT_SECRET} - - FRONTEND_URL=http://localhost:5500 - volumes: - - ./backend/database:/app/database - - ./backend/uploads:/app/uploads - restart: always - - frontend: - build: - context: ./frontend - dockerfile: Dockerfile - ports: - - "5500:5500" - depends_on: - - backend - restart: always -``` - -### 3. 部署 - -```bash -# 构建项目 -pnpm build - -# 启动容器 -docker-compose up -d - -# 查看日志 -docker-compose logs -f - -# 停止容器 -docker-compose down -``` - ---- - -## ☁️ 方案三:云平台部署 - -### 3.1 Vercel + Railway - -**前端部署到 Vercel:** - -1. 在 Vercel 导入项目 -2. 设置构建配置: - - Build Command: `cd frontend && pnpm install && pnpm build` - - Output Directory: `frontend/dist` - -**后端部署到 Railway:** - -1. 在 Railway 创建新项目 -2. 连接 GitHub 仓库 -3. 设置环境变量: - ``` - NODE_ENV=production - PORT=3000 - JWT_SECRET=your-secret-key - FRONTEND_URL=your-vercel-url - ``` - -### 3.2 Render - -1. 在 Render 创建 Web Service -2. 后端配置: - - Build Command: `cd backend && pnpm install && pnpm build` - - Start Command: `cd backend && node dist/app.js` -3. 前端配置: - - Build Command: `cd frontend && pnpm install && pnpm build` - - Publish Directory: `frontend/dist` - ---- - -## 📝 生产环境配置 - -### 必要的环境变量 - -在 `backend/.env` 文件中配置: - -```env -NODE_ENV=production -PORT=3000 -JWT_SECRET=你的超级密钥-至少32字符 -FRONTEND_URL=http://your-frontend-domain.com -UPLOAD_DIR=uploads -``` - -### 生成安全的 JWT_SECRET - -```bash -# Linux/macOS -openssl rand -base64 32 - -# Windows PowerShell -[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 })) -``` - ---- - -## 🔒 安全建议 - -1. **修改 JWT_SECRET**:不要使用默认密钥 -2. **配置 HTTPS**:使用 nginx + Let's Encrypt -3. **限制文件上传大小**:防止恶意上传 -4. **定期备份数据库**:备份 `backend/database/*.sqlite3` -5. **配置防火墙**:只开放必要端口 - ---- - -## 🌐 使用 Nginx 反向代理(可选) - -### 安装 Nginx - -```bash -# Ubuntu/Debian -sudo apt update -sudo apt install nginx - -# CentOS/RHEL -sudo yum install nginx -``` - -### 配置文件 - -创建 `/etc/nginx/sites-available/just-demo`: - -```nginx -server { - listen 80; - server_name your-domain.com; - - # 前端 - location / { - proxy_pass http://localhost:5500; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } - - # 后端 API - location /api { - proxy_pass http://localhost:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - } -} -``` - -### 启用配置 - -```bash -sudo ln -s /etc/nginx/sites-available/just-demo /etc/nginx/sites-enabled/ -sudo nginx -t -sudo systemctl reload nginx -``` - ---- - -## 🔧 故障排查 - -### 服务无法启动 - -```bash -# 查看详细日志 -pm2 logs --lines 100 - -# 检查端口占用 -# Linux/macOS -lsof -i :3000 - -# Windows -netstat -ano | findstr :3000 -``` - -### 数据库错误 - -```bash -# 重新运行迁移 -cd backend -pnpm migrate:rollback:prod -pnpm migrate:prod -``` - -### sqlite3 bindings 错误 - -如果遇到以下错误: -``` -Could not locate the bindings file. Tried: - → /path/to/sqlite3/build/node_sqlite3.node -``` - -这是因为 `sqlite3` 是原生模块,需要在目标平台重新编译。 - -**快速修复:** - -```bash -# 使用修复脚本(推荐) -chmod +x fix-sqlite3.sh -./fix-sqlite3.sh -``` - -**手动修复:** - -```bash -# 1. 安装编译工具(根据系统选择) -# Debian/Ubuntu -sudo apt-get update -sudo apt-get install -y python3 make g++ build-essential - -# CentOS/RHEL -sudo yum install -y python3 make gcc-c++ - -# Alpine -sudo apk add --no-cache python3 make g++ - -# 2. 停止服务 -pm2 stop just-demo-backend - -# 3. 进入 backend 目录并重建 sqlite3 -cd backend -rm -rf node_modules/.pnpm/sqlite3@* node_modules/sqlite3 -pnpm rebuild sqlite3 || pnpm install sqlite3 --force - -# 4. 返回根目录并重启服务 -cd .. -pm2 restart just-demo-backend -``` - -### 前端无法访问后端 - -检查 `backend/.env` 中的 `FRONTEND_URL` 配置是否正确。 - ---- - -## 📊 性能优化 - -1. **启用 PM2 集群模式**:充分利用多核 CPU -2. **配置 Nginx 缓存**:加快静态资源访问 -3. **使用 CDN**:加速前端资源加载 -4. **定期清理日志**:防止日志文件过大 - ---- - -## 🔄 更新部署 - -```bash -# 1. 拉取最新代码 -git pull - -# 2. 重新构建 -pnpm build - -# 3. 重启服务 -pm2 restart all - -# 或使用部署脚本 -./deploy.sh -``` - ---- - -## 📞 技术支持 - -如遇问题,请检查: -1. Node.js 版本是否 >= 16 -2. 端口 3000 和 5500 是否被占用 -3. 数据库文件是否有读写权限 -4. 环境变量是否配置正确 - diff --git a/DEPLOYMENT-GUIDE.md b/DEPLOYMENT-GUIDE.md deleted file mode 100644 index 8fa180b..0000000 --- a/DEPLOYMENT-GUIDE.md +++ /dev/null @@ -1,264 +0,0 @@ -# 部署方案快速对比 - -选择最适合你的部署方式 🚀 - -## 📊 方案对比 - -| 方案 | 难度 | 适用场景 | 优点 | 缺点 | -|------|------|---------|------|------| -| **PM2 一键部署** ⭐推荐 | ⭐ 简单 | VPS、云服务器 | 最简单、一键部署、进程管理 | 需要服务器 | -| **Docker Compose** | ⭐⭐ 中等 | 容器化需求 | 环境隔离、易迁移 | 需要学习 Docker | -| **云平台部署** | ⭐ 简单 | 快速上线 | 免费额度、自动扩展 | 可能有费用 | -| **传统部署** | ⭐⭐⭐ 复杂 | 完全自定义 | 完全控制 | 配置复杂 | - ---- - -## 🎯 方案一:PM2 一键部署(最简单) - -### 适用场景 -- ✅ 你有一台 VPS 或云服务器 -- ✅ 想要最快速的部署方式 -- ✅ 需要进程管理和自动重启 -- ✅ 想要开机自启动 - -### 部署步骤 - -#### Windows -```powershell -# 一行命令搞定 -.\deploy.ps1 -``` - -#### Linux/macOS -```bash -# 一行命令搞定 -chmod +x deploy.sh && ./deploy.sh -``` - -### 特点 -- ⚡ **部署时间**: 3-5 分钟 -- 🎯 **一键完成**: 自动安装、构建、启动 -- 🔄 **自动重启**: 崩溃自动恢复 -- 📊 **进程监控**: PM2 提供完整的监控 -- 🚀 **开机自启**: 服务器重启自动启动 - -### 访问地址 -- 前端:`http://你的服务器IP:5500` -- 后端:`http://你的服务器IP:3000` - ---- - -## 🐳 方案二:Docker 部署 - -### 适用场景 -- ✅ 需要环境隔离 -- ✅ 多个项目部署 -- ✅ 需要容器编排 -- ✅ 跨平台部署 - -### 部署步骤 - -```bash -# 一键 Docker 部署 -chmod +x docker-deploy.sh && ./docker-deploy.sh - -# 或手动部署 -docker-compose up -d -``` - -### 特点 -- ⚡ **部署时间**: 5-10 分钟(首次构建) -- 📦 **环境隔离**: 不污染宿主机环境 -- 🔧 **易迁移**: 可在任何支持 Docker 的环境运行 -- 🔄 **自动重启**: 容器崩溃自动恢复 - ---- - -## ☁️ 方案三:云平台部署 - -### 3.1 Vercel(前端)+ Railway(后端) - -#### 前端部署到 Vercel -1. Fork/导入项目到 GitHub -2. 在 Vercel 导入仓库 -3. 配置构建: - ``` - Root Directory: frontend - Build Command: pnpm install && pnpm build - Output Directory: dist - ``` - -#### 后端部署到 Railway -1. 在 Railway 创建新项目 -2. 连接 GitHub 仓库 -3. 设置环境变量(自动生成) -4. 自动部署 - -### 特点 -- ⚡ **部署时间**: 5-10 分钟 -- 💰 **免费额度**: 都有免费版本 -- 🌍 **全球 CDN**: 访问速度快 -- 🔄 **自动部署**: Git push 自动部署 - ---- - -### 3.2 Render(All-in-One) - -#### 一站式部署 -1. 注册 Render 账号 -2. 连接 GitHub 仓库 -3. 创建两个 Web Services: - - **Backend**: - - Build: `cd backend && pnpm install && pnpm build` - - Start: `cd backend && node dist/app.js` - - **Frontend**: - - Build: `cd frontend && pnpm install && pnpm build` - - Static Site - - Publish: `frontend/dist` - -### 特点 -- ⚡ **部署时间**: 10-15 分钟 -- 💰 **免费计划**: 每月有免费额度 -- 🔄 **自动部署**: Git push 触发 -- 🔒 **免费 SSL**: 自动配置 HTTPS - ---- - -## 🎮 方案四:手动部署 - -### 适用场景 -- ✅ 需要完全自定义配置 -- ✅ 学习部署流程 -- ✅ 特殊环境要求 - -### 部署步骤 - -```bash -# 1. 克隆项目 -git clone -cd just-demo - -# 2. 安装依赖 -pnpm install:all - -# 3. 构建 -pnpm build - -# 4. 配置环境变量 -cp backend/.env.example backend/.env -# 编辑 backend/.env - -# 5. 数据库迁移 -cd backend && pnpm migrate:prod && cd .. - -# 6. 启动后端 -cd backend && node dist/app.js & - -# 7. 启动前端 -cd frontend && npx serve dist -p 5500 & -``` - ---- - -## 🔧 配置 Nginx 反向代理(可选) - -如果你使用 PM2 或手动部署,可以配置 Nginx: - -```bash -# 1. 安装 Nginx -sudo apt install nginx # Ubuntu/Debian - -# 2. 配置 -sudo cp nginx.conf /etc/nginx/sites-available/just-demo -sudo ln -s /etc/nginx/sites-available/just-demo /etc/nginx/sites-enabled/ - -# 3. 修改域名 -sudo nano /etc/nginx/sites-available/just-demo -# 将 your-domain.com 改为你的域名 - -# 4. 重启 Nginx -sudo nginx -t -sudo systemctl reload nginx -``` - ---- - -## 📱 快速决策指南 - -### 我该选哪个方案? - -#### 🏃 我想最快部署 -→ **选择 PM2 一键部署** -```bash -# Windows -.\deploy.ps1 - -# Linux/macOS -./deploy.sh -``` - -#### 💰 我没有服务器/想省钱 -→ **选择云平台部署** -- Vercel(前端免费) -- Railway(后端有免费额度) -- Render(全栈免费) - -#### 🐳 我想要容器化 -→ **选择 Docker 部署** -```bash -./docker-deploy.sh -``` - -#### 🎓 我想学习部署流程 -→ **选择手动部署** -- 完整了解每个步骤 -- 便于排查问题 - ---- - -## 🆘 遇到问题? - -### PM2 方案 -```bash -pm2 logs # 查看日志 -pm2 status # 查看状态 -pm2 restart all # 重启服务 -``` - -### Docker 方案 -```bash -docker-compose logs -f # 查看日志 -docker-compose ps # 查看状态 -docker-compose restart # 重启服务 -``` - -### 云平台 -- 查看部署日志 -- 检查环境变量 -- 查看服务状态 - ---- - -## 📚 详细文档 - -- [完整部署指南](./DEPLOY.md) -- [项目说明](./README.md) - ---- - -## 🎉 开始部署 - -选择一个方案,立即开始: - -```bash -# PM2(推荐) -./deploy.sh # Linux/macOS -.\deploy.ps1 # Windows - -# Docker -./docker-deploy.sh - -# 查看详细文档 -cat DEPLOY.md -``` - diff --git a/README.md b/README.md index 9f51119..3d9914e 100644 --- a/README.md +++ b/README.md @@ -27,33 +27,7 @@ pnpm dev:frontend # 前端:http://localhost:5173 ### 生产部署 🚀 -#### 一键部署(推荐) - -**Windows:** -```powershell -.\deploy.ps1 -``` - -**Linux/macOS:** -```bash -chmod +x deploy.sh -./deploy.sh -``` - -部署脚本会自动完成: -- ✅ 检查并安装必要工具(Node.js、pnpm、PM2) -- ✅ 安装项目依赖 -- ✅ 构建前后端项目 -- ✅ 创建生产环境配置 -- ✅ 运行数据库迁移 -- ✅ 使用 PM2 启动服务 -- ✅ 配置开机自启动 - -部署成功后访问: -- 前端:http://localhost:5500 -- 后端:http://localhost:3000 - -#### 手动部署 +#### 部署 ```bash # 1. 构建项目 @@ -64,7 +38,7 @@ cp backend/.env.example backend/.env # 编辑 backend/.env 修改配置 # 3. 运行数据库迁移 -cd backend && pnpm migrate:prod && cd .. +cd backend && pnpm migrate:prod # 4. 启动服务 pnpm start @@ -79,15 +53,12 @@ pm2 restart all # 重启服务 pm2 stop all # 停止服务 ``` -📖 详细部署说明请查看 [DEPLOY.md](./DEPLOY.md) - ## 项目结构 ``` just-demo/ ├── backend/ # 后端服务 ├── frontend/ # 前端应用 -├── database/ # 数据库文件 └── package.json # 根配置 ``` diff --git a/backend/.dockerignore b/backend/.dockerignore deleted file mode 100644 index a709a01..0000000 --- a/backend/.dockerignore +++ /dev/null @@ -1,17 +0,0 @@ -node_modules -npm-debug.log -pnpm-debug.log -dist -build -.git -.gitignore -*.md -.env -.env.local -.vscode -.idea -*.log -uploads -database/*.sqlite3 -database/*.db - diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 03c7f7d..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -FROM node:18-alpine AS builder - -WORKDIR /app - -# 安装 pnpm -RUN npm install -g pnpm - -# 复制依赖文件 -COPY package.json pnpm-lock.yaml ./ - -# 安装依赖 -RUN pnpm install --frozen-lockfile - -# 复制源代码 -COPY . . - -# 构建 -RUN pnpm build - -# 生产阶段 -FROM node:18-alpine - -WORKDIR /app - -# 安装必要工具 -RUN apk add --no-cache wget && \ - npm install -g pnpm - -# 只安装生产依赖 -COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --prod --frozen-lockfile - -# 复制构建产物和必要文件 -COPY --from=builder /app/dist ./dist -COPY knexfile.js ./ - -# 创建必要的目录 -RUN mkdir -p uploads database && \ - chown -R node:node /app - -# 使用非 root 用户 -USER node - -EXPOSE 3000 - -# 健康检查 -HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ - CMD wget --quiet --tries=1 --spider http://localhost:3000/api/health || exit 1 - -CMD ["node", "dist/app.js"] - diff --git a/backend/database/prod.sqlite3 b/backend/database/prod.sqlite3 deleted file mode 100644 index f48d6480562e119fca496c7691b8dccd74d69909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeI)?Qh#e90zbaY3ilz>Y@qx1uFGc#%Ap)ZOO(q5G!3?3~f`lwLH9XyyTj>O`OcW zbSna(jCCM{1V~6AUNK&5dj&5LVlUV`{sP`3c(Dg~1L7Uh0CDH!9NSGdHVJJ@zt)=C zcjvqMb3fntq1}mNhiyvqxvE>Ss6HVLNwO>*&~-_YQtWGpeTij|t@MZu_FWFGueO?! zcDi4zXSr%}QBo%de;<5l;E#djzBl@Y(ihXuDjz6=sW($S$)8v@76_~nfs(3d6T@<& z-*$@RtVbxdoswrRkR`M3*r)46Bn?d+&rQzc^x30_j?L!uLq`whUe)s=H?%`uuR86F zyuLNhD$5(^HVrD;@UVPdqt?lCP_3vyZB;)r`QqVRba%U$*KLQA5^;5>N_D4RF6%Yd zu2}Ap&g#~!I<4AH!6g;q(Cxb4p1x?gg;SQhbu5!Hg56l=qE)VwyiUnkR#U4smRuxW z!L@7Dt~$+3md0wdC@Gp2&Fe+BM(qj-_R))E&Z?KGJ~ey%c<$(oIdkYp?!?UGk!iMP zy~fMm^Pa|;^@=t*A~&A!d!tw_)cGNKX3ee6lL9sEq8ZH@Y_YYvWA#0ny%OZ}ZfRGV zH{Ko`P_&T|d3nL_ouFK>vOd~BK{~JKo;xVi@`|2ideo+6)5sWIsZpo_#N$7m2hlivyroVl~@SQS`jXu{W`0qHL5(?ky1)4+8#E7D}JQ3 zPA$*$s732ubGQ(RebM+3$&s?nzz|uy8=E!djmkPj+s_(OqYV|mG4~aZseLTcx!~;gyZGvh&9I-d=xlddKvGT~sT+E733) z$@dlGqD>Ke;n2Lxz}In(YUzi^K0fqOtK{8ngbX+BpEz`>7CyJ46K5+7Lc?wzOALD*uKjQeP)4Cw?6MI_`5xpAfSiTu{ z&34(@#8><=%sBUQkD_Usyxi{xonONLNJYaf*!7<0*`TeU)3VV%ty!LTrs}c_tYET@ z4XC7I+2wXNznWrw>sF%^bf-w*jX#h$FdCbZik8jFjgk+$;E=Os#V)xPzq<3xa<#C~ zDXk~U-l>Rx#`6p1VD1Rcp*voY+Rau;`%2cBPV{Qqw#l#gKcaWK%M&mhI;Z>g7)#9B5P%lO+6`TKQHo(C=$Ha5!L+tR5B&K zz{^aCGNGsZqSRj-6RpO^MJe%+R1~@Wq@0o_ctvBPi2q!y{Qh57 zZ%gbS76?E90uX=z1Rwwb2tWV=5P$##x=$b}C#7}#{y*|p{@r(+I3fr@00Izz00bZa z0SG_<0uX?}niuHf0^$GVZ_SGU00Izz00bZa0SG_<0uX=z1R&6T0(k%5eSL}}f&c^{ z009U<00Izz00bZa0SLqe@cut8f^7&u00Izz00bZa0SG_<0uX>e_X*(szx(z{}fB*y_009U<00Izz00iO!c>f<4!8QaS009U<00Izz00bZa0SG{#`vmy=|Aaa% zsh8OY76?E90uX=z1Rwwb2tWV=5P$##{*%CLLXkE<{`|y*RW4W0nDtt@Y89zlCpSO+ z>c)qcZY(!``SR-ZtM6U^?(7vAqsONS)>{y(AqD5<}(4=fOX00bZa0SG_<0uX=z d1Rwwb2t0ZML&?o@_&G%4v80i1CWt2p{{od7Gr<4= diff --git a/deploy.ps1 b/deploy.ps1 deleted file mode 100644 index 7910df8..0000000 --- a/deploy.ps1 +++ /dev/null @@ -1,95 +0,0 @@ -# 一键部署脚本 - Windows PowerShell -# 使用方法: .\deploy.ps1 - -$ErrorActionPreference = "Stop" - -Write-Host "🚀 开始部署 Just-Demo 项目..." -ForegroundColor Cyan - -# 1. 检查 Node.js -Write-Host "`n📦 检查 Node.js..." -ForegroundColor Blue -if (-not (Get-Command node -ErrorAction SilentlyContinue)) { - Write-Host "❌ Node.js 未安装,请先安装 Node.js (v16+)" -ForegroundColor Red - Write-Host "下载地址: https://nodejs.org/" -ForegroundColor Yellow - exit 1 -} -Write-Host "✅ Node.js 版本: $(node -v)" -ForegroundColor Green - -# 2. 检查 pnpm,如果没有则安装 -Write-Host "`n📦 检查 pnpm..." -ForegroundColor Blue -if (-not (Get-Command pnpm -ErrorAction SilentlyContinue)) { - Write-Host "pnpm 未安装,正在安装..." -ForegroundColor Yellow - npm install -g pnpm -} -Write-Host "✅ pnpm 版本: $(pnpm -v)" -ForegroundColor Green - -# 3. 检查 PM2,如果没有则安装 -Write-Host "`n📦 检查 PM2..." -ForegroundColor Blue -if (-not (Get-Command pm2 -ErrorAction SilentlyContinue)) { - Write-Host "PM2 未安装,正在安装..." -ForegroundColor Yellow - npm install -g pm2 - npm install -g pm2-windows-startup - pm2-startup install -} -Write-Host "✅ PM2 已安装" -ForegroundColor Green - -# 4. 安装依赖 -Write-Host "`n📦 安装项目依赖..." -ForegroundColor Blue -pnpm install -Set-Location backend -pnpm install -Set-Location .. - -# 5. 构建项目 -Write-Host "`n🔨 构建项目..." -ForegroundColor Blue -pnpm build:backend - -# 6. 创建生产环境配置 -Write-Host "`n⚙️ 创建生产环境配置..." -ForegroundColor Blue -if (-not (Test-Path "backend\.env")) { - # 生成随机密钥 - $bytes = New-Object byte[] 32 - $rng = [System.Security.Cryptography.RandomNumberGenerator]::Create() - $rng.GetBytes($bytes) - $jwtSecret = [Convert]::ToBase64String($bytes) - - @" -NODE_ENV=production -PORT=3000 -JWT_SECRET=$jwtSecret -FRONTEND_URL=http://localhost:5500 -UPLOAD_DIR=uploads -"@ | Out-File -FilePath "backend\.env" -Encoding UTF8 - Write-Host "✅ 已创建 backend\.env" -ForegroundColor Green -} else { - Write-Host "✅ backend\.env 已存在" -ForegroundColor Green -} - -# 7. 运行数据库迁移 -Write-Host "`n🗄️ 运行数据库迁移..." -ForegroundColor Blue -Set-Location backend -pnpm migrate:prod -Set-Location .. - -# 8. 使用 PM2 启动服务 -Write-Host "`n🚀 使用 PM2 启动服务..." -ForegroundColor Blue -pm2 delete just-demo-backend 2>$null -pm2 start ecosystem.config.js - -# 9. 保存 PM2 配置 -Write-Host "`n💾 保存 PM2 配置..." -ForegroundColor Blue -pm2 save - -# 10. 显示服务状态 -Write-Host "`n📊 服务状态:" -ForegroundColor Cyan -pm2 status - -Write-Host "`n🎉 部署成功!" -ForegroundColor Green -Write-Host "`n访问地址:" -ForegroundColor Cyan -Write-Host " - 后端: http://localhost:3000" -ForegroundColor White -Write-Host "`n常用命令:" -ForegroundColor Cyan -Write-Host " pm2 status # 查看服务状态" -ForegroundColor White -Write-Host " pm2 logs # 查看日志" -ForegroundColor White -Write-Host " pm2 restart all # 重启所有服务" -ForegroundColor White -Write-Host " pm2 stop all # 停止所有服务" -ForegroundColor White -Write-Host "" - diff --git a/deploy.sh b/deploy.sh index 15cafec..2ab76dd 100644 --- a/deploy.sh +++ b/deploy.sh @@ -37,7 +37,7 @@ if ! command -v pm2 &> /dev/null; then fi echo -e "${GREEN}✅ PM2 已安装${NC}" -# 3.5. 检查并安装编译工具(sqlite3 需要) +# 3.5. 检查并安装编译工具 echo -e "${BLUE}🔧 检查编译工具...${NC}" if [[ "$OSTYPE" == "linux-gnu"* ]]; then # Linux 系统 @@ -64,79 +64,39 @@ if [[ "$OSTYPE" == "linux-gnu"* ]]; then fi echo -e "${GREEN}✅ 编译工具已就绪${NC}" -# 4. 安装依赖 -echo -e "${BLUE}📦 安装项目依赖...${NC}" -pnpm install -cd backend && pnpm install && cd .. - -# 4.5. 强制重建 sqlite3(确保原生模块正确编译) -echo -e "${BLUE}🔨 重建 sqlite3 原生模块...${NC}" -cd backend -# 删除 sqlite3 模块并重新安装,确保在当前平台编译 -rm -rf node_modules/.pnpm/sqlite3@* 2>/dev/null || true -rm -rf node_modules/sqlite3 2>/dev/null || true -# 强制重新安装 sqlite3,确保在当前平台编译 -pnpm install sqlite3 --force -# 重建以确保原生模块正确编译 -npm rebuild sqlite3 -# 删除 bcrypt 模块并重新安装,确保在当前平台编译 -rm -rf node_modules/.pnpm/bcrypt@* 2>/dev/null || true -rm -rf node_modules/bcrypt 2>/dev/null || true -# 强制重新安装 bcrypt -pnpm install bcrypt --force -# 重建以确保原生模块正确编译 -npm rebuild bcrypt -cd .. -echo -e "${GREEN}✅ bcrypt 重建完成${NC}" +cp .env.backend.example backend/.env -# 5. 构建项目 -echo -e "${BLUE}🔨 构建项目...${NC}" -pnpm build:backend - -# 6. 创建生产环境配置 -echo -e "${BLUE}⚙️ 创建生产环境配置...${NC}" -if [ ! -f backend/.env ]; then - cat > backend/.env << EOF -NODE_ENV=production -PORT=3000 -JWT_SECRET=$(openssl rand -base64 32) -FRONTEND_URL=http://localhost:5500 -UPLOAD_DIR=uploads -EOF - echo -e "${GREEN}✅ 已创建 backend/.env${NC}" -else - echo -e "${GREEN}✅ backend/.env 已存在${NC}" -fi +echo -e "${BLUE}📦 安装依赖...${NC}" +pnpm install:all +echo -e "${BLUE}📦 依赖安装完成${NC}" -# 7. 运行数据库迁移 -echo -e "${BLUE}🗄️ 运行数据库迁移...${NC}" +# 4. 安装依赖 +echo -e "${BLUE}📦 后端构建中...${NC}" cd backend +npm rebuild sqlite3 +echo -e "${BLUE}📦 sqlite3 重建完成${NC}" +npm rebuild bcrypt +echo -e "${BLUE}📦 bcrypt 安装完成${NC}" +pnpm build +echo -e "${BLUE}📦 后端构建完成${NC}" pnpm migrate:prod -cd .. +echo -e "${BLUE}📦 数据库迁移完成${NC}" -# 8. 使用 PM2 启动服务 -echo -e "${BLUE}🚀 使用 PM2 启动服务...${NC}" -pm2 delete just-demo-backend 2>/dev/null || true -pm2 start ecosystem.config.js +pm2 stop just-demo-backend +pm2 delete just-demo-backend +pm2 start npm --name "just-demo-backend" -- run start:p +echo -e "${BLUE}📦 后端启动完成${NC}" -# 9. 保存 PM2 配置(开机自启动) -echo -e "${BLUE}💾 配置 PM2 开机自启动...${NC}" -pm2 save -pm2 startup +cd .. -# 10. 显示服务状态 -echo "" -echo -e "${GREEN}✅ 部署完成!${NC}" -echo "" -echo "📊 服务状态:" -pm2 status +# 5. 构建项目 +echo -e "${BLUE}📦 前端构建中...${NC}" +cd frontend +pnpm build +echo -e "${BLUE}📦 前端构建完成${NC}" -echo "" echo -e "${GREEN}🎉 部署成功!${NC}" -echo "" -echo "访问地址:" -echo " - 后端: http://localhost:3000" -echo "" + echo "常用命令:" echo " pm2 status # 查看服务状态" echo " pm2 logs # 查看日志" diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6dc1840..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,48 +0,0 @@ -version: '3.8' - -services: - backend: - build: - context: ./backend - dockerfile: Dockerfile - container_name: just-demo-backend - ports: - - "3000:3000" - environment: - - NODE_ENV=production - - PORT=3000 - - JWT_SECRET=${JWT_SECRET:-your-secret-key-please-change} - - FRONTEND_URL=${FRONTEND_URL:-http://localhost:5500} - - UPLOAD_DIR=uploads - volumes: - - ./backend/database:/app/database - - ./backend/uploads:/app/uploads - restart: unless-stopped - healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - - frontend: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: just-demo-frontend - ports: - - "5500:5500" - depends_on: - - backend - restart: unless-stopped - healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:5500"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 20s - -networks: - default: - name: just-demo-network - diff --git a/docker-deploy.sh b/docker-deploy.sh deleted file mode 100644 index 221c2f9..0000000 --- a/docker-deploy.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -# Docker 一键部署脚本 -# 使用方法: chmod +x docker-deploy.sh && ./docker-deploy.sh - -set -e - -echo "🐳 开始 Docker 部署..." - -# 颜色定义 -GREEN='\033[0;32m' -BLUE='\033[0;34m' -RED='\033[0;31m' -NC='\033[0m' - -# 1. 检查 Docker -echo -e "${BLUE}📦 检查 Docker...${NC}" -if ! command -v docker &> /dev/null; then - echo -e "${RED}❌ Docker 未安装${NC}" - echo "请访问 https://docs.docker.com/get-docker/ 安装 Docker" - exit 1 -fi -echo -e "${GREEN}✅ Docker 版本: $(docker --version)${NC}" - -# 2. 检查 Docker Compose -echo -e "${BLUE}📦 检查 Docker Compose...${NC}" -if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then - echo -e "${RED}❌ Docker Compose 未安装${NC}" - exit 1 -fi -echo -e "${GREEN}✅ Docker Compose 已安装${NC}" - -# 3. 创建环境配置 -echo -e "${BLUE}⚙️ 创建环境配置...${NC}" -if [ ! -f .env ]; then - JWT_SECRET=$(openssl rand -base64 32) - cat > .env << EOF -JWT_SECRET=$JWT_SECRET -FRONTEND_URL=http://localhost:5500 -EOF - echo -e "${GREEN}✅ 已创建 .env${NC}" -else - echo -e "${GREEN}✅ .env 已存在${NC}" -fi - -# 4. 构建和启动容器 -echo -e "${BLUE}🔨 构建和启动容器...${NC}" -docker-compose down -docker-compose build --no-cache -docker-compose up -d - -# 5. 等待服务启动 -echo -e "${BLUE}⏳ 等待服务启动...${NC}" -sleep 5 - -# 6. 显示容器状态 -echo -e "${GREEN}✅ 部署完成!${NC}" -echo "" -echo "📊 容器状态:" -docker-compose ps - -echo "" -echo -e "${GREEN}🎉 部署成功!${NC}" -echo "" -echo "访问地址:" -echo " - 前端: http://localhost:5500" -echo " - 后端: http://localhost:3000" -echo "" -echo "常用命令:" -echo " docker-compose ps # 查看容器状态" -echo " docker-compose logs -f # 查看日志" -echo " docker-compose restart # 重启服务" -echo " docker-compose down # 停止服务" -echo "" - diff --git a/docker-test.bat b/docker-test.bat deleted file mode 100644 index 2a9f5a6..0000000 --- a/docker-test.bat +++ /dev/null @@ -1,56 +0,0 @@ -@echo off -echo 🐳 开始 Docker 构建测试... -echo. - -echo [1/4] 检查 Docker 环境... -docker --version >nul 2>&1 -if errorlevel 1 ( - echo ❌ Docker 未安装或未启动 - pause - exit /b 1 -) -echo ✅ Docker 已就绪 -echo. - -echo [2/4] 停止旧容器... -docker-compose down -echo. - -echo [3/4] 构建镜像(这可能需要几分钟)... -docker-compose build --no-cache -if errorlevel 1 ( - echo ❌ 构建失败 - pause - exit /b 1 -) -echo ✅ 构建成功 -echo. - -echo [4/4] 启动容器... -docker-compose up -d -if errorlevel 1 ( - echo ❌ 启动失败 - pause - exit /b 1 -) -echo. - -echo ⏳ 等待服务启动(10秒)... -timeout /t 10 /nobreak >nul -echo. - -echo 📊 容器状态: -docker-compose ps -echo. - -echo 🎉 部署完成! -echo. -echo 访问地址: -echo 前端: http://localhost:5500 -echo 后端: http://localhost:3000 -echo. -echo 查看日志: docker-compose logs -f -echo 停止服务: docker-compose down -echo. -pause - diff --git a/docker-test.sh b/docker-test.sh deleted file mode 100644 index 5358992..0000000 --- a/docker-test.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -# Docker 构建测试脚本 -echo "🐳 开始 Docker 构建测试..." -echo "" - -echo "[1/4] 检查 Docker 环境..." -if ! command -v docker &> /dev/null; then - echo "❌ Docker 未安装或未启动" - exit 1 -fi -echo "✅ Docker 已就绪" -echo "" - -echo "[2/4] 停止旧容器..." -docker-compose down -echo "" - -echo "[3/4] 构建镜像(这可能需要几分钟)..." -docker-compose build --no-cache -if [ $? -ne 0 ]; then - echo "❌ 构建失败" - exit 1 -fi -echo "✅ 构建成功" -echo "" - -echo "[4/4] 启动容器..." -docker-compose up -d -if [ $? -ne 0 ]; then - echo "❌ 启动失败" - exit 1 -fi -echo "" - -echo "⏳ 等待服务启动(10秒)..." -sleep 10 -echo "" - -echo "📊 容器状态:" -docker-compose ps -echo "" - -echo "🎉 部署完成!" -echo "" -echo "访问地址:" -echo " 前端: http://localhost:5500" -echo " 后端: http://localhost:3000" -echo "" -echo "查看日志: docker-compose logs -f" -echo "停止服务: docker-compose down" -echo "" - diff --git a/ecosystem.config.js b/ecosystem.config.js deleted file mode 100644 index 8892182..0000000 --- a/ecosystem.config.js +++ /dev/null @@ -1,35 +0,0 @@ -// PM2 配置文件 -const path = require('path'); - -module.exports = { - apps: [ - { - name: 'just-demo-backend', - script: path.resolve(__dirname, 'backend/dist/app.js'), - cwd: path.resolve(__dirname), - instances: 1, - autorestart: true, - watch: false, - max_memory_restart: '500M', - env: { - NODE_ENV: 'production', - PORT: 3000 - }, - env_production: { - NODE_ENV: 'production', - PORT: 3000 - }, - error_file: path.resolve(__dirname, 'logs/backend-error.log'), - out_file: path.resolve(__dirname, 'logs/backend-out.log'), - log_date_format: 'YYYY-MM-DD HH:mm:ss Z', - merge_logs: true, - // 自动重启策略 - min_uptime: '10s', - max_restarts: 10, - // 启动延迟 - listen_timeout: 3000, - kill_timeout: 5000 - } - ] -}; - diff --git a/fix-sqlite3.sh b/fix-sqlite3.sh deleted file mode 100644 index 65c6d11..0000000 --- a/fix-sqlite3.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash - -# 修复 sqlite3 bindings 问题的脚本 -# 使用方法: chmod +x fix-sqlite3.sh && ./fix-sqlite3.sh - -set -e - -echo "🔧 修复 sqlite3 bindings 问题..." - -# 颜色定义 -GREEN='\033[0;32m' -BLUE='\033[0;34m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -# 检查编译工具 -echo -e "${BLUE}📦 检查编译工具...${NC}" -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - if command -v apt-get &> /dev/null; then - # Debian/Ubuntu - if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then - echo "正在安装编译工具..." - sudo apt-get update - sudo apt-get install -y python3 make g++ build-essential - fi - elif command -v yum &> /dev/null; then - # CentOS/RHEL - if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then - echo "正在安装编译工具..." - sudo yum install -y python3 make gcc-c++ - fi - elif command -v apk &> /dev/null; then - # Alpine - if ! command -v python3 &> /dev/null || ! command -v make &> /dev/null || ! command -v g++ &> /dev/null; then - echo "正在安装编译工具..." - sudo apk add --no-cache python3 make g++ - fi - fi -fi - -# 进入 backend 目录 -cd backend - -# 停止 PM2 服务(如果正在运行) -echo -e "${BLUE}⏸️ 停止后端服务...${NC}" -pm2 stop just-demo-backend 2>/dev/null || true - -# 删除旧的 sqlite3 模块 -echo -e "${BLUE}🗑️ 清理旧的 sqlite3 模块...${NC}" -rm -rf node_modules/.pnpm/sqlite3@* 2>/dev/null || true -rm -rf node_modules/sqlite3 2>/dev/null || true - -# 重新安装 sqlite3 -echo -e "${BLUE}📦 重新安装 sqlite3...${NC}" -pnpm rebuild sqlite3 || pnpm install sqlite3 --force - -# 验证安装 -echo -e "${BLUE}✅ 验证 sqlite3 安装...${NC}" -if node -e "require('sqlite3')" 2>/dev/null; then - echo -e "${GREEN}✅ sqlite3 安装成功!${NC}" -else - echo -e "${RED}❌ sqlite3 安装失败,请检查错误信息${NC}" - exit 1 -fi - -# 返回根目录 -cd .. - -# 重启 PM2 服务 -echo -e "${BLUE}🚀 重启后端服务...${NC}" -pm2 restart just-demo-backend || pm2 start ecosystem.config.js - -echo "" -echo -e "${GREEN}🎉 修复完成!${NC}" -echo "" -echo "如果问题仍然存在,请尝试:" -echo " 1. 完全删除 node_modules: rm -rf backend/node_modules" -echo " 2. 重新安装依赖: cd backend && pnpm install" -echo " 3. 重启服务: pm2 restart just-demo-backend" - diff --git a/frontend/.dockerignore b/frontend/.dockerignore deleted file mode 100644 index f7f87c2..0000000 --- a/frontend/.dockerignore +++ /dev/null @@ -1,14 +0,0 @@ -node_modules -npm-debug.log -pnpm-debug.log -dist -build -.git -.gitignore -*.md -.env -.env.local -.vscode -.idea -*.log - diff --git a/frontend/Dockerfile b/frontend/Dockerfile deleted file mode 100644 index fd8236d..0000000 --- a/frontend/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -FROM node:18-alpine AS builder - -WORKDIR /app - -# 安装 pnpm -RUN npm install -g pnpm - -# 复制依赖文件 -COPY package.json pnpm-lock.yaml ./ - -# 安装依赖 -RUN pnpm install --frozen-lockfile - -# 复制源代码 -COPY . . - -# 构建 -RUN pnpm build - -# 生产阶段 -FROM node:18-alpine - -WORKDIR /app - -# 安装必要工具 -RUN apk add --no-cache wget && \ - npm install -g serve - -# 复制构建产物 -COPY --from=builder /app/dist ./dist - -# 使用非 root 用户 -RUN chown -R node:node /app -USER node - -EXPOSE 5500 - -HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ - CMD wget --quiet --tries=1 --spider http://localhost:5500 || exit 1 - -CMD ["serve", "dist", "-p", "5500", "-s"] - diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index 173f3fb..0000000 --- a/nginx.conf +++ /dev/null @@ -1,72 +0,0 @@ -server { - listen 80; - server_name your-domain.com; # 修改为你的域名 - - # Gzip 压缩 - gzip on; - gzip_vary on; - gzip_min_length 1024; - gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json; - - # 前端静态文件 - location / { - proxy_pass http://localhost:5500; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - - # 缓存设置 - proxy_cache_valid 200 1d; - proxy_cache_bypass $http_upgrade; - add_header X-Cache-Status $upstream_cache_status; - } - - # 后端 API - location /api { - proxy_pass http://localhost:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - - # 超时设置 - proxy_connect_timeout 60s; - proxy_send_timeout 60s; - proxy_read_timeout 60s; - } - - # 上传文件访问 - location /uploads { - proxy_pass http://localhost:3000/uploads; - proxy_http_version 1.1; - proxy_set_header Host $host; - - # 缓存上传的文件 - expires 30d; - add_header Cache-Control "public, immutable"; - } - - # 日志 - access_log /var/log/nginx/just-demo-access.log; - error_log /var/log/nginx/just-demo-error.log; -} - -# HTTPS 配置(使用 Let's Encrypt) -# server { -# listen 443 ssl http2; -# server_name your-domain.com; -# -# ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; -# ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; -# ssl_protocols TLSv1.2 TLSv1.3; -# ssl_ciphers HIGH:!aNULL:!MD5; -# -# # ... 其他配置同上 -# } - diff --git a/package.json b/package.json index e50b0d8..778b7e0 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "build": "pnpm run build:backend && pnpm run build:frontend", "build:backend": "cd backend && pnpm run build", "build:frontend": "cd frontend && pnpm run build", - "install:all": "pnpm install && cd backend && pnpm install && cd ../frontend && pnpm install" + "install:all": "pnpm install --frozen-lockfile && cd backend && pnpm install --frozen-lockfile && cd ../frontend && pnpm install --frozen-lockfile" }, "devDependencies": { "concurrently": "^8.2.2",