gongxiangp2/影子系统覆盖正式系统部署方案.md

12 KiB
Raw Blame History

影子系统覆盖正式系统 - 安全部署方案

⚠️ 核心原则

影子系统覆盖正式系统后,所有的功能/用户信息/素材信息全部都不能动!


📋 部署前检查清单

1. 数据库状态确认

正式环境数据库(lobechat)

  • 数据库名: lobechat
  • 服务器: 192.168.58.20:5432
  • 用户: gongxiangpan / gongxiangpan123
  • 数据库大小: 约 10 MB
  • 容器名: gongxiangpan-postgres-1

当前数据量(2025-12-20实际查询):

  • 用户数: 98 个用户
  • 素材总数: 1,525 个素材(未删除)+ 6 个软删除
  • 素材类型分布:
    • 3DMAX: 656个
    • 3D场景: 371个
    • 其他: 101个
    • 音乐: 93个
    • PSD: 71个
    • 种草视频: 57个
    • 买家秀图片: 50个
    • 主图视频: 41个
    • 安装视频: 29个
    • 实拍图片: 19个
    • 详情页: 17个
    • 材质: 11个
    • 模特: 7个
    • 标准模型: 1个
    • 小红书种草: 1个
  • 收藏数: 2条收藏记录
  • 下载记录: 0条(material_download_logs表为空)
  • 操作日志: 5条记录
  • 点赞记录: 4条记录
  • 分类数: 7个
  • 场景数: 12个
  • 平台数: 0个
  • 品类数: 29个
  • 软删除素材: 6个

数据库表列表:

  • users - 用户表(144 KB)
  • materials - 素材表(1560 KB,最大表)
  • material_favorites - 收藏表(80 KB)
  • material_download_logs - 下载日志表(48 KB)
  • material_logs - 操作日志表(80 KB)
  • material_likes - 点赞表(80 KB)
  • material_skus - SKU表(32 KB)
  • categories - 分类表(48 KB)
  • scenes - 场景表(48 KB)
  • platforms - 平台表(24 KB)
  • product_categories - 品类表(48 KB)
  • departments - 部门表(48 KB)
  • danmakus - 弹幕表(48 KB)
  • system_settings - 系统设置表(32 KB)
  • _prisma_migrations - 迁移记录表(32 KB)

必须确认的数据:

-- 用户数量
SELECT COUNT(*) as user_count FROM users;

-- 素材数量(未删除)
SELECT COUNT(*) as material_count FROM materials WHERE "deletedAt" IS NULL;

-- 收藏数量
SELECT COUNT(*) as favorite_count FROM material_favorites;

-- 下载记录数量
SELECT COUNT(*) as download_log_count FROM material_download_logs;

-- 分类数量
SELECT COUNT(*) as category_count FROM categories;

-- 场景数量
SELECT COUNT(*) as scene_count FROM scenes;

-- 平台数量
SELECT COUNT(*) as platform_count FROM platforms;

-- 品类数量
SELECT COUNT(*) as product_category_count FROM product_categories;

-- 素材类型分布
SELECT "materialType", COUNT(*) as count 
FROM materials 
WHERE "deletedAt" IS NULL 
GROUP BY "materialType" 
ORDER BY count DESC;

影子环境数据库(lobechat_stage)

  • 数据库名: lobechat_stage
  • 服务器: 192.168.58.20:5432
  • 用户: gongxiangpan / gongxiangpan123

2. 文件存储状态确认

正式环境文件

  • 本地上传文件: /root/youyidian-3d-material/uploads/
  • MinIO S3配置:
    • Endpoint: https://s3.1080p.hk
    • Bucket: jsxiangche
    • 公网域名: https://s3.1080p.hk/jsxiangche
    • 文件前缀: 由壹点AI/
    • Access Key: AEvT1p0wSNjow3Asu9NV
    • Region: us-east-1

必须确认:

# 检查正式环境uploads目录大小
ssh root@192.168.58.20 "du -sh /root/youyidian-3d-material/uploads/"

# 检查文件数量
ssh root@192.168.58.20 "find /root/youyidian-3d-material/uploads/ -type f | wc -l"

# 检查最新上传的文件
ssh root@192.168.58.20 "ls -lt /root/youyidian-3d-material/uploads/ | head -20"

⚠️ 重要提醒:

  • uploads目录包含所有用户上传的源文件(ZIP压缩包)
  • 这些文件是素材的核心资产,必须完整保留
  • 部署时必须确保新容器正确挂载此目录

3. 容器状态确认

# 检查正式系统容器
ssh root@192.168.58.20 "docker ps | grep youyidian-3d-material"

# 检查影子系统容器
ssh root@192.168.58.20 "docker ps | grep youyidian-3d-shadow"

🔒 部署前备份(必须执行)

1. 数据库完整备份

# 执行数据库备份脚本
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupFile = "backup_prod_before_deploy_$timestamp.sql"

# 备份正式环境数据库
ssh root@192.168.58.20 "docker exec gongxiangpan-postgres-1 pg_dump -U gongxiangpan -d lobechat > /root/backups/$backupFile"

# 下载备份到本地(双重保险)
scp root@192.168.58.20:/root/backups/$backupFile ./backups/

2. uploads目录备份

# 备份uploads目录
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
ssh root@192.168.58.20 "tar -czf /root/backups/uploads_backup_$timestamp.tar.gz /root/youyidian-3d-material/uploads/"

# 下载备份到本地(可选,文件可能很大)
# scp root@192.168.58.20:/root/backups/uploads_backup_$timestamp.tar.gz ./backups/

3. 环境变量备份

# 备份正式环境的环境变量
ssh root@192.168.58.20 "docker exec youyidian-3d-material env > /root/backups/env_prod_$timestamp.txt"

🚀 部署步骤(影子系统 → 正式系统)

步骤 1:停止正式系统容器(保留数据)

# 停止正式系统容器(不删除)
ssh root@192.168.58.20 "docker stop youyidian-3d-material"

# 确认容器已停止
ssh root@192.168.58.20 "docker ps -a | grep youyidian-3d-material"

⚠️ 注意:

  • 只停止容器,不删除容器
  • 不删除数据卷
  • 不删除uploads目录

步骤 2:验证影子系统镜像

# 检查影子系统使用的镜像
ssh root@192.168.58.20 "docker inspect youyidian-3d-shadow | grep Image"

# 记录镜像ID
$shadowImageId = ssh root@192.168.58.20 "docker inspect youyidian-3d-shadow --format='{{.Image}}'"
Write-Host "影子系统镜像ID: $shadowImageId"

步骤 3:更新正式系统容器配置

方案A:使用docker-compose(推荐)

# 1. 备份当前docker-compose.yml
Copy-Item docker-compose.yml docker-compose.yml.backup

# 2. 更新docker-compose.yml中的镜像标签
# 将影子系统测试通过的镜像标签更新到正式系统配置中

# 3. 重新启动正式系统
ssh root@192.168.58.20 "cd /root/youyidian-3d-material && docker-compose up -d"

方案B:直接替换容器(快速方案)

# 1. 删除旧的正式系统容器(保留数据卷)
ssh root@192.168.58.20 "docker rm youyidian-3d-material"

# 2. 使用影子系统的镜像创建新的正式系统容器
ssh root@192.168.58.20 @"
docker run -d \
  --name youyidian-3d-material \
  --restart unless-stopped \
  -p 4320:3000 \
  -v /root/youyidian-3d-material/uploads:/app/uploads \
  -e DATABASE_URL='postgresql://gongxiangpan:gongxiangpan123@192.168.58.20:5432/lobechat' \
  -e NEXTAUTH_URL='http://192.168.58.20:4320' \
  -e NEXTAUTH_SECRET='your-secret-key' \
  -e S3_ENDPOINT='https://s3.yydd.ai' \
  -e S3_BUCKET='gongxiangpan' \
  -e S3_ACCESS_KEY='your-access-key' \
  -e S3_SECRET_KEY='your-secret-key' \
  -e S3_REGION='us-east-1' \
  -e S3_PUBLIC_URL='https://s3.yydd.ai/gongxiangpan' \
  -e REDIS_URL='redis://192.168.58.20:6379' \
  $shadowImageId
"@

步骤 4:验证部署结果

# 1. 检查容器状态
ssh root@192.168.58.20 "docker ps | grep youyidian-3d-material"

# 2. 检查容器日志
ssh root@192.168.58.20 "docker logs --tail 50 youyidian-3d-material"

# 3. 验证数据库连接
ssh root@192.168.58.20 "docker exec youyidian-3d-material env | grep DATABASE_URL"

# 4. 验证uploads目录挂载
ssh root@192.168.58.20 "docker exec youyidian-3d-material ls -la /app/uploads | head -20"

步骤 5:功能验证

必须验证的功能:

  1. 用户登录

  2. 素材列表

    • 查看首页素材列表
    • 确认素材数量正确
    • 确认预览图正常显示
  3. 素材下载

    • 下载一个素材
    • 确认文件完整
    • 确认下载次数增加
  4. 素材上传

    • 上传一个测试素材
    • 确认上传成功
    • 确认文件保存到uploads目录
  5. 收藏功能

    • 收藏/取消收藏素材
    • 确认收藏状态正确
  6. 搜索功能

    • 搜索素材
    • 确认搜索结果正确
  7. 筛选功能

    • 使用各种筛选条件
    • 确认筛选结果正确
  8. 滚动加载

    • 滚动页面加载更多素材
    • 确认不会自动返回顶部

🔄 回滚方案(如果出现问题)

快速回滚步骤

# 1. 停止新部署的容器
ssh root@192.168.58.20 "docker stop youyidian-3d-material"

# 2. 启动备份的旧容器
ssh root@192.168.58.20 "docker start youyidian-3d-material-backup"

# 或者从备份恢复数据库
$backupFile = "backup_prod_before_deploy_YYYYMMDD_HHMMSS.sql"
ssh root@192.168.58.20 "docker exec -i gongxiangpan-postgres-1 psql -U gongxiangpan -d lobechat < /root/backups/$backupFile"

📊 部署后数据验证

数据完整性检查

-- 1. 用户数量对比
SELECT COUNT(*) as user_count FROM users;

-- 2. 素材数量对比(未删除)
SELECT COUNT(*) as material_count FROM materials WHERE "deletedAt" IS NULL;

-- 3. 收藏数量对比
SELECT COUNT(*) as favorite_count FROM material_favorites;

-- 4. 下载记录数量对比
SELECT COUNT(*) as download_log_count FROM material_download_logs;

-- 5. 最新素材检查
SELECT id, "productModel", "createdAt" 
FROM materials 
WHERE "deletedAt" IS NULL 
ORDER BY "createdAt" DESC 
LIMIT 10;

-- 6. 最新用户检查
SELECT id, username, email, "createdAt" 
FROM users 
ORDER BY "createdAt" DESC 
LIMIT 10;

文件完整性检查

# 检查uploads目录
ssh root@192.168.58.20 "du -sh /root/youyidian-3d-material/uploads/"
ssh root@192.168.58.20 "find /root/youyidian-3d-material/uploads/ -type f | wc -l"

# 检查最新上传的文件
ssh root@192.168.58.20 "ls -lt /root/youyidian-3d-material/uploads/ | head -20"

⚠️ 关键注意事项

1. 数据库连接

必须确保:

  • 新容器连接的是正式数据库 lobechat(不是 lobechat_stage)
  • DATABASE_URL 正确:postgresql://gongxiangpan:gongxiangpan123@192.168.58.20:5432/lobechat

2. 文件存储

必须确保:

  • uploads目录正确挂载:-v /root/youyidian-3d-material/uploads:/app/uploads
  • MinIO S3配置正确(S3_ENDPOINT, S3_BUCKET等)

3. 环境变量

必须确保:

  • NEXTAUTH_URL: http://192.168.58.20:4320(正式系统端口)
  • REDIS_URL: redis://192.168.58.20:6379(正式Redis端口)

4. 端口映射

必须确保:

  • 容器端口映射:-p 4320:3000(正式系统端口)

📝 部署检查表

部署前:

  • 已备份正式数据库
  • 已备份uploads目录
  • 已备份环境变量
  • 已记录当前数据量(用户、素材、收藏等)
  • 已确认影子系统功能正常

部署中:

  • 已停止正式系统容器
  • 已验证影子系统镜像
  • 已更新容器配置
  • 已确认数据库连接正确
  • 已确认uploads目录挂载正确

部署后:

  • 容器正常运行
  • 用户可以正常登录
  • 素材列表显示正常
  • 素材下载功能正常
  • 素材上传功能正常
  • 收藏功能正常
  • 搜索筛选功能正常
  • 滚动加载功能正常
  • 数据量与部署前一致

🆘 故障排查

问题1:容器启动失败

# 查看容器日志
ssh root@192.168.58.20 "docker logs youyidian-3d-material"

# 检查端口占用
ssh root@192.168.58.20 "netstat -tlnp | grep 4320"

问题2:数据库连接失败

# 测试数据库连接
ssh root@192.168.58.20 "docker exec gongxiangpan-postgres-1 psql -U gongxiangpan -d lobechat -c 'SELECT 1;'"

# 检查环境变量
ssh root@192.168.58.20 "docker exec youyidian-3d-material env | grep DATABASE"

问题3:文件上传失败

# 检查uploads目录权限
ssh root@192.168.58.20 "ls -la /root/youyidian-3d-material/uploads/"

# 检查容器内目录
ssh root@192.168.58.20 "docker exec youyidian-3d-material ls -la /app/uploads/"

问题4:MinIO S3连接失败

# 检查S3环境变量
ssh root@192.168.58.20 "docker exec youyidian-3d-material env | grep S3"

# 测试S3连接
curl https://s3.yydd.ai/gongxiangpan/

📞 联系方式

如果部署过程中遇到问题,请立即停止操作并联系技术负责人。

切记:数据安全第一,功能完整第二!