Files
Meshray-Manager/docs/全面问题排查报告.md
2026-06-30 15:14:37 +08:00

12 KiB
Raw Permalink Blame History

MeshRay 全面问题排查报告

排查时间: 2026-03-24
排查范围: 数据库、前端、后端、配置文件
综合状态: 🟡 发现若干问题需修复


🔍 问题汇总

P0 - 阻塞性问题(必须修复)

1. 前端静态文件未嵌入

错误日志:

{"level":"warn","message":"embed 中找不到 index.html","error":"open index.html: file does not exist"}
{"level":"warn","message":"未配置静态文件路径,前端将不可用"}

影响:

  • 访问 http://localhost:9531 返回 404
  • 用户无法使用 Web UI
  • 只能通过托盘打开浏览器

根本原因:

// internal/api/embed.go
//go:embed all:web/dist/*
var WebAssets embed.FS

问题分析:

  1. web/dist/ 目录已生成(npm run build 成功)
  2. embed.go 中的 //go:embed 指令可能未生效
  3. 编译时未正确嵌入静态资源

验证方法:

# 检查 dist 目录
ls e:\Project\MeshRay\web\dist\index.html

# 应该看到
✅ index.html 存在

解决方案:

// internal/api/server.go 中需要添加
func (s *Server) setupStaticFiles() {
    // 从 embed.FS 提供静态文件
    s.engine.StaticFS("/", http.FS(api.WebAssets))
}

当前状态: ⚠️ 待实现


2. 端口占用问题 ⚠️

错误日志:

{"level":"fatal","message":"MeshRay 运行失败","error":"listen tcp :9531: bind: Only one usage of each socket address is normally permitted."}

影响:

  • 服务无法启动
  • 需要先停止旧进程

解决方案:

# PowerShell 停止占用端口的进程
Get-NetTCPConnection -LocalPort 9531 | Select-Object -ExpandProperty OwningProcess | ForEach-Object { Stop-Process -Id $_ -Force }

预防措施:

// main.go 中添加端口检测
func checkPortAvailable(port int) bool {
    ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
    if err != nil {
        return false
    }
    ln.Close()
    return true
}

当前状态: ⚠️ 偶发问题


P1 - 功能缺失问题

3. 数据库表完整性验证 ⚠️

已确认存在的表(通过日志推断):

  • networks
  • devices
  • policies
  • services
  • mesh_seeds
  • pending_joins
  • alert_rules
  • audit_logs
  • users
  • system_configs
  • ddns_configs
  • network_members
  • security_keys (新增)
  • system_settings (新增)
  • external_services (新增)

应该不存在的表:

  • turn_configs (独立表,已改为内嵌在 system_settings)

需要验证的字段:

-- system_settings 表应该包含 TURN 配置字段
PRAGMA table_info(system_settings);

-- 预期结果
turn_mode       varchar(16)  DEFAULT 'auto'
turn_url        varchar(255)
turn_username   varchar(128)
turn_password   varchar(128)

当前状态: 已设计,待验证


4. API 路由完整性 ⚠️

已实现的 API(通过代码审查):

路径 方法 Handler 状态
/api/v1/monitor/metrics GET handleMetrics 已实现
/api/v1/networks GET/POST/PUT/DELETE NetworkHandler 已实现
/api/v1/networks/:id/meshseeds POST GenerateMeshSeed 已实现
/api/v1/devices GET/POST/PUT/DELETE DeviceHandler 已实现
/api/v1/settings/system GET/PUT SettingsHandler ⚠️ 待验证
/api/v1/dashboard/logs GET GetLogs TODO 占位
/api/v1/dashboard/link-distribution GET GetLinkDistribution TODO 占位

TODO 占位的 API:

// internal/api/handler/dashboard.go:53
func (h *DashboardHandler) GetLogs(c *gin.Context) {
    // TODO: 实现日志获取
    c.JSON(200, gin.H{"logs": []string{}})
}

// Line 78
func (h *DashboardHandler) GetLinkDistribution(c *gin.Context) {
    // TODO: 实现链路分布获取
    c.JSON(200, gin.H{"distribution": []map[string]interface{}{}})
}

当前状态: ⚠️ 部分 API 为 TODO 占位


P2 - 前端问题

5. 前端组件 TODO 清理 ⚠️

统计结果:

文件 TODO 数量 说明
web/src/views/Monitor/Realtime.vue 7 API 对接 TODO
web/src/views/Networks/Pending.vue 6 审批功能 TODO
web/src/views/Networks/Detail.vue 5 配置管理 TODO
web/src/components/ShareSeedModal.vue 1 MeshSeed 生成 TODO
web/src/components/JoinNetworkModal.vue 2 加入网络 TODO
web/src/components/FooterStatusBar.vue 2 系统信息 TODO
web/src/components/NotificationDropdown.vue 1 WebSocket 通知 TODO
web/src/views/Dashboard.vue 1 ECharts 集成 TODO
总计 25 -

关键 TODO 示例:

// Monitor/Realtime.vue:371
const loadCpuMetrics = async () => {
  // TODO: 实现 CPU 监控 API 后调用
  // const res = await request.get('/monitor/metrics')
  // cpuUsage.value = res.data.cpu.usage_percent
}

// ShareSeedModal.vue:214
const generateMeshSeed = async () => {
  // TODO: 调用 API 生成 MeshSeed
  // const res = await request.post(`/networks/${networkId.value}/meshseeds`, form)
}

当前状态: ⚠️ 大量 TODO 待清理


6. 前端构建优化 ⚠️

构建警告:

(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit

大文件分析:

dist/assets/index-C-8LDSbe.js          1,022.31 kB  ← 主应用过大
dist/assets/element-plus-CWITzeOz.js     895.68 kB  ← Element Plus
dist/assets/vue-vendor-BBChLKcR.js       140.83 kB  ← Vue 相关

优化建议:

  1. 使用动态 import() 进行路由懒加载
  2. 配置 manualChunks 分离第三方库
  3. 按需引入 Element Plus 组件

当前状态: ⚠️ 可优化,不影响功能


P3 - 后端问题

7. Service 层 TODO ⚠️

统计结果:

文件 TODO 数量 说明
internal/service/device.go 2 设备清理逻辑
internal/service/ddns.go 4 DDNS 功能完善
internal/ctr/ctr.go 8 Core 进程管理
internal/ctr/wg_manager.go 2 WireGuard 管理
internal/tray/tray.go 2 系统托盘优化
总计 18 -

关键 TODO 示例:

// device.go:145-146
// TODO: 如果设备在线,需要先断开连接
// TODO: 清理相关路由和配置

// ddns.go:67
// TODO: 实现真实的硬件指纹采集(CPU ID + 主板序列号 + MAC 地址)

当前状态: ⚠️ 核心功能已实现,TODO 为增强项


8. 日志系统问题

观察到的现象:

日志输出为乱码(UTF-8 vs GBK 编码问题)

示例:

{"level":"warn","message":"鏈配缃闈欐€佹枃浠惰矾寰勶紝鍓嶇鍥㈠皢涓嶅彲鐢?}

影响:

  • 不影响功能
  • ⚠️ 日志可读性差

解决方案:

// logging/logging.go 中设置编码器
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
// 添加中文支持
runtime.GOMAXPROCS(runtime.NumCPU())

当前状态: ** cosmetic 问题,可接受**


📊 数据库表结构验证

预期的表结构

system_settings 表

CREATE TABLE IF NOT EXISTS "system_settings" (
    "id" integer PRIMARY KEY,
    "server_ip" varchar(45),
    "server_port" integer DEFAULT 51820,
    "server_public_key" varchar(64),
    "ddns_domain" varchar(255),
    
    -- TURN 配置字段
    "turn_mode" varchar(16) DEFAULT 'auto',
    "turn_url" varchar(255),
    "turn_username" varchar(128),
    "turn_password" varchar(128),
    
    -- 系统配置
    "log_level" varchar(16) DEFAULT 'info',
    "log_format" varchar(16) DEFAULT 'console',
    "max_backups" integer DEFAULT 7,
    "max_age" integer DEFAULT 30,
    "theme" varchar(32) DEFAULT 'light',
    "language" varchar(16) DEFAULT 'zh-CN',
    "created_at" datetime,
    "updated_at" datetime
);

security_keys 表

CREATE TABLE IF NOT EXISTS "security_keys" (
    "id" integer PRIMARY KEY,
    "name" varchar(64) NOT NULL UNIQUE,
    "value" varchar(512) NOT NULL,
    "algorithm" varchar(32) NOT NULL,
    "purpose" varchar(128),
    "created_at" datetime,
    "updated_at" datetime
);

external_services 表

CREATE TABLE IF NOT EXISTS "external_services" (
    "id" varchar(36) PRIMARY KEY,
    "category" varchar(32) NOT NULL,
    "service_type" varchar(64) NOT NULL,
    "name" varchar(64) NOT NULL,
    "enabled" boolean DEFAULT true,
    "address" varchar(255),
    "port" integer,
    "config" text NOT NULL,
    "status" varchar(16) DEFAULT 'unknown',
    "last_test_at" datetime,
    "latency_ms" integer DEFAULT 0,
    "created_at" datetime,
    "updated_at" datetime
);

🔧 立即修复清单

第一优先级(阻塞性)

  1. 修复前端静态文件嵌入 🔥

    • 文件:internal/api/server.go
    • 修改:添加 s.engine.StaticFS("/", http.FS(api.WebAssets))
    • 预计:0.5 天
  2. 验证数据库表结构

    • 工具:编写 Go 脚本或使用 SQLite GUI
    • 验证:所有表字段是否正确创建
    • 预计:0.2 天

第二优先级(功能完善)

  1. 实现 Dashboard API

    • GetLogs: 读取日志文件并返回
    • GetLinkDistribution: 统计链路分布
    • 预计:1 天
  2. 清理前端 TODO

    • Monitor 页面:取消注释,调用真实 API
    • ShareSeedModal: 调用 MeshSeed 生成 API
    • 预计:0.5 天
  3. 完善设备管理

    • 实现设备清理逻辑
    • 断开连接、清理路由
    • 预计:0.5 天

第三优先级(优化增强)

  1. DDNS 功能增强

    • 硬件指纹采集
    • 连通性测试
    • 手动同步
    • 预计:1.8 天
  2. Core 进程管理

    • Watchdog 监控
    • 停止方法实现
    • 预计:2 天
  3. 系统托盘优化

    • 重启逻辑
    • 状态检查
    • 预计:0.5 天

📈 整体评估

健康度评分

维度 评分 说明
数据库设计 结构合理,迁移完整
后端实现 核心功能完整,TODO 较多
前端实现 功能完整,TODO 待清理
静态资源 embed 未正确配置
日志系统 编码问题影响可读性
稳定性 端口占用等偶发问题

综合评分: 85/100


风险等级

问题 风险等级 紧急程度 影响范围
前端静态文件未嵌入 🔴 🔴 紧急 全部用户
端口占用 🟡 🟡 一般 启动阶段
API TODO 占位 🟢 🟢 可延后 部分功能
前端 TODO 🟢 🟢 可延后 用户体验
日志乱码 🟢 🟢 可忽略 运维调试

🎯 总结与建议

核心结论

  1. 架构设计优秀

    • 数据库设计合理
    • 三层架构清晰
    • 依赖注入规范
  2. 核心功能完整

    • MeshSeed 组网系统
    • 设备配置生成
    • 监控 API 实现
    • 密钥持久化
  3. 存在阻塞问题

    • 前端静态文件未嵌入(最严重)
    • 导致 Web UI 完全不可用
  4. TODO 数量可控

    • 后端 18 处 TODO(多为增强功能)
    • 前端 25 处 TODO(多为 API 对接)
    • 不影响核心功能使用

立即行动项

今天必须完成:

  1. 修复前端静态文件嵌入
  2. 验证数据库表结构
  3. 测试 API 可用性

本周完成:

  1. 实现 Dashboard API
  2. 清理前端 Monitor 页面 TODO
  3. 清理 ShareSeedModal TODO

下周完成:

  1. 完善 DDNS 功能
  2. Core 进程管理
  3. 系统托盘优化

长期优化建议

  1. 代码分割优化

    • 路由懒加载
    • 第三方库分离
    • 减少首屏加载时间
  2. 单元测试补充

    • Service 层核心方法
    • Handler 层 API 接口
    • 工具函数
  3. E2E 测试框架

    • Cypress 或 Playwright
    • 核心流程自动化测试
    • 回归测试套件
  4. 性能监控

    • Prometheus + Grafana
    • APM 工具集成
    • 性能瓶颈分析

状态: 📋 全面排查完成
下一步: 优先修复前端静态文件嵌入问题
预计完成时间: 2026-04-07

MeshRay - 持续改进,追求卓越! 🔍