Stabilize Fusion builds and simplify optional modules.
Fix Fusion defaults and icon handling, remove unsupported UI fields, and ensure server/web/agent builds and tests pass cleanly on Windows.
This commit is contained in:
@@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
@@ -15,15 +16,27 @@ import (
|
||||
"crypto-miner-server/internal/db"
|
||||
"crypto-miner-server/internal/maintenance"
|
||||
"crypto-miner-server/internal/pool"
|
||||
"crypto-miner-server/internal/sys"
|
||||
)
|
||||
|
||||
type wsLogWriter struct {
|
||||
hub *api.WSHub
|
||||
}
|
||||
|
||||
func (w *wsLogWriter) Write(p []byte) (n int, err error) {
|
||||
w.hub.BroadcastServerLog(string(p))
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
log.Println("Crypto Miner Control Server starting...")
|
||||
|
||||
// Load configuration
|
||||
cfg := LoadConfig()
|
||||
log.Printf("Configuration loaded: port=%d, dataDir=%s", cfg.Port, cfg.DataDir)
|
||||
projectRoot := findProjectRoot()
|
||||
cfg.DataDir = resolveDataDir(cfg.DataDir, projectRoot)
|
||||
log.Printf("Configuration loaded: port=%d, dataDir=%s (project root: %s)", cfg.Port, cfg.DataDir, projectRoot)
|
||||
|
||||
// Ensure data directories exist
|
||||
dirs := []string{
|
||||
@@ -56,12 +69,14 @@ func main() {
|
||||
aiHandler.SetEventBroadcaster(func(entry api.AIActivityEntry) {
|
||||
wsHub.BroadcastAIActivity(entry)
|
||||
})
|
||||
|
||||
// Stream all server logs to the dashboard Master Terminal
|
||||
log.SetOutput(io.MultiWriter(os.Stdout, &wsLogWriter{hub: wsHub}))
|
||||
log.Println("WebSocket hub initialized")
|
||||
|
||||
// Initialize builder handler
|
||||
// The agent source is expected at ../agent relative to the server directory
|
||||
agentSrcDir := findAgentSourceDir()
|
||||
projectRoot := findProjectRoot()
|
||||
builderHandler := builder.NewHandler(database, cfg.DataDir, agentSrcDir, projectRoot)
|
||||
log.Printf("Builder handler initialized (agent source: %s)", agentSrcDir)
|
||||
|
||||
@@ -90,6 +105,7 @@ func main() {
|
||||
wsHub.SetPoolManager(poolManager, defaultPoolCfg)
|
||||
|
||||
applyRuntimeConfig(cfg, wsHub, poolManager, builderHandler)
|
||||
applyControlServerFirewall(cfg)
|
||||
|
||||
configProvider := &serverConfigProvider{
|
||||
config: cfg,
|
||||
@@ -190,6 +206,20 @@ func applyRuntimeConfig(cfg *Config, wsHub *api.WSHub, poolManager *pool.Manager
|
||||
MaxBuildSizeMB: cfg.Server.MaxBuildSizeMB,
|
||||
})
|
||||
}
|
||||
applyControlServerFirewall(cfg)
|
||||
}
|
||||
|
||||
func applyControlServerFirewall(cfg *Config) {
|
||||
if cfg == nil || !cfg.Server.OpenFirewallOnStart {
|
||||
return
|
||||
}
|
||||
port := cfg.Port
|
||||
if port <= 0 {
|
||||
port = 8989
|
||||
}
|
||||
if err := sys.EnsureInboundTCPPort(port, "AetherForge Control Server"); err != nil {
|
||||
log.Printf("[firewall] %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// serverConfigProvider wraps the Config to implement api.ConfigProvider interface
|
||||
@@ -270,6 +300,22 @@ func findAgentSourceDir() string {
|
||||
return filepath.Join(projectRoot, "agent")
|
||||
}
|
||||
|
||||
// resolveDataDir pins relative data paths to the project root so builds always land in
|
||||
// <repo>/data even when miner-server.exe is started from server/ or bin/.
|
||||
func resolveDataDir(dataDir, projectRoot string) string {
|
||||
if filepath.IsAbs(dataDir) {
|
||||
return dataDir
|
||||
}
|
||||
if projectRoot != "" && projectRoot != "." {
|
||||
return filepath.Join(projectRoot, dataDir)
|
||||
}
|
||||
abs, err := filepath.Abs(dataDir)
|
||||
if err != nil {
|
||||
return dataDir
|
||||
}
|
||||
return abs
|
||||
}
|
||||
|
||||
func findProjectRoot() string {
|
||||
if cwd, err := os.Getwd(); err == nil {
|
||||
if _, err := os.Stat(filepath.Join(cwd, "run.bat")); err == nil {
|
||||
|
||||
Reference in New Issue
Block a user