Go边缘代理: 单文件可执行+嵌入式MediaMTX+监控+注册

- edge-agent/: Go项目, 支持Windows托盘/Linux无头两种模式
- 使用go:embed将MediaMTX二进制嵌入单一可执行文件
- 首次运行自动释放MediaMTX并生成边缘节点配置
- 自动注册到origin (POST /api/nodes/register)
- 10秒心跳上报CPU/RAM/带宽/连接数 (gopsutil采集)
- Windows: getlantern/systray托盘菜单(状态/CPU/MEM/带宽/退出)
- Linux: headless模式,适合systemd守护
- build.sh/build.ps1: 交叉编译脚本(Linux/Windows)
- 更新start.sh/品牌名StreamCore
This commit is contained in:
admin committed 2026-08-10 14:54:03 +08:00
1 parent 980b91f41f
commit 409e5d314e
14 files changed
+800 -11

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
package main
import (
"embed"
"log"
"os"
"os/signal"
"syscall"
"time"
"streamcore-edge/agent"
)
//go:embed mediamtx/*
var mediamtxFS embed.FS
const (
defaultOriginURL = "http://127.0.0.1:8080"
heartbeatInterval = 10 * time.Second
)
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
cfg := agent.Config{
NodeName: "edge-node",
OriginURL: getEnv("STREAMCORE_ORIGIN", defaultOriginURL),
HlsPort: 8889,
ApiPort: 9998,
Subnet: getEnv("STREAMCORE_SUBNET", "0.0.0.0/0"),
DataDir: getEnv("STREAMCORE_DATA_DIR", ""),
Weight: 100,
}
if cfg.DataDir == "" {
home, _ := os.UserHomeDir()
if home == "" {
home = os.TempDir()
}
cfg.DataDir = home + "/.streamcore-edge"
}
ag, err := agent.New(cfg, mediamtxFS)
if err != nil {
log.Fatalf("Failed to initialize agent: %v", err)
}
if err := ag.Start(); err != nil {
log.Fatalf("Failed to start agent: %v", err)
}
log.Println("Edge agent started")
runTray(ag)
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
<-sigCh
log.Println("Shutting down...")
ag.Stop()
}
func getEnv(key, def string) string {
if v := os.Getenv(key); v != "" {
return v
}
return def
}