mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-10-29 16:17:25 +09:00
Introduces the initial Go-based ServerKit agent implementation, supporting Docker and system metrics collection, with supporting scripts and documentation. Adds a comprehensive multi-server management integration plan, including architecture, security model, database schema, API design, frontend updates, installation methods, and phased implementation roadmap. Updates ROADMAP.md to mark advanced security phase as completed.
226 lines
8.1 KiB
PowerShell
226 lines
8.1 KiB
PowerShell
#Requires -RunAsAdministrator
|
|
#
|
|
# ServerKit Agent Installation Script for Windows
|
|
# Usage: irm https://your-serverkit.com/install.ps1 | iex; Install-ServerKitAgent -Token "sk_reg_xxx" -Server "https://..."
|
|
#
|
|
|
|
function Install-ServerKitAgent {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Token,
|
|
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Server,
|
|
|
|
[Parameter(Mandatory=$false)]
|
|
[string]$Name = "",
|
|
|
|
[Parameter(Mandatory=$false)]
|
|
[string]$DownloadUrl = ""
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# Configuration
|
|
$InstallDir = "$env:ProgramFiles\ServerKit Agent"
|
|
$ConfigDir = "$env:ProgramData\ServerKit\Agent"
|
|
$LogDir = "$env:ProgramData\ServerKit\Agent\logs"
|
|
$ServiceName = "ServerKitAgent"
|
|
|
|
function Write-Info { param([string]$Message) Write-Host "[INFO] $Message" -ForegroundColor Cyan }
|
|
function Write-Success { param([string]$Message) Write-Host "[SUCCESS] $Message" -ForegroundColor Green }
|
|
function Write-Warn { param([string]$Message) Write-Host "[WARN] $Message" -ForegroundColor Yellow }
|
|
function Write-Err { param([string]$Message) Write-Host "[ERROR] $Message" -ForegroundColor Red }
|
|
|
|
Write-Host ""
|
|
Write-Host "╔══════════════════════════════════════════╗" -ForegroundColor Green
|
|
Write-Host "║ ServerKit Agent Installation ║" -ForegroundColor Green
|
|
Write-Host "╚══════════════════════════════════════════╝" -ForegroundColor Green
|
|
Write-Host ""
|
|
|
|
# Detect architecture
|
|
$Arch = if ([Environment]::Is64BitOperatingSystem) { "amd64" } else { "386" }
|
|
Write-Info "Detected architecture: windows/$Arch"
|
|
|
|
# Create directories
|
|
Write-Info "Creating directories..."
|
|
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
|
|
New-Item -ItemType Directory -Path $ConfigDir -Force | Out-Null
|
|
New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
|
|
|
|
# Stop existing service if running
|
|
$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
|
|
if ($service -and $service.Status -eq "Running") {
|
|
Write-Info "Stopping existing agent service..."
|
|
Stop-Service -Name $ServiceName -Force
|
|
Start-Sleep -Seconds 2
|
|
}
|
|
|
|
# Construct download URL
|
|
if ([string]::IsNullOrEmpty($DownloadUrl)) {
|
|
$DownloadUrl = "$Server/downloads/agent/serverkit-agent-windows-$Arch.exe"
|
|
}
|
|
|
|
# Download agent
|
|
Write-Info "Downloading agent from $DownloadUrl..."
|
|
$AgentPath = "$InstallDir\serverkit-agent.exe"
|
|
try {
|
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
Invoke-WebRequest -Uri $DownloadUrl -OutFile $AgentPath -UseBasicParsing
|
|
} catch {
|
|
Write-Err "Failed to download agent: $_"
|
|
throw
|
|
}
|
|
|
|
# Verify download
|
|
if (-not (Test-Path $AgentPath)) {
|
|
Write-Err "Agent binary not found after download"
|
|
throw "Download failed"
|
|
}
|
|
|
|
Write-Success "Agent downloaded successfully"
|
|
|
|
# Register with ServerKit
|
|
Write-Info "Registering agent with ServerKit..."
|
|
$RegisterArgs = @("register", "--token", $Token, "--server", $Server)
|
|
if (-not [string]::IsNullOrEmpty($Name)) {
|
|
$RegisterArgs += @("--name", $Name)
|
|
}
|
|
|
|
$process = Start-Process -FilePath $AgentPath -ArgumentList $RegisterArgs -Wait -PassThru -NoNewWindow
|
|
if ($process.ExitCode -ne 0) {
|
|
Write-Err "Registration failed with exit code $($process.ExitCode)"
|
|
throw "Registration failed"
|
|
}
|
|
|
|
Write-Success "Registration successful"
|
|
|
|
# Install as Windows Service
|
|
Write-Info "Installing Windows service..."
|
|
|
|
# Remove existing service if present
|
|
if ($service) {
|
|
Write-Info "Removing existing service..."
|
|
sc.exe delete $ServiceName | Out-Null
|
|
Start-Sleep -Seconds 2
|
|
}
|
|
|
|
# Create service using sc.exe
|
|
$binPath = "`"$AgentPath`" start"
|
|
$result = sc.exe create $ServiceName binPath= $binPath start= auto displayname= "ServerKit Agent"
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Err "Failed to create service"
|
|
throw "Service creation failed"
|
|
}
|
|
|
|
# Set service description
|
|
sc.exe description $ServiceName "ServerKit Agent - Remote server management agent" | Out-Null
|
|
|
|
# Configure service recovery (restart on failure)
|
|
sc.exe failure $ServiceName reset= 86400 actions= restart/5000/restart/10000/restart/30000 | Out-Null
|
|
|
|
Write-Success "Service installed"
|
|
|
|
# Configure firewall (optional)
|
|
Write-Info "Configuring Windows Firewall..."
|
|
try {
|
|
$firewallRule = Get-NetFirewallRule -DisplayName "ServerKit Agent" -ErrorAction SilentlyContinue
|
|
if (-not $firewallRule) {
|
|
New-NetFirewallRule -DisplayName "ServerKit Agent" `
|
|
-Direction Outbound `
|
|
-Action Allow `
|
|
-Program $AgentPath `
|
|
-Description "Allow ServerKit Agent outbound connections" | Out-Null
|
|
Write-Success "Firewall rule created"
|
|
} else {
|
|
Write-Info "Firewall rule already exists"
|
|
}
|
|
} catch {
|
|
Write-Warn "Could not configure firewall: $_"
|
|
}
|
|
|
|
# Start service
|
|
Write-Info "Starting agent service..."
|
|
Start-Service -Name $ServiceName
|
|
Start-Sleep -Seconds 3
|
|
|
|
$service = Get-Service -Name $ServiceName
|
|
if ($service.Status -eq "Running") {
|
|
Write-Success "Agent is running"
|
|
} else {
|
|
Write-Err "Agent failed to start"
|
|
Get-EventLog -LogName Application -Source $ServiceName -Newest 10 -ErrorAction SilentlyContinue | Format-List
|
|
throw "Agent failed to start"
|
|
}
|
|
|
|
# Add to PATH
|
|
$currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
|
|
if ($currentPath -notlike "*$InstallDir*") {
|
|
Write-Info "Adding agent to system PATH..."
|
|
[Environment]::SetEnvironmentVariable("Path", "$currentPath;$InstallDir", "Machine")
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Success "Installation complete!"
|
|
Write-Host ""
|
|
Write-Host "Agent Status: Get-Service $ServiceName"
|
|
Write-Host "View Logs: Get-Content '$LogDir\agent.log' -Tail 50"
|
|
Write-Host "Config File: $ConfigDir\config.yaml"
|
|
Write-Host "Uninstall: Uninstall-ServerKitAgent"
|
|
Write-Host ""
|
|
}
|
|
|
|
function Uninstall-ServerKitAgent {
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$InstallDir = "$env:ProgramFiles\ServerKit Agent"
|
|
$ConfigDir = "$env:ProgramData\ServerKit\Agent"
|
|
$ServiceName = "ServerKitAgent"
|
|
|
|
Write-Host "Uninstalling ServerKit Agent..." -ForegroundColor Yellow
|
|
|
|
# Stop and remove service
|
|
$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
|
|
if ($service) {
|
|
if ($service.Status -eq "Running") {
|
|
Stop-Service -Name $ServiceName -Force
|
|
Start-Sleep -Seconds 2
|
|
}
|
|
sc.exe delete $ServiceName | Out-Null
|
|
Write-Host "Service removed" -ForegroundColor Green
|
|
}
|
|
|
|
# Remove firewall rule
|
|
Remove-NetFirewallRule -DisplayName "ServerKit Agent" -ErrorAction SilentlyContinue
|
|
|
|
# Remove installation directory
|
|
if (Test-Path $InstallDir) {
|
|
Remove-Item -Path $InstallDir -Recurse -Force
|
|
Write-Host "Installation directory removed" -ForegroundColor Green
|
|
}
|
|
|
|
# Ask about config removal
|
|
$removeConfig = Read-Host "Remove configuration and logs? (y/N)"
|
|
if ($removeConfig -eq "y" -or $removeConfig -eq "Y") {
|
|
if (Test-Path $ConfigDir) {
|
|
Remove-Item -Path $ConfigDir -Recurse -Force
|
|
Write-Host "Configuration removed" -ForegroundColor Green
|
|
}
|
|
}
|
|
|
|
# Remove from PATH
|
|
$currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
|
|
$newPath = ($currentPath.Split(';') | Where-Object { $_ -ne $InstallDir }) -join ';'
|
|
[Environment]::SetEnvironmentVariable("Path", $newPath, "Machine")
|
|
|
|
Write-Host ""
|
|
Write-Host "ServerKit Agent has been uninstalled" -ForegroundColor Green
|
|
}
|
|
|
|
# Export functions
|
|
Export-ModuleMember -Function Install-ServerKitAgent, Uninstall-ServerKitAgent
|