diff --git a/backend/internal/model/model.go b/backend/internal/model/model.go index faf5b92..0be5ac7 100644 --- a/backend/internal/model/model.go +++ b/backend/internal/model/model.go @@ -41,6 +41,7 @@ type Instance struct { AccessMode AccessMode `json:"access_mode"` // open | whitelist AllowNetworks []string `json:"allow_networks"` // 实例级白名单 CIDR 列表 AuthMode AuthMode `json:"auth_mode"` // cert | cert+password + PublicHost string `json:"public_host"` // 公网域名/IP,生成 .ovpn 时优先用它;空则用下载时前端传入的 host Status string `json:"status"` // running/stopped/error PID int `json:"pid"` CreatedAt time.Time `json:"created_at"` diff --git a/backend/internal/service/service.go b/backend/internal/service/service.go index 8f0f40c..52fcd3c 100644 --- a/backend/internal/service/service.go +++ b/backend/internal/service/service.go @@ -400,7 +400,8 @@ func (s *Service) CreateUser(u model.VPNUser) (*model.VPNUser, error) { return &u, nil } -// GenerateOVPN 下载/重新生成 .ovpn,remoteHost 由前端传入。 +// GenerateOVPN 下载/重新生成 .ovpn。 +// remoteHost 优先级:Instance.PublicHost > 传入的 remoteHost > "vpn.example.com"。 func (s *Service) GenerateOVPN(userID, remoteHost string) (string, error) { u, err := s.Store.GetUser(userID) if err != nil { @@ -410,7 +411,11 @@ func (s *Service) GenerateOVPN(userID, remoteHost string) (string, error) { if err != nil { return "", err } - return s.Ovm.GenerateClientOVPNFor(u, in, remoteHost) + host := in.PublicHost + if host == "" { + host = remoteHost + } + return s.Ovm.GenerateClientOVPNFor(u, in, host) } // RevokeUser 吊销用户:禁用 + 标记。 diff --git a/frontend/src/views/Instances.vue b/frontend/src/views/Instances.vue index 8d9e79c..7129cd5 100644 --- a/frontend/src/views/Instances.vue +++ b/frontend/src/views/Instances.vue @@ -12,6 +12,12 @@ + + +