feat: 添加v2.2.0部署脚本和工具文件
This commit is contained in:
@@ -28,7 +28,11 @@
|
||||
"Bash(timeout /t 3 /nobreak)",
|
||||
"Bash(ping:*)",
|
||||
"Bash(git diff-tree:*)",
|
||||
"Bash(git format-patch:*)"
|
||||
"Bash(git format-patch:*)",
|
||||
"WebFetch(domain:bocha-ai.feishu.cn)",
|
||||
"Bash(ls:*)",
|
||||
"Bash(git pull:*)",
|
||||
"Bash(del nul)"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
358
1PANEL_DEPLOY.md
Normal file
358
1PANEL_DEPLOY.md
Normal file
@@ -0,0 +1,358 @@
|
||||
# 1Panel Web界面部署指南
|
||||
|
||||
## 使用1Panel Web界面部署ZJPB项目
|
||||
|
||||
### 前提条件
|
||||
- 1Panel已安装并可访问
|
||||
- 1Panel版本支持Python项目管理
|
||||
|
||||
---
|
||||
|
||||
## 方式一:使用1Panel的运行时环境(推荐)
|
||||
|
||||
### 步骤1:准备项目文件
|
||||
|
||||
1. **压缩项目**
|
||||
- 在本地压缩整个项目文件夹
|
||||
- 排除:`venv/`, `__pycache__/`, `.env`, `test_*.py`, `logs/`
|
||||
|
||||
### 步骤2:在1Panel中创建数据库
|
||||
|
||||
1. 登录1Panel管理面板
|
||||
2. 进入 **数据库** 菜单
|
||||
3. 点击 **创建数据库**
|
||||
4. 填写信息:
|
||||
```
|
||||
数据库名:ai_nav
|
||||
用户名:ai_nav_user
|
||||
密码:(自动生成或自定义)
|
||||
权限:本地访问
|
||||
```
|
||||
5. 点击确定,**记录数据库密码**
|
||||
|
||||
### 步骤3:上传项目文件
|
||||
|
||||
1. 进入 **文件** 菜单
|
||||
2. 导航到网站目录(如 `/www/wwwroot/`)
|
||||
3. 创建项目目录 `zjpb`
|
||||
4. 上传并解压 `zjpb.zip`
|
||||
|
||||
### 步骤4:配置环境变量
|
||||
|
||||
1. 在项目目录中,找到 `.env.example` 文件
|
||||
2. 复制为 `.env`
|
||||
3. 点击编辑,填写配置:
|
||||
|
||||
```env
|
||||
# 数据库配置
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_USER=ai_nav_user
|
||||
DB_PASSWORD=你的数据库密码
|
||||
DB_NAME=ai_nav
|
||||
|
||||
# 安全配置
|
||||
SECRET_KEY=你的密钥(使用下方命令生成)
|
||||
FLASK_ENV=production
|
||||
|
||||
# DeepSeek API(可选)
|
||||
DEEPSEEK_API_KEY=sk-xxxxx
|
||||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||||
```
|
||||
|
||||
生成SECRET_KEY:
|
||||
```bash
|
||||
# 在1Panel终端执行
|
||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||
```
|
||||
|
||||
### 步骤5:使用1Panel创建Python项目
|
||||
|
||||
#### 5.1 进入网站管理
|
||||
|
||||
1. 点击 **网站** 菜单
|
||||
2. 点击 **创建网站**
|
||||
3. 选择 **运行时** 类型
|
||||
|
||||
#### 5.2 配置Python项目
|
||||
|
||||
填写以下信息:
|
||||
|
||||
**基本设置:**
|
||||
```
|
||||
网站类型:运行时
|
||||
运行时:Python
|
||||
域名:your-domain.com(或IP地址)
|
||||
代码目录:/www/wwwroot/zjpb
|
||||
```
|
||||
|
||||
**Python设置:**
|
||||
```
|
||||
Python版本:选择 3.8+ 的版本
|
||||
应用类型:选择 "Flask" 或 "其他"
|
||||
启动文件:app.py
|
||||
启动命令:gunicorn -c gunicorn_config.py app:app
|
||||
端口:5000(默认)
|
||||
```
|
||||
|
||||
**环境变量:**(如果1Panel支持在界面配置)
|
||||
```
|
||||
FLASK_ENV=production
|
||||
```
|
||||
|
||||
**其他选项:**
|
||||
```
|
||||
☑ 自动启动
|
||||
☑ 守护进程
|
||||
进程数:4
|
||||
```
|
||||
|
||||
#### 5.3 安装依赖
|
||||
|
||||
1. 创建网站后,1Panel会自动创建虚拟环境
|
||||
2. 进入网站设置
|
||||
3. 找到 **依赖管理** 或 **包管理**
|
||||
4. 上传 `requirements.txt` 或手动安装
|
||||
5. 点击 **安装依赖**
|
||||
|
||||
或者使用1Panel的终端:
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 激活虚拟环境(1Panel自动创建的)
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 步骤6:初始化数据库
|
||||
|
||||
1. 在1Panel中打开 **终端** 或 SSH连接
|
||||
2. 执行:
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
source venv/bin/activate
|
||||
python init_db.py
|
||||
```
|
||||
|
||||
### 步骤7:启动和管理
|
||||
|
||||
1. 在1Panel网站列表中找到你的项目
|
||||
2. 点击 **启动** 按钮
|
||||
3. 查看状态:运行中 ✓
|
||||
|
||||
### 步骤8:配置反向代理(如果需要)
|
||||
|
||||
如果1Panel没有自动配置Nginx:
|
||||
|
||||
1. 进入网站设置
|
||||
2. 找到 **反向代理** 或 **代理配置**
|
||||
3. 配置:
|
||||
```
|
||||
目标地址:http://127.0.0.1:5000
|
||||
```
|
||||
|
||||
### 步骤9:配置SSL证书(推荐)
|
||||
|
||||
1. 在网站设置中找到 **SSL**
|
||||
2. 选择 **Let's Encrypt**
|
||||
3. 点击申请证书
|
||||
4. 启用 **强制HTTPS**
|
||||
|
||||
### 步骤10:访问验证
|
||||
|
||||
1. 前台:`https://your-domain.com`
|
||||
2. 后台:`https://your-domain.com/admin/login`
|
||||
- 默认用户名:`admin`
|
||||
- 默认密码:`admin123`
|
||||
3. **立即修改密码**:访问 `/admin/change-password`
|
||||
|
||||
---
|
||||
|
||||
## 方式二:使用1Panel的OpenResty/Nginx + Supervisor
|
||||
|
||||
如果1Panel的Python运行时不支持或不稳定,可以使用传统方式:
|
||||
|
||||
### 步骤1-4:同上(数据库、文件上传、环境配置)
|
||||
|
||||
### 步骤5:手动创建虚拟环境
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 步骤6:创建Supervisor配置
|
||||
|
||||
1. 在1Panel中进入 **容器** 或 **进程管理**
|
||||
2. 如果有Supervisor功能,创建新任务
|
||||
|
||||
或手动创建配置文件:
|
||||
```bash
|
||||
nano /etc/supervisor/conf.d/zjpb.conf
|
||||
```
|
||||
|
||||
内容:
|
||||
```ini
|
||||
[program:zjpb]
|
||||
command=/www/wwwroot/zjpb/venv/bin/gunicorn -c gunicorn_config.py app:app
|
||||
directory=/www/wwwroot/zjpb
|
||||
user=www
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/www/wwwroot/zjpb/logs/supervisor.log
|
||||
environment=FLASK_ENV="production"
|
||||
```
|
||||
|
||||
启动:
|
||||
```bash
|
||||
supervisorctl reread
|
||||
supervisorctl update
|
||||
supervisorctl start zjpb
|
||||
```
|
||||
|
||||
### 步骤7:创建反向代理网站
|
||||
|
||||
1. 在1Panel **网站** 菜单中点击 **创建网站**
|
||||
2. 选择 **反向代理**
|
||||
3. 填写:
|
||||
```
|
||||
域名:your-domain.com
|
||||
代理地址:http://127.0.0.1:5000
|
||||
```
|
||||
|
||||
### 步骤8:配置SSL
|
||||
|
||||
同方式一
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 1Panel在哪里创建Python项目?
|
||||
|
||||
**A:**
|
||||
- 进入 **网站** 菜单
|
||||
- 点击 **创建网站**
|
||||
- 选择 **运行时** 或 **Runtime**
|
||||
- 选择 **Python**
|
||||
|
||||
### Q2: 找不到虚拟环境?
|
||||
|
||||
**A:**
|
||||
- 1Panel创建的虚拟环境通常在项目目录下的 `venv/` 文件夹
|
||||
- 路径:`/www/wwwroot/zjpb/venv/`
|
||||
- 可以在文件管理器中查看
|
||||
|
||||
### Q3: 如何查看应用日志?
|
||||
|
||||
**A:**
|
||||
- 方式1:在网站管理中点击 **日志** 按钮
|
||||
- 方式2:查看文件 `logs/error.log`
|
||||
- 方式3:使用1Panel的终端:`tail -f logs/error.log`
|
||||
|
||||
### Q4: 如何重启应用?
|
||||
|
||||
**A:**
|
||||
- 方式1:在1Panel网站列表中点击 **重启** 按钮
|
||||
- 方式2:使用管理脚本:`./manage.sh restart`
|
||||
- 方式3:Supervisor:`supervisorctl restart zjpb`
|
||||
|
||||
### Q5: 端口被占用怎么办?
|
||||
|
||||
**A:**
|
||||
修改 `gunicorn_config.py` 中的端口:
|
||||
```python
|
||||
bind = "0.0.0.0:5001" # 改为其他端口
|
||||
```
|
||||
然后在反向代理中也修改为对应端口。
|
||||
|
||||
---
|
||||
|
||||
## 管理和维护
|
||||
|
||||
### 更新代码
|
||||
|
||||
1. 在1Panel文件管理中上传新文件
|
||||
2. 在网站管理中点击 **重启**
|
||||
|
||||
### 查看状态
|
||||
|
||||
1. 进入网站列表
|
||||
2. 查看状态指示灯
|
||||
3. 点击网站名称查看详细信息
|
||||
|
||||
### 备份数据库
|
||||
|
||||
1. 进入 **数据库** 菜单
|
||||
2. 找到 `ai_nav` 数据库
|
||||
3. 点击 **备份** 按钮
|
||||
|
||||
### 监控日志
|
||||
|
||||
1. 在网站设置中找到 **日志** 选项
|
||||
2. 查看访问日志和错误日志
|
||||
3. 可以设置日志轮转
|
||||
|
||||
---
|
||||
|
||||
## 推荐配置
|
||||
|
||||
### 生产环境推荐配置
|
||||
|
||||
```
|
||||
服务器配置:
|
||||
- CPU: 2核+
|
||||
- 内存: 2GB+
|
||||
- 硬盘: 20GB+
|
||||
|
||||
Python版本:
|
||||
- Python 3.8+
|
||||
|
||||
数据库:
|
||||
- MySQL 5.7+
|
||||
- MariaDB 10.3+
|
||||
|
||||
Web服务器:
|
||||
- Nginx (1Panel自带)
|
||||
|
||||
进程管理:
|
||||
- Supervisor 或 1Panel内置
|
||||
|
||||
工作进程数:
|
||||
- gunicorn workers: 4
|
||||
- gunicorn threads: 2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. ✅ 修改默认管理员密码
|
||||
2. ✅ 使用强密码的SECRET_KEY
|
||||
3. ✅ 启用HTTPS (Let's Encrypt)
|
||||
4. ✅ 定期备份数据库
|
||||
5. ✅ 设置文件权限:
|
||||
```bash
|
||||
chmod 600 .env
|
||||
chmod 755 static/uploads
|
||||
```
|
||||
6. ✅ 配置防火墙(1Panel通常自动配置)
|
||||
|
||||
---
|
||||
|
||||
## 获取帮助
|
||||
|
||||
如果遇到问题:
|
||||
1. 查看 `logs/error.log` 日志文件
|
||||
2. 检查1Panel的系统日志
|
||||
3. 验证数据库连接
|
||||
4. 检查端口是否被占用
|
||||
5. 确认虚拟环境依赖已安装
|
||||
|
||||
祝部署顺利!🎉
|
||||
180
1PANEL_QUICK.md
Normal file
180
1PANEL_QUICK.md
Normal file
@@ -0,0 +1,180 @@
|
||||
# 1Panel快速部署向导
|
||||
|
||||
## 🎯 使用1Panel Web界面 - 5步完成部署
|
||||
|
||||
### 📋 准备工作
|
||||
- [x] 1Panel已安装
|
||||
- [x] 项目文件已压缩(zjpb.zip)
|
||||
|
||||
---
|
||||
|
||||
## 第1步:创建数据库(2分钟)
|
||||
|
||||
1. 登录1Panel → **数据库**
|
||||
2. 点击 **创建数据库**
|
||||
3. 填写:
|
||||
- 数据库名:`ai_nav`
|
||||
- 用户名:`ai_nav_user`
|
||||
- 密码:自动生成(**记录下来!**)
|
||||
4. 确定
|
||||
|
||||
---
|
||||
|
||||
## 第2步:上传项目(3分钟)
|
||||
|
||||
1. **文件** → 导航到 `/www/wwwroot/`
|
||||
2. 创建文件夹 `zjpb`
|
||||
3. 上传 `zjpb.zip`
|
||||
4. 解压缩
|
||||
5. 编辑 `.env.example` → 另存为 `.env`
|
||||
6. 填写数据库密码和密钥
|
||||
|
||||
---
|
||||
|
||||
## 第3步:创建Python网站(5分钟)
|
||||
|
||||
### 方式A:使用1Panel的Python运行时(推荐)
|
||||
|
||||
1. **网站** → **创建网站**
|
||||
2. 类型:**运行时 (Runtime)**
|
||||
3. 配置:
|
||||
```
|
||||
运行时:Python 3.8+
|
||||
应用类型:Flask
|
||||
域名:your-domain.com
|
||||
代码目录:/www/wwwroot/zjpb
|
||||
启动文件:app.py
|
||||
启动命令:gunicorn -c gunicorn_config.py app:app
|
||||
端口:5000
|
||||
☑ 自动启动
|
||||
```
|
||||
4. 创建
|
||||
|
||||
### 方式B:使用反向代理(备选)
|
||||
|
||||
如果没有Python运行时选项:
|
||||
|
||||
1. **网站** → **创建网站**
|
||||
2. 类型:**反向代理**
|
||||
3. 配置:
|
||||
```
|
||||
域名:your-domain.com
|
||||
代理地址:http://127.0.0.1:5000
|
||||
```
|
||||
|
||||
然后SSH到服务器手动启动(参考完整文档)
|
||||
|
||||
---
|
||||
|
||||
## 第4步:安装依赖和初始化(5分钟)
|
||||
|
||||
### 4.1 打开1Panel终端
|
||||
|
||||
点击1Panel右上角 **终端** 图标,或SSH连接
|
||||
|
||||
### 4.2 安装依赖
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 激活1Panel创建的虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 4.3 初始化数据库
|
||||
|
||||
```bash
|
||||
python init_db.py
|
||||
```
|
||||
|
||||
看到成功提示后,记住默认账号:
|
||||
- 用户名:`admin`
|
||||
- 密码:`admin123`
|
||||
|
||||
---
|
||||
|
||||
## 第5步:启动和访问(2分钟)
|
||||
|
||||
### 5.1 启动应用
|
||||
|
||||
**在1Panel界面:**
|
||||
1. 进入 **网站** 列表
|
||||
2. 找到你的项目
|
||||
3. 点击 **启动** 按钮
|
||||
4. 状态变为 **运行中 ✓**
|
||||
|
||||
### 5.2 配置SSL(推荐)
|
||||
|
||||
1. 点击网站名称进入设置
|
||||
2. 找到 **SSL** 选项
|
||||
3. 选择 **Let's Encrypt**
|
||||
4. 申请证书
|
||||
5. 启用 **强制HTTPS**
|
||||
|
||||
### 5.3 访问网站
|
||||
|
||||
- 前台:`https://your-domain.com`
|
||||
- 后台:`https://your-domain.com/admin/login`
|
||||
|
||||
### 5.4 修改密码(重要!)
|
||||
|
||||
1. 登录后台(admin / admin123)
|
||||
2. 点击左侧菜单 **修改密码**
|
||||
3. 设置新密码
|
||||
|
||||
---
|
||||
|
||||
## ✅ 完成!
|
||||
|
||||
现在你的网站已经部署完成并运行了!
|
||||
|
||||
---
|
||||
|
||||
## 🔧 常用操作
|
||||
|
||||
### 重启应用
|
||||
- 1Panel界面:网站列表 → 点击 **重启**
|
||||
|
||||
### 查看日志
|
||||
- 1Panel界面:网站设置 → **日志**
|
||||
- 或查看文件:`/www/wwwroot/zjpb/logs/error.log`
|
||||
|
||||
### 备份数据库
|
||||
- 1Panel界面:数据库 → 选择 `ai_nav` → **备份**
|
||||
|
||||
### 更新代码
|
||||
1. 上传新文件到项目目录
|
||||
2. 重启应用
|
||||
|
||||
---
|
||||
|
||||
## ❓ 常见问题
|
||||
|
||||
**Q: 找不到Python运行时选项?**
|
||||
- 使用反向代理方式,然后手动启动应用
|
||||
- 参考:`1PANEL_DEPLOY.md` 方式二
|
||||
|
||||
**Q: 虚拟环境在哪?**
|
||||
- 1Panel自动创建在:`/www/wwwroot/zjpb/venv/`
|
||||
|
||||
**Q: 启动失败?**
|
||||
1. 查看日志:`logs/error.log`
|
||||
2. 检查 `.env` 配置
|
||||
3. 确认数据库连接
|
||||
4. 验证依赖已安装
|
||||
|
||||
**Q: 需要修改端口?**
|
||||
- 编辑 `gunicorn_config.py`,修改 `bind` 参数
|
||||
|
||||
---
|
||||
|
||||
## 📚 更多帮助
|
||||
|
||||
- 完整文档:`1PANEL_DEPLOY.md`
|
||||
- 传统部署:`DEPLOYMENT.md`
|
||||
- 检查清单:`DEPLOY_CHECKLIST.md`
|
||||
|
||||
祝部署顺利!🚀
|
||||
92
CHECK_GIT.md
Normal file
92
CHECK_GIT.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 检查生产服务器Git配置
|
||||
|
||||
## 方法1:通过SSH命令检查
|
||||
|
||||
```bash
|
||||
# SSH登录到生产服务器
|
||||
ssh root@your-server-ip
|
||||
|
||||
# 检查git是否安装
|
||||
git --version
|
||||
|
||||
# 如果显示版本号,说明已安装,例如:
|
||||
# git version 2.30.2
|
||||
|
||||
# 如果显示 "command not found",说明未安装
|
||||
```
|
||||
|
||||
## 方法2:通过1Panel面板检查
|
||||
|
||||
```bash
|
||||
# 1. 登录1Panel管理面板
|
||||
# 2. 进入 "主机" -> "终端"
|
||||
# 3. 输入命令:
|
||||
git --version
|
||||
```
|
||||
|
||||
## 方法3:检查项目目录是否有.git
|
||||
|
||||
```bash
|
||||
# SSH登录后
|
||||
cd /www/wwwroot/zjpb
|
||||
ls -la | grep .git
|
||||
|
||||
# 如果显示 .git 目录,说明项目已经是git仓库
|
||||
# 可以直接使用 git pull
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 如果Git未安装
|
||||
|
||||
### CentOS/RHEL系统:
|
||||
```bash
|
||||
yum install -y git
|
||||
```
|
||||
|
||||
### Ubuntu/Debian系统:
|
||||
```bash
|
||||
apt update
|
||||
apt install -y git
|
||||
```
|
||||
|
||||
### 验证安装:
|
||||
```bash
|
||||
git --version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 如果项目目录没有.git(需要初始化)
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 初始化git仓库
|
||||
git init
|
||||
|
||||
# 添加远程仓库(如果你有GitHub/Gitee等)
|
||||
git remote add origin https://github.com/yourusername/zjpb.git
|
||||
|
||||
# 或者使用SSH方式
|
||||
git remote add origin git@github.com:yourusername/zjpb.git
|
||||
|
||||
# 拉取代码
|
||||
git pull origin master
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 推荐:使用Git部署的优势
|
||||
|
||||
✅ **版本控制** - 可以随时回滚到之前的版本
|
||||
✅ **增量更新** - 只传输修改的文件,速度快
|
||||
✅ **操作简单** - 一条命令完成更新
|
||||
✅ **团队协作** - 多人开发更方便
|
||||
|
||||
## 如果不用Git,手动部署也可以
|
||||
|
||||
可以使用FTP/SFTP工具上传文件:
|
||||
- FileZilla(免费)
|
||||
- WinSCP(免费)
|
||||
- 1Panel自带的文件管理器
|
||||
463
DEPLOYMENT.md
Normal file
463
DEPLOYMENT.md
Normal file
@@ -0,0 +1,463 @@
|
||||
# ZJPB - 焦提示词 部署文档
|
||||
|
||||
## 1Panel部署指南
|
||||
|
||||
### 前置要求
|
||||
- 1Panel管理面板已安装
|
||||
- MySQL 5.7+ 或 MariaDB
|
||||
- Python 3.8+
|
||||
- Nginx(1Panel自带)
|
||||
|
||||
---
|
||||
|
||||
## 一、数据库准备
|
||||
|
||||
### 1.1 在1Panel中创建MySQL数据库
|
||||
|
||||
1. 登录1Panel管理面板
|
||||
2. 进入「数据库」菜单
|
||||
3. 点击「创建数据库」
|
||||
4. 填写信息:
|
||||
- 数据库名:`ai_nav`
|
||||
- 用户名:`ai_nav_user`
|
||||
- 密码:自动生成或自定义(记录下来)
|
||||
- 权限:本地访问
|
||||
5. 点击创建
|
||||
|
||||
### 1.2 导入数据库结构
|
||||
|
||||
使用1Panel的phpMyAdmin或命令行导入:
|
||||
|
||||
```sql
|
||||
-- 如果你有数据库备份文件,可以直接导入
|
||||
-- 否则在部署后通过init_db.py初始化
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、上传项目文件
|
||||
|
||||
### 2.1 压缩项目
|
||||
|
||||
在本地Windows环境压缩项目文件夹为 `zjpb.zip`,**排除以下文件/文件夹**:
|
||||
- `__pycache__/`
|
||||
- `*.pyc`
|
||||
- `.git/`
|
||||
- `.env`(生产环境重新配置)
|
||||
- `venv/` 或 `env/`
|
||||
- `test_*.py`(测试文件)
|
||||
|
||||
### 2.2 上传到服务器
|
||||
|
||||
1. 在1Panel中进入「文件」菜单
|
||||
2. 导航到 `/opt/1panel/apps/` 或你的网站目录(如 `/www/wwwroot/`)
|
||||
3. 创建项目目录:`zjpb`
|
||||
4. 上传 `zjpb.zip` 并解压
|
||||
5. 最终路径示例:`/www/wwwroot/zjpb/`
|
||||
|
||||
---
|
||||
|
||||
## 三、环境配置
|
||||
|
||||
### 3.1 SSH连接到服务器
|
||||
|
||||
使用1Panel的终端或SSH工具连接服务器
|
||||
|
||||
### 3.2 创建Python虚拟环境
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 创建虚拟环境
|
||||
python3 -m venv venv
|
||||
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 升级pip
|
||||
pip install --upgrade pip
|
||||
```
|
||||
|
||||
### 3.3 安装Python依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 3.4 配置环境变量
|
||||
|
||||
创建生产环境的 `.env` 文件:
|
||||
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
填写以下内容(**修改为实际值**):
|
||||
|
||||
```env
|
||||
# 数据库配置
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_USER=ai_nav_user
|
||||
DB_PASSWORD=你的数据库密码
|
||||
DB_NAME=ai_nav
|
||||
|
||||
# 安全配置(生成随机密钥)
|
||||
SECRET_KEY=your-production-secret-key-change-this
|
||||
|
||||
# 运行环境
|
||||
FLASK_ENV=production
|
||||
|
||||
# DeepSeek API配置(可选)
|
||||
DEEPSEEK_API_KEY=你的DeepSeek_API密钥
|
||||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||||
```
|
||||
|
||||
**生成安全的SECRET_KEY**:
|
||||
```bash
|
||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||
```
|
||||
|
||||
### 3.5 创建必要的目录
|
||||
|
||||
```bash
|
||||
# 创建日志目录
|
||||
mkdir -p logs
|
||||
|
||||
# 创建静态文件上传目录
|
||||
mkdir -p static/uploads
|
||||
|
||||
# 设置权限
|
||||
chmod 755 logs static/uploads
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、初始化数据库
|
||||
|
||||
### 4.1 运行初始化脚本
|
||||
|
||||
```bash
|
||||
source venv/bin/activate
|
||||
python init_db.py
|
||||
```
|
||||
|
||||
这会创建所有表并创建默认管理员账号:
|
||||
- 用户名:`admin`
|
||||
- 密码:`admin123`
|
||||
|
||||
**⚠️ 重要:登录后立即修改默认密码!**
|
||||
|
||||
---
|
||||
|
||||
## 五、配置Nginx反向代理
|
||||
|
||||
### 5.1 在1Panel中创建网站
|
||||
|
||||
1. 进入1Panel「网站」菜单
|
||||
2. 点击「创建网站」
|
||||
3. 填写信息:
|
||||
- 网站类型:反向代理
|
||||
- 域名:`your-domain.com`(或IP)
|
||||
- 代理地址:`http://127.0.0.1:5000`
|
||||
- 启用SSL:推荐(自动申请Let's Encrypt证书)
|
||||
|
||||
### 5.2 自定义Nginx配置(可选)
|
||||
|
||||
如果需要自定义,编辑Nginx配置:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
|
||||
# 如果启用SSL,这里会自动重定向到443
|
||||
|
||||
client_max_body_size 10M; # 允许上传文件大小
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# WebSocket支持(如果需要)
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
|
||||
# 静态文件直接由Nginx处理
|
||||
location /static/ {
|
||||
alias /www/wwwroot/zjpb/static/;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、配置Supervisor守护进程
|
||||
|
||||
### 6.1 在1Panel中使用Supervisor
|
||||
|
||||
1. 进入1Panel「容器」→「应用编排」或「进程管理」
|
||||
2. 创建新的守护进程配置
|
||||
|
||||
### 6.2 创建Supervisor配置文件
|
||||
|
||||
如果1Panel没有内置,手动创建:
|
||||
|
||||
```bash
|
||||
nano /etc/supervisor/conf.d/zjpb.conf
|
||||
```
|
||||
|
||||
配置内容:
|
||||
|
||||
```ini
|
||||
[program:zjpb]
|
||||
command=/www/wwwroot/zjpb/venv/bin/gunicorn -c gunicorn_config.py app:app
|
||||
directory=/www/wwwroot/zjpb
|
||||
user=www
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/www/wwwroot/zjpb/logs/supervisor.log
|
||||
environment=FLASK_ENV="production"
|
||||
```
|
||||
|
||||
### 6.3 启动服务
|
||||
|
||||
```bash
|
||||
# 重新加载Supervisor配置
|
||||
supervisorctl reread
|
||||
supervisorctl update
|
||||
|
||||
# 启动应用
|
||||
supervisorctl start zjpb
|
||||
|
||||
# 查看状态
|
||||
supervisorctl status zjpb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、使用systemd守护进程(替代方案)
|
||||
|
||||
如果不使用Supervisor,可以用systemd:
|
||||
|
||||
### 7.1 创建systemd服务文件
|
||||
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/zjpb.service
|
||||
```
|
||||
|
||||
内容:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=ZJPB AI Navigation Flask Application
|
||||
After=network.target mysql.service
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
User=www
|
||||
Group=www
|
||||
WorkingDirectory=/www/wwwroot/zjpb
|
||||
Environment="PATH=/www/wwwroot/zjpb/venv/bin"
|
||||
Environment="FLASK_ENV=production"
|
||||
ExecStart=/www/wwwroot/zjpb/venv/bin/gunicorn -c gunicorn_config.py app:app
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
### 7.2 启动服务
|
||||
|
||||
```bash
|
||||
# 重新加载systemd
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动服务
|
||||
sudo systemctl start zjpb
|
||||
|
||||
# 设置开机自启
|
||||
sudo systemctl enable zjpb
|
||||
|
||||
# 查看状态
|
||||
sudo systemctl status zjpb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 八、验证部署
|
||||
|
||||
### 8.1 检查服务状态
|
||||
|
||||
```bash
|
||||
# 查看gunicorn进程
|
||||
ps aux | grep gunicorn
|
||||
|
||||
# 查看日志
|
||||
tail -f logs/error.log
|
||||
tail -f logs/access.log
|
||||
```
|
||||
|
||||
### 8.2 访问网站
|
||||
|
||||
1. 前台访问:`http://your-domain.com`
|
||||
2. 后台访问:`http://your-domain.com/admin/login`
|
||||
- 用户名:`admin`
|
||||
- 密码:`admin123`(首次登录后立即修改)
|
||||
|
||||
---
|
||||
|
||||
## 九、常用管理命令
|
||||
|
||||
### 9.1 重启应用
|
||||
|
||||
**使用Supervisor:**
|
||||
```bash
|
||||
supervisorctl restart zjpb
|
||||
```
|
||||
|
||||
**使用systemd:**
|
||||
```bash
|
||||
sudo systemctl restart zjpb
|
||||
```
|
||||
|
||||
### 9.2 查看日志
|
||||
|
||||
```bash
|
||||
# 应用日志
|
||||
tail -f logs/error.log
|
||||
|
||||
# Nginx访问日志
|
||||
tail -f /www/server/nginx/logs/your-domain.com.log
|
||||
|
||||
# Supervisor日志
|
||||
tail -f logs/supervisor.log
|
||||
```
|
||||
|
||||
### 9.3 更新代码
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 备份数据库
|
||||
mysqldump -u ai_nav_user -p ai_nav > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# 拉取新代码或上传新文件
|
||||
# ...
|
||||
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装新依赖
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 重启应用
|
||||
supervisorctl restart zjpb
|
||||
# 或
|
||||
sudo systemctl restart zjpb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十、安全加固
|
||||
|
||||
### 10.1 修改默认管理员密码
|
||||
|
||||
登录后台后立即修改密码:
|
||||
1. 访问:`/admin/change-password`
|
||||
2. 输入旧密码:`admin123`
|
||||
3. 设置新的强密码
|
||||
|
||||
### 10.2 配置防火墙
|
||||
|
||||
```bash
|
||||
# 只允许80和443端口(1Panel通常已配置)
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
### 10.3 配置SSL证书
|
||||
|
||||
在1Panel中为网站启用SSL:
|
||||
1. 进入网站设置
|
||||
2. 启用SSL
|
||||
3. 选择Let's Encrypt免费证书
|
||||
4. 自动申请并配置
|
||||
|
||||
---
|
||||
|
||||
## 十一、故障排查
|
||||
|
||||
### 11.1 应用无法启动
|
||||
|
||||
检查日志:
|
||||
```bash
|
||||
tail -f logs/error.log
|
||||
```
|
||||
|
||||
常见问题:
|
||||
- 数据库连接失败:检查`.env`配置
|
||||
- 端口被占用:修改`gunicorn_config.py`中的端口
|
||||
- 权限问题:确保文件所有者为`www`用户
|
||||
|
||||
### 11.2 静态文件404
|
||||
|
||||
检查Nginx配置和目录权限:
|
||||
```bash
|
||||
ls -la static/
|
||||
chmod -R 755 static/
|
||||
```
|
||||
|
||||
### 11.3 数据库连接失败
|
||||
|
||||
```bash
|
||||
# 测试数据库连接
|
||||
mysql -u ai_nav_user -p ai_nav
|
||||
|
||||
# 检查MySQL服务
|
||||
sudo systemctl status mysql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十二、备份策略
|
||||
|
||||
### 12.1 数据库备份
|
||||
|
||||
创建定时任务:
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
|
||||
添加每日备份:
|
||||
```cron
|
||||
0 2 * * * mysqldump -u ai_nav_user -p密码 ai_nav > /www/backup/zjpb_$(date +\%Y\%m\%d).sql
|
||||
```
|
||||
|
||||
### 12.2 文件备份
|
||||
|
||||
```bash
|
||||
# 备份上传的文件
|
||||
tar -czf uploads_backup_$(date +%Y%m%d).tar.gz static/uploads/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 支持与帮助
|
||||
|
||||
如有问题,请检查:
|
||||
1. 应用日志:`logs/error.log`
|
||||
2. Nginx日志:`/www/server/nginx/logs/`
|
||||
3. 系统日志:`journalctl -u zjpb -f`
|
||||
|
||||
祝部署顺利!🚀
|
||||
132
DEPLOY_CHECKLIST.md
Normal file
132
DEPLOY_CHECKLIST.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# 📦 1Panel部署打包清单
|
||||
|
||||
部署前请确保以下文件都已准备好:
|
||||
|
||||
## ✅ 必需文件
|
||||
|
||||
### 应用文件
|
||||
- [x] app.py - 主应用文件
|
||||
- [x] wsgi.py - WSGI入口(生产环境)
|
||||
- [x] config.py - 配置文件
|
||||
- [x] models.py - 数据模型
|
||||
- [x] init_db.py - 数据库初始化脚本
|
||||
- [x] requirements.txt - Python依赖列表
|
||||
|
||||
### 配置文件
|
||||
- [x] gunicorn_config.py - Gunicorn配置
|
||||
- [x] .env.example - 环境变量模板
|
||||
- [ ] .env - 生产环境变量(需在服务器上创建)
|
||||
|
||||
### 部署脚本
|
||||
- [x] deploy.sh - 一键部署脚本
|
||||
- [x] manage.sh - 应用管理脚本
|
||||
|
||||
### 文档
|
||||
- [x] DEPLOYMENT.md - 完整部署文档
|
||||
- [x] QUICK_DEPLOY.md - 快速部署指南
|
||||
- [x] README.md - 项目说明
|
||||
|
||||
### 目录结构
|
||||
```
|
||||
zjpb/
|
||||
├── static/ # 静态文件
|
||||
│ ├── css/
|
||||
│ ├── js/
|
||||
│ └── uploads/ # 上传文件目录
|
||||
├── templates/ # 模板文件
|
||||
│ ├── admin/
|
||||
│ └── *.html
|
||||
├── utils/ # 工具类
|
||||
│ ├── website_fetcher.py
|
||||
│ ├── tag_generator.py
|
||||
│ └── bookmark_parser.py
|
||||
├── migrations/ # 数据库迁移脚本
|
||||
├── logs/ # 日志目录(自动创建)
|
||||
└── venv/ # 虚拟环境(服务器上创建)
|
||||
```
|
||||
|
||||
## 🚫 排除文件(不要上传到服务器)
|
||||
|
||||
- `__pycache__/` - Python缓存
|
||||
- `*.pyc` - 编译的Python文件
|
||||
- `.git/` - Git仓库
|
||||
- `.env` - 本地环境变量
|
||||
- `venv/` `env/` - 虚拟环境
|
||||
- `test_*.py` - 测试文件
|
||||
- `*.log` - 日志文件
|
||||
- `logs/` - 日志目录
|
||||
- `static/uploads/*` - 上传的文件
|
||||
|
||||
## 📋 部署前检查清单
|
||||
|
||||
### 本地准备
|
||||
- [ ] 更新 requirements.txt
|
||||
- [ ] 测试应用运行正常
|
||||
- [ ] 准备 .env.example 模板
|
||||
- [ ] 压缩项目文件
|
||||
|
||||
### 服务器准备
|
||||
- [ ] 1Panel已安装
|
||||
- [ ] MySQL数据库已创建
|
||||
- [ ] 域名已解析(可选)
|
||||
- [ ] SSH访问权限
|
||||
|
||||
### 部署步骤
|
||||
- [ ] 上传项目文件到服务器
|
||||
- [ ] 解压并设置目录权限
|
||||
- [ ] 执行 deploy.sh 脚本
|
||||
- [ ] 配置 .env 文件
|
||||
- [ ] 初始化数据库
|
||||
- [ ] 在1Panel中创建网站(反向代理)
|
||||
- [ ] 启动应用
|
||||
- [ ] 配置SSL证书(可选)
|
||||
|
||||
### 部署后验证
|
||||
- [ ] 前台页面访问正常
|
||||
- [ ] 后台登录成功
|
||||
- [ ] 修改默认管理员密码
|
||||
- [ ] 测试网站添加功能
|
||||
- [ ] 测试标签创建功能
|
||||
- [ ] 测试图片上传功能
|
||||
|
||||
## 🔐 安全检查
|
||||
|
||||
- [ ] 修改默认管理员密码
|
||||
- [ ] 设置强密码的 SECRET_KEY
|
||||
- [ ] 配置 .env 权限(chmod 600)
|
||||
- [ ] 启用 SSL/HTTPS
|
||||
- [ ] 配置防火墙规则
|
||||
- [ ] 定期备份数据库
|
||||
|
||||
## 📝 压缩命令
|
||||
|
||||
Windows PowerShell:
|
||||
```powershell
|
||||
Compress-Archive -Path * -DestinationPath zjpb.zip -Force
|
||||
```
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
zip -r zjpb.zip . -x "*.pyc" "*__pycache__*" "*.git*" ".env" "venv/*" "test_*.py" "logs/*"
|
||||
```
|
||||
|
||||
## 🎯 快速部署(服务器上)
|
||||
|
||||
```bash
|
||||
# 1. 上传并解压
|
||||
cd /www/wwwroot/zjpb
|
||||
unzip zjpb.zip
|
||||
|
||||
# 2. 一键部署
|
||||
chmod +x deploy.sh
|
||||
./deploy.sh
|
||||
|
||||
# 3. 配置环境变量
|
||||
nano .env
|
||||
|
||||
# 4. 启动应用
|
||||
chmod +x manage.sh
|
||||
./manage.sh start
|
||||
```
|
||||
|
||||
详细步骤请参考:`DEPLOYMENT.md`
|
||||
232
GIT_PATCH_DEPLOY.md
Normal file
232
GIT_PATCH_DEPLOY.md
Normal file
@@ -0,0 +1,232 @@
|
||||
# ZJPB v2.1 Git Patch 部署指南(最简单)
|
||||
|
||||
## ✨ 优势
|
||||
|
||||
- ✅ **最干净** - 使用Git patch,保持版本历史完整
|
||||
- ✅ **最安全** - 自动备份未提交的修改
|
||||
- ✅ **最快速** - 只需上传2个文件(89KB)
|
||||
- ✅ **可追溯** - 所有更改都有Git记录
|
||||
|
||||
---
|
||||
|
||||
## 📦 需要上传的文件(仅2个)
|
||||
|
||||
1. `v2.1.0.patch` (89KB) - 代码补丁文件
|
||||
2. `git_patch_deploy.sh` - 自动化部署脚本
|
||||
|
||||
---
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
### 第一步:备份生产数据库(在1Panel中操作)
|
||||
|
||||
1. 登录1Panel管理面板
|
||||
2. 进入 **数据库** → 找到 `ai_nav` 数据库
|
||||
3. 点击 **备份** 按钮
|
||||
4. 下载备份文件保存
|
||||
|
||||
### 第二步:上传文件到服务器
|
||||
|
||||
**方法1:使用1Panel文件管理器**
|
||||
|
||||
1. 登录1Panel
|
||||
2. 进入 **文件** → 导航到 `/opt/1panel/apps/zjpb/`
|
||||
3. 上传文件:
|
||||
- `v2.1.0.patch`
|
||||
- `git_patch_deploy.sh`
|
||||
|
||||
**方法2:使用命令行(如果你用SSH)**
|
||||
|
||||
```bash
|
||||
# 在本地(Windows)使用SCP上传
|
||||
scp v2.1.0.patch root@your-server-ip:/opt/1panel/apps/zjpb/
|
||||
scp git_patch_deploy.sh root@your-server-ip:/opt/1panel/apps/zjpb/
|
||||
```
|
||||
|
||||
### 第三步:执行部署脚本
|
||||
|
||||
在1Panel终端或SSH中执行:
|
||||
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /opt/1panel/apps/zjpb
|
||||
|
||||
# 赋予执行权限
|
||||
chmod +x git_patch_deploy.sh
|
||||
|
||||
# 执行部署
|
||||
./git_patch_deploy.sh
|
||||
```
|
||||
|
||||
**脚本会自动完成:**
|
||||
1. ✅ 停止应用
|
||||
2. ✅ 检查Git状态
|
||||
3. ✅ 备份未提交的修改(如有)
|
||||
4. ✅ 应用v2.1.0补丁
|
||||
5. ✅ 提交到Git
|
||||
6. ✅ 安装依赖
|
||||
7. ✅ 运行数据库迁移(创建prompt_templates表)
|
||||
8. ✅ 重启应用
|
||||
9. ✅ 检查状态
|
||||
|
||||
**预期输出:**
|
||||
```
|
||||
================================
|
||||
ZJPB v2.1 Git Patch 部署
|
||||
================================
|
||||
|
||||
当前目录: /opt/1panel/apps/zjpb
|
||||
|
||||
1. 停止应用...
|
||||
2. 检查Git状态...
|
||||
3. 备份当前修改(如有)...
|
||||
4. 应用v2.1.0补丁...
|
||||
✅ 补丁应用成功
|
||||
5. 提交更改到Git...
|
||||
6. 激活虚拟环境...
|
||||
7. 检查依赖...
|
||||
8. 运行数据库迁移...
|
||||
正在创建 prompt_templates 表...
|
||||
[OK] 表创建成功
|
||||
[OK] 默认prompt模板初始化成功
|
||||
9. 重启应用...
|
||||
10. 检查应用状态...
|
||||
zjpb 正在运行 (PID: xxxx)
|
||||
|
||||
================================
|
||||
✅ 部署完成!
|
||||
================================
|
||||
```
|
||||
|
||||
### 第四步:验证部署
|
||||
|
||||
**前台验证:**
|
||||
1. 访问首页,检查页脚:
|
||||
- `© 2025 ZJPB - 焦提示词 | AI工具导航`
|
||||
- `浙ICP备2025154782号-1`
|
||||
- 打开F12检查Network,确认Clarity统计已加载
|
||||
|
||||
2. 访问任意网站详情页,检查图标:
|
||||
- 返回首页:`←` 而不是 `arrow_back`
|
||||
- 访问网站:`↗` 而不是 `north_east`
|
||||
- 浏览次数:`👁` 而不是 `visibility`
|
||||
|
||||
**后台验证:**
|
||||
1. 登录 `/admin/login`
|
||||
2. 左侧菜单应该有 **Prompt管理**
|
||||
3. 点击进入,查看3条默认模板:
|
||||
- 标签生成
|
||||
- 主要功能生成
|
||||
- 详细介绍生成
|
||||
|
||||
4. 进入 **网站管理** → 编辑任意网站
|
||||
5. 标签区域应该正常显示标签名称(蓝色标签,有文字)
|
||||
|
||||
**AI功能验证:**
|
||||
1. 编辑或创建网站
|
||||
2. 测试 **AI生成标签** 按钮
|
||||
3. 测试 **AI生成详细介绍** 按钮
|
||||
4. 测试 **AI生成主要功能** 按钮
|
||||
|
||||
---
|
||||
|
||||
## 🔍 部署后检查
|
||||
|
||||
查看Git提交历史:
|
||||
```bash
|
||||
cd /opt/1panel/apps/zjpb
|
||||
git log --oneline -5
|
||||
```
|
||||
|
||||
应该看到最新的提交:
|
||||
```
|
||||
xxxxxxx release: v2.1.0 - Prompt管理系统、页脚优化、图标修复
|
||||
```
|
||||
|
||||
查看应用状态:
|
||||
```bash
|
||||
./manage.sh status
|
||||
```
|
||||
|
||||
查看应用日志(如有问题):
|
||||
```bash
|
||||
./manage.sh logs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 回滚方案(如出现问题)
|
||||
|
||||
```bash
|
||||
cd /opt/1panel/apps/zjpb
|
||||
|
||||
# 停止应用
|
||||
./manage.sh stop
|
||||
|
||||
# 回滚到上一个提交
|
||||
git reset --hard HEAD~1
|
||||
|
||||
# 如果有stash的备份,恢复它
|
||||
git stash list
|
||||
git stash pop
|
||||
|
||||
# 重启应用
|
||||
./manage.sh start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 注意事项
|
||||
|
||||
1. ✅ 服务器路径是 `/opt/1panel/apps/zjpb` 不是 `/www/wwwroot/zjpb`
|
||||
2. ✅ 已确认服务器有Git仓库
|
||||
3. ✅ patch文件会自动保存现有未提交的修改
|
||||
4. ✅ 部署过程中会自动运行数据库迁移
|
||||
5. ✅ 所有更改都会提交到Git,可随时回滚
|
||||
|
||||
---
|
||||
|
||||
## 🎯 完整部署命令(复制粘贴)
|
||||
|
||||
```bash
|
||||
# 1. 进入项目目录
|
||||
cd /opt/1panel/apps/zjpb
|
||||
|
||||
# 2. 检查文件是否上传成功
|
||||
ls -lh v2.1.0.patch git_patch_deploy.sh
|
||||
|
||||
# 3. 赋予执行权限
|
||||
chmod +x git_patch_deploy.sh
|
||||
|
||||
# 4. 执行部署
|
||||
./git_patch_deploy.sh
|
||||
|
||||
# 5. 部署完成后验证
|
||||
./manage.sh status
|
||||
git log --oneline -3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 部署检查清单
|
||||
|
||||
- [ ] 生产数据库已备份
|
||||
- [ ] v2.1.0.patch 已上传到服务器
|
||||
- [ ] git_patch_deploy.sh 已上传到服务器
|
||||
- [ ] 部署脚本执行成功
|
||||
- [ ] 前台页脚显示正确(ICP+统计)
|
||||
- [ ] 详情页图标显示正确(Emoji)
|
||||
- [ ] 后台Prompt管理菜单存在
|
||||
- [ ] 标签显示正常(有文字)
|
||||
- [ ] AI生成功能测试通过
|
||||
|
||||
---
|
||||
|
||||
## 💡 优势说明
|
||||
|
||||
相比手动上传11个文件,Git patch方式:
|
||||
- 只需上传2个文件(89KB)
|
||||
- 自动处理文件合并
|
||||
- 保留完整Git历史
|
||||
- 可以一键回滚
|
||||
- 更安全可靠
|
||||
195
MANUAL_DEPLOY.md
Normal file
195
MANUAL_DEPLOY.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# ZJPB v2.1 手动上传部署指南
|
||||
|
||||
## 📋 需要上传的文件(共10个)
|
||||
|
||||
### 核心文件(必须上传)
|
||||
1. ✅ `app.py` - 新增Prompt管理视图
|
||||
2. ✅ `models.py` - 新增PromptTemplate模型
|
||||
3. ✅ `migrate_prompts.py` - 数据库迁移脚本(新文件)
|
||||
|
||||
### 模板文件(必须上传)
|
||||
4. ✅ `templates/base_new.html` - 页脚和统计代码
|
||||
5. ✅ `templates/detail_new.html` - 图标修复
|
||||
6. ✅ `templates/admin/site/create.html` - 标签显示修复
|
||||
7. ✅ `templates/admin/site/edit.html` - 标签显示修复
|
||||
|
||||
### 辅助文件(可选)
|
||||
8. ⭕ `INCREMENTAL_DEPLOY.md` - 部署文档
|
||||
9. ⭕ `export_data.py` - 数据导出工具
|
||||
10. ⭕ `migrate_db.py` - 数据库工具
|
||||
|
||||
### 部署脚本(新增)
|
||||
11. ✅ `quick_deploy_server.sh` - 服务器端快速部署脚本
|
||||
|
||||
---
|
||||
|
||||
## 🚀 部署步骤(使用1Panel文件管理器)
|
||||
|
||||
### 第一步:备份生产数据库
|
||||
|
||||
1. 登录1Panel管理面板
|
||||
2. 进入 **数据库** → 找到 `ai_nav` 数据库
|
||||
3. 点击 **备份** 按钮
|
||||
4. 下载备份文件到本地保存
|
||||
|
||||
### 第二步:备份现有代码
|
||||
|
||||
1. 在1Panel中进入 **文件管理**
|
||||
2. 进入 `/www/wwwroot/`
|
||||
3. 右键点击 `zjpb` 文件夹
|
||||
4. 选择 **压缩** → 命名为 `zjpb_backup_20250130.tar.gz`
|
||||
5. 下载到本地保存
|
||||
|
||||
### 第三步:上传新文件
|
||||
|
||||
#### 方法1:使用1Panel文件管理器(推荐)
|
||||
|
||||
1. 在1Panel文件管理器中进入 `/www/wwwroot/zjpb/`
|
||||
|
||||
2. **上传核心文件**(覆盖):
|
||||
- 上传 `app.py` 到 `/www/wwwroot/zjpb/`
|
||||
- 上传 `models.py` 到 `/www/wwwroot/zjpb/`
|
||||
- 上传 `migrate_prompts.py` 到 `/www/wwwroot/zjpb/`(新文件)
|
||||
- 上传 `quick_deploy_server.sh` 到 `/www/wwwroot/zjpb/`(新文件)
|
||||
|
||||
3. **上传模板文件**(覆盖):
|
||||
- 进入 `/www/wwwroot/zjpb/templates/`
|
||||
- 上传 `base_new.html` 到 `templates/`
|
||||
- 上传 `detail_new.html` 到 `templates/`
|
||||
- 进入 `templates/admin/site/`
|
||||
- 上传 `create.html` 到 `templates/admin/site/`
|
||||
- 上传 `edit.html` 到 `templates/admin/site/`
|
||||
|
||||
#### 方法2:使用FTP工具(FileZilla/WinSCP)
|
||||
|
||||
```
|
||||
服务器地址: your-server-ip
|
||||
用户名: root
|
||||
密码: your-password
|
||||
端口: 22 (SFTP)
|
||||
```
|
||||
|
||||
连接后进入 `/www/wwwroot/zjpb/`,直接拖拽文件上传覆盖。
|
||||
|
||||
### 第四步:设置脚本权限并执行部署
|
||||
|
||||
在1Panel终端或SSH中执行:
|
||||
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /www/wwwroot/zjpb
|
||||
|
||||
# 设置脚本执行权限
|
||||
chmod +x quick_deploy_server.sh
|
||||
|
||||
# 执行部署脚本
|
||||
./quick_deploy_server.sh
|
||||
```
|
||||
|
||||
**脚本会自动完成以下操作:**
|
||||
1. ✅ 停止应用
|
||||
2. ✅ 备份当前代码
|
||||
3. ✅ 安装依赖(如有更新)
|
||||
4. ✅ 运行数据库迁移
|
||||
5. ✅ 重启应用
|
||||
6. ✅ 检查状态
|
||||
|
||||
### 第五步:验证部署
|
||||
|
||||
**前台验证:**
|
||||
1. 访问首页,检查页脚是否显示:
|
||||
- `© 2025 ZJPB - 焦提示词 | AI工具导航`
|
||||
- `浙ICP备2025154782号-1`
|
||||
|
||||
2. 访问任意网站详情页,检查:
|
||||
- 图标是否正常显示(不是Material Icons文本)
|
||||
- 返回首页按钮显示 `←` 而不是 `arrow_back`
|
||||
|
||||
**后台验证:**
|
||||
1. 登录后台 `/admin/login`
|
||||
2. 检查左侧菜单是否有 **Prompt管理**
|
||||
3. 点击进入,应该看到3条默认数据:
|
||||
- 标签生成
|
||||
- 主要功能生成
|
||||
- 详细介绍生成
|
||||
|
||||
4. 进入 **网站管理** → 编辑任意网站
|
||||
5. 检查标签区域是否正常显示标签名称(不是空白蓝框)
|
||||
|
||||
**AI功能验证:**
|
||||
1. 创建新网站或编辑现有网站
|
||||
2. 测试 "AI生成标签" 按钮
|
||||
3. 测试 "AI生成详细介绍" 按钮
|
||||
4. 测试 "AI生成主要功能" 按钮
|
||||
|
||||
---
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### Q1: 上传后文件权限错误
|
||||
```bash
|
||||
# 设置正确的权限
|
||||
cd /www/wwwroot/zjpb
|
||||
chmod 644 *.py
|
||||
chmod 755 *.sh
|
||||
```
|
||||
|
||||
### Q2: 脚本执行失败
|
||||
```bash
|
||||
# 手动执行步骤
|
||||
cd /www/wwwroot/zjpb
|
||||
./manage.sh stop
|
||||
source venv/bin/activate
|
||||
python migrate_prompts.py
|
||||
./manage.sh start
|
||||
```
|
||||
|
||||
### Q3: 数据库迁移报错 "表已存在"
|
||||
这是正常的,说明之前已经运行过,可以忽略。
|
||||
|
||||
### Q4: 应用无法启动
|
||||
```bash
|
||||
# 查看错误日志
|
||||
./manage.sh logs
|
||||
|
||||
# 或
|
||||
tail -f logs/error.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 快速回滚(如出现问题)
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/zjpb
|
||||
./manage.sh stop
|
||||
|
||||
# 恢复备份
|
||||
cd /www/wwwroot
|
||||
rm -rf zjpb
|
||||
tar -xzf zjpb_backup_20250130.tar.gz
|
||||
|
||||
# 重启
|
||||
cd zjpb
|
||||
./manage.sh start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 部署检查清单
|
||||
|
||||
- [ ] 生产数据库已备份
|
||||
- [ ] 现有代码已备份
|
||||
- [ ] 所有文件上传完成
|
||||
- [ ] 部署脚本执行成功
|
||||
- [ ] 前台页脚显示正常
|
||||
- [ ] 详情页图标显示正常
|
||||
- [ ] 后台Prompt管理菜单存在
|
||||
- [ ] 标签显示正常
|
||||
- [ ] AI功能测试通过
|
||||
|
||||
---
|
||||
|
||||
## 💡 提示
|
||||
|
||||
如果你经常需要部署更新,建议配置Git远程仓库(GitHub/Gitee),下次就可以直接 `git pull` 更新,更加方便快捷。
|
||||
94
QUICK_DEPLOY.md
Normal file
94
QUICK_DEPLOY.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# 1Panel部署快速指南
|
||||
|
||||
## 简化部署步骤
|
||||
|
||||
### 1. 准备工作(本地)
|
||||
|
||||
1. 压缩项目:
|
||||
```bash
|
||||
# 排除不需要的文件
|
||||
zip -r zjpb.zip . -x "*.pyc" "*__pycache__*" "*.git*" ".env" "venv/*" "test_*.py"
|
||||
```
|
||||
|
||||
### 2. 服务器操作
|
||||
|
||||
#### 2.1 上传并解压
|
||||
```bash
|
||||
cd /www/wwwroot
|
||||
mkdir zjpb
|
||||
cd zjpb
|
||||
# 上传zjpb.zip到此目录
|
||||
unzip zjpb.zip
|
||||
```
|
||||
|
||||
#### 2.2 一键部署脚本
|
||||
```bash
|
||||
# 赋予执行权限
|
||||
chmod +x deploy.sh
|
||||
|
||||
# 执行部署
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
### 3. 配置数据库
|
||||
|
||||
在1Panel中创建数据库:
|
||||
- 名称:ai_nav
|
||||
- 用户:ai_nav_user
|
||||
- 密码:(记录下来)
|
||||
|
||||
### 4. 配置环境变量
|
||||
|
||||
编辑 `.env` 文件:
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
填写数据库信息和密钥。
|
||||
|
||||
### 5. 初始化
|
||||
|
||||
```bash
|
||||
source venv/bin/activate
|
||||
python init_db.py
|
||||
```
|
||||
|
||||
### 6. 启动服务
|
||||
|
||||
**方法1: 使用管理脚本**
|
||||
```bash
|
||||
chmod +x manage.sh
|
||||
./manage.sh start
|
||||
```
|
||||
|
||||
**方法2: 使用1Panel**
|
||||
在1Panel中创建反向代理网站,指向 `http://127.0.0.1:5000`
|
||||
|
||||
### 7. 访问
|
||||
|
||||
- 前台:http://your-domain.com
|
||||
- 后台:http://your-domain.com/admin/login
|
||||
- 默认账号:admin / admin123
|
||||
|
||||
---
|
||||
|
||||
## 快速命令参考
|
||||
|
||||
```bash
|
||||
# 启动应用
|
||||
./manage.sh start
|
||||
|
||||
# 停止应用
|
||||
./manage.sh stop
|
||||
|
||||
# 重启应用
|
||||
./manage.sh restart
|
||||
|
||||
# 查看状态
|
||||
./manage.sh status
|
||||
|
||||
# 查看日志
|
||||
./manage.sh logs
|
||||
```
|
||||
|
||||
详细部署文档请查看:`DEPLOYMENT.md`
|
||||
221
UPLOAD_FILES_v2.2.0.txt
Normal file
221
UPLOAD_FILES_v2.2.0.txt
Normal file
@@ -0,0 +1,221 @@
|
||||
================================================================================
|
||||
ZJPB v2.2.0 手动上传文件清单
|
||||
================================================================================
|
||||
|
||||
本地路径: D:\315mac\Code\zjpb\
|
||||
目标路径: /opt/1panel/apps/zjpb/
|
||||
|
||||
方案一:Git Patch方式(推荐)
|
||||
--------------------------------
|
||||
只需上传2个文件:
|
||||
|
||||
1. v2.2.0.patch (56KB)
|
||||
目标: /opt/1panel/apps/zjpb/v2.2.0.patch
|
||||
|
||||
2. git_patch_deploy_v2.2.sh (2.6KB)
|
||||
目标: /opt/1panel/apps/zjpb/git_patch_deploy_v2.2.sh
|
||||
|
||||
上传后执行:
|
||||
cd /opt/1panel/apps/zjpb
|
||||
chmod +x git_patch_deploy_v2.2.sh
|
||||
./git_patch_deploy_v2.2.sh
|
||||
|
||||
================================================================================
|
||||
|
||||
方案二:手动上传所有文件(如果不想用patch)
|
||||
----------------------------------------
|
||||
需要上传9个文件:
|
||||
|
||||
新增文件(4个):
|
||||
--------------
|
||||
1. utils/news_searcher.py
|
||||
本地: D:\315mac\Code\zjpb\utils\news_searcher.py
|
||||
目标: /opt/1panel/apps/zjpb/utils/news_searcher.py
|
||||
说明: NewsSearcher工具类,封装博查API调用
|
||||
|
||||
2. migrate_news_fields.py
|
||||
本地: D:\315mac\Code\zjpb\migrate_news_fields.py
|
||||
目标: /opt/1panel/apps/zjpb/migrate_news_fields.py
|
||||
说明: 数据库迁移脚本,添加source_name和source_icon字段
|
||||
|
||||
3. test_news_feature.py
|
||||
本地: D:\315mac\Code\zjpb\test_news_feature.py
|
||||
目标: /opt/1panel/apps/zjpb/test_news_feature.py
|
||||
说明: 新闻功能测试脚本
|
||||
|
||||
4. fetch_news_cron.py
|
||||
本地: D:\315mac\Code\zjpb\fetch_news_cron.py
|
||||
目标: /opt/1panel/apps/zjpb/fetch_news_cron.py
|
||||
说明: 定期任务脚本,批量更新新闻
|
||||
|
||||
修改文件(4个):
|
||||
--------------
|
||||
5. config.py
|
||||
本地: D:\315mac\Code\zjpb\config.py
|
||||
目标: /opt/1panel/apps/zjpb/config.py
|
||||
说明: 添加博查API配置
|
||||
|
||||
6. models.py
|
||||
本地: D:\315mac\Code\zjpb\models.py
|
||||
目标: /opt/1panel/apps/zjpb/models.py
|
||||
说明: News模型添加source_name和source_icon字段
|
||||
|
||||
7. app.py
|
||||
本地: D:\315mac\Code\zjpb\app.py
|
||||
目标: /opt/1panel/apps/zjpb/app.py
|
||||
说明: 添加新闻路由、智能更新逻辑、NewsAdmin优化
|
||||
|
||||
8. templates/detail_new.html
|
||||
本地: D:\315mac\Code\zjpb\templates\detail_new.html
|
||||
目标: /opt/1panel/apps/zjpb/templates/detail_new.html
|
||||
说明: 新闻展示UI,布局优化
|
||||
|
||||
文档文件(1个,可选):
|
||||
--------------------
|
||||
9. NEWS_FEATURE_v2.2.md
|
||||
本地: D:\315mac\Code\zjpb\NEWS_FEATURE_v2.2.md
|
||||
目标: /opt/1panel/apps/zjpb/NEWS_FEATURE_v2.2.md
|
||||
说明: 新闻功能完整文档
|
||||
|
||||
================================================================================
|
||||
|
||||
手动上传后需要执行的操作:
|
||||
------------------------
|
||||
|
||||
1. 运行数据库迁移:
|
||||
cd /opt/1panel/apps/zjpb
|
||||
source venv/bin/activate
|
||||
python migrate_news_fields.py
|
||||
|
||||
2. 配置.env文件,添加:
|
||||
BOCHA_API_KEY=sk-76d0236a50d445ae92e75b634ed5313c
|
||||
BOCHA_BASE_URL=https://api.bocha.cn
|
||||
|
||||
3. 重启应用:
|
||||
./manage.sh restart
|
||||
|
||||
4. 测试功能:
|
||||
python test_news_feature.py
|
||||
|
||||
================================================================================
|
||||
|
||||
文件详细信息:
|
||||
------------
|
||||
|
||||
utils/news_searcher.py (271行)
|
||||
- NewsSearcher类
|
||||
- 博查API封装
|
||||
- 新闻搜索和解析
|
||||
- 错误处理
|
||||
|
||||
migrate_news_fields.py (99行)
|
||||
- 添加source_name字段
|
||||
- 添加source_icon字段
|
||||
- 检查字段是否已存在
|
||||
- 显示表结构
|
||||
|
||||
test_news_feature.py (142行)
|
||||
- API配置检查
|
||||
- 数据库连接测试
|
||||
- 新闻搜索测试
|
||||
- 保存数据测试
|
||||
|
||||
fetch_news_cron.py (167行)
|
||||
- 批量新闻更新
|
||||
- 命令行参数支持
|
||||
- 进度显示
|
||||
- 错误处理
|
||||
|
||||
config.py (修改部分)
|
||||
- BOCHA_API_KEY配置
|
||||
- BOCHA_BASE_URL配置
|
||||
- BOCHA_SEARCH_ENDPOINT配置
|
||||
- NEWS_SEARCH_*配置
|
||||
|
||||
models.py (修改部分)
|
||||
- News.source_name字段
|
||||
- News.source_icon字段
|
||||
|
||||
app.py (修改部分)
|
||||
- site_detail路由:智能新闻更新逻辑(64行新增)
|
||||
- /api/fetch-site-news路由(91行)
|
||||
- /api/fetch-all-news路由(105行)
|
||||
- NewsAdmin: 新增source_name和source_icon字段
|
||||
|
||||
templates/detail_new.html (修改部分)
|
||||
- 新闻模块HTML(47行)
|
||||
- 新闻来源展示
|
||||
- 布局调整(新闻左侧,推荐右侧)
|
||||
|
||||
================================================================================
|
||||
|
||||
推荐使用方案一(Git Patch)的原因:
|
||||
---------------------------------
|
||||
✅ 只需上传2个文件(58.6KB总共)
|
||||
✅ 自动处理文件合并,避免手动覆盖错误
|
||||
✅ Git历史完整,可追溯
|
||||
✅ 自动备份现有修改
|
||||
✅ 一键回滚
|
||||
✅ 自动运行数据库迁移
|
||||
✅ 自动重启应用
|
||||
|
||||
手动上传的缺点:
|
||||
--------------
|
||||
❌ 需要上传9个文件
|
||||
❌ 需要确保文件路径正确
|
||||
❌ 需要手动运行迁移脚本
|
||||
❌ 需要手动重启应用
|
||||
❌ 无法自动回滚
|
||||
❌ 可能覆盖生产环境的修改
|
||||
|
||||
================================================================================
|
||||
|
||||
1Panel文件管理器上传步骤:
|
||||
-------------------------
|
||||
|
||||
1. 登录1Panel管理面板
|
||||
2. 进入"文件"菜单
|
||||
3. 导航到 /opt/1panel/apps/zjpb/
|
||||
4. 点击"上传"按钮
|
||||
5. 选择需要上传的文件
|
||||
6. 等待上传完成
|
||||
|
||||
如果上传utils/news_searcher.py:
|
||||
- 先导航到 /opt/1panel/apps/zjpb/utils/
|
||||
- 然后上传 news_searcher.py
|
||||
|
||||
如果上传templates/detail_new.html:
|
||||
- 先导航到 /opt/1panel/apps/zjpb/templates/
|
||||
- 然后上传 detail_new.html
|
||||
|
||||
================================================================================
|
||||
|
||||
SCP命令上传(如果使用SSH):
|
||||
--------------------------
|
||||
|
||||
# 方案一:上传patch文件
|
||||
scp v2.2.0.patch root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp git_patch_deploy_v2.2.sh root@your-server:/opt/1panel/apps/zjpb/
|
||||
|
||||
# 方案二:上传所有文件
|
||||
scp utils/news_searcher.py root@your-server:/opt/1panel/apps/zjpb/utils/
|
||||
scp migrate_news_fields.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp test_news_feature.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp fetch_news_cron.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp config.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp models.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp app.py root@your-server:/opt/1panel/apps/zjpb/
|
||||
scp templates/detail_new.html root@your-server:/opt/1panel/apps/zjpb/templates/
|
||||
scp NEWS_FEATURE_v2.2.md root@your-server:/opt/1panel/apps/zjpb/
|
||||
|
||||
================================================================================
|
||||
|
||||
建议:
|
||||
-----
|
||||
强烈推荐使用方案一(Git Patch)!
|
||||
- 更安全
|
||||
- 更快速
|
||||
- 更可靠
|
||||
- 更易回滚
|
||||
|
||||
================================================================================
|
||||
96
deploy.sh
Normal file
96
deploy.sh
Normal file
@@ -0,0 +1,96 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ZJPB 一键部署脚本
|
||||
# 用于1Panel环境快速部署
|
||||
|
||||
echo "================================"
|
||||
echo "ZJPB - 焦提示词 部署脚本"
|
||||
echo "================================"
|
||||
echo ""
|
||||
|
||||
# 检查Python版本
|
||||
python_version=$(python3 --version 2>&1 | awk '{print $2}')
|
||||
echo "✓ Python版本: $python_version"
|
||||
|
||||
# 创建必要目录
|
||||
echo "创建必要目录..."
|
||||
mkdir -p logs
|
||||
mkdir -p static/uploads
|
||||
echo "✓ 目录创建完成"
|
||||
|
||||
# 创建虚拟环境
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "创建Python虚拟环境..."
|
||||
python3 -m venv venv
|
||||
echo "✓ 虚拟环境创建完成"
|
||||
else
|
||||
echo "✓ 虚拟环境已存在"
|
||||
fi
|
||||
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 升级pip
|
||||
echo "升级pip..."
|
||||
pip install --upgrade pip -q
|
||||
|
||||
# 安装依赖
|
||||
echo "安装Python依赖包..."
|
||||
pip install -r requirements.txt -q
|
||||
echo "✓ 依赖包安装完成"
|
||||
|
||||
# 检查.env文件
|
||||
if [ ! -f ".env" ]; then
|
||||
echo ""
|
||||
echo "⚠️ 警告: .env文件不存在"
|
||||
echo "请从.env.example复制并配置:"
|
||||
echo " cp .env.example .env"
|
||||
echo " nano .env"
|
||||
echo ""
|
||||
read -p "是否现在创建.env文件? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
cp .env.example .env
|
||||
echo "✓ .env文件已创建,请编辑配置"
|
||||
nano .env
|
||||
fi
|
||||
else
|
||||
echo "✓ .env配置文件存在"
|
||||
fi
|
||||
|
||||
# 询问是否初始化数据库
|
||||
echo ""
|
||||
read -p "是否需要初始化数据库? (首次部署选择y) (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "初始化数据库..."
|
||||
python init_db.py
|
||||
echo "✓ 数据库初始化完成"
|
||||
echo ""
|
||||
echo "默认管理员账号:"
|
||||
echo " 用户名: admin"
|
||||
echo " 密码: admin123"
|
||||
echo " ⚠️ 请登录后立即修改密码!"
|
||||
fi
|
||||
|
||||
# 设置权限
|
||||
echo ""
|
||||
echo "设置目录权限..."
|
||||
chmod 755 logs static/uploads
|
||||
chmod +x manage.sh
|
||||
echo "✓ 权限设置完成"
|
||||
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "部署完成!"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "后续步骤:"
|
||||
echo "1. 确保已在1Panel中创建MySQL数据库"
|
||||
echo "2. 确保.env文件配置正确"
|
||||
echo "3. 在1Panel中创建反向代理网站,指向: http://127.0.0.1:5000"
|
||||
echo "4. 启动应用: ./manage.sh start"
|
||||
echo "5. 访问网站并修改默认密码"
|
||||
echo ""
|
||||
echo "详细文档: 查看 DEPLOYMENT.md"
|
||||
echo ""
|
||||
67
export_sites.py
Normal file
67
export_sites.py
Normal file
@@ -0,0 +1,67 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
导出网站数据
|
||||
生成CSV文件,方便批量导入
|
||||
"""
|
||||
import csv
|
||||
import sys
|
||||
from app import create_app
|
||||
from models import Site, Tag
|
||||
|
||||
def export_sites_to_csv():
|
||||
"""导出网站数据到CSV"""
|
||||
app = create_app('development')
|
||||
|
||||
with app.app_context():
|
||||
sites = Site.query.order_by(Site.sort_order.desc()).all()
|
||||
|
||||
if not sites:
|
||||
print("没有找到任何网站数据")
|
||||
return
|
||||
|
||||
# 导出为CSV
|
||||
filename = 'sites_export.csv'
|
||||
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
|
||||
writer = csv.writer(f)
|
||||
|
||||
# 写入表头
|
||||
writer.writerow([
|
||||
'网站名称',
|
||||
'URL',
|
||||
'简短描述',
|
||||
'详细描述',
|
||||
'特色功能',
|
||||
'标签(逗号分隔)',
|
||||
'排序值',
|
||||
'是否可见'
|
||||
])
|
||||
|
||||
# 写入数据
|
||||
for site in sites:
|
||||
tags_str = ', '.join([tag.name for tag in site.tags])
|
||||
writer.writerow([
|
||||
site.name,
|
||||
site.url,
|
||||
site.short_desc or '',
|
||||
site.description or '',
|
||||
site.features or '',
|
||||
tags_str,
|
||||
site.sort_order,
|
||||
'是' if site.is_visible else '否'
|
||||
])
|
||||
|
||||
print(f"✓ 成功导出 {len(sites)} 个网站")
|
||||
print(f" 文件: {filename}")
|
||||
print("\n网站列表:")
|
||||
print("-" * 80)
|
||||
|
||||
for i, site in enumerate(sites, 1):
|
||||
tags = ', '.join([tag.name for tag in site.tags])
|
||||
print(f"{i}. {site.name}")
|
||||
print(f" URL: {site.url}")
|
||||
print(f" 描述: {site.short_desc}")
|
||||
print(f" 标签: {tags}")
|
||||
print()
|
||||
|
||||
if __name__ == '__main__':
|
||||
export_sites_to_csv()
|
||||
33
export_urls.py
Normal file
33
export_urls.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
导出网站URL列表
|
||||
"""
|
||||
from app import create_app
|
||||
from models import Site
|
||||
|
||||
def export_urls():
|
||||
"""导出所有网站URL"""
|
||||
app = create_app('development')
|
||||
|
||||
with app.app_context():
|
||||
sites = Site.query.order_by(Site.sort_order.desc()).all()
|
||||
|
||||
if not sites:
|
||||
print("没有找到任何网站数据")
|
||||
return
|
||||
|
||||
# 导出到文件
|
||||
filename = 'urls.txt'
|
||||
with open(filename, 'w', encoding='utf-8') as f:
|
||||
for site in sites:
|
||||
f.write(site.url + '\n')
|
||||
|
||||
print(f"✓ 成功导出 {len(sites)} 个URL")
|
||||
print(f" 文件: {filename}")
|
||||
print("\nURL列表:")
|
||||
print("-" * 80)
|
||||
for url in [site.url for site in sites]:
|
||||
print(url)
|
||||
|
||||
if __name__ == '__main__':
|
||||
export_urls()
|
||||
93
git_patch_deploy.sh
Normal file
93
git_patch_deploy.sh
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/bin/bash
|
||||
# ZJPB v2.1 Git Patch 部署脚本
|
||||
# 在生产服务器上执行
|
||||
|
||||
echo "================================"
|
||||
echo "ZJPB v2.1 Git Patch 部署"
|
||||
echo "================================"
|
||||
echo ""
|
||||
|
||||
# 项目路径
|
||||
PROJECT_DIR="/opt/1panel/apps/zjpb"
|
||||
|
||||
# 检查是否在正确目录
|
||||
cd $PROJECT_DIR || { echo "❌ 项目目录不存在"; exit 1; }
|
||||
|
||||
echo "当前目录: $(pwd)"
|
||||
echo ""
|
||||
|
||||
# 停止应用
|
||||
echo "1. 停止应用..."
|
||||
./manage.sh stop
|
||||
sleep 2
|
||||
|
||||
# 检查Git状态
|
||||
echo "2. 检查Git状态..."
|
||||
git status
|
||||
|
||||
# 备份未提交的修改(如果有)
|
||||
echo "3. 备份当前修改(如有)..."
|
||||
if ! git diff-index --quiet HEAD --; then
|
||||
echo " 发现未提交的修改,正在保存..."
|
||||
git stash save "backup_before_v2.1_$(date +%Y%m%d_%H%M%S)"
|
||||
fi
|
||||
|
||||
# 应用patch
|
||||
echo "4. 应用v2.1.0补丁..."
|
||||
if [ -f "v2.1.0.patch" ]; then
|
||||
git apply --check v2.1.0.patch
|
||||
if [ $? -eq 0 ]; then
|
||||
git apply v2.1.0.patch
|
||||
echo " ✅ 补丁应用成功"
|
||||
else
|
||||
echo " ❌ 补丁应用失败,请检查"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo " ❌ v2.1.0.patch 文件不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 提交更改
|
||||
echo "5. 提交更改到Git..."
|
||||
git add .
|
||||
git commit -m "release: v2.1.0 - Prompt管理系统、页脚优化、图标修复
|
||||
|
||||
通过patch部署,包含以下更新:
|
||||
- Prompt管理系统
|
||||
- 页脚ICP备案和统计代码
|
||||
- 详情页图标修复
|
||||
- 标签显示修复
|
||||
"
|
||||
|
||||
# 激活虚拟环境
|
||||
echo "6. 激活虚拟环境..."
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
echo "7. 检查依赖..."
|
||||
pip install -r requirements.txt -q
|
||||
|
||||
# 运行数据库迁移
|
||||
echo "8. 运行数据库迁移..."
|
||||
python migrate_prompts.py
|
||||
|
||||
# 重启应用
|
||||
echo "9. 重启应用..."
|
||||
./manage.sh start
|
||||
sleep 3
|
||||
|
||||
# 检查状态
|
||||
echo "10. 检查应用状态..."
|
||||
./manage.sh status
|
||||
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "✅ 部署完成!"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "Git提交历史:"
|
||||
git log --oneline -3
|
||||
echo ""
|
||||
echo "请访问网站验证更新是否成功"
|
||||
echo ""
|
||||
44
gunicorn_config.py
Normal file
44
gunicorn_config.py
Normal file
@@ -0,0 +1,44 @@
|
||||
# Gunicorn配置文件
|
||||
import os
|
||||
|
||||
# 绑定地址和端口
|
||||
bind = "0.0.0.0:5000"
|
||||
|
||||
# 工作进程数 (推荐: CPU核心数 * 2 + 1)
|
||||
workers = 4
|
||||
|
||||
# 工作线程数
|
||||
threads = 2
|
||||
|
||||
# 工作模式
|
||||
worker_class = "sync"
|
||||
|
||||
# 超时时间(秒)
|
||||
timeout = 120
|
||||
|
||||
# 访问日志
|
||||
accesslog = "logs/access.log"
|
||||
|
||||
# 错误日志
|
||||
errorlog = "logs/error.log"
|
||||
|
||||
# 日志级别
|
||||
loglevel = "info"
|
||||
|
||||
# 进程名称
|
||||
proc_name = "zjpb_app"
|
||||
|
||||
# 守护进程模式(设置为False,由systemd或supervisor管理)
|
||||
daemon = False
|
||||
|
||||
# PID文件
|
||||
pidfile = "logs/gunicorn.pid"
|
||||
|
||||
# 预加载应用(提高性能)
|
||||
preload_app = True
|
||||
|
||||
# 优雅重启超时
|
||||
graceful_timeout = 30
|
||||
|
||||
# 保持连接
|
||||
keepalive = 5
|
||||
61
manage.sh
Normal file
61
manage.sh
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ZJPB 应用管理脚本
|
||||
# 用法: ./manage.sh [start|stop|restart|status|logs]
|
||||
|
||||
APP_NAME="zjpb"
|
||||
APP_DIR="/www/wwwroot/zjpb"
|
||||
VENV_DIR="$APP_DIR/venv"
|
||||
PID_FILE="$APP_DIR/logs/gunicorn.pid"
|
||||
|
||||
cd $APP_DIR
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo "启动 $APP_NAME..."
|
||||
source $VENV_DIR/bin/activate
|
||||
gunicorn -c gunicorn_config.py app:app
|
||||
echo "$APP_NAME 已启动"
|
||||
;;
|
||||
|
||||
stop)
|
||||
echo "停止 $APP_NAME..."
|
||||
if [ -f $PID_FILE ]; then
|
||||
kill $(cat $PID_FILE)
|
||||
echo "$APP_NAME 已停止"
|
||||
else
|
||||
echo "PID文件不存在,可能未运行"
|
||||
fi
|
||||
;;
|
||||
|
||||
restart)
|
||||
$0 stop
|
||||
sleep 2
|
||||
$0 start
|
||||
;;
|
||||
|
||||
status)
|
||||
if [ -f $PID_FILE ]; then
|
||||
PID=$(cat $PID_FILE)
|
||||
if ps -p $PID > /dev/null; then
|
||||
echo "$APP_NAME 正在运行 (PID: $PID)"
|
||||
else
|
||||
echo "$APP_NAME 未运行(但PID文件存在)"
|
||||
fi
|
||||
else
|
||||
echo "$APP_NAME 未运行"
|
||||
fi
|
||||
;;
|
||||
|
||||
logs)
|
||||
echo "实时查看日志(Ctrl+C退出):"
|
||||
tail -f logs/error.log
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "用法: $0 {start|stop|restart|status|logs}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
121
one_click_deploy.sh
Normal file
121
one_click_deploy.sh
Normal file
@@ -0,0 +1,121 @@
|
||||
#!/bin/bash
|
||||
# ZJPB v2.1 一键部署命令集合
|
||||
# 复制整个脚本到服务器终端执行即可
|
||||
|
||||
set -e # 遇到错误立即停止
|
||||
|
||||
echo "================================"
|
||||
echo "ZJPB v2.1 一键部署"
|
||||
echo "================================"
|
||||
echo ""
|
||||
|
||||
# 进入项目目录
|
||||
cd /opt/1panel/apps/zjpb
|
||||
|
||||
# 显示当前位置
|
||||
echo "📂 当前目录: $(pwd)"
|
||||
echo ""
|
||||
|
||||
# 停止应用
|
||||
echo "⏸️ 停止应用..."
|
||||
./manage.sh stop 2>/dev/null || echo "应用未运行"
|
||||
sleep 2
|
||||
|
||||
# 检查Git状态
|
||||
echo ""
|
||||
echo "🔍 检查Git状态..."
|
||||
git status --short
|
||||
|
||||
# 备份未提交的修改
|
||||
echo ""
|
||||
echo "💾 备份当前修改..."
|
||||
if ! git diff-index --quiet HEAD -- 2>/dev/null; then
|
||||
git stash save "backup_before_v2.1_$(date +%Y%m%d_%H%M%S)"
|
||||
echo " ✅ 已保存未提交的修改"
|
||||
else
|
||||
echo " ℹ️ 无需备份"
|
||||
fi
|
||||
|
||||
# 检查patch文件
|
||||
echo ""
|
||||
echo "📦 检查补丁文件..."
|
||||
if [ ! -f "v2.1.0.patch" ]; then
|
||||
echo " ❌ v2.1.0.patch 不存在,请先上传"
|
||||
exit 1
|
||||
fi
|
||||
echo " ✅ v2.1.0.patch 存在"
|
||||
|
||||
# 应用patch
|
||||
echo ""
|
||||
echo "🔧 应用v2.1.0补丁..."
|
||||
git apply --check v2.1.0.patch 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
git apply v2.1.0.patch
|
||||
echo " ✅ 补丁应用成功"
|
||||
else
|
||||
echo " ❌ 补丁应用失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 提交更改
|
||||
echo ""
|
||||
echo "📝 提交更改到Git..."
|
||||
git add .
|
||||
git commit -m "release: v2.1.0 - Prompt管理系统、页脚优化、图标修复
|
||||
|
||||
部署时间: $(date '+%Y-%m-%d %H:%M:%S')
|
||||
部署方式: Git Patch
|
||||
|
||||
更新内容:
|
||||
- 新增Prompt管理系统
|
||||
- 页脚添加ICP备案号和统计代码
|
||||
- 详情页图标优化(Material Icons → Emoji)
|
||||
- 修复标签显示问题
|
||||
" 2>&1
|
||||
|
||||
# 激活虚拟环境
|
||||
echo ""
|
||||
echo "🐍 激活虚拟环境..."
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
echo ""
|
||||
echo "📚 检查依赖..."
|
||||
pip install -r requirements.txt -q
|
||||
|
||||
# 运行数据库迁移
|
||||
echo ""
|
||||
echo "🗄️ 运行数据库迁移..."
|
||||
python migrate_prompts.py
|
||||
|
||||
# 重启应用
|
||||
echo ""
|
||||
echo "🚀 重启应用..."
|
||||
./manage.sh start
|
||||
sleep 3
|
||||
|
||||
# 检查状态
|
||||
echo ""
|
||||
echo "✅ 检查应用状态..."
|
||||
./manage.sh status
|
||||
|
||||
# 显示Git历史
|
||||
echo ""
|
||||
echo "📜 Git提交历史(最近3条):"
|
||||
git log --oneline -3
|
||||
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "🎉 部署完成!"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "📋 验证清单:"
|
||||
echo " 1. 访问首页,检查页脚ICP备案号"
|
||||
echo " 2. 访问详情页,检查图标是否为emoji"
|
||||
echo " 3. 登录后台,检查Prompt管理菜单"
|
||||
echo " 4. 编辑网站,检查标签显示是否正常"
|
||||
echo " 5. 测试AI生成功能"
|
||||
echo ""
|
||||
echo "🔧 查看日志: ./manage.sh logs"
|
||||
echo "📊 查看状态: ./manage.sh status"
|
||||
echo ""
|
||||
66
quick_deploy_server.sh
Normal file
66
quick_deploy_server.sh
Normal file
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
# ZJPB v2.1 快速部署脚本
|
||||
# 在生产服务器上执行此脚本
|
||||
|
||||
echo "================================"
|
||||
echo "ZJPB v2.1 增量部署"
|
||||
echo "================================"
|
||||
echo ""
|
||||
|
||||
# 检查是否在正确目录
|
||||
if [ ! -f "app.py" ]; then
|
||||
echo "❌ 错误:请在项目根目录执行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 停止应用
|
||||
echo "1. 停止应用..."
|
||||
./manage.sh stop
|
||||
sleep 2
|
||||
|
||||
# 备份当前代码
|
||||
echo "2. 备份当前代码..."
|
||||
BACKUP_DIR="../zjpb_backup_$(date +%Y%m%d_%H%M%S)"
|
||||
cp -r ../zjpb "$BACKUP_DIR"
|
||||
echo " 备份已保存到: $BACKUP_DIR"
|
||||
|
||||
# 激活虚拟环境
|
||||
echo "3. 激活虚拟环境..."
|
||||
source venv/bin/activate
|
||||
|
||||
# 安装依赖(如有更新)
|
||||
echo "4. 检查依赖..."
|
||||
pip install -r requirements.txt -q
|
||||
|
||||
# 运行数据库迁移
|
||||
echo "5. 运行数据库迁移..."
|
||||
python migrate_prompts.py
|
||||
|
||||
# 重启应用
|
||||
echo "6. 重启应用..."
|
||||
./manage.sh start
|
||||
sleep 2
|
||||
|
||||
# 检查状态
|
||||
echo "7. 检查应用状态..."
|
||||
./manage.sh status
|
||||
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "✅ 部署完成!"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "验证项目:"
|
||||
echo "1. 访问前台首页,检查页脚ICP备案号"
|
||||
echo "2. 访问详情页,检查图标是否正常"
|
||||
echo "3. 登录后台,检查Prompt管理菜单"
|
||||
echo "4. 编辑网站,检查标签是否正常显示"
|
||||
echo ""
|
||||
echo "如遇问题,可快速回滚:"
|
||||
echo " ./manage.sh stop"
|
||||
echo " cd .."
|
||||
echo " rm -rf zjpb"
|
||||
echo " mv $BACKUP_DIR zjpb"
|
||||
echo " cd zjpb"
|
||||
echo " ./manage.sh start"
|
||||
echo ""
|
||||
BIN
static/logos/logo_5fda15d305a84866.jpg
Normal file
BIN
static/logos/logo_5fda15d305a84866.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
static/logos/logo_aipmclub_com.png
Normal file
BIN
static/logos/logo_aipmclub_com.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
370
templates/admin/change_password.html
Normal file
370
templates/admin/change_password.html
Normal file
@@ -0,0 +1,370 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>修改密码 - ZJPB 焦提示词</title>
|
||||
|
||||
<!-- Google Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=Noto+Sans:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
|
||||
<!-- Google Material Symbols -->
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom Admin Theme -->
|
||||
<link href="{{ url_for('static', filename='css/admin-sidebar.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/admin-actions.css') }}" rel="stylesheet">
|
||||
</head>
|
||||
<body class="admin-sidebar-layout">
|
||||
<!-- 左侧菜单栏 -->
|
||||
<aside class="admin-sidebar">
|
||||
<!-- Logo -->
|
||||
<div class="sidebar-logo">
|
||||
<span class="material-symbols-outlined logo-icon">blur_on</span>
|
||||
<span class="logo-text">ZJPB 焦提示词</span>
|
||||
</div>
|
||||
|
||||
<!-- 主菜单 -->
|
||||
<nav class="sidebar-nav">
|
||||
<div class="nav-section">
|
||||
<div class="nav-section-title">主菜单</div>
|
||||
<ul class="nav-menu">
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('admin.index') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">dashboard</span>
|
||||
<span class="nav-text">控制台</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('site.index_view') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">public</span>
|
||||
<span class="nav-text">网站管理</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('tag.index_view') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">label</span>
|
||||
<span class="nav-text">标签管理</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('news.index_view') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">newspaper</span>
|
||||
<span class="nav-text">新闻管理</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('admin_users.index_view') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">admin_panel_settings</span>
|
||||
<span class="nav-text">管理员</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- 系统菜单 -->
|
||||
<div class="nav-section">
|
||||
<div class="nav-section-title">系统</div>
|
||||
<ul class="nav-menu">
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('batch_import') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">upload_file</span>
|
||||
<span class="nav-text">批量导入</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item active">
|
||||
<a href="{{ url_for('change_password') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">lock_reset</span>
|
||||
<span class="nav-text">修改密码</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('index') }}" class="nav-link" target="_blank">
|
||||
<span class="material-symbols-outlined nav-icon">open_in_new</span>
|
||||
<span class="nav-text">查看网站</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{ url_for('admin_logout') }}" class="nav-link">
|
||||
<span class="material-symbols-outlined nav-icon">logout</span>
|
||||
<span class="nav-text">退出登录</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- 用户信息 -->
|
||||
<div class="sidebar-user">
|
||||
<div class="user-avatar">
|
||||
<span class="material-symbols-outlined">account_circle</span>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<div class="user-name">{{ current_user.username }}</div>
|
||||
<div class="user-email">{{ current_user.email or 'admin@zjpb.com' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<!-- 右侧主内容区 -->
|
||||
<div class="admin-main">
|
||||
<!-- 顶部导航栏 -->
|
||||
<header class="admin-header">
|
||||
<div class="header-breadcrumb">
|
||||
<a href="{{ url_for('admin.index') }}" class="breadcrumb-link">控制台</a>
|
||||
<span class="breadcrumb-separator">/</span>
|
||||
<span class="breadcrumb-current">修改密码</span>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<div class="search-box">
|
||||
<span class="material-symbols-outlined search-icon">search</span>
|
||||
<input type="text" placeholder="全局搜索..." class="search-input">
|
||||
</div>
|
||||
<button class="header-btn">
|
||||
<span class="material-symbols-outlined">notifications</span>
|
||||
</button>
|
||||
<button class="header-btn">
|
||||
<span class="material-symbols-outlined">settings</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- 页面内容 -->
|
||||
<main class="admin-content">
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<h1 class="page-title">修改密码</h1>
|
||||
<p class="page-description">修改您的管理员账户登录密码</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Flash Messages -->
|
||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||
{% if messages %}
|
||||
{% for category, message in messages %}
|
||||
<div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show" role="alert">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px; vertical-align: middle; margin-right: 8px;">
|
||||
{% if category == 'error' %}error{% else %}check_circle{% endif %}
|
||||
</span>
|
||||
{{ message }}
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-lg-6">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ url_for('change_password') }}">
|
||||
<!-- 旧密码 -->
|
||||
<div class="form-group">
|
||||
<label for="old_password">旧密码</label>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">
|
||||
<span class="material-symbols-outlined" style="font-size: 20px;">lock</span>
|
||||
</span>
|
||||
</div>
|
||||
<input type="password"
|
||||
class="form-control"
|
||||
id="old_password"
|
||||
name="old_password"
|
||||
placeholder="请输入旧密码"
|
||||
required
|
||||
autofocus>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新密码 -->
|
||||
<div class="form-group">
|
||||
<label for="new_password">新密码</label>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">
|
||||
<span class="material-symbols-outlined" style="font-size: 20px;">lock_reset</span>
|
||||
</span>
|
||||
</div>
|
||||
<input type="password"
|
||||
class="form-control"
|
||||
id="new_password"
|
||||
name="new_password"
|
||||
placeholder="请输入新密码(至少6位)"
|
||||
required
|
||||
minlength="6">
|
||||
</div>
|
||||
<small class="form-text text-muted">密码长度至少6位</small>
|
||||
</div>
|
||||
|
||||
<!-- 确认新密码 -->
|
||||
<div class="form-group">
|
||||
<label for="confirm_password">确认新密码</label>
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">
|
||||
<span class="material-symbols-outlined" style="font-size: 20px;">check_circle</span>
|
||||
</span>
|
||||
</div>
|
||||
<input type="password"
|
||||
class="form-control"
|
||||
id="confirm_password"
|
||||
name="confirm_password"
|
||||
placeholder="请再次输入新密码"
|
||||
required
|
||||
minlength="6">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 提交按钮 -->
|
||||
<div class="form-group mb-0 mt-4">
|
||||
<button type="submit" class="btn btn-primary btn-block">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px; vertical-align: middle; margin-right: 4px;">save</span>
|
||||
确认修改
|
||||
</button>
|
||||
<a href="{{ url_for('admin.index') }}" class="btn btn-secondary btn-block mt-2">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px; vertical-align: middle; margin-right: 4px;">cancel</span>
|
||||
取消
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 安全提示 -->
|
||||
<div class="alert alert-info mt-3">
|
||||
<span class="material-symbols-outlined" style="font-size: 18px; vertical-align: middle; margin-right: 8px;">info</span>
|
||||
<strong>安全提示:</strong>
|
||||
<ul class="mb-0 mt-2" style="padding-left: 20px;">
|
||||
<li>密码修改成功后,您将被自动登出,需要使用新密码重新登录</li>
|
||||
<li>请妥善保管您的密码,不要与他人分享</li>
|
||||
<li>建议定期修改密码以保证账号安全</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- Bootstrap JS -->
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
<style>
|
||||
.page-title {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.page-description {
|
||||
color: #666;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.card {
|
||||
border: 1px solid #DCDFE6;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 1px 4px rgba(0, 0, 0, .05);
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
color: #000000;
|
||||
font-weight: 500;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.input-group-text {
|
||||
background: #F5F7FA;
|
||||
border: 1px solid #DCDFE6;
|
||||
border-right: none;
|
||||
color: #606266;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
border: 1px solid #DCDFE6;
|
||||
border-radius: 0 4px 4px 0;
|
||||
padding: 10px 12px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
border-color: #0052D9;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: #0052D9;
|
||||
border-color: #0052D9;
|
||||
padding: 10px 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: #003FA3;
|
||||
border-color: #003FA3;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #F5F7FA;
|
||||
border-color: #DCDFE6;
|
||||
color: #606266;
|
||||
padding: 10px 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: #E6E8EB;
|
||||
border-color: #C0C4CC;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.alert {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.alert-info {
|
||||
background: #ECF5FF;
|
||||
border-color: #B3D8FF;
|
||||
color: #0052D9;
|
||||
}
|
||||
|
||||
.alert-danger {
|
||||
background: #FEF0F0;
|
||||
border-color: #FBC4C4;
|
||||
color: #D54941;
|
||||
}
|
||||
|
||||
.alert-success {
|
||||
background: #F0F9FF;
|
||||
border-color: #C1E7C1;
|
||||
color: #00A870;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// 验证两次密码是否一致
|
||||
document.querySelector('form').addEventListener('submit', function(e) {
|
||||
const newPassword = document.getElementById('new_password').value;
|
||||
const confirmPassword = document.getElementById('confirm_password').value;
|
||||
|
||||
if (newPassword !== confirmPassword) {
|
||||
e.preventDefault();
|
||||
alert('两次输入的新密码不一致,请重新输入');
|
||||
document.getElementById('confirm_password').focus();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
52
test_deepseek.py
Normal file
52
test_deepseek.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""测试DeepSeek API配置"""
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
from openai import OpenAI
|
||||
|
||||
# 加载环境变量
|
||||
load_dotenv()
|
||||
|
||||
def test_deepseek_api():
|
||||
"""测试DeepSeek API连接"""
|
||||
api_key = os.getenv('DEEPSEEK_API_KEY')
|
||||
base_url = os.getenv('DEEPSEEK_BASE_URL', 'https://api.deepseek.com')
|
||||
|
||||
print(f"API Key: {api_key[:20]}..." if api_key else "未找到API Key")
|
||||
print(f"Base URL: {base_url}")
|
||||
|
||||
if not api_key:
|
||||
print("[ERROR] DEEPSEEK_API_KEY not configured")
|
||||
return False
|
||||
|
||||
try:
|
||||
# 创建客户端
|
||||
client = OpenAI(
|
||||
api_key=api_key,
|
||||
base_url=base_url
|
||||
)
|
||||
|
||||
# 发送测试请求
|
||||
print("\nTesting API connection...")
|
||||
response = client.chat.completions.create(
|
||||
model="deepseek-chat",
|
||||
messages=[
|
||||
{"role": "system", "content": "你是一个AI助手"},
|
||||
{"role": "user", "content": "你好,请用一句话介绍你自己"}
|
||||
],
|
||||
max_tokens=100
|
||||
)
|
||||
|
||||
result = response.choices[0].message.content
|
||||
# 移除emoji和特殊字符
|
||||
result_clean = result.encode('ascii', 'ignore').decode('ascii')
|
||||
print(f"\n[SUCCESS] API connection successful!")
|
||||
print(f"Response: {result_clean if result_clean else result[:50]}")
|
||||
print(f"Usage: {response.usage}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n[ERROR] API connection failed: {str(e)}")
|
||||
return False
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_deepseek_api()
|
||||
2438
v2.1.0.patch
Normal file
2438
v2.1.0.patch
Normal file
File diff suppressed because it is too large
Load Diff
15
wsgi.py
Normal file
15
wsgi.py
Normal file
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
生产环境应用入口
|
||||
用于gunicorn启动
|
||||
"""
|
||||
import os
|
||||
from app import create_app
|
||||
|
||||
# 创建应用实例
|
||||
app = create_app(os.getenv('FLASK_ENV', 'production'))
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 这个分支仅用于直接运行脚本测试
|
||||
# 生产环境应该使用 gunicorn
|
||||
app.run(host='0.0.0.0', port=5000, debug=False)
|
||||
Reference in New Issue
Block a user