package model import ( "time" ) // Network 组网模型 - 使用雪花算法生成 ID(uint64) type Network struct { ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // 雪花算法 ID Name string `gorm:"type:varchar(64);not null;uniqueIndex" json:"name"` SubnetIPv4 string `gorm:"type:varchar(18);not null" json:"subnet_ipv4"` SubnetIPv6 string `gorm:"type:varchar(43)" json:"subnet_ipv6,omitempty"` Mode string `gorm:"type:varchar(16);not null;default:'enhanced';index" json:"mesh_mode"` // native | enhanced WGMode string `gorm:"type:varchar(16);not null;default:'userspace'" json:"wg_mode"` // kernel | userspace PolicyID uint64 `gorm:"type:bigint;index" json:"policy_id"` DHCPEnabled bool `gorm:"default:true" json:"dhcp_enabled"` TunEnabled bool `gorm:"default:true" json:"tun_enabled"` TunName string `gorm:"type:varchar(16);default:'meshray-tun'" json:"tun_name"` MTU int `gorm:"default:1420" json:"mtu"` Password string `gorm:"type:varchar(128)" json:"-"` // AES-256-GCM 加密存储 Status string `gorm:"type:varchar(16);default:'running';index" json:"status"` // running | stopped | error CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` // 关联字段 Devices []Device `gorm:"foreignKey:NetworkID" json:"devices,omitempty"` // DDNS 同步字段 DDNSEnabled bool `gorm:"default:false" json:"ddns_enabled"` DDNSServiceID string `gorm:"type:varchar(36);index" json:"ddns_service_id"` // ExternalService.ID DDNSUsageID string `gorm:"type:varchar(36);index" json:"ddns_usage_id"` // DDNSUsage.ID DDNSPrefix string `gorm:"type:varchar(255)" json:"ddns_prefix"` // TXT 记录前缀(如:_meshray.ABC123) } // Device 设备模型 - 使用雪花算法生成 ID(uint64) type Device struct { ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // 雪花算法 ID NetworkID uint64 `gorm:"type:bigint;not null;index:idx_device_network" json:"network_id"` // 所属网络 ID Name string `gorm:"type:varchar(64);not null" json:"name"` VirtualIP string `gorm:"type:varchar(45);not null" json:"virtual_ip"` PublicKey string `gorm:"type:varchar(64);not null" json:"public_key"` PresharedKey string `gorm:"type:varchar(64)" json:"-"` Endpoint string `gorm:"type:varchar(261)" json:"endpoint,omitempty"` // 原始公网 Endpoint(host:port),用于增强模式回退 IsRelayCapable bool `gorm:"default:false" json:"is_relay_capable"` // 是否作为 Mesh 中继节点 Status string `gorm:"type:varchar(16);default:'offline';index" json:"status"` // online | offline LastSeen time.Time `json:"last_seen"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` } // Policy 传输策略模型 type Policy struct { ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` // Snowflake ID, matches Network.PolicyID Name string `gorm:"size:255;not null;index" json:"name"` Type string `gorm:"size:32;not null;default:'custom'" json:"type"` // system | custom Description string `gorm:"size:512" json:"description"` LayerConfig string `gorm:"type:text" json:"layer_config"` // JSON 格式存储 9 层链路配置 GlobalParams string `gorm:"type:text" json:"global_params"` // JSON 格式存储全局参数 Enabled bool `gorm:"default:true" json:"enabled"` IsDefault bool `gorm:"default:false" json:"is_default"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // TURNAuthType TURN 鉴权方式 type TURNAuthType string const ( TURNAuthCredential TURNAuthType = "credential" // Username + Password(RFC 5766,自建 coturn) TURNAuthToken TURNAuthType = "token" // 临时 Token(商业 TURN 服务:Twilio、Xirsys 等) TURNAuthSecret TURNAuthType = "secret" // Shared Secret(由信令服务器签发临时凭证) ) // Service 服务模型 - 前端用户视角的服务实例 type Service struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` Name string `gorm:"type:varchar(64);not null" json:"name"` Type string `gorm:"type:varchar(8);not null;index" json:"type"` // "tun"/"turn"/"ddns" Address string `gorm:"type:varchar(255);not null" json:"address"` Port int `gorm:"not null" json:"port"` Protocols []string `gorm:"type:text;serializer:json" json:"protocols"` // JSON: ["udp","tcp","tls","ws","wss"] AuthType string `gorm:"type:varchar(16)" json:"auth_type,omitempty"` AuthUsername string `gorm:"type:varchar(128)" json:"username,omitempty"` AuthPassword string `gorm:"type:varchar(128)" json:"password,omitempty"` // 仅用于输入,存储时仍需加密处理 Token string `gorm:"type:text" json:"token,omitempty"` SharedSecret string `gorm:"type:varchar(128)" json:"shared_secret,omitempty"` MTU int `gorm:"default:1420" json:"mtu,omitempty"` Provider string `gorm:"type:varchar(32)" json:"provider,omitempty"` Domain string `gorm:"type:varchar(255)" json:"domain,omitempty"` RecordType string `gorm:"type:varchar(8)" json:"record_type,omitempty"` // DDNS 全功能模式字段 ConfigMode string `gorm:"type:varchar(16);default:'infrastructure'" json:"config_mode"` // "infrastructure" | "fullservice" DDNSConfigID string `gorm:"type:varchar(36)" json:"ddns_config_id,omitempty"` // 关联的 DDNS 配置 ID(全功能模式) Subdomain string `gorm:"type:varchar(255)" json:"subdomain,omitempty"` // 主机记录(全功能模式) TargetIP string `gorm:"type:varchar(64)" json:"target_ip,omitempty"` // 目标 IP(全功能模式) TXTRecordName string `gorm:"type:varchar(255)" json:"txt_record_name,omitempty"` // TXT 记录名称(全功能模式) TXTValue string `gorm:"type:text" json:"txt_value,omitempty"` // TXT 记录值(全功能模式) CNAMETarget string `gorm:"type:varchar(255)" json:"cname_target,omitempty"` // CNAME 目标域名(全功能模式) TTL int `gorm:"default:600" json:"ttl,omitempty"` // TTL(全功能模式) Status string `gorm:"type:varchar(16);default:'active'" json:"status"` // active | inactive Reachable bool `gorm:"-" json:"reachable"` // 连通性状态 Latency int `gorm:"-" json:"latency"` // 延迟 WSEnabled bool `gorm:"default:false" json:"ws_enabled"` IndependentWS string `gorm:"type:text" json:"independent_ws,omitempty"` // JSON: {address, port, wss} Enabled bool `gorm:"default:true;index" json:"enabled"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` } // ExternalService 外部服务模型 - 统一管理所有外部依赖服务 // 按照 README 6.4 节定义,通过 category + serviceType + config JSON 实现无限扩展 type ExternalService struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` Category string `gorm:"type:varchar(32);not null;index" json:"category"` // "networking" / "dns" / "security" / "gateway" / "automation" ServiceType string `gorm:"type:varchar(64);not null;index" json:"service_type"` // stun_server / turn_server / ddns_aliyun / ssl_acme 等 Name string `gorm:"type:varchar(64);not null" json:"name"` Enabled bool `gorm:"default:true;index" json:"enabled"` Address string `gorm:"type:varchar(255)" json:"address,omitempty"` // 服务器地址(可选) Port int `json:"port,omitempty"` // 端口(可选) Config string `gorm:"type:text;not null" json:"config"` // JSON,结构由 serviceType 决定(敏感字段加密) Status string `gorm:"type:varchar(16);default:'unknown';index" json:"status"` // reachable / unreachable / unknown LastTestAt *time.Time `json:"last_test_at,omitempty"` // 最后测试时间 LatencyMs int `gorm:"default:0" json:"latency_ms"` // 延迟(ms) CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` } // SystemSetting 系统设置模型 - 单例模式,全局只有一条记录 type SystemSetting struct { ID uint `gorm:"primaryKey;type:bigint" json:"id"` // 固定为 1 ServerIP string `gorm:"type:varchar(45)" json:"server_ip"` // 服务端公网 IP ServerPort int `gorm:"default:51820" json:"server_port"` // WireGuard 监听端口 ServerPublicKey string `gorm:"type:varchar(64)" json:"server_public_key,omitempty"` // WireGuard 服务端公钥 DDNSDomain string `gorm:"type:varchar(255)" json:"ddns_domain"` // DDNS 域名(如 mesh.example.com) TURNMode string `gorm:"type:varchar(16);default:'auto'" json:"turn_mode"` // auto/manual TURNURL string `gorm:"type:varchar(255)" json:"turn_url"` // TURN 服务器 URL(手动模式) TURNUsername string `gorm:"type:varchar(128)" json:"turn_username,omitempty"` // TURN 用户名 TURNPassword string `gorm:"type:varchar(128)" json:"-"` // TURN 密码(加密存储) LogLevel string `gorm:"type:varchar(16);default:'info'" json:"log_level"` // debug/info/warn/error LogFormat string `gorm:"type:varchar(16);default:'console'" json:"log_format"` // console/json MaxBackups int `gorm:"default:7" json:"max_backups"` // 日志最大保留份数 MaxAge int `gorm:"default:30" json:"max_age"` // 日志最大保留天数 Theme string `gorm:"type:varchar(32);default:'light'" json:"theme"` // light/dark/auto Language string `gorm:"type:varchar(16);default:'zh-CN'" json:"language"` // zh-CN/en-US CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"` } // DDNSProvider DDNS 服务商配置模型(配置层) type DDNSProvider struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` Name string `gorm:"type:varchar(64);not null" json:"name"` // 服务商名称,如 "Cloudflare-Mesh" Provider string `gorm:"type:varchar(32);not null" json:"provider"` // cloudflare, aliyun, tencent Domain string `gorm:"type:varchar(255);not null" json:"domain"` // 主域名 AccessKey string `gorm:"type:varchar(255)" json:"-"` // 加密存储 SecretKey string `gorm:"type:text" json:"-"` // 加密存储 Config string `gorm:"type:text" json:"config"` // JSON 扩展配置 Enabled bool `gorm:"default:true" json:"enabled"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // DDNSUsageType DDNS 用途类型 type DDNSUsageType string const ( DDNSUsageMeshSeedSync DDNSUsageType = "meshseed_sync" // MeshSeed 同步(TXT 记录) DDNSUsageIPResolve DDNSUsageType = "ip_resolve" // IP 动态解析(A/AAAA 记录) DDNSUsageDeviceBind DDNSUsageType = "device_bind" // 设备域名绑定(CNAME 记录) ) // DDNSUsage DDNS 用途定义模型(应用层) type DDNSUsage struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` ProviderID string `gorm:"type:varchar(36);not null;index" json:"provider_id"` // 关联的 Provider(即 ExternalService.ID) UsageType DDNSUsageType `gorm:"type:varchar(32);not null" json:"usage_type"` RecordType string `gorm:"type:varchar(8);not null" json:"record_type"` // TXT, A, AAAA, CNAME RecordPrefix string `gorm:"type:varchar(255);not null" json:"record_prefix"` // 记录前缀 Description string `gorm:"type:varchar(512)" json:"description"` IsExclusive bool `gorm:"default:false" json:"is_exclusive"` // 是否独占 PrefixMode string `gorm:"type:varchar(16);not null;default:'auto'" json:"prefix_mode"` // "auto" | "custom" CreatedAt time.Time `json:"created_at"` // 关联关系 Provider *DDNSProvider `gorm:"foreignKey:ProviderID" json:"provider,omitempty"` } // NetworkDDNSBinding 网络 DDNS 绑定模型(使用层) type NetworkDDNSBinding struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` NetworkID uint64 `gorm:"type:bigint;not null;uniqueIndex" json:"network_id"` // 每个网络只能绑定一个 UsageID string `gorm:"type:varchar(36);not null" json:"usage_id"` // 选择的用途 ProviderID string `gorm:"type:varchar(36);not null" json:"provider_id"` // 冗余存储 Status string `gorm:"type:varchar(16);default:'active'" json:"status"` // active, sync_pending, sync_failed LastSyncAt *time.Time `json:"last_sync_at"` SyncMessage string `gorm:"type:text" json:"sync_message"` // 同步结果/错误信息 CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` // 关联字段 Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"` Usage *DDNSUsage `gorm:"foreignKey:UsageID" json:"usage,omitempty"` } // MeshSeed 组网凭证模型 type MeshSeed struct { ID uint `gorm:"primaryKey" json:"id"` SeedID string `gorm:"size:64;not null;uniqueIndex" json:"seed_id"` // 16 字节随机 Base64 NetworkID uint64 `gorm:"type:bigint;not null;index" json:"network_id"` // ✅ 与 Network.ID 类型一致 Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"` JoinToken string `gorm:"size:512;not null" json:"join_token"` // Base64 编码的完整 MeshSeed Signature string `gorm:"size:512;not null" json:"signature"` // Ed25519 签名 IssuerNodeID string `gorm:"size:255;not null" json:"issuer_node_id"` MaxUses int `gorm:"default:10" json:"max_uses"` UsedCount int `gorm:"default:0" json:"used_count"` ExpiresAt time.Time `gorm:"index" json:"expires_at"` DDNSEnabled bool `gorm:"default:false" json:"ddns_enabled"` UpdateVersion int `gorm:"default:0" json:"update_version"` DDNSDomain string `gorm:"size:255" json:"ddns_domain"` Revoked bool `gorm:"default:false" json:"revoked"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // SecurityKey 安全密钥模型(用于存储 Ed25519 签名密钥等) type SecurityKey struct { ID uint `gorm:"primaryKey" json:"id"` Name string `gorm:"size:64;not null;uniqueIndex" json:"name"` // 密钥名称,如 "meshseed_signing" Value string `gorm:"size:512;not null" json:"-"` // Base64 编码的密钥值 Algorithm string `gorm:"size:32;not null" json:"algorithm"` // 算法类型:ed25519, rsa 等 Purpose string `gorm:"size:128" json:"purpose"` // 用途描述 CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"` } // PendingJoin 待加入审核模型 type PendingJoin struct { ID uint `gorm:"primaryKey" json:"id"` SeedID string `gorm:"size:64;not null;index" json:"seed_id"` DeviceName string `gorm:"size:255;not null" json:"device_name"` RequestIP string `gorm:"size:64" json:"request_ip"` Status string `gorm:"size:32;default:'pending'" json:"status"` // pending | approved | rejected ExpireAt time.Time `gorm:"index" json:"expire_at"` // 72 小时超时 ApprovedAt *time.Time `json:"approved_at"` RejectedAt *time.Time `json:"rejected_at"` Reason string `gorm:"size:512" json:"reason"` // 拒绝原因 CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // AlertRule 告警规则模型 type AlertRule struct { ID uint `gorm:"primaryKey" json:"id"` Type string `gorm:"size:32;not null;index" json:"type"` // resource | link | service Name string `gorm:"size:255;not null" json:"name"` Threshold float64 `gorm:"not null" json:"threshold"` Operator string `gorm:"size:8;not null" json:"operator"` // gt | lt | eq NotifyEmail bool `gorm:"default:false" json:"notify_email"` NotifyWebhook bool `gorm:"default:false" json:"notify_webhook"` WebhookURL string `gorm:"size:512" json:"webhook_url"` Enabled bool `gorm:"default:true" json:"enabled"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // User 用户模型 type User struct { ID uint `gorm:"primaryKey" json:"id"` Username string `gorm:"size:64;not null;uniqueIndex" json:"username"` PasswordHash string `gorm:"size:255;not null" json:"-"` // bcrypt 加密存储 Email string `gorm:"size:255" json:"email"` Role string `gorm:"size:32;default:'user'" json:"role"` // admin | user Status string `gorm:"size:32;default:'active'" json:"status"` // active | banned LastLoginAt time.Time `json:"last_login_at,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // AuditLog 审计日志模型 type AuditLog struct { ID uint `gorm:"primaryKey" json:"id"` Action string `gorm:"size:64;not null;index" json:"action"` // create_network | delete_network | generate_seed | etc. OperatorIP string `gorm:"size:64;not null" json:"operator_ip"` UserAgent string `gorm:"size:512" json:"user_agent"` Detail string `gorm:"type:text" json:"detail"` // JSON 格式存储详细信息 CreatedAt time.Time `gorm:"index" json:"created_at"` } // SystemConfig 系统配置模型(全局唯一) type SystemConfig struct { ID uint `gorm:"primaryKey" json:"id"` Key string `gorm:"size:64;not null;uniqueIndex" json:"key"` // 配置键,如 "wg_mode" Value string `gorm:"size:255;not null" json:"value"` // 配置值,如 "auto" | "kernel" | "userspace" UpdatedAt time.Time `json:"updated_at"` } // Notification 通知模型 type Notification struct { ID uint `gorm:"primaryKey" json:"id"` UserID uint `gorm:"not null;index" json:"user_id"` // 接收用户 ID Type string `gorm:"size:32;not null;index" json:"type"` // alert/system/update/ddns Priority int `gorm:"default:2;index" json:"priority"` // 1=low, 2=medium, 3=high Title string `gorm:"size:255;not null" json:"title"` Message string `gorm:"type:text;not null" json:"message"` Data string `gorm:"type:text" json:"data,omitempty"` // JSON 格式额外数据 IsRead bool `gorm:"default:false;index" json:"is_read"` // 是否已读 ReadAt *time.Time `json:"read_at,omitempty"` // 阅读时间 CreatedAt time.Time `gorm:"autoCreateTime;index" json:"created_at"` // 创建时间 } // DDNSConfig DDNS 配置模型 type DDNSConfig struct { ID string `gorm:"primaryKey;type:varchar(36)" json:"id"` Provider string `gorm:"type:varchar(32);not null" json:"provider"` // aliyun | tencent AccessKey string `gorm:"type:varchar(128);not null" json:"accessKey"` SecretKey string `gorm:"type:varchar(128);not null" json:"-"` // AES-256-GCM 加密存储 Domain string `gorm:"type:varchar(255);not null" json:"domain"` TXTRecordName string `gorm:"type:varchar(255)" json:"txtRecordName"` // 自动生成 SyncMode string `gorm:"type:varchar(16);default:'auto'" json:"syncMode"` // auto | manual RetryCount int `gorm:"default:10" json:"retryCount"` RetryInterval int `gorm:"default:300" json:"retryInterval"` // 秒 Enabled bool `gorm:"default:true" json:"enabled"` CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"` } // NetworkMemberRole 网络成员角色 type NetworkMemberRole string const ( RoleOwner NetworkMemberRole = "owner" // 创建者,拥有所有权限 RoleMember NetworkMemberRole = "member" // 加入者,只能使用网络 ) // NetworkMember 网络成员表 - 管理网络成员及其角色 type NetworkMember struct { ID uint64 `gorm:"primaryKey;type:bigint" json:"id"` NetworkID uint64 `gorm:"type:bigint;not null;uniqueIndex:idx_network_user" json:"networkID"` UserID uint64 `gorm:"type:bigint;not null;uniqueIndex:idx_network_user" json:"userID"` Role NetworkMemberRole `gorm:"type:varchar(16);not null;default:'member'" json:"role"` // owner | member JoinedAt time.Time `gorm:"autoCreateTime" json:"joinedAt"` // 关联 Network *Network `gorm:"foreignKey:NetworkID" json:"network,omitempty"` User *User `gorm:"foreignKey:UserID" json:"user,omitempty"` } // TableName 指定表名 func (NetworkMember) TableName() string { return "network_members" } // Permission 权限类型 type Permission string const ( PermManageNetwork Permission = "manage_network" // 管理网络配置 PermAddPeer Permission = "add_peer" // 添加节点 PermRemovePeer Permission = "remove_peer" // 移除节点 PermKickMember Permission = "kick_member" // 踢出成员 PermUpdateConfig Permission = "update_config" // 更新组网参数 PermDeleteNetwork Permission = "delete_network" // 解散网络 PermLeaveNetwork Permission = "leave_network" // 退出网络 )