Day 11: 部署上线
将应用部署到生产环境,让全世界都能访问你的项目。
部署前准备
环境变量配置
你:配置生产环境的环境变量,包含数据库连接、API密钥等
# .env.production
NODE_ENV=production
DATABASE_URL=mongodb://prod-server:27017/myapp
JWT_SECRET=your-super-secret-key
API_BASE_URL=https://api.yourdomain.com
构建优化
你:优化前端构建配置,减少包体积,启用压缩
安全配置
你:添加安全中间件,防止常见的 Web 攻击
// 安全配置
app.use(helmet()); // 设置安全响应头
app.use(cors({ // CORS 配置
origin: ['https://yourdomain.com'],
credentials: true
}));
app.use(rateLimit({ // 限流
windowMs: 15 * 60 * 1000,
max: 100
}));
前端部署
Vercel 部署
你:将 Next.js 应用部署到 Vercel,配置自定义域名
步骤:
- 连接 GitHub 仓库
- 自动构建和部署
- 配置环境变量
- 绑定自定义域名
Netlify 部署
你:将 React 应用部署到 Netlify,配置重定向规则
阿里云 OSS 静态托管
你:将前端应用部署到阿里云 OSS,配置 CDN 加速
Nginx 配置
你:配置 Nginx 反向代理,实现前后端分离部署
server {
listen 80;
server_name yourdomain.com;
# 前端静态文件
location / {
root /var/www/frontend/dist;
try_files $uri $uri/ /index.html;
}
# API 请求代理
location /api/ {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
后端部署
云服务器部署
你:在阿里云 ECS 上部署 Node.js 应用,使用 PM2 进程管理
# 安装 PM2
npm install -g pm2
# 启动应用
pm2 start app.js --name "my-api"
# 开机自启
pm2 startup
pm2 save
Docker 容器化
你:将 Node.js 应用 Docker 化,编写 Dockerfile 和 docker-compose
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --only=production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- mongodb
mongodb:
image: mongo:5
volumes:
- mongo_data:/data/db
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
volumes:
mongo_data:
Serverless 部署
你:将 API 部署为云函数(阿里云函数计算),实现按需付费
数据库部署
MongoDB Atlas
你:将数据库迁移到 MongoDB Atlas 云数据库
阿里云 RDS
你:配置阿里云 RDS MySQL,设置备份策略
Redis 缓存
你:配置阿里云 Redis,优化数据库查询性能
HTTPS 配置
Let's Encrypt 免费证书
你:用 Certbot 申请免费 SSL 证书,配置 HTTPS
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 申请证书
sudo certbot --nginx -d yourdomain.com
# 自动续期
sudo crontab -e
0 12 * * * /usr/bin/certbot renew --quiet
云服务 SSL
你:在阿里云配置 SSL 证书,实现 HTTPS 访问
域名和 CDN
域名解析
你:配置域名 DNS 解析,指向服务器 IP
CDN 加速
你:配置阿里云 CDN,加速静态资源访问
负载均衡
你:配置负载均衡器,实现多服务器部署
监控和日志
服务监控
你:配置服务器监控,监控 CPU、内存、磁盘使用情况
应用监控
你:集成应用监控,跟踪错误和性能指标
日志管理
你:配置日志收集和分析系统
// 日志配置
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console());
}
CI/CD 自动化部署
GitHub Actions 部署
你:配置 GitHub Actions,代码推送后自动部署到生产环境
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build application
run: npm run build
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.4
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm install --production
pm2 restart myapp
蓝绿部署
你:实现蓝绿部署,确保零停机更新
备份和恢复
数据库备份
你:设置定时数据库备份,保存到云存储
#!/bin/bash
# 数据库备份脚本
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.sql"
# 备份数据库
mysqldump -u root -p$DB_PASSWORD myapp > $BACKUP_FILE
# 上传到云存储
aliyun oss cp $BACKUP_FILE oss://my-backup-bucket/
# 删除本地文件
rm $BACKUP_FILE
代码备份
你:配置代码仓库备份,防止代码丢失
灾难恢复
你:制定灾难恢复计划,服务器挂了怎么快速恢复
性能优化
静态资源优化
你:配置静态资源缓存,启用 Gzip 压缩
数据库优化
你:优化数据库查询,添加必要索引
缓存策略
你:配置多级缓存,提升响应速度
常见部署问题
端口占用
你:检查并解决端口冲突问题
权限问题
你:解决文件权限和用户权限问题
内存不足
你:优化应用内存使用,配置交换空间
跨域问题
你:解决生产环境的跨域访问问题
部署检查清单
上线前检查
- 代码测试通过
- 环境变量配置正确
- 数据库连接正常
- HTTPS 证书配置
- 域名解析正确
- 监控系统就绪
上线后检查
- 网站正常访问
- 功能测试通过
- 性能指标正常
- 错误监控正常
- 备份系统工作
⚠️
部署安全提醒:生产环境的密码、密钥绝对不能提交到代码库,使用环境变量或密钥管理服务。
第十一天完成! 你已经学会部署应用到生产环境了。最后一天学习高级技巧。
下一步
Day 12: 高级技巧 - 掌握 Claude Code 的高级使用技巧
练习建议:
- 部署一个完整的全栈应用到云服务器
- 配置 HTTPS 和域名访问
- 体验一下自动化部署的便利性