chore: 恢复旧布局基线(迁移改动丢失后重建,apps/packages 布局暂存)
This commit is contained in:
1 parent
a9510235bb
commit
456fa6954b
203 files changed
+18787
-48
No files matched your search
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user