Backup der Docker basierten TeamSpeak Server MySQL/MariaDB Datenbank zu AWS S3

  • Gude liebe teamspeak-connection.de Community,

    in folgendem Beitrag präsentiere ich euch eine kostengünstige Möglichkeit, ein automatisches Backup eurer TeamSpeak Server Datenbank zu generieren, es in einem S3-Bucket zu speichern und wiederherzustellen.


    Vorab:

    1. Damit das ganze funktioniert, muss eurer TS3 Server eine externe MariaDB Datenbank nutzen, ich zeige euch auch, wie die Migration stattfindet.
    2. Diese Anleitung richtet sich an Admins mit fortgeschrittenen Kenntnissen von Docker, Linux und TS3-Servern.
    3. Bei Fragen/ Komplikationen könnt ihr mich gerne kontaktieren, mehr dazu unten.

    Voraussetzungen:

    • Einen V-Server/VPS etc. mit root-Rechten
    • Basic Linux-, Docker- und Cloud- Kenntnisse
    • Etwas Zeit


    1. Lokales Backup erstellen (falls Server bereits existiert)
      Bei einer Migration von Datenbanken sind Probleme nie auszuschließen, daher hier meine Lieblingsoption, einmal den ganzen Server mit YaTQA zu sichern.
      YaTQA ist ein vollkommen kostenloses Tool, welches eine grafische Oberfläche zur Verwaltung eures TeamSpeak Servers über eine Query Verbindung bereitstellt. Herunterladen könnt ihr es hier.
      • Nach der Installation von YaTQA gebt ihr eure Querydaten (IP, Port, Nutzername, Password) in die entsprechenden Felder ein und drückt auf "connect".
        Screenshot_25.png
      • Wenn eine Verbindung erfolgreich hergestellt wurde, haben sich neue Tabs geöffnet, hier navigiert ihr zum Reiter Miscellaneous.
        Dort befindet sich unter der Abteilung Snapshots" die Option "Create and save a snapshot...". Solltet Ihr mehrere virtuelle Server betreiben, klickt stattdessen auf "of multiple servers".
        Das Programm öffnet nun ein weiteres Fenster um ein Verzeichnis für den Snapshot zu wählen
        Screenshot_26.jpg
      • Ich empfehle zusätzlich ein Datensnapshot zu machen, das inkludiert Icons, Daten im Dateibrowser etc.
        Dafür nutzt Ihr die Option "Create file backup..." und wähl erneut ein Verzeichnis aus, das kann je nach Größe der Dateien und eurer Leitung mehrere Minuten dauern.
    2. Docker, Docker-Compose und Portainer einrichten
      Falls Ihr bereits TeamSpeak in einem Docker Container nutzt, könnt Ihr diesen Schritt überspringen.
      Ich nutze für das Tutorial Debian 12, bitte passt die Befehle an eure Distribution an.
      • Hier ist eine exzellente Anleitung von Digital Ocean, wie man Docker unter Debian installiert, welche es viel besser erklärt, als ich jemals könnte.
      • Jetzt müssen wir noch die Erweiterung "Docker-Compose" installieren, welche uns die Verwaltung von Containern und Stacks (mehrere Container) erleichtert.
        • sudo apt-get install docker-compose-plugin
      • Portainer ist ein weiteres Tool, welches ein Webinterface zur Verwaltung von Docker zur Verfügung stellt. Es ist optional, jedoch sollte es in meinen Augen jeder, der Docker nutzt, auch nutzen.
        • Hier ein Tutorial zur Installation.
    3. Stack mit Portainer erstellen:
      • Nach der erfolgreichen Installation von Docker, Docker-Compose und Portainer können wir nun zum ersten mal unser Webinterface aufrufen, dies befindet sich unter http://<deineip>:9000.
        Nach der Registrierung begeben wir uns zu unserer Docker Instanz und klicken auf "Live connect"
        Screenshot_27.jpg
      • Tipp: Vergisst nicht den Port 9443 in eurer Firewall zu öffnen!
      • Auf der linken Seite navigieren wir nun zu "Stacks" und dann auf "Add stack" auf der Rechten, um unseren ersten Stack zu erstellen.
      • Zuerst vergeben wir unserem Stack einen Namen z.B. TeamSpeak
      • Um ein persistentes Volume zu nutzen, müssen wir noch ein Verzeichnis erstellen:sudo mkdir -p /opt/teamspeak
      • Einen TeamSpeak nutzer erstellen (falls noch nicht vorhanden)
        sudo adduser --disabled-login teamspeak
      • Uns die UID und GID notieren (die Ausgabe)
        id teamspeak
      • Dem Teamspeak Nutzer Berechtigungen zum Verzeichniss erteilen:
        chown -R <eureUID>:<eureGID> /opt/teamspeak
      • Ein Verzeichnis für unsere DB erstellen:
        sudo mkdir /var/lib/mysql
    • Nun müssen wir noch ein paar Umgebungsvariablen erstellen, das geht mit dem "add environmental variable" button. Wir brauchen folgende Umgebungsvariablen:
    • DB_ROOT_PASSWORD - ein sicheres von euch ausgesuchtes Passwort für den root Nutzer in MariaDB.
    • DB_PASSWORD - das Passwort für den "teamspeak" Nutzer in MariaDB.
    • SERVERADMIN_PASSWORD - das Passwort welches dem "serveradmin" Query Nutzer zugeteilt wird.

    Danach könnt ihr mit "Deploy the stack" euren ersten Stack zum laufen bringen.
    Falls alles ohne Probleme läuft, sollten euch etwas weiter unten die 2 Container "teamspeak-server" und "teamspeak-db" als "running" angezeigt werden.
    Nun können wir uns erneut mit dem TeamSpeak verbinden.

    • Unser Snapshot wiederherstellen
      Um unseren Server wieder auf den ursprünglichen Zustand zu bringen, müssen wir nun das vorhin erstellte Snapshot wieder auf den Server übertragen
      • Tipp: Die neuen Anmeldedaten für euren TS3-Server findet Ihr im Log eures containers. Dieser lässt sich via. SSH anzeigen mit "docker logs teamspeak-server"
      • Verbindet euch erneut mit YaTQA zu eurem Servern und wählt diesmal unter "Miscellaneous" "restore snapshot" und wählt die Datei, welche Ihr vorhin erstellt habt, das selbe gilt für "Restore file backup". Der Fortschritt ist auf der linken Seite einsehbar und kann erneut mehrere Minuten andauern.
        Nach Wiederherstellung des Snapshots startet eurer Server neu.
    • Eine Neue Identität erstellen
      • Um Zugriff auf unseren Bucket zu beschränken erstellen wir zuerst noch eine weitere Identität innerhalb der AWS-Managementkonsole
        • Hierzu navigieren wir zu in der Konsole zur Suchleiste und geben "IAM" ein und klicken auf das erste Ergebnis.
          Screenshot_30.jpg
        • Die IAM Konsole verwaltet alle Nutzer und Nutzergruppe und deren Berechtigungen innerhalb eines AWS Kontos.
        • Wir navigieren nun zu "Benutzer" auf der Rechten Seite. Nun klicken wir auf den "Benutzer erstellen" Button auf der Rechten Seite.
        • Dort vergeben wir dem Nutzer einen Namen und klicken auf "weiter"
        • Nun müssen wir dem Nutzer noch die benötigten Berechtigungen erteilen. Hierzu wählen wir "direktes Anfügen von Richtlinien" und geben im Suchfeld "AmazonS3FullAccess" ein und geben dem Feld ein Häkchen.
        • Tipp: Es empfiehlt sich immer, nur die Berechtigungen zu vergeben, welche auch benötigt werden, daher könnt ihr auch gerne andere, restriktivere, Berechtigungen eurem neuen Nutzer zuweisen.
          Screenshot_31.jpg
        • Nun müssen wir nur noch mit "Benutzer erstellen" bestätigen.
        • Um mithilfe des AWS CLI Befehle von unserem VPS ausführen zu können, müssen wir noch einen Zugriffsschlüssel für unseren neuen Nutzer erstellen:
          • Dafür klicken wir auf den Namen des erstellten Nutzers und anschließend auf "Zugriffsschlüssel erstellen".
            Screenshot_32.jpg
          • Im Menü wählen wir nun "Befehlszeilenschnittstelle (CLI)" aus, setzen unten ein Haken im Kasten und Bestätigen mit "Weiter".
            Einen Tag-Wert müsst Ihr nicht vergeben.
          • Im neu erschienenen Fenster kopieren wir nun den Zugriffs- und geheimen Zugriffsschlüssel, dieser wird nur EINMALIG angezeigt, daher notiert Ihn euch SICHER und bestätigt mit "Fertig".
          • Ebenfalls notieren wir uns den ARN-Wert in der Übersicht
            Screenshot_33.jpg
    • Einen S3-Bucket erstellen
      • Für S3-Buckets gibt es viele Anbieter, ich werde jedoch für das Tutorial Amazon Web Services nutzen.
        • Was ist ein S3-Bucket? Ein Simple Storage Server ist ein cloudbasierter, verwalteter Speicherserver. Ein Bucket lässt sich mit einer Festplatte oder Volume vergleichen.
      • Hierfür begeben wir uns nach der Anmeldung in der AWS-Managementkonsole zur S3-Konsole.
      • Hier navigieren wir zum Button "Bucket erstellen"
        • Diesem Bucket teilen wir einen Namen und eine Region zu, der Rest der Einstellungen können wir auf so belassen und bestätigen mit "Bucket erstellen"
      • Nun erstellen wir noch ein Unterverzeichnis in unserem Bucket, wir klicken hierfür auf unseren Bucket und dann auf "Ordner erstellen" und benennen ihn "Backup" und einen weiteren Ordner innerhalb des "backup" Ordners namens "ts3".
      • Nun begeben wir uns zurück in das Stammverzeichnis des S3 Buckets, wo wir unter "Berechtigungen" noch einige Dinge einstellen müssen.
        • Begebe dich hierzu zur "Bucket-Richtlinie" und klicke auf "Bearbeiten"
        • Gebe dort diesen Text ein: https://pastebin.com/raw/Nr4ieZCq
        • Bestätige das ganze mit "Änderungen speichern".
      • Wichtig: Damit sich über Zeit keine großen Rechnungen anhäufen, empfehle ich einen Lebenszyklus zu erstellen, welcher Dateien nach x Tagen nach Erstellungsdatum automatisch löscht.


        • Geht dazu in eurem Bucket auf den Tab "Verwaltung" und klickt auf "Lebenszyklus erstellen".
        • Hier habt ihr viele Einstellungsmöglichkeiten, was mit euren Daten nach x Tagen geschieht: hier ist jedoch meine empfohlene Konfiguration:
        • Vergebt dem Lebenszyklus einen Namen und wählt "Auf alle Objekte im Bucket anwenden" und bestätigt die Warnung.
        • Im nächsten Teil wählt, "Aktuelle Objektversionen ablaufen lassen".
        • Im darauf folgendem Feld wählt ihr die Anzahl der Tage aus, ab dem die Objektversion abläuft, ich nutze hierfür 8 Tage.
          Dies gibt euch 8 Tage Zeit, eine Korruption in eurer Datenbank/ TeamSpeak-Server zu identifizieren und zu beheben.
          Gerne kann hier auch ein höherer Wert angegeben werden, kostentechnisch steigert sich der Betrag nur um wenige ct. und kann evtl. noch in eurem kostenlosen Kontingent von 5GB kostenlosem Speicher für 12 Monate enthalten sein.
        • Bestätigt nun die Lebenszykluskonfiguration mit "Speichern".
    • Backup Skript erstellen
      • Nun verbinden wir uns erneut via. SSH mit unserem VPS und erstellen ein neues Verzeichnis:
        sudo mkdir /opt/mariabackup
      • cd /opt/mariabackup/
      • Dort erstellen wir eine neue Daten mit dem Texteditor Nano:
        sudo nano backup.sh
      • Im Skript geben wir folgenden Code ein: https://pastebin.com/HahzRf04
    • Verlasse nun den Texteditor mit STRG + X und bestätige mit Y und ENTER
    • Bevor wir das Skript ausführen können, müssen wir noch ein Paar Befehle ausführen:
      • Das offizielle Package der AWS CLI:
      • sudo apt install awscli
      • Nun müssen wir noch das Package konfigurieren:
      • sudo aws configure
        • Hier geben wir zuerst den Zugriffsschüssel ein, gefolgt von den geheimen Zugriffsschlüssel, deiner AWS Region (meistens EU-Central-1) und JSON als Ausgabeformat
      • Wir müssen noch 2 Verzeichniss erstellen:
        • sudo mkdir usr/bin/mktemp
        • sudo mkdir usr/bin/gzip
    • Jetzt können wir unser Skript zum ersten Mal testen!

    Um zu testen ob der Upload auf unseren S3-Bucket funktioniert hat, begeben wir uns erneut in die S3-Konsole in das /backup/ts3/ Verzeichnis, wo sich nun eine neue Datei befinden sollte.
    Screenshot_34.jpg


    • Die Backup.sh Datei automatisch ausführen
      • Wir benötigen das Paket "cron":
      • sudo apt install cron
      • Um unter Linux automatisch Prozesse auszuführen erstellen wir einen "Cronjob"
      • sudo crontab -e
      • Dort fügen wir folgende Zeile hinzu:
      • 0 */6 * * * /bin/sh /opt/mariabackup/backup.sh >> /var/log/ts3_backup.log 2>&1
    • Fertig! Nun wird alle 6 Stunden unser Skript automatisch ausgeführt UND eine Logdatei erstellt!. 8)
    • Um den Log einzusehen müssen wir nur die ts3_backup.log datei öffnen
      nano /var/log/ts3_backup.log

    Ein Backup wiederherstellen:

    Falls ihr euch jemals in der unschönen Situation befindet, dass ihr eure DB wiederherstellen müsst, könnt ihr das auf folgendem Weg tun:


    • TeamSpeak-Server Container anhalten


      • Zuerst müssen wir beide container anhalten:
        • docker stop teamspeak-server
        • docker rm teamspeak-server
    • Das neuste Backup identifizieren
      • Für diesen Schritt müssen wir uns erneut in die AWS Console einloggen und die S3 Console aufrufen.
        Begebt euch nun in euren TeamSpeak-Backup Bucket und sortiert die Dateien nach dem neusten Erstelldatum.
        Jetzt könnt ihr den S3-URI kopieren.
        pasted-from-clipboard.png
    • Das MariaDB Backup wiederherstellen
      • Zuerst loggen wir uns in den DB Container ein:
        • docker exec -it --user root teamspeak-db bash
      • AWS CLI herunterladen:
        • apt update
        • apt install awscli
    • AWS CLI konfigurieren
      • sudo aws configure
      • Hier geben wir zuerst den Zugriffsschüssel ein, gefolgt von den geheimen Zugriffsschlüssel, deiner AWS Region (meistens EU-Central-1) und JSON als Ausgabeformat. Diesen müsst ihr zuerst in der IAM Konsole wie oben beschrieben erstellen, es sei denn ihr habt noch die Schlüssel vom vorhin erstellen Benutzer.
    • Das Backup herunterladen:
      • aws s3 cp *s3-uri*
    • Das Backup entpacken
      • gzip -d *dateiname*
    • Wir müssen noch eine Zeile in der .dump Datei hinzufügen, damit die richtige Datenbank wiederhergestellt wird:
      • nano *dateiname*
      • In der ersten Zeile fügt ihr ein: USE teamspeak;
      • Verlasst den Editor mit STRG + X, Y, ENTER-Taste


    • Das Backup wiederherstellen:
      • mysql -u teamspeak -p*EuerPasswort* < *Dateiname*
    • Nun könnt ihr den TeamSpeak-Server erneut starten:


      • docker start teamspeak-server

    Ich hoffe das diese Anleitung bei euch auch funktioniert, falls nicht, könnt Ihr mich gerne Kontaktieren auf

    • Twitter/X: @Badespeak
    • TS: Badespeak.net

    18 Mal editiert, zuletzt von Badetuch ()

  • Sehr cool, Badetuch ! Vielen Dank für deine Zeit und das teilen!


    Der Artikel hat sich unter dem Namen "Backup der Docker basierten TeamSpeak Server MySQL/MariaDB Datenbank zu AWS S3" einen Platz in unserer FAQ verdient. :)

    Viele Grüße,
    Sebbo

    ---

    DevOps Engineer <3

  • Besten Dank Sebbo !


    TeamSpeak ist für mich und viele weitere einfach immer noch pure Liebe :)

    Große Ehre für mich, einen Platz im FAQ gelandet zu haben, vielen Dank!

    Noch eine Bitte, ist es möglich evtl. die maximale Zeichenanzahl zu erhöhen? Ich musste einiges auf GitHub hochladen oder auslassen um unter die Grenze von 10.000 zu kommen.


    VG Elia

    Einmal editiert, zuletzt von Badetuch ()

  • Hallo Badetuch ,

    ich habe das Limit mal auf 20k Zeichen erhöht, also verdoppelt.


    Höher würde ich das allerdings nicht setzen, da ein Beitrag mit 10k Zeichen bereits sehr lang ist, was dazu führt, dass User gerne mal die Lust am lesen verlieren und den Artikel dann schließen.


    Statt es auf Github und Co. auszulagern, könntest du die Snippets hier auch als zum Beispiel Text-Datei anhängen. :)

    Viele Grüße,
    Sebbo

    ---

    DevOps Engineer <3

  • Besten Dank! Musste den Beitrag noch einige male anpassen, da noch ein paar kleine Dinge nicht funktioniert haben auf meinem Test-Server. Jetzt sollte alles passen!

    Einmal editiert, zuletzt von Badetuch ()

  • Badetuch

    Hat den Titel des Themas von „Automatisches Backup der TeamSpeak Datenbank mit MariaDB (Docker)“ zu „Backup der Docker basierten TeamSpeak Server MySQL/MariaDB Datenbank zu AWS S3“ geändert.
  • Dieses Thema enthält einen weiteren Beitrag, der nur für registrierte Benutzer sichtbar ist, bitte registrieren Sie sich oder melden Sie sich an um diesen lesen zu können.