Skip to content

部署说明

Docker 部署(推荐)

准备工作

  1. 安装 Docker 和 Docker Compose
  2. 准备外部 MySQL 服务
  3. 克隆项目代码

部署步骤

bash
# 1. 进入项目目录
cd kevi_blog-v2

# 2. 配置环境变量
cp .env.example .env

# 3. 编辑 .env 文件,配置数据库连接
# 注意:Redis URL 使用容器内地址
REDIS_URL=redis://redis:6379

# 4. 启动服务
docker-compose up --build -d

# 5. 查看日志
docker-compose logs -f

# 6. 停止服务
docker-compose down

配置说明

docker-compose.yml 包含以下服务:

  • web: Nuxt 应用
  • redis: Redis 缓存服务

需要外部 MySQL 服务。

数据持久化

数据卷映射:

  • ./uploads:/app/uploads - 上传文件持久化

传统部署

1. 构建应用

bash
# 安装依赖
pnpm install

# 类型检查
pnpm run type-check

# 代码检查
pnpm run lint

# 构建生产版本
pnpm run build

2. 启动服务

bash
# 使用 PM2 管理进程
pm2 start ecosystem.config.js

# 或直接使用 Node
pnpm run preview

3. Nginx 反向代理配置

nginx
server {
    listen 80;
    server_name your-domain.com;

    # 前端应用
    location / {
        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_cache_bypass $http_upgrade;
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # API 接口
    location /api {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        proxy_pass http://localhost:3000;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

4. SSL 配置(HTTPS)

bash
# 安装 Certbot
sudo apt-get install certbot python3-certbot-nginx

# 获取 SSL 证书
sudo certbot --nginx -d your-domain.com

# 自动续期
sudo certbot renew --dry-run

服务器环境准备

安装 Node.js

bash
# 使用 NodeSource 仓库安装 Node.js 18.x
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# 验证安装
node --version
npm --version

安装 MySQL

bash
# 安装 MySQL 8.0
sudo apt-get update
sudo apt-get install mysql-server

# 安全配置
sudo mysql_secure_installation

# 创建数据库
mysql -u root -p
sql
CREATE DATABASE nuxt_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'blog_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON nuxt_blog.* TO 'blog_user'@'localhost';
FLUSH PRIVILEGES;

安装 Redis

bash
# 安装 Redis
sudo apt-get install redis-server

# 启动 Redis
sudo systemctl start redis
sudo systemctl enable redis

# 设置密码
sudo nano /etc/redis/redis.conf

修改配置文件:

conf
requirepass your_redis_password

重启 Redis:

bash
sudo systemctl restart redis

PM2 配置

创建 ecosystem.config.js 文件:

javascript
module.exports = {
  apps: [{
    name: 'kevi-blog',
    script: 'node',
    args: '.output/server/index.mjs',
    cwd: '/projects/kevi_blog-v2',
    instances: 'max',
    exec_mode: 'cluster',
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }]
}

PM2 命令:

bash
# 启动应用
pm2 start ecosystem.config.js

# 查看状态
pm2 status

# 查看日志
pm2 logs kevi-blog

# 重启应用
pm2 restart kevi-blog

# 停止应用
pm2 stop kevi-blog

# 设置开机自启
pm2 startup
pm2 save

性能优化

1. 开启 Gzip 压缩

nuxt.config.ts 中配置:

typescript
export default defineNuxtConfig({
  nitro: {
    compressPublicAssets: true
  }
})

2. 配置 CDN

使用 CDN 加速静态资源:

typescript
export default defineNuxtConfig({
  app: {
    cdnURL: 'https://cdn.yourdomain.com'
  }
})

3. 数据库优化

  • 创建索引
  • 优化查询语句
  • 使用 Redis 缓存热点数据

4. 启用缓存

env
CACHE_STORAGE=redis

监控和日志

应用日志

bash
# PM2 日志
pm2 logs kevi-blog --lines 100

# Docker 日志
docker-compose logs -f web

系统监控

安装监控工具:

bash
# 安装 htop
sudo apt-get install htop

# 安装 glances
sudo pip3 install glances

# 运行监控
htop
glances

备份策略

数据库备份

bash
# 创建备份脚本
nano backup-db.sh
bash
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups"
DB_NAME="nuxt_blog"
DB_USER="blog_user"
DB_PASS="your_password"

mkdir -p $BACKUP_DIR

mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# 保留最近 7 天的备份
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +7 -delete

设置定时任务:

bash
crontab -e
cron
# 每天凌晨 2 点备份数据库
0 2 * * * /path/to/backup-db.sh

文件备份

bash
# 备份上传目录
tar -czf /backups/uploads_$(date +%Y%m%d).tar.gz ./uploads

故障排除

1. 应用无法启动

bash
# 检查端口占用
netstat -tlnp | grep 3000

# 检查日志
pm2 logs kevi-blog

2. 数据库连接失败

  • 检查数据库服务状态
  • 验证连接配置
  • 检查防火墙规则

3. 文件上传失败

  • 检查上传目录权限
  • 验证存储配置
  • 检查磁盘空间

4. 内存不足

bash
# 检查内存使用
free -h

# 增加交换空间
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

安全建议

  1. 定期更新系统

    bash
    sudo apt-get update && sudo apt-get upgrade
  2. 配置防火墙

    bash
    sudo ufw allow ssh
    sudo ufw allow http
    sudo ufw allow https
    sudo ufw enable
  3. 修改默认密码

    • 数据库密码
    • Redis 密码
    • 管理员账号密码
  4. 启用 HTTPS

    • 使用 Let's Encrypt 免费证书
    • 强制 HTTPS 重定向
  5. 定期备份

    • 数据库备份
    • 文件备份
    • 配置备份
  6. 监控日志

    • 定期查看应用日志
    • 设置异常告警

生产环境检查清单

  • [ ] 修改所有默认密码
  • [ ] 配置强密码策略
  • [ ] 启用 HTTPS
  • [ ] 配置防火墙
  • [ ] 设置定期备份
  • [ ] 配置日志监控
  • [ ] 性能优化完成
  • [ ] 压力测试通过
  • [ ] SSL 证书自动续期
  • [ ] 数据库备份脚本就绪
  • [ ] 监控系统配置完成
  • [ ] 域名 DNS 解析正确
  • [ ] CDN 配置完成(可选)