Eco-Server automatisiert mit Powershell updaten lassen

Eco-Server automatisiert mit Powershell updaten lassen

In diesem Artikel zeige ich Dir, wie du mit recht wenig Aufwand einen selbst aktualisierenden Updater für den ECO-Server erstellen kannst.

ECO – Das Spiel kennen vermutlich einige, andere wiederum vielleicht auch nicht. Ich spiele nicht viel, da ich einen zwei Jahre alten Sohn habe und wir uns vor Kurzem auch ein 120 Jahre altes Haus gekauft haben, arbeit ist also genug da. Aber das Spiel, hat es mir wirklich angetan.

Kurz zusammengefasst, es ist Minecraft aber mit ökologischen und ökonomischen Faktoren. Dazu erfahrt ihr aber mehr wenn ich auf das Spiel detailliert eingehe. Den Artikel verlinke ich dann hier.

Für dieses Spiel habe ich einen eigenen Server auf Windows-Basis aufgesetzt. Die Server-Anwendung kann man entweder direkt bei Strange-Loop-Games nach dem Kauf herunterladen oder über Steam beziehen:


Der Download bei Strangeloop-Games nach dem Kauf
Den ECO-Server findet Ihr nach dem Kauf im Steam unter „Werkzeuge“

Der direkte Download bei Strange-Loop-Games hat den Nachteil, dass diese Anwendung sich nicht neu installiert. Der Download im Steam hat den Nachteil, dass der Start des Servers als Sitzung gilt und man so entweder den Server killt wenn man spielen will, oder aber der Serverstart einen aus dem Spiel wirft. Steam aktualisiert aber die Dateien automatisch. Ziemlich blöd. Darum habe ich mir ein Skript erstellt, womit ich das beste aus beiden Welten habe.

Da ich meinen Spielern immer die aktuellste Version anbieten möchte, alleine schon aus dem Grund weil Steam immer alles updatet, ist das fast zwingend ein Muss.

Wir Ihr sicher schon gemerkt habe, arbeite ich für so kleinere Dinge meistens mit Skripten, ob nun Python oder Powershell, kommt immer auf das an was ich gerade vor habe. Ist es recht windowsspezifisch, nutze ich gerne die mächtige Powershell, soll es plattformunabhängig sein, dann lieber Python. Weil der Server nativ für Eco nur mit Windows läuft, bietet sich Powershell an.

Das Skript

Das Skript ist recht simpel und nutzt die SteamCMD, mit der man gewisse Befehle automatisieren kann. Mit einer geplanten Aufgabe im Windows läuft das sogar komplett autark. Zusätzlich verschicke ich auch noch über die Webhooks von Discord Meldungen, wenn der Updater startet und beendet ist. Wie du einen Webhook bei Discord einrichten kannst, erfährst du aus der Entwickler-Dokumentation von Discord.

Generell macht das Skript folgendes:

  • Sichern der angegebenen Folder innerhalb des ECO-Servers (z.B.: die Confgs, Spielstände und Mods)
  • Update des ECO-Servers via SteamCMD
  • Zurücksichern der vorher gesicherten Stände (Kopieren)

Das Zurücksichern ist notwendig, da der ECO-Servers alle Dateien durchaus austauschen kann und daher unter Umständen Configs von Euch nicht mehr vorhanden wären.

## App-ID des ECO-Servers im Steam
$appid = 739590;

## Aktulle Zeit und Datum
$now = $((get-date).ToString("yyyyMMdd_hhmmss"))

## Log-Pfad und -Dateinamen für den Updater
$logPath = "C:\Log\EcoUpdater"
$logFileName = "$logPath\Updater_$now.txt"

## Pfad zum ECO-Server
$ecoServerPath = "G:\Games\Eco-Server"

## Pfad zur SteamCMD
$steamCMDPath = "C:\SteamCMD\steamcmd.exe"

## Discord-Webhook-URL
$hookUrl = "https://discordapp.com/api/webhooks/[Webhook ID]"

## Folder für die Backups
$backupFolder = "G:\Backups\EcoServer\Backup_$now"

## ECO-Server Prozessname
$processName = "EcoServer"

## Debug-Modus
$debug = $false

## Verzeichnisse innerhalb des Eco-Servers-Pfades welche gesichert werden sollen
$foldersToBackup = @("Configs","Storage","Mods\01 EIGENE")

## Message-Logger
function LogMessage($message){
    $current = $((get-date).ToString("yyyyMMdd_hhmmss"))
    Add-Content $logFileName "[$current]: $message"
}

## Funktion zum Senden von Nachrichten via Discord
function SendDiscordMessage($message, $toAll = $true){
    if(!$debug){
        LogMessage -message "Sending discord Message: ""$message"""
        if($toAll){
            $message = "@everyone $message"
        }
        Invoke-RestMethod -Uri $hookUrl -Method Post -Body ([PSCustomObject]@{content = $message} | ConvertTo-Json)
    }
}

## Updater Start

LogMessage -message "------------- Updater started -------------"
LogMessage -message "Debug: $debug"

## ECO-Server beenden
LogMessage -message "Stopping process ""$processName"""
Stop-Process -Name $processName

## Log-Folder prüfen
If(!(test-path $logPath))
{
      New-Item -ItemType Directory -Force -Path $logPath
      LogMessage -message "Logpath: $logPath"
}

## Backup-Folder prüfen und anlegen
If(!(test-path $backupFolder))
{
      New-Item -ItemType Directory -Force -Path $backupFolder
      LogMessage -message "Backupfolder: $backupFolder"
}

## Folder sichern
LogMessage -message "Backing up folders"
foreach ($folder in $foldersToBackup){
    
    $bPath = "$ecoServerPath\$folder"
    if(!$debug){
        If(test-path $bPath){
            LogMessage -message "Backing up folder ""$bPath"" to ""$backupFolder"""
            Copy-Item $bPath -Destination $backupFolder -Recurse
        }
    }
    
}

# Update starten
if(!$debug){
    SendDiscordMessage -message "**[AUTO-UPDATE]**`nChecking for server updates and restart if needed`nhttps://media.giphy.com/media/syCa5ird7wp0c/giphy.gif"
}

LogMessage -message "Update: Starting via SteamCMD $steamCMDPath"
(Start-Process -FilePath $steamCMDPath -ArgumentList "+@ShutdownOnFailedCommand 1 +@NoPromptForPassword 1 +login anonymous +force_install_dir $ecoServerPath +app_update $appid validate +quit" -NoNewWindow -Wait)
# -RedirectStandardOutput $logFileName 

LogMessage -message "Revert backuped files"

# Folder zurückspielen
foreach ($folder in $foldersToBackup){
    $bPath = "$backupFolder\$folder"
    if(!$debug){
        If(test-path $bPath){
            LogMessage -message "Revert backuped files from ""$bPath"" to ""$ecoServerPath"""
            Copy-Item $bPath -Destination $ecoServerPath -Recurse -Force
        }
    }
    
}
LogMessage -message "Starting EcoServer"
Start-Process -FilePath "$ecoServerPath\Ecoserver.exe"
SendDiscordMessage -message "**[AUTO-UPDATE]**`nUpdate done`nhttps://media.giphy.com/media/l0NhZ0aUSE8fXag12/giphy.gif"

LogMessage -message "------------- Updater ended -------------"

Viel Spaß mit dem Skript und lass mich wissen, ob es dir hilft 🙂

Falls du auch ECO spielst und auf der Suche nach einem Server bist, würde ich mich freuen wenn ich dich in unserer Community und auf unserem Server begrüßen könnte: