Go 项目,包含: - 服务端 updater:两阶段协议,ECDSA 签名验证,AES-GCM 加密 - 发送端 dcu-send:Gitea Action CLI - internal/auth:加解密/签名/会话管理 - internal/docker:Docker CLI 容器查找/拉取/重建 - action/:Gitea Action 定义 - deploy/Dockerfile:多阶段构建 - .gitea/workflows/build.yaml:CI/CD
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"crypto/ecdsa"
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-chi/chi/v5/middleware"
|
||||
|
||||
"gitea.songhuwan.com/actions/docker-compose-updater/internal/auth"
|
||||
"gitea.songhuwan.com/actions/docker-compose-updater/internal/docker"
|
||||
)
|
||||
|
||||
// Server 封装 HTTP 服务器。
|
||||
type Server struct {
|
||||
addr string
|
||||
router *chi.Mux
|
||||
srv *http.Server
|
||||
}
|
||||
|
||||
// New 创建 Server。
|
||||
func New(
|
||||
addr string,
|
||||
verifyKey *ecdsa.PublicKey,
|
||||
updater *docker.Updater,
|
||||
sessionTTL time.Duration,
|
||||
nonceTTL time.Duration,
|
||||
timeWindow time.Duration,
|
||||
) *Server {
|
||||
sessionMgr := auth.NewSessionManager(sessionTTL)
|
||||
nonceCache := auth.NewNonceCache(nonceTTL)
|
||||
h := NewHandler(verifyKey, sessionMgr, nonceCache, updater, timeWindow)
|
||||
|
||||
r := chi.NewRouter()
|
||||
r.Use(middleware.Logger)
|
||||
r.Use(middleware.Recoverer)
|
||||
r.Use(middleware.RequestSize(1024 * 1024)) // 1MB
|
||||
|
||||
r.Get("/health", h.Health)
|
||||
r.Post("/session", h.HandleSession)
|
||||
r.Post("/hook", h.HandleHook)
|
||||
|
||||
return &Server{
|
||||
addr: addr,
|
||||
router: r,
|
||||
}
|
||||
}
|
||||
|
||||
// Start 启动 HTTP 服务器。
|
||||
func (s *Server) Start() error {
|
||||
s.srv = &http.Server{
|
||||
Addr: s.addr,
|
||||
Handler: s.router,
|
||||
}
|
||||
slog.Info("server starting", "addr", s.addr)
|
||||
return s.srv.ListenAndServe()
|
||||
}
|
||||
Reference in New Issue
Block a user