Files
Vantz Stockwell a62715409f feat: Add Go companion agent for bare metal server management
Implements complete companion agent for Rust servers not on managed panels.

Features:
- NATS integration with token auth and auto-reconnect
- Game server process management (start/stop/restart/monitor)
- File operations (read/write/delete/list) via NATS
- SteamCMD integration for automated updates
- Self-update capability with download and replace
- Heartbeat publishing every 60s with server status
- Graceful shutdown handling (SIGTERM/SIGINT)
- Zombie process prevention via cmd.Wait()
- Cross-platform builds (Linux amd64, Windows amd64)

Structure:
- cmd/agent/main.go: Entry point, config, signal handling
- internal/app/daemon.go: Main loop, NATS subscriptions
- internal/client/nats.go: NATS connection with reconnect
- internal/process/gameserver.go: Process management
- internal/process/steamcmd.go: Steam update execution
- internal/files/operations.go: File system operations
- internal/update/updater.go: Self-update logic
- Makefile: Cross-compilation targets
- README.md: Installation and configuration guide

NATS Subjects:
- Publishes: corrosion.{license_id}.companion.heartbeat
- Publishes: corrosion.{license_id}.files.response
- Subscribes: corrosion.{license_id}.cmd.server
- Subscribes: corrosion.{license_id}.files.{get|put|delete|list}
- Subscribes: corrosion.{license_id}.update.steam
- Subscribes: corrosion.{license_id}.update.companion

Built binaries: 7.0MB (Linux), 7.2MB (Windows)
Total code: 1,356 LOC across 8 files

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 12:05:23 -05:00

261 lines
7.9 KiB
Markdown

# Corrosion Companion Agent
The Companion Agent is a lightweight Go binary that runs on bare metal Rust dedicated servers to provide process management, file operations, and SteamCMD integration for servers not running on managed game server panels (AMP/Pterodactyl).
## Features
- **NATS Integration**: Connects to Corrosion cloud via NATS with token authentication
- **Process Management**: Start, stop, restart, and monitor game server process
- **File Operations**: Remote file management (read, write, delete, list)
- **SteamCMD Integration**: Automatic server updates via SteamCMD
- **Self-Update**: Download and apply agent updates from the cloud
- **Heartbeat Monitoring**: Publishes status every 60 seconds
- **Graceful Shutdown**: Handles SIGTERM/SIGINT for clean shutdowns
- **Crash Detection**: Monitors server process and reports crashes
- **Zero Configuration**: Pre-configured binary downloaded from dashboard
## Architecture
```
┌─────────────────────────────────────────────┐
│ Corrosion Cloud (NATS) │
│ corrosion.{license_id}.cmd.* │
│ corrosion.{license_id}.files.* │
│ corrosion.{license_id}.update.steam │
└──────────────────┬──────────────────────────┘
│ (Outbound connection)
┌─────────▼──────────┐
│ Companion Agent │
│ (This binary) │
└─────────┬──────────┘
┌─────────▼──────────┐
│ Rust Dedicated │
│ Server Process │
└────────────────────┘
```
## Installation
### Prerequisites
- Linux server (Ubuntu/Debian recommended) or Windows Server
- SteamCMD installed
- Rust Dedicated Server installed
### Quick Start
1. **Download** the pre-configured binary from your Corrosion dashboard
2. **Make executable** (Linux only):
```bash
chmod +x corrosion-companion-linux-amd64
```
3. **Set environment variables**:
```bash
export NATS_URL="nats://nats.corrosionmgmt.com:4222"
export NATS_TOKEN="your-companion-token-from-dashboard"
export LICENSE_ID="your-license-uuid"
export GAME_SERVER_PATH="/home/rustserver/RustDedicated"
export STEAMCMD_PATH="/usr/games/steamcmd"
```
4. **Run** the agent:
```bash
./corrosion-companion-linux-amd64
```
### Production Deployment (Linux with systemd)
1. **Copy binary** to system location:
```bash
sudo cp corrosion-companion-linux-amd64 /usr/local/bin/corrosion-companion
```
2. **Create environment file**:
```bash
sudo mkdir -p /etc/corrosion-companion
sudo nano /etc/corrosion-companion/config.env
```
Add:
```env
NATS_URL=nats://nats.corrosionmgmt.com:4222
NATS_TOKEN=your-companion-token-from-dashboard
LICENSE_ID=your-license-uuid
GAME_SERVER_PATH=/home/rustserver/RustDedicated
STEAMCMD_PATH=/usr/games/steamcmd
GAME_SERVER_ARGS=-batchmode +server.port 28015 +server.identity "myserver"
HEARTBEAT_INTERVAL=60
```
3. **Create systemd service**:
```bash
sudo nano /etc/systemd/system/corrosion-companion.service
```
Add:
```ini
[Unit]
Description=Corrosion Companion Agent
After=network.target
[Service]
Type=simple
User=rustserver
Group=rustserver
EnvironmentFile=/etc/corrosion-companion/config.env
ExecStart=/usr/local/bin/corrosion-companion
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
4. **Enable and start**:
```bash
sudo systemctl daemon-reload
sudo systemctl enable corrosion-companion
sudo systemctl start corrosion-companion
```
5. **Check status**:
```bash
sudo systemctl status corrosion-companion
sudo journalctl -u corrosion-companion -f
```
## Configuration
All configuration is done via environment variables:
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `NATS_URL` | Yes | - | NATS server URL |
| `NATS_TOKEN` | Yes | - | Authentication token from dashboard |
| `LICENSE_ID` | Yes | - | Your Corrosion license UUID |
| `GAME_SERVER_PATH` | Yes | - | Full path to game server executable |
| `STEAMCMD_PATH` | No | `/usr/games/steamcmd` | Full path to steamcmd |
| `GAME_SERVER_ARGS` | No | `-batchmode` | Arguments to pass to game server |
| `HEARTBEAT_INTERVAL` | No | `60` | Heartbeat interval in seconds |
| `LOG_LEVEL` | No | `info` | Log verbosity (info/debug/warn/error) |
## NATS Subject Reference
### Published by Companion
| Subject | Payload | Frequency |
|---------|---------|-----------|
| `corrosion.{license_id}.companion.heartbeat` | Status, uptime, disk, CPU | Every 60s |
| `corrosion.{license_id}.files.response` | File operation results | On request |
### Subscribed by Companion
| Subject | Purpose |
|---------|---------|
| `corrosion.{license_id}.cmd.server` | Start/stop/restart commands |
| `corrosion.{license_id}.files.get` | Read file |
| `corrosion.{license_id}.files.put` | Write file |
| `corrosion.{license_id}.files.delete` | Delete file |
| `corrosion.{license_id}.files.list` | List directory |
| `corrosion.{license_id}.update.steam` | Trigger SteamCMD update |
| `corrosion.{license_id}.update.companion` | Self-update command |
## Building from Source
### Prerequisites
- Go 1.21 or later
- Make (optional, but recommended)
### Build Commands
```bash
# Download dependencies
go mod download
# Build for current platform
make build-local
# Build for Linux (amd64)
make build-linux
# Build for Windows (amd64)
make build-windows
# Build for all platforms
make build
# Run tests
make test
# Format code
make fmt
```
Binaries are output to `bin/` directory.
## Troubleshooting
### Agent won't connect to NATS
- Verify `NATS_URL` is correct
- Check firewall allows outbound connections to port 4222
- Verify `NATS_TOKEN` is valid from dashboard
- Check logs: `journalctl -u corrosion-companion -n 50`
### Server won't start
- Verify `GAME_SERVER_PATH` points to the correct executable
- Check file permissions (agent needs execute permission on server binary)
- Verify `GAME_SERVER_ARGS` are correct for your server
- Check server logs for startup errors
### SteamCMD updates fail
- Verify `STEAMCMD_PATH` is correct
- Check SteamCMD is installed: `steamcmd +quit`
- Ensure disk space is available
- Check network connectivity to Steam servers
### Self-update fails
- Verify agent has write permission to its own directory
- Check download URL is accessible
- Ensure sufficient disk space
- Restart agent manually after update if automatic restart fails
## Security Considerations
- **Token Security**: Keep `NATS_TOKEN` secret. It grants full control over your server.
- **File Operations**: The agent can read/write/delete files. It runs with the permissions of the user running it.
- **Process Control**: The agent can start/stop the game server process.
- **Network**: The agent only makes outbound connections (no inbound ports required).
- **Updates**: Self-updates download from URLs provided by Corrosion cloud (signed URLs).
## Support
- **Documentation**: https://docs.corrosionmgmt.com
- **Dashboard**: https://panel.corrosionmgmt.com
- **Issues**: Report via dashboard or contact support
## License
Proprietary software. Licensed to Corrosion platform users only.
## Version History
### 1.0.0 (2026-02-15)
- Initial release
- NATS connectivity with token auth
- Process management (start/stop/restart)
- File operations (read/write/delete/list)
- SteamCMD integration
- Self-update capability
- Heartbeat monitoring
- Graceful shutdown handling