chore: 恢复旧布局基线(迁移改动丢失后重建,apps/packages 布局暂存)

This commit is contained in:
logan committed 2026-10-14 20:31:17 +08:00
1 parent a9510235bb
commit 456fa6954b
203 files changed
+18787 -48

No files matched your search

+113
View File
@@ -0,0 +1,113 @@
package main
import (
"crypto/rand"
"encoding/hex"
"log"
"net"
"os"
"path/filepath"
"strings"
"opsxdb/server/internal/server"
)
// Version 服务端版本,/health 响应携带供桌面 sidecar 版本握手。
const Version = "0.1.0"
func main() {
addr := resolveListenAddr()
token := resolveToken(isPublicBind(addr) || bindPublicEnv())
server.Version = Version
if token != "" {
log.Printf("OpsxDB server listening on %s(已启用访问令牌)", addr)
} else {
log.Printf("OpsxDB server listening on %s", addr)
}
if err := server.NewRouter(token).Run(addr); err != nil {
log.Fatal(err)
}
}
// resolveListenAddr:默认仅本机 127.0.0.1:8788(桌面 sidecar 同机访问)。
// 显式对外:OPSXDB_BIND_PUBLIC=1 或 OPSXDB_ADDR=:8788 / 0.0.0.0:8788。
func resolveListenAddr() string {
if v := strings.TrimSpace(os.Getenv("OPSXDB_ADDR")); v != "" {
return v
}
if bindPublicEnv() {
return ":8788"
}
return "127.0.0.1:8788"
}
func bindPublicEnv() bool {
pub := strings.ToLower(strings.TrimSpace(os.Getenv("OPSXDB_BIND_PUBLIC")))
return pub == "1" || pub == "true" || pub == "yes"
}
// isPublicBind 判断监听地址是否绑在非回环地址上。
func isPublicBind(addr string) bool {
host, _, err := net.SplitHostPort(addr)
if err != nil {
return false
}
if host == "" {
return true // ":8788" 监听全部网卡
}
if ip := net.ParseIP(host); ip != nil {
return !ip.IsLoopback()
}
return host != "localhost"
}
func tokenFilePath() (string, error) {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".opsxdb", "token"), nil
}
// resolveToken 生效规则:
// - 优先 env OPSXDB_TOKEN(sidecar 拉起路径即强制 token);
// - 否则读 ~/.opsxdb/token;
// - force(绑公网)时仍无 token → crypto/rand 生成 32B hex,写 0600 文件并打印一次;
// - 本机 dev(不 force)无 token → 返回空,中间件直通。
func resolveToken(force bool) string {
if t := strings.TrimSpace(os.Getenv("OPSXDB_TOKEN")); t != "" {
return t
}
p, err := tokenFilePath()
if err == nil {
if b, err := os.ReadFile(p); err == nil {
if t := strings.TrimSpace(string(b)); t != "" {
return t
}
}
}
if !force {
return ""
}
t, err := genToken()
if err != nil {
log.Fatalf("公网监听必须配置访问令牌,且自动生成失败: %v(请设置 OPSXDB_TOKEN)", err)
}
if p, err := tokenFilePath(); err == nil {
if err := os.MkdirAll(filepath.Dir(p), 0700); err == nil {
if err := os.WriteFile(p, []byte(t+"\n"), 0600); err != nil {
log.Printf("写入 token 文件失败(仅本次进程有效): %v", err)
}
}
}
log.Printf("已生成访问令牌(仅显示一次,已写入 ~/.opsxdb/token): %s", t)
return t
}
func genToken() (string, error) {
var b [32]byte
if _, err := rand.Read(b[:]); err != nil {
return "", err
}
return hex.EncodeToString(b[:]), nil
}