Files
Meshray-Manager/docs/项目问题修复计划.md
2026-06-30 15:14:37 +08:00

524 lines
11 KiB
Markdown
Raw Permalink 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.
# MeshRay 项目问题修复计划
**创建时间**: 2026-03-24
**优先级**: P0 > P1 > P2
**预计周期**: 2-3 周
---
## 📊 问题总览
| 优先级 | 数量 | 修复周期 | 风险等级 |
|--------|------|----------|----------|
| **P0 - 必须立即修复** | 5 | 2-3 天 | 🔴 极高 |
| **P1 - 本迭代修复** | 6 | 3-4 天 | 🟠 高 |
| **P2 - 下迭代修复** | 50+ | 1-2 周 | 🟡 中低 |
---
## 🔴 P0 - 必须立即修复(2-3 天)
### **问题 1: 使用 math/rand 生成密码**
**文件**: `internal/service/user.go:18`
**风险**: 密码可预测,严重安全漏洞
**修复方案**:
```go
// ❌ 错误代码
import "math/rand"
password := string(rand.Intn(1000))
// ✅ 正确代码
import "crypto/rand"
b := make([]byte, 32)
rand.Read(b)
password := base64.StdEncoding.EncodeToString(b)
```
**修复步骤**:
1. 替换 import
2. 使用 crypto/rand 生成随机字节
3. Base64 编码为密码字符串
4. 添加单元测试验证随机性
**预计时间**: 2 小时
---
### **问题 2: 固定模式生成加密密钥**
**文件**: `internal/config/config.go:153`
**风险**: 所有实例使用相同密钥,完全无安全性
**修复方案**:
```go
// ❌ 错误代码
key := []byte("meshray-secret-key-12345678") // 固定密钥
// ✅ 正确代码
// 首次启动时生成随机密钥
key := make([]byte, 32)
if _, err := rand.Read(key); err != nil {
return err
}
// 保存到配置文件或环境变量
config.EncryptKey = base64.StdEncoding.EncodeToString(key)
```
**修复步骤**:
1. 检查配置文件中是否已有密钥
2. 如无,则生成随机密钥并保存
3. 如有,则读取使用
4. 添加密钥轮换机制(可选)
**预计时间**: 4 小时
---
### **问题 3: Linux 特定命令跨平台不兼容**
**文件**: `internal/ctr/wg.go:378,464`
**风险**: Windows/macOS 无法运行
**修复方案**:
```go
// ❌ 错误代码
exec.Command("ip", "link", "add", name, "type", "wireguard")
// ✅ 正确代码(条件编译)
// wg_linux.go
// +build linux
func createDevice(name string) error {
exec.Command("ip", "link", "add", name, "type", "wireguard")
}
// wg_windows.go
// +build windows
func createDevice(name string) error {
// Windows 使用 wireguard.exe
exec.Command("wireguard.exe", "/installtunnelservice", configPath)
}
// wg_darwin.go
// +build darwin
func createDevice(name string) error {
// macOS 使用 wg-go-tool
exec.Command("wg-go-tool", "-c", configPath)
}
```
**修复步骤**:
1. 创建 3 个平台特定文件
2. 使用 build tag 区分
3. 提取公共接口
4. 测试各平台编译
**预计时间**: 1 天
---
### **问题 4: TUN 设备资源泄漏**
**文件**: `internal/ctr/wg.go:414-418`
**风险**: 长时间运行后资源耗尽
**修复方案**:
```go
// ❌ 错误代码
func (w *WGManager) createTUN() error {
tun, err := tun.CreateTUN("wg0", mtu)
// 未保存引用,后续无法关闭
return nil
}
// ✅ 正确代码
type WGManager struct {
tunDevices map[string]device.Device // 保存引用
}
func (w *WGManager) createTUN() error {
tun, err := tun.CreateTUN("wg0", mtu)
if err != nil {
return err
}
// 保存引用
w.tunDevices["wg0"] = tun
return nil
}
func (w *WGManager) Stop() error {
// 关闭所有 TUN 设备
for _, tun := range w.tunDevices {
tun.Close()
}
return nil
}
```
**修复步骤**:
1. 在 WGManager 中添加 tunDevices 字段
2. 创建 TUN 后保存引用
3. Stop() 方法中关闭所有设备
4. 添加延迟测试验证无泄漏
**预计时间**: 4 小时
---
### **问题 5: wgDevice 未保存引用**
**文件**: `internal/ctr/wg.go:433`
**风险**: 无法管理/关闭 WG 设备
**修复方案**:
```go
// ❌ 错误代码
wgDevice, err := wgctrl.New()
// 未保存,后续无法访问
// ✅ 正确代码
type WGManager struct {
wgClients map[string]*wgctrl.Client
}
func (w *WGManager) initWG(deviceName string) error {
client, err := wgctrl.New()
if err != nil {
return err
}
// 保存引用
w.wgClients[deviceName] = client
return nil
}
func (w *WGManager) Close() error {
// 关闭所有 WG 客户端
for _, client := range w.wgClients {
client.Close()
}
return nil
}
```
**修复步骤**:
1. 在 WGManager 中添加 wgClients 字段
2. 创建 WG 客户端后保存引用
3. Close() 方法统一关闭
4. 添加单元测试验证
**预计时间**: 3 小时
---
## 🟠 P1 - 本迭代修复(3-4 天)
### **问题 6: ctr 初始化错误未返回**
**文件**: `internal/api/server.go:168`
**风险**: ctrClient 为 nil 导致 panic
**修复方案**:
```go
// ❌ 错误代码
ctrClient, err := ctr.NewClient(config)
// 未检查 err
// ✅ 正确代码
ctrClient, err := ctr.NewClient(config)
if err != nil {
log.Error("初始化 ctr 失败", zap.Error(err))
return err // ← 返回错误,阻止启动
}
```
**预计时间**: 1 小时
---
### **问题 7: CreateNetwork 失败不回滚数据库**
**文件**: `internal/service/network.go:85-92`
**风险**: 数据不一致
**修复方案**:
```go
// ❌ 错误代码
func (s *NetworkService) CreateNetwork(req) error {
network := &model.Network{...}
s.store.DB().Create(network) // ← 保存
err = s.ctrClient.CreateNetwork(...)
if err != nil {
return err // ← 失败但未回滚!
}
}
// ✅ 正确代码
func (s *NetworkService) CreateNetwork(req) error {
tx := s.store.DB().Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
network := &model.Network{...}
if err := tx.Create(network).Error; err != nil {
tx.Rollback()
return err
}
err = s.ctrClient.CreateNetwork(...)
if err != nil {
tx.Rollback() // ← 回滚
return fmt.Errorf("调用 ctr 失败:%w", err)
}
return tx.Commit().Error
}
```
**预计时间**: 4 小时
---
### **问题 8: AddPeer 错误只记录不处理**
**文件**: `internal/service/device.go:115`
**风险**: Peer 添加失败但用户以为成功
**修复方案**:
```go
// ❌ 错误代码
err = s.ctrClient.AddPeer(...)
if err != nil {
log.Error("添加 Peer 失败", zap.Error(err))
// 未返回错误!
}
// ✅ 正确代码
err = s.ctrClient.AddPeer(...)
if err != nil {
log.Error("添加 Peer 失败", zap.Error(err))
return fmt.Errorf("添加设备失败:%w", err) // ← 返回错误
}
```
**预计时间**: 30 分钟
---
### **问题 9: 类型断言无检查**
**文件**: `internal/service/ddns.go:187`
**风险**: 可能 panic
**修复方案**:
```go
// ❌ 错误代码
provider := config.Provider.(DDNSProvider) // 可能 panic
// ✅ 正确代码
provider, ok := config.Provider.(DDNSProvider)
if !ok {
return errors.New("无效的 DDNS Provider 类型")
}
```
**预计时间**: 30 分钟
---
### **问题 10: CORS 允许所有来源**
**文件**: `internal/api/middleware/auth.go:288`
**风险**: CSRF 攻击
**修复方案**:
```go
// ❌ 错误代码
middleware.AllowOrigin("*") // 允许所有来源
// ✅ 正确代码
// 从配置读取允许的来源
allowedOrigins := config.CORS.AllowedOrigins
if len(allowedOrigins) == 0 {
allowedOrigins = []string{"http://localhost:5173"}
}
middleware.AllowOrigin(allowedOrigins...)
```
**预计时间**: 2 小时
---
### **问题 11: Go 版本不存在**
**文件**: `go.mod`
**风险**: 无法编译
**修复方案**:
```diff
- go 1.25.0
+ go 1.21.0 # 使用最新稳定版
```
**预计时间**: 10 分钟
---
## 🟡 P2 - 下迭代修复(1-2 周)
### **分类 1: 前端 API 未对接(30+ 处)**
**涉及文件**:
- `web/src/views/Settings/*`
- `web/src/views/Monitor/*`
- `web/src/views/Networks/*`
**修复计划**:
1. 第 1 周:完成 Settings 页面 API 对接
2. 第 2 周:完成 Monitor 页面 API 对接
3. 第 3 周:完成 Networks 页面 API 对接
**预计时间**: 1 周
---
### **分类 2: 后端功能未完成**
**待实现功能**:
- [ ] DDNS 同步完整实现
- [ ] MeshSeed 生成和解析
- [ ] Watchdog 监控机制
- [ ] 告警规则引擎
- [ ] 审计日志导出
**预计时间**: 3-4 天
---
### **分类 3: 并发安全问题**
**涉及文件**:
- `core/connect/strategy.go` - channel 锁保护
- `internal/ctr/wg.go` - 并发访问保护
**修复方案**:
```go
type StrategyScheduler struct {
mu sync.RWMutex
// ...
}
```
**预计时间**: 1 天
---
### **分类 4: 依赖清理**
**未使用的依赖**:
```diff
- github.com/some/unused-package v1.0.0
- github.com/another/unused v2.0.0
```
**修复步骤**:
1. 使用 `go mod why` 确认是否使用
2. 删除未使用的依赖
3. 运行 `go mod tidy`
**预计时间**: 2 小时
---
## 📋 详细时间表
### **第 1 周:P0 修复**
| 时间 | 任务 | 负责人 |
|------|------|--------|
| Day 1 AM | 问题 1: 随机数生成修复 | Dev A |
| Day 1 PM | 问题 2: 加密密钥修复 | Dev A |
| Day 2 AM | 问题 3: 跨平台兼容 | Dev B |
| Day 2 PM | 问题 4: TUN 设备引用 | Dev B |
| Day 3 AM | 问题 5: wgDevice 引用 | Dev B |
| Day 3 PM | 测试验证 | QA |
### **第 2 周:P1 修复**
| 时间 | 任务 | 负责人 |
|------|------|--------|
| Day 1 | 问题 6-8: 错误处理 | Dev A |
| Day 2 | 问题 9-10: 类型安全和 CORS | Dev B |
| Day 3 | 问题 11: Go 版本 + 回归测试 | Dev A + QA |
### **第 3-4 周:P2 修复**
| 时间 | 任务 | 负责人 |
|------|------|--------|
| Week 3 | 前端 API 对接(Settings | Frontend |
| Week 4 | 前端 API 对接(Monitor | Frontend |
| Week 4 | 后端功能完善 | Backend |
---
## ✅ 验收标准
### **P0 修复验收**
- [ ] 密码生成通过 NIST 随机性测试
- [ ] 加密密钥每个实例唯一
- [ ] Windows/macOS/Linux 均能编译运行
- [ ] 72 小时运行无资源泄漏
- [ ] WG 设备正常启停
### **P1 修复验收**
- [ ] 所有错误都有返回和日志
- [ ] 数据库事务回滚测试通过
- [ ] CORS 配置化且默认安全
- [ ] 编译无警告
### **P2 修复验收**
- [ ] 前端 API 对接率 > 90%
- [ ] 核心功能完整可用
- [ ] 并发测试无 race condition
- [ ] 依赖列表精简
---
## 🎯 风险控制
### **高风险项**
1. **跨平台兼容性** - 需要实际测试环境
- 缓解:使用 GitHub Actions CI/CD
2. **资源泄漏** - 难以复现
- 缓解:压力测试 + 内存分析
3. **数据库回滚** - 影响现有逻辑
- 缓解:充分的单元测试
---
## 📊 进度跟踪
使用 GitHub Projects 跟踪:
- P0 Issues: 5 个
- P1 Issues: 6 个
- P2 Issues: 50+ 个
**每日站会**同步进度,**每周五**演示修复成果。
---
*创建时间:2026-03-24*
*版本:v1.0*
*下次更新:完成 P0 修复后*