# ZJPB 开发进度 - 2026-03-12

## 📦 版本信息
- **工作日期**: 2026-03-12
- **部署状态**: ✅ 新服务器部署完成，应用正常运行

---

## 🎯 本次完成内容

### 1️⃣ 更换 Gitea 仓库地址

**原因**: 原服务器出现问题，需要迁移到新服务器

**操作**:
- 旧地址: `http://server.zjpb.net:3000/jowelin/zjpb.git`
- 新地址: `http://175.178.72.171:3000/jowelin/zjpb.net.git`
- 访问令牌: `d507007d9bd411a6468a424441cf534e32e71020`
- 已配置 git remote 并成功推送代码

---

### 2️⃣ 新服务器环境部署（1Panel）

**服务器信息**:
- IP: 175.178.72.171
- 环境: 1Panel + Docker
- MySQL 容器: `1Panel-mysql-2Z4D` (MySQL 8.4.8)
- 项目路径: `/opt/1panel/apps/zjpb`

**部署步骤**:
1. ✅ 克隆项目代码
2. ✅ 创建数据库 `zjpb`
3. ✅ 配置 .env 文件
4. ✅ 创建 Python 虚拟环境
5. ✅ 安装依赖 (requirements.txt)
6. ✅ 初始化数据库 (init_db.py)
7. ✅ 配置 Systemd 服务
8. ✅ 配置反向代理
9. ✅ 配置 SSL 证书

---

### 3️⃣ Systemd 服务配置

**服务文件**: `/etc/systemd/system/zjpb.service`

```ini
[Unit]
Description=ZJPB Flask Application
After=network.target mysql.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/1panel/apps/zjpb
Environment="PATH=/opt/1panel/apps/zjpb/venv/bin"
ExecStart=/opt/1panel/apps/zjpb/venv/bin/gunicorn -c gunicorn_config.py wsgi:app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
```

**关键修改**:
- `gunicorn_config.py`: `daemon = False` (systemd 管理进程)
- 启动命令: `wsgi:app` (不是 `app:create_app()`)
- 已设置开机自启: `systemctl enable zjpb`

**常用命令**:
```bash
systemctl start zjpb      # 启动
systemctl stop zjpb       # 停止
systemctl restart zjpb    # 重启
systemctl status zjpb     # 状态
journalctl -u zjpb -f     # 实时日志
```

---

### 4️⃣ 数据库配置

**连接信息**:
- 主机: localhost
- 端口: 3306
- 用户: zjpb_user
- 密码: M3bzYwtiMWWneaTW
- 数据库: zjpb

**初始化状态**:
- ✅ 所有表已创建
- ✅ 默认管理员账号已创建 (admin/admin123)
- ⚠️ 原数据未恢复（.ibd 文件恢复失败）

---

### 5️⃣ 反向代理和 SSL

**配置**:
- ✅ 1Panel 中配置反向代理: `http://127.0.0.1:5000`
- ✅ SSL 证书已配置
- ✅ 防火墙已开放 443 端口
- ⚠️ HSTS 暂未开启（建议稳定运行后再开启）

---

### 6️⃣ 数据恢复尝试（未成功）

**尝试方案**:
1. ❌ 直接导入 .ibd 文件 - 缺少 .cfg 配置文件
2. ❌ 本地 Docker 挂载恢复 - 表结构不匹配
3. ❌ 服务器端 .ibd 导入 - Schema mismatch 错误

**失败原因**:
- 只有 .ibd 物理文件，缺少 .cfg 元数据文件
- MySQL 版本或表结构可能不同
- InnoDB 表空间导入需要完整的配置信息

**结论**: 放弃数据恢复，使用全新数据库

---

## 📂 修改文件清单

| 文件 | 类型 | 说明 |
|------|------|------|
| `.git/config` | 修改 | 更新 remote 地址和访问令牌 |
| `PROGRESS_2026-02-23.md` | 修改 | 更新 Gitea 地址 |
| `/etc/systemd/system/zjpb.service` | 新增 | Systemd 服务配置 |
| `gunicorn_config.py` | 修改 | daemon=False |
| `.env` | 修改 | 数据库密码修正 |
| `restore_ibd.sh` | 新增 | 数据恢复脚本（未使用） |
| `create_tables.sql` | 新增 | 表结构 SQL（测试用） |
| `restore_db_from_backup.sh` | 新增 | 备份恢复脚本（未使用） |

---

## 🚀 待完成（下次工作）

- [ ] 手动添加核心数据（网站、标签）
- [ ] 测试所有功能是否正常
- [ ] 考虑是否开启 HSTS
- [ ] 配置定时备份任务
- [ ] 优化部署流程文档

---

## 💡 经验总结

### 成功经验
1. **Systemd 服务管理**: 比 nohup 更可靠，支持自动重启和日志管理
2. **1Panel 部署**: 简化了 MySQL、Nginx 等服务的管理
3. **Git 令牌认证**: 将令牌嵌入 remote URL，避免每次输入密码

### 遇到的问题
1. **gunicorn 启动命令错误**: `app:create_app()` 括号导致 bash 语法错误
2. **daemon 模式冲突**: gunicorn daemon=True 与 systemd Type=simple 冲突
3. **.ibd 文件恢复失败**: 缺少 .cfg 文件，无法跨版本/实例恢复

### 学到的知识
1. **InnoDB 表空间导入**: 需要 .ibd + .cfg 文件才能完整恢复
2. **Docker MySQL 数据目录**: 挂载现有数据目录需要权限和版本匹配
3. **1Panel MySQL**: 通过 Docker 容器运行，需要用 docker exec 执行命令

---

## 🖥️ 服务器信息

- **新服务器 IP**: 175.178.72.171
- **项目路径**: `/opt/1panel/apps/zjpb`
- **MySQL 容器**: `1Panel-mysql-2Z4D`
- **服务管理**: `systemctl restart zjpb`
- **Gitea**: `http://175.178.72.171:3000/jowelin/zjpb.net.git`
- **访问令牌**: `d507007d9bd411a6468a424441cf534e32e71020`

---

## 📝 重要提醒

1. **环境变量修改**: 修改 .env 后必须执行 `systemctl restart zjpb`
2. **管理员密码**: 默认 admin/admin123，生产环境务必修改
3. **数据备份**: 定期备份数据库，使用 mysqldump 导出 SQL 格式
4. **SSL 证书**: 定期检查证书有效期，及时续期

---

**开发人员**: Claude Sonnet 4.6
**项目负责人**: lisacc
**工作日期**: 2026-03-12
