# dashGO v1.0.0 更新日志 ## 发布日期:2024-12-11 --- ## 🎉 重要变更 ### 默认使用 SQLite 数据库 **功能描述**:现在默认使用 SQLite 数据库,无需安装 MySQL 即可快速启动 **优势**: - ✅ 零配置,开箱即用 - ✅ 无需安装数据库服务器 - ✅ 适合开发、测试和小规模部署 - ✅ 数据库文件便于备份和迁移 - ✅ 自动创建 data 目录 **配置示例**: ```yaml database: driver: "sqlite" database: "data/xboard.db" ``` **切换到 MySQL**: ```yaml database: driver: "mysql" database: "xboard" host: "127.0.0.1" port: 3306 username: "root" password: "your_password" ``` **相关文档**: - [SQLite 快速开始](QUICK_START_SQLITE.md) - [完整安装指南](README_SETUP.md) --- ## 📦 部署优化 ### 预编译二进制文件 **功能描述**:提供预编译二进制文件,无需本地编译 **实现**: - ✅ 编译 `xboard-server-linux-amd64` - 主服务器程序 - ✅ 编译 `migrate-linux-amd64` - 数据库迁移工具 - ✅ 编译 `xboard-agent-linux-amd64` - 节点代理程序 - ✅ 更新 `setup.sh` 支持自动下载二进制 - ✅ 更新 `agent/install.sh` 支持自动下载二进制 - ✅ 支持自动检测系统架构 (amd64/arm64) **下载地址**:`https://download.sharon.wiki/` **Server 文件**:`https://download.sharon.wiki/server/` - `xboard-server-linux-amd64` - `xboard-server-linux-arm64` - `xboard-server-windows-amd64.exe` - `xboard-server-darwin-amd64` - `xboard-server-darwin-arm64` - `migrate-linux-amd64` - `migrate-linux-arm64` **Agent 文件**:`https://download.sharon.wiki/agent/` - `xboard-agent-linux-amd64` - `xboard-agent-linux-arm64` - `xboard-agent-linux-386` - `xboard-agent-windows-amd64.exe` - `xboard-agent-windows-386.exe` - `xboard-agent-darwin-amd64` - `xboard-agent-darwin-arm64` - `xboard-agent-freebsd-amd64` **使用方式**: ```bash # 安装 Dashboard(自动下载二进制) bash setup.sh # 安装 Agent(自动下载二进制) curl -sL https://raw.githubusercontent.com/ZYHUO/dashGO/main/agent/install.sh | bash -s -- <面板地址> ``` **优势**: - 🚀 安装速度更快(无需编译) - 💾 节省磁盘空间(无需 Go 环境) - 🔧 降低安装门槛(无需配置编译环境) - ✨ 支持多架构(amd64/arm64) **相关文件**: - `setup.sh` - 添加 `download_binaries()` 函数 - `agent/install.sh` - 更新下载 URL - `BINARIES_UPLOAD.md` - 上传说明文档 --- ## 🎉 新功能 ### 1. Agent 自动更新功能 **功能描述**:Agent 支持自动检测新版本并自动更新,无需手动干预 **实现**: - ✅ 版本管理和语义化版本支持(SemVer) - ✅ 定期检查更新(可配置间隔) - ✅ 安全下载(HTTPS only,SHA256 验证) - ✅ 原子更新和自动回滚 - ✅ 更新策略控制(auto/manual) - ✅ 更新历史记录 - ✅ 零停机更新(sing-box 继续运行) **使用方式**: ```bash # 启用自动更新(默认) xboard-agent -panel https://panel.example.com -token abc123 # 自定义检查间隔(每30分钟) xboard-agent -panel https://panel.example.com -token abc123 -update-check-interval=1800 # 禁用自动更新 xboard-agent -panel https://panel.example.com -token abc123 -auto-update=false # 手动触发更新 xboard-agent -panel https://panel.example.com -token abc123 -update ``` **安全机制**: - 🔒 HTTPS 强制验证 - 🔒 SHA256 文件完整性验证 - 🔒 Token 认证(最小16字符) - 🔒 路径遍历防护 - 🔒 文件权限验证 - 🔒 原子操作替换 - 🔒 自动回滚机制 **相关文件**: - `agent/version.go` - 版本管理 - `agent/update_checker.go` - 更新检查 - `agent/downloader.go` - 文件下载 - `agent/verifier.go` - 文件验证 - `agent/updater.go` - 更新执行 - `agent/security.go` - 安全验证 - `agent/update_history.go` - 历史记录 - `agent/update_error.go` - 错误处理 - `agent/update_notifier.go` - 通知服务 - `docs/agent-auto-update.md` - 完整文档 --- ### 2. 节点-主机绑定功能 **功能描述**:节点可以选择绑定到主机,实现自动部署 **实现**: - ✅ Server 模型添加 `host_id` 字段 - ✅ AdminCreateServer 支持 `host_id` 参数 - ✅ AdminUpdateServer 支持修改绑定 - ✅ AdminListServers 返回主机名称 - ✅ 前端界面支持选择绑定主机 **使用场景**: ``` 1. 创建主机(Host) 2. 创建节点(Server),选择绑定到主机 3. Agent 自动在主机上部署节点配置 4. 用户通过订阅获取节点信息 ``` **API 示例**: ```json POST /api/v2/admin/server { "name": "香港节点1", "type": "shadowsocks", "host": "hk1.example.com", "port": "443", "host_id": 1, // 绑定到主机ID=1 "rate": 1.0, "show": true } ``` **相关文件**: - `internal/model/server.go` - `internal/handler/admin.go` - `internal/service/host.go` - `web/src/views/admin/Servers.vue` - `docs/server-host-binding.md` --- ### 2. 套餐购买数量限制 **功能描述**:套餐支持设置最大可售数量,实现库存管理 **实现**: - ✅ Plan 模型添加 `sold_count` 字段 - ✅ `CanPurchase()` 方法检查是否可购买 - ✅ `GetRemainingCount()` 方法获取剩余数量 - ✅ PlanService 提供计数管理方法 - ✅ Repository 实现原子操作 **使用场景**: ``` 1. 创建限量套餐(capacity_limit = 100) 2. 用户购买时自动增加 sold_count 3. 达到限制后自动停止销售 4. 用户退订时减少 sold_count ``` **API 响应**: ```json { "id": 1, "name": "限量套餐", "capacity_limit": 100, "sold_count": 85, "remaining_count": 15, "can_purchase": true } ``` **相关文件**: - `internal/model/plan.go` - `internal/service/plan.go` - `internal/repository/plan.go` - `migrations/005_add_plan_sold_count.sql` - `docs/plan-purchase-limit.md` --- ### 3. 一键安装/升级/修复脚本 **功能描述**:统一的脚本管理所有安装、升级、修复操作 **功能**: - ✅ 全新安装(本地开发) - ✅ 安装到现有 MySQL 数据库 - ✅ 升级现有数据库(保留数据) - ✅ 修复迁移问题 - ✅ 查看迁移状态 - ✅ 生成配置文件 **使用**: ```bash bash setup.sh ``` **相关文件**: - `setup.sh` - 一键脚本 - `README_SETUP.md` - 完整文档 - `QUICK_START.md` - 快速开始 --- ## 🐛 Bug 修复 ### 1. 配置文件字段名称错误 **问题**:安装脚本生成的配置使用 `type: "mysql"`,但代码期望 `driver: "mysql"` **影响**:导致数据库连接失败,报错 "unsupported database driver" **修复**: - ✅ 所有脚本改为生成 `driver` 字段 - ✅ 更新所有文档示例 - ✅ 创建修复指南 **相关文件**: - `install-existing-db.sh` - `local-install.sh` - `install.sh` - `upgrade.sh` - `docs/local-installation.md` - `QUICK_INSTALL.md` - `UPGRADE_MYSQL.md` - `FIX_CONFIG.md` --- ### 2. 迁移系统执行 rollback 文件 **问题**:迁移系统会执行所有 `.sql` 文件,包括 `_rollback.sql`,导致字段被删除 **影响**: - `host_id` 字段被删除,保存节点失败 - `sold_count` 字段被删除,套餐库存功能失效 **修复**: - ✅ 修改迁移系统,跳过 `_rollback.sql` 文件 - ✅ 创建修复脚本自动修复数据库 - ✅ 添加字段检查和自动添加逻辑 **相关文件**: - `cmd/migrate/main.go` - `setup.sh` (选项 4) - `MIGRATION_FIX.md` --- ## 📚 文档更新 ### 新增文档 1. **README_SETUP.md** - 完整的安装和升级指南 - 详细的功能说明 - 常见问题解答 - 手动操作指南 - 架构说明 2. **QUICK_START.md** - 快速开始指南 - 一键安装命令 - 常用场景 - 快速排查 3. **docs/server-host-binding.md** - 节点-主机绑定设计文档 - 设计目标 - 实现方案 - API 变更 - 使用场景 4. **docs/plan-purchase-limit.md** - 套餐购买数量限制设计文档 - 需求说明 - 设计方案 - 购买逻辑 - 使用场景 5. **MIGRATION_FIX.md** - 迁移问题修复指南 - 问题分析 - 修复方案 - 验证步骤 6. **ARCHITECTURE_CLARIFICATION.md** - 架构说明文档 - 数据模型 - 绑定关系 - 核心方法 - 工作流程 ### 更新文档 1. **docs/local-installation.md** - 更新配置示例 2. **docs/database-migration.md** - 更新迁移说明 3. **QUICK_INSTALL.md** - 更新配置字段 4. **UPGRADE_MYSQL.md** - 更新升级步骤 --- ## 🔧 技术改进 ### 1. 迁移系统优化 **改进**: - 跳过 `_rollback.sql` 文件 - 更好的错误处理 - 支持字段已存在的情况 **代码**: ```go // 过滤并排序 SQL 文件(跳过 rollback 文件) var sqlFiles []string for _, f := range files { if !f.IsDir() && strings.HasSuffix(f.Name(), ".sql") && !strings.Contains(f.Name(), "_rollback") { sqlFiles = append(sqlFiles, f.Name()) } } ``` ### 2. 原子操作 **改进**:套餐购买数量使用原子操作,防止并发超卖 **代码**: ```go // IncrementSoldCount 增加已售数量(原子操作) func (r *PlanRepository) IncrementSoldCount(planID int64) error { return r.db.Model(&model.Plan{}).Where("id = ?", planID). UpdateColumn("sold_count", gorm.Expr("sold_count + ?", 1)).Error } ``` ### 3. 配置验证 **改进**:创建/更新节点时验证主机是否存在 **代码**: ```go // 如果设置了 host_id,验证主机是否存在 if req.HostID != nil { if _, err := services.Host.GetByID(*req.HostID); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "host not found"}) return } } ``` --- ## 📦 数据库变更 ### 新增字段 #### v2_server.host_id ```sql ALTER TABLE `v2_server` ADD COLUMN `host_id` BIGINT NULL DEFAULT NULL COMMENT '绑定的主机ID' AFTER `parent_id`; ALTER TABLE `v2_server` ADD INDEX `idx_server_host_id` (`host_id`); ``` #### v2_plan.sold_count ```sql ALTER TABLE `v2_plan` ADD COLUMN `sold_count` INT NOT NULL DEFAULT 0 COMMENT '已售出数量'; -- 初始化数据 UPDATE `v2_plan` p SET `sold_count` = ( SELECT COUNT(*) FROM `v2_user` u WHERE u.`plan_id` = p.`id` ); CREATE INDEX `idx_plan_capacity` ON `v2_plan`(`capacity_limit`, `sold_count`); ``` ### 迁移文件 - `migrations/001_add_host_id_to_servers.sql` - `migrations/005_add_plan_sold_count.sql` --- ## 🎯 API 变更 ### 新增/修改的 API #### 1. POST /api/v2/admin/server **新增参数**:`host_id` **请求示例**: ```json { "name": "香港节点1", "type": "shadowsocks", "host": "hk1.example.com", "port": "443", "host_id": 1, // 新增 "rate": 1.0, "show": true } ``` #### 2. PUT /api/v2/admin/server/:id **新增参数**:`host_id` **请求示例**: ```json { "host_id": 2 // 修改绑定 } ``` #### 3. GET /api/v2/admin/servers **新增响应字段**:`host_name` **响应示例**: ```json { "data": [ { "id": 1, "name": "香港节点1", "host_id": 1, "host_name": "香港主机1" // 新增 } ] } ``` #### 4. GET /api/v2/admin/plans **新增响应字段**:`sold_count`, `remaining_count`, `can_purchase` **响应示例**: ```json { "data": [ { "id": 1, "name": "基础套餐", "capacity_limit": 100, "sold_count": 85, // 新增 "remaining_count": 15, // 新增 "can_purchase": true // 新增 } ] } ``` --- ## ⚠️ 破坏性变更 ### 配置文件字段名称 **旧版本**: ```yaml database: type: "mysql" # ❌ 不再支持 ``` **新版本**: ```yaml database: driver: "mysql" # ✅ 必须使用 ``` **迁移方法**: ```bash # 方法1:使用脚本修复 bash setup.sh # 选择 6 (重新生成配置) # 方法2:手动修改 sed -i 's/type: "mysql"/driver: "mysql"/g' configs/config.yaml ``` --- ## 📋 升级指南 ### 从旧版本升级 #### 步骤1:备份数据 ```bash # MySQL mysqldump -u root -p xboard > backup.sql # SQLite cp xboard.db xboard.db.backup ``` #### 步骤2:更新代码 ```bash git pull origin main ``` #### 步骤3:修改配置文件 ```bash # 将 type 改为 driver sed -i 's/type: "mysql"/driver: "mysql"/g' configs/config.yaml ``` #### 步骤4:运行升级脚本 ```bash bash setup.sh # 选择 3 (升级现有数据库) ``` #### 步骤5:重启服务 ```bash # Docker docker compose restart # Systemd systemctl restart xboard # 手动 ./xboard-server ``` --- ## 🧪 测试建议 ### 1. 节点绑定功能 ```bash # 1. 创建主机 # 2. 创建节点,选择绑定主机 # 3. 编辑节点,修改绑定 # 4. 验证主机配置生成正确 ``` ### 2. 套餐库存功能 ```bash # 1. 创建限量套餐(capacity_limit = 10) # 2. 购买套餐,验证 sold_count 增加 # 3. 购买到限制,验证 can_purchase = false # 4. 用户退订,验证 sold_count 减少 ``` ### 3. 迁移修复 ```bash # 1. 运行修复脚本 bash setup.sh # 选择 4 # 2. 验证字段存在 mysql -u root -p xboard -e "DESCRIBE v2_server;" | grep host_id mysql -u root -p xboard -e "DESCRIBE v2_plan;" | grep sold_count # 3. 验证迁移记录 mysql -u root -p xboard -e "SELECT * FROM migrations;" ``` --- ## 🔮 未来计划 ### v1.1.0 - [ ] 订单服务集成购买数量管理 - [ ] 前端套餐库存显示 - [ ] 管理后台库存预警 - [ ] 定时任务校验计数准确性 ### v1.2.0 - [ ] 节点自动部署优化 - [ ] 主机监控和告警 - [ ] 批量操作支持 - [ ] API 文档完善 --- ## 🙏 致谢 感谢所有贡献者和用户的支持! --- ## 📞 支持 - GitHub: https://github.com/ZYHUO/dashGO - Issues: https://github.com/ZYHUO/dashGO/issues - Discussions: https://github.com/ZYHUO/dashGO/discussions --- ## 📄 许可证 MIT License