diff --git a/docker-compose.postgresql.yml b/docker-compose.postgresql.yml index 23793f9..7cc4219 100644 --- a/docker-compose.postgresql.yml +++ b/docker-compose.postgresql.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: postgresql: image: postgres:17 diff --git a/docker-compose.sqlite.yml b/docker-compose.sqlite.yml index 3148931..af21b2d 100644 --- a/docker-compose.sqlite.yml +++ b/docker-compose.sqlite.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: victoriametrics: image: victoriametrics/victoria-metrics:v1.131.0 diff --git a/internal/app.go b/internal/app.go index 9cb6e37..ce97b25 100644 --- a/internal/app.go +++ b/internal/app.go @@ -294,6 +294,7 @@ func setupApi(app *orz.App, components *AppComponents) { adminApi.POST("/ddns/:id/enable", components.DDNSHandler.Enable) adminApi.POST("/ddns/:id/disable", components.DDNSHandler.Disable) adminApi.GET("/ddns/:id/records", components.DDNSHandler.GetRecords) + adminApi.POST("/ddns/:id/trigger", components.DDNSHandler.TriggerUpdate) } // OIDC 认证路由(如果启用) diff --git a/internal/handler/ddns_handler.go b/internal/handler/ddns_handler.go index 6c7fc6d..c9e1953 100644 --- a/internal/handler/ddns_handler.go +++ b/internal/handler/ddns_handler.go @@ -263,3 +263,18 @@ func (h *DDNSHandler) GetRecords(c echo.Context) error { "total": len(records), }) } + +// TriggerUpdate 手动触发 DDNS 更新 +func (h *DDNSHandler) TriggerUpdate(c echo.Context) error { + id := c.Param("id") + ctx := c.Request().Context() + + if err := h.ddnsService.TriggerUpdate(ctx, id); err != nil { + h.logger.Error("failed to trigger ddns update", zap.Error(err)) + return err + } + + return orz.Ok(c, orz.Map{ + "message": "DDNS 更新触发成功,探针将在几秒内上报 IP 并更新记录", + }) +} diff --git a/internal/service/ddns_service.go b/internal/service/ddns_service.go index 5d482bc..9208f54 100644 --- a/internal/service/ddns_service.go +++ b/internal/service/ddns_service.go @@ -416,3 +416,30 @@ func (s *DDNSService) sendDDNSConfigToAgent(config *models.DDNSConfig) error { return s.wsManager.SendToClient(config.AgentID, msgData) } + +// TriggerUpdate 手动触发 DDNS 更新 +// 向探针发送配置消息,触发探针立即获取并上报 IP 地址 +func (s *DDNSService) TriggerUpdate(ctx context.Context, configID string) error { + // 获取配置 + config, err := s.GetConfig(ctx, configID) + if err != nil { + return fmt.Errorf("获取 DDNS 配置失败: %w", err) + } + + // 检查配置是否启用 + if !config.Enabled { + return fmt.Errorf("DDNS 配置未启用") + } + + // 向探针发送配置,触发探针立即上报 IP + if err := s.sendDDNSConfigToAgent(config); err != nil { + return fmt.Errorf("向探针发送配置失败: %w", err) + } + + s.logger.Info("手动触发 DDNS 更新成功", + zap.String("configID", configID), + zap.String("agentID", config.AgentID), + zap.String("name", config.Name)) + + return nil +} diff --git a/web/src/admin/pages/DDNS/index.tsx b/web/src/admin/pages/DDNS/index.tsx index 691f23e..62f63f2 100644 --- a/web/src/admin/pages/DDNS/index.tsx +++ b/web/src/admin/pages/DDNS/index.tsx @@ -6,7 +6,7 @@ import {PageHeader} from '@admin/components'; import {Globe, Plus, Settings} from 'lucide-react'; import dayjs from 'dayjs'; import type {DDNSConfig} from '@/types'; -import {deleteDDNSConfig, disableDDNSConfig, enableDDNSConfig, getDDNSConfigs,} from '@/api/ddns'; +import {deleteDDNSConfig, disableDDNSConfig, enableDDNSConfig, getDDNSConfigs, triggerDDNSUpdate,} from '@/api/ddns'; import {getErrorMessage} from '@/lib/utils'; import DDNSModal from './DDNSModal.tsx'; import RecordsDrawer from './RecordsDrawer.tsx'; @@ -69,6 +69,15 @@ const DDNSPage = () => { }); }; + const handleTrigger = async (config: DDNSConfig) => { + try { + await triggerDDNSUpdate(config.id); + message.success('DDNS 更新触发成功,探针将在几秒内上报 IP 并更新记录'); + } catch (error: unknown) { + message.error(getErrorMessage(error, '触发失败')); + } + }; + const providerNames: Record = { aliyun: '阿里云', tencentcloud: '腾讯云', @@ -152,7 +161,7 @@ const DDNSPage = () => { { title: '操作', valueType: 'option', - width: 200, + width: 240, render: (_, record) => [ , + ,