仓库自包含化:Docker/CI/文档/规范入库,路由分组拆分
CI / test (push) Successful in 15s

This commit is contained in:
Wang Defa
2026-07-09 19:18:04 +08:00
parent b9a3e97e84
commit 3e0389c1e9
83 changed files with 20241 additions and 248 deletions
Binary file not shown.
+52 -1
View File
@@ -3,10 +3,22 @@ package main
import (
"context"
"flag"
"fmt"
"log"
"net"
"net/http"
"os"
"time"
// 纯 Go 时区数据(+~450KB):distroless/scratch 容器无 tzdata,
// 嵌入后 TZ 环境变量即可让 cron 按本地时区解释
_ "time/tzdata"
"gorm.io/gorm"
// swag 生成的 OpenAPI spec(init 时注册,SWAGGER=1 的 /swagger 路由消费)
_ "oci-portal/docs"
"oci-portal/internal/api"
"oci-portal/internal/config"
"oci-portal/internal/crypto"
@@ -15,19 +27,58 @@ import (
"oci-portal/internal/service"
)
// @title OCI Portal API
// @version 0.0.1
// @description 自托管 OCI 多租户管理面板 API。业务接口用 JWT(Bearer);AI 网关端点(/ai/v1/*)用独立网关密钥(Authorization: Bearer 或 x-api-key)。
// @BasePath /
// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
// @description 登录接口返回的 JWT,格式: Bearer <token>
func main() {
healthcheck := flag.Bool("healthcheck", false, "探活本机服务后退出:健康 0,异常 1(容器 HEALTHCHECK 用)")
flag.Parse()
if *healthcheck {
os.Exit(runHealthcheck())
}
if err := run(); err != nil {
log.Fatal(err)
}
}
// runHealthcheck 请求本机 HTTP 端口:能响应且非 5xx 视为健康。
// distroless 镜像无 shell/wget,靠二进制自检 flag 支撑 HEALTHCHECK。
func runHealthcheck() int {
addr := os.Getenv("ADDR")
if addr == "" {
addr = ":8080"
}
_, port, err := net.SplitHostPort(addr)
if err != nil {
fmt.Fprintf(os.Stderr, "healthcheck: bad ADDR %q: %v\n", addr, err)
return 1
}
client := &http.Client{Timeout: 3 * time.Second}
resp, err := client.Get("http://127.0.0.1:" + port + "/")
if err != nil {
fmt.Fprintf(os.Stderr, "healthcheck: %v\n", err)
return 1
}
defer resp.Body.Close()
if resp.StatusCode >= http.StatusInternalServerError {
fmt.Fprintf(os.Stderr, "healthcheck: status %d\n", resp.StatusCode)
return 1
}
return 0
}
// bootstrap 完成配置加载、数据库打开与加密组件构建。
func bootstrap() (*config.Config, *gorm.DB, *crypto.Cipher, error) {
cfg, err := config.Load()
if err != nil {
return nil, nil, nil, err
}
db, err := database.Open(cfg.DBPath)
db, err := database.Open(cfg.DBDriver, cfg.DBDSN, cfg.DBPath)
if err != nil {
return nil, nil, nil, err
}