Files
Vantz Stockwell 358adde496
All checks were successful
Build Companion Agent / build (push) Successful in 30s
Test Asgard Runner / test (push) Successful in 3s
feat: Add companion agent one-click deployment + fix frontend TS errors
Go deployment orchestrator with platform-specific SteamCMD install,
Rust server download, server.cfg generation, and service registration.
Wire deploy command subscription in daemon, make GameServerPath optional,
add InstallDir config with OS-aware defaults. Fix unused imports and
WebSocket subscribe API in ServerView.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 14:49:48 -05:00

72 lines
2.4 KiB
Go

package deploy
import (
"fmt"
"os"
"path/filepath"
)
// DeployConfig holds the configuration received from a NATS cmd.deploy command.
// These fields map directly to the Rust game server settings needed for initial deployment.
type DeployConfig struct {
ServerName string `json:"server_name"`
MaxPlayers int `json:"max_players"`
WorldSize int `json:"world_size"`
Seed int `json:"seed"`
ServerPort int `json:"server_port"`
RconPort int `json:"rcon_port"`
RconPassword string `json:"rcon_password"`
}
// DeployStatus represents a progress update published to NATS during deployment.
// The frontend listens on corrosion.{license_id}.deploy.status for these messages
// to display real-time deployment progress to the user.
type DeployStatus struct {
Stage string `json:"stage"`
Progress int `json:"progress"`
Message string `json:"message"`
Error string `json:"error,omitempty"`
Timestamp string `json:"timestamp"`
}
// Valid deployment stages:
// downloading_steamcmd - Downloading and extracting SteamCMD
// installing_steamcmd - Running SteamCMD initial setup
// downloading_rust - Downloading Rust Dedicated Server via SteamCMD
// configuring - Generating server.cfg and identity directories
// starting - Launching the Rust server process
// online - Server is running and accepting connections
// failed - Deployment failed at some stage
// GenerateServerCfg creates the server.cfg file for a Rust Dedicated Server.
// It writes to {installDir}/server/server/corrosion/cfg/server.cfg, creating
// the full directory tree if it does not already exist.
func GenerateServerCfg(installDir string, cfg DeployConfig) error {
cfgDir := filepath.Join(installDir, "server", "server", "corrosion", "cfg")
if err := os.MkdirAll(cfgDir, 0755); err != nil {
return fmt.Errorf("failed to create cfg directory %s: %w", cfgDir, err)
}
content := fmt.Sprintf(`server.hostname "%s"
server.maxplayers %d
server.worldsize %d
server.seed %d
server.port %d
rcon.port %d
rcon.password "%s"
rcon.web 1
server.identity "corrosion"
server.saveinterval 300
`, cfg.ServerName, cfg.MaxPlayers, cfg.WorldSize, cfg.Seed,
cfg.ServerPort, cfg.RconPort, cfg.RconPassword)
cfgPath := filepath.Join(cfgDir, "server.cfg")
if err := os.WriteFile(cfgPath, []byte(content), 0644); err != nil {
return fmt.Errorf("failed to write server.cfg to %s: %w", cfgPath, err)
}
return nil
}