12 KiB
12 KiB
影子系统覆盖正式系统 - 安全部署方案
⚠️ 核心原则
影子系统覆盖正式系统后,所有的功能/用户信息/素材信息全部都不能动!
📋 部署前检查清单
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
- Endpoint:
必须确认:
# 检查正式环境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:功能验证
必须验证的功能:
-
用户登录
- 访问 http://192.168.58.20:4320
- 使用现有账号登录
- 确认用户信息正确
-
素材列表
- 查看首页素材列表
- 确认素材数量正确
- 确认预览图正常显示
-
素材下载
- 下载一个素材
- 确认文件完整
- 确认下载次数增加
-
素材上传
- 上传一个测试素材
- 确认上传成功
- 确认文件保存到uploads目录
-
收藏功能
- 收藏/取消收藏素材
- 确认收藏状态正确
-
搜索功能
- 搜索素材
- 确认搜索结果正确
-
筛选功能
- 使用各种筛选条件
- 确认筛选结果正确
-
滚动加载
- 滚动页面加载更多素材
- 确认不会自动返回顶部
🔄 回滚方案(如果出现问题)
快速回滚步骤
# 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/
📞 联系方式
如果部署过程中遇到问题,请立即停止操作并联系技术负责人。
切记:数据安全第一,功能完整第二!