3d99940658
Sandbox Deployment Platform — Go control plane + agents, NextJS dashboard, nginx reverse proxy. Cross-compile via Docker; deploy via sshpass to 172.18.136.92 (micro) and 172.18.139.186 (gateway). - control-plane: HTTP API, WS hub, SQLite (modernc.org/sqlite) for progress, .log files for log persistence - agent-micro / agent-gateway: alpine:3.20 + bind-mounted repo, binary exec'd in container, no Dockerfile build step - dashboard: NextJS static export + shadcn/ui components, single WebSocket hook - docker-compose.yml: three services on alpine:latest with docker socket bind for agents - scripts/: build.sh (golang:1.23-alpine cross-compile), deploy.sh, patch-nginx.sh (idempotent nginx splice), ssh wrappers Runtime model: pass-through Bitbucket creds per deploy, never logged or persisted on the agent. Control plane never touches git or docker directly — agents do all the work locally.
33 lines
762 B
Go
33 lines
762 B
Go
package config
|
|
|
|
import (
|
|
"flag"
|
|
"os"
|
|
)
|
|
|
|
type Config struct {
|
|
Addr string // listen addr, e.g. ":8080"
|
|
DataDir string // SQLite + .log files live here
|
|
AgentHealth string // map of nodeID -> agent base URL (TODO: real map)
|
|
}
|
|
|
|
// Load reads flags and env. Env wins over defaults; flags win over env.
|
|
func Load() Config {
|
|
c := Config{
|
|
Addr: envOr("SDP_ADDR", ":8080"),
|
|
DataDir: envOr("SDP_DATA", "./data"),
|
|
AgentHealth: envOr("SDP_AGENT_HEALTH", ""),
|
|
}
|
|
flag.StringVar(&c.Addr, "addr", c.Addr, "control plane listen addr")
|
|
flag.StringVar(&c.DataDir, "data", c.DataDir, "data directory for sqlite and logs")
|
|
flag.Parse()
|
|
return c
|
|
}
|
|
|
|
func envOr(k, def string) string {
|
|
if v := os.Getenv(k); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|