gongxiangp2/update-deploy.sh
chenpei 383772d39f 🛡️ 服务器安全加固和FRP问题修复
主要更新:
1. FRP服务器诊断与修复
   - 发现并修复文件描述符耗尽问题(65,536 → 1,048,576)
   - 分析并解决用户上传失败问题
   - 确认SSH服务器安全未被攻破

2. 安全防护系统部署
   - 部署IP黑名单防火墙(封禁20+攻击者)
   - 设置SSH端口速率限制
   - 配置自动化定时任务(每小时更新)
   - 安装Fail2ban实时防护系统
   - 添加白名单保护机制

3. 内网访问优化
   - 改进内网检测逻辑
   - 添加网络状态API
   - 优化钉钉登录流程
   - 完善信息补充功能

4. 文档完善
   - FRP服务器诊断修复报告
   - SSH安全评估报告
   - Fail2ban使用指南
   - 文件描述符详解
   - 用户上传失败原因分析
   - 防火墙配置说明
   - 内网检测改进报告

修复的问题:
- ✅ 文件描述符耗尽导致的服务异常
- ✅ 用户上传失败(影响9.5小时)
- ✅ SSH暴力破解攻击(91,299+次)
- ✅ 第三方项目攻击影响
- ✅ 127.0.0.1误封禁问题

部署的安全措施:
- 三重防护体系(Fail2ban + 防火墙 + 强密码)
- 自动化监控和封禁
- 实时攻击拦截(秒级响应)
- 完整的管理和监控工具

测试环境:开发环境
影响范围:服务器安全、用户上传、系统稳定性
当前状态:✅ 所有问题已修复,系统运行正常
2025-11-06 13:42:36 +08:00

194 lines
5.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 功能更新部署脚本 v2.0
# 用于部署新功能到NAS服务器
set -e
# 配置信息(使用内网地址,速度更快)
NAS_HOST="192.168.58.20"
NAS_PORT="22" # 标准SSH端口
NAS_USER="root"
NAS_PASSWORD="jsjj8888"
NAS_PROJECT_DIR="/mnt/PoolOne/apps/youyidian-3d"
echo "========================================="
echo " 由壹点3D素材系统 - 功能更新部署"
echo " 版本:v2.0.0"
echo " 更新日期:2025-10-16"
echo "========================================="
echo ""
# 检查sshpass
if ! command -v sshpass &> /dev/null; then
echo "❌ 未安装 sshpass,正在安装..."
brew install hudochenkov/sshpass/sshpass
fi
echo "📦 1. 准备更新包..."
echo "压缩项目文件(排除不必要的文件)..."
# 创建临时目录保存要打包的文件
TEMP_PKG_DIR=$(mktemp -d)
echo "临时目录: $TEMP_PKG_DIR"
# 复制项目文件(排除不需要的)
rsync -a \
--exclude='node_modules/' \
--exclude='.next/' \
--exclude='out/' \
--exclude='build/' \
--exclude='dist/' \
--exclude='源码/' \
--exclude='uploads/' \
--exclude='backups/' \
--exclude='.git/' \
--exclude='*.tar.gz' \
--exclude='*.zip' \
--exclude='*.rar' \
--exclude='*.7z' \
--exclude='*.log' \
--exclude='.DS_Store' \
--exclude='.vscode/' \
--exclude='.idea/' \
--exclude='.cursor/' \
--exclude='coverage/' \
--exclude='test/' \
--exclude='tests/' \
--exclude='.cache/' \
--exclude='.tmp/' \
--exclude='tmp/' \
--exclude='temp/' \
./ "$TEMP_PKG_DIR/"
# 确保 .dockerignore 被包含
cp .dockerignore "$TEMP_PKG_DIR/" 2>/dev/null || echo "警告: .dockerignore 不存在"
cp Dockerfile "$TEMP_PKG_DIR/" 2>/dev/null || echo "警告: Dockerfile 不存在"
# 创建压缩包
tar -czf project-update-v2.0.tar.gz -C "$TEMP_PKG_DIR" .
# 清理临时目录
rm -rf "$TEMP_PKG_DIR"
echo "✅ 更新包创建完成:project-update-v2.0.tar.gz"
echo ""
echo "📤 2. 上传到NAS服务器 (内网地址 ${NAS_HOST}:${NAS_PORT})..."
sshpass -p "${NAS_PASSWORD}" scp -P ${NAS_PORT} project-update-v2.0.tar.gz ${NAS_USER}@${NAS_HOST}:${NAS_PROJECT_DIR}/
echo "✅ 上传完成"
echo ""
echo "🚀 3. 在NAS服务器上部署更新..."
sshpass -p "${NAS_PASSWORD}" ssh -p ${NAS_PORT} ${NAS_USER}@${NAS_HOST} << 'ENDSSH'
cd /mnt/PoolOne/apps/youyidian-3d
echo "备份当前版本..."
if [ ! -d "backups" ]; then
mkdir -p backups
fi
# 备份上传目录
if [ -d "uploads" ]; then
backup_name="backups/uploads-$(date +%Y%m%d-%H%M%S)"
echo "备份上传文件到 $backup_name"
cp -r uploads "$backup_name"
fi
echo "解压更新包..."
tar -xzf project-update-v2.0.tar.gz
rm project-update-v2.0.tar.gz
# 恢复上传目录
if [ -d "backups" ]; then
latest_backup=$(ls -td backups/uploads-* 2>/dev/null | head -1)
if [ -n "$latest_backup" ] && [ -d "$latest_backup" ]; then
echo "恢复上传文件..."
cp -r "$latest_backup"/* uploads/ 2>/dev/null || true
fi
fi
# 确保uploads文件夹有正确的权限
echo "设置上传文件夹权限..."
mkdir -p uploads
chmod -R 777 uploads
chown -R 1000:1000 uploads
echo "停止旧容器..."
docker compose down
echo "重新构建并启动新容器..."
docker compose up -d --build --force-recreate
echo "等待容器启动..."
sleep 15
echo "运行数据库迁移..."
docker compose exec -T app npx prisma db push --accept-data-loss --schema=/app/prisma/schema.prisma
echo "初始化店铺数据..."
docker compose exec -T app npx prisma db execute --schema=/app/prisma/schema.prisma --stdin <<< "
INSERT INTO categories (id, name, \"createdAt\") VALUES
(gen_random_uuid(), '天猫旗舰店', NOW()),
(gen_random_uuid(), '京东自营', NOW()),
(gen_random_uuid(), '拼多多店铺', NOW()),
(gen_random_uuid(), '1688店铺', NOW()),
(gen_random_uuid(), '其他店铺', NOW())
ON CONFLICT (name) DO NOTHING;
"
echo ""
echo "========================================="
echo " ✅ 部署完成!"
echo "========================================="
echo ""
echo "📍 访问地址:"
echo " 🏠 内网(速度快,推荐上传):http://192.168.58.20:4320"
echo " 🌍 公网(随时随地访问):http://180.97.221.140:2320"
echo ""
echo "容器状态:"
docker compose ps
echo ""
echo "最近日志:"
docker compose logs --tail=30 app
echo ""
echo "========================================="
echo " 新功能:"
echo " ✅ 1. 浏览器黑暗模式支持"
echo " ✅ 2. 上传进度条和速度显示"
echo " ✅ 3. 支持7Z压缩格式"
echo " ✅ 4. 取消上传大小限制(3GB)"
echo " ✅ 5. 内外网模式识别和提示"
echo " ✅ 6. 使用店铺分类功能(全新架构)"
echo " ✅ 7. 上传超时时间延长至3小时"
echo " ✅ 8. 修复上传权限问题"
echo " ✅ 9. 修复拖拽上传闪屏问题"
echo " ✅ 10. 预览图尺寸优化为300x300"
echo " ✅ 11. CORS跨域支持(内外网互相访问)"
echo " ✅ 12. 分类数量统计显示"
echo " ✅ 13. 管理员分类管理功能(编辑/删除)"
echo " ✅ 14. 固定顶部导航栏(滚动不影响)"
echo " ✅ 15. 悬浮排行榜面板(贡献/下载/点赞)"
echo " ✅ 16. 管理员可设置其他用户为管理员"
echo ""
echo " 标签更新:"
echo " 📝 商品型号 → SPU"
echo " 📝 一级分类 → 使用店铺"
echo " 📝 场景名称 → 场景类别"
echo "========================================="
ENDSSH
echo ""
echo "🎉 部署成功!请访问系统验证新功能。"
echo ""
echo "📖 详细说明请查看:FEATURE_UPDATES.md"
echo ""
# 清理本地临时文件
rm -f project-update-v2.0.tar.gz
echo "✅ 清理完成"