Best Practice bei Serverumzug

  • Hallo zusammen,

    ich plane aktuell den Umzug von einem VPS auf einen Rootserver und wollte mal in die Runde fragen, wie ihr das normalerweise handhabt bzw. was sich bei euch als Best Practice bewährt hat. Auf dem VPS läuft derzeit Debian 13 mit diversen Diensten (Fail2Ban, unattended-Upgrades, Docker (Postgre DB usw.).

    Ziel wäre, das Ganze möglichst sauber auf den RS zu bekommen, ohne unnötige Downtime oder Altlasten mitzuschleppen.

    Mich würden vor allem eure Erfahrungen interessieren:

    • Macht ihr eher ein 1:1-Migration (rsync / Snapshot / Image) oder setzt ihr den Rootserver komplett frisch auf und migriert nur Daten & Konfiguration?
    • Nutzt ihr den Umzug gleich für „Aufräumen“ bzw. Neuaufbau?
    • Gibt es beim Wechsel VPS auf dedizierte Hardware typische Dinge, auf die man achten sollte?
    • Wie geht ihr mit IP-Änderung und DNS-Umschaltung um, damit die Downtime möglichst gering bleibt?

    Ist zwar eher ein Hobby-Setup, aber ich würde es trotzdem gerne ordentlich machen :)

    Danke euch!

    Einmal editiert, zuletzt von duck (26. Februar 2026 um 11:11)

  • Moin,

    du schreibst als letzten Punkt "Hobby Setup".
    Also ist Downtime schon mal relativ egal :D

    Wie migriere ich zwischen meinen Servern?

    Ich mach immer eine Full Fresh Installation und lass Ansible den Server einrichten.

    Da bei mir alles Dockerized läuft übertrage ich danach die Docker Daten. Entweder via Copy Job oder indem ich mein Borgbackup auf den neuen Server runterlade.

    Dann nutze ich mittlerweile Pangolin. Das heißt ich stelle im Pangolin einfach die neue Adresse ein. IP nach extern ändert sich nicht.

    Vorher habe ich die TTL in der Zone auf 300 gestellt und dann die (Sub)Domain auf die neue IP umgestellt und (leicht ungeduldig) gewartet bis das endlich umgestellt wurde.
    Dann einmal die Container wieder starten und go.

    Aber mir ist der FullFresh vom Server wichtig. Ich will da keine "Altlasten" haben weil ich schon mehrfach das OS und die Configs migriert habe.

  • Das kommt drauf an ;)

    Ich hab einige Systeme mit dem Snapshot/Snapshot-Export umgezogen, hier hast du nur das Thema IP-Adresse lokal (wenn du dhcp durch statische Konfig ersetzt hast) und im DNS. Geht nur, wenn wenn die neue Platte nicht kleiner ist.

    Bei fehlenden Snapshots exports geht dass auch mit dd via ssh jeweils im Rettungssystem, ist gefühlt für die Gesamt-Prozedure gar nicht so viel langsamer, aber mehr zu tun.

    gparted im Rettungssystem hilft auch, die neue Platte, evtl. größere Platte gleich sinnvoll zu nutzen und den Platz zu verteilen.

    Dann bist du in der Regel schon fertig.

    Ein paar Systeme habe ich auch neu installiert, weil Alma 8 auf Alma 10 keinen sinnvollen Upgrade-Pfad bietet. Neue Installation, Dienste migieren und Daten syncen, das dauert üblicherweise länger. Da ich mittlerweile viele kleine Systeme für einzelne Aufgabe habe, kann das aber auch das relativ schnell gehen.

    | VPS: 28 | vCPU: 75 | Memory: 104 GB | Disk: 4012 GB |

  • Ich migriere oft via Image per Clonezilla, für einen Neubau bin ich meistens zu faul. 🙃

    Das hat sich bist jetzt immer bewährt, einzig bei einem Umzug auf eine kleinere Platte muss man etwas Vorarbeit leisten und Partitionen verkleinern. Dann muss man nur noch IPs anpassen und den DNS umhängen. Dafür habe ich vorher immer eine kleine TTL eingestellt, damit der Schwenk nicht ewig dauert.

    Nachteil dieser Methode: Man benötigt irgendwo genug Speicher um das Image zwischenzulagern, der irgendwie über das Internet erreichbar sein muss. Bei mir ist es z.B. eine Speicherkiste beim roten H. Und man hat auf jeden Fall eine Downtime, was bei mir in der Regel aber recht egal ist.

  • Erstmal vielen Dank für eure Antworten!

    du schreibst als letzten Punkt "Hobby Setup".
    Also ist Downtime schon mal relativ egal :D

    Das ist der Anspruch an mich selbst, auch bei einem Hobby Setup die Downtime so minimal wie möglich zu halten, damit das Ganze schnell wieder am laufen ist. 8)

    Ich erstelle ein Backup mit Veeam for Linux. Auf dem neuen Server wird das Backup wieder eingespielt, IP Adressen ändern, fertig.

    Ist Veeam für Linux nicht kostenpflichtig?

    Ich mach immer eine Full Fresh Installation und lass Ansible den Server einrichten.

    Ansible kann ich dann dazu nutzen automatisiert die Grundkonfiguration des Servers vorzunehmen?

    Z.B. Fail2Ban, unattented Updates, Docker-Dienst, rstric Einrichtung usw, richtig?

    Aktuell Sichere ich meine Dockerdaten automatisch mit restic und einer kleinen Downtime um 5 Uhr Morgens auf einem Fileserver per rclone.

    3 Mal editiert, zuletzt von duck (26. Februar 2026 um 12:08)

  • Ich finde den Anspruch, auch die Hobby Setups mit minimaler Downtime umzuziehen, erst mal ziemlich gut.

    Das ist der Anspruch an mich selbst, auch bei einem Hobby Setup die Downtime so minimal wie möglich zu halten, damit das Ganze schnell wieder am laufen ist. 8)

    Ist es auch!

    Aber ich hab mir in der Vergangenheit wegen diesem Anspruch Migrationen auch schon unnötig kompliziert gemacht :D

    Im Hobbyumfeld ist eine Downtime nicht so tragisch wie im Gewerblichen Umfeld. Wenn die Private Cloud mal eine halbe Stunde mitten am Tag nicht Verfügbar ist motzt "nur" die Familie und nicht 400 Leute im Unternehmen.

    Ansible kann ich dann dazu nutzen automatisiert die Grundkonfiguration des Servers vorzunehmen?

    Z.B. Fail2Ban, unattented Updates, Docker-Dienst, rstric Einrichtung usw, richtig?

    Ansible kann sehr viel Konfigurieren.

    Ich hab mein Playbook welches die ganze Grundinstallationen durchführt und meinen Serverzoo mit Updates versorgt.

    Aber hab auch noch so die Sachen die ich bei der frischen Installation erst einmal händisch konfiguriere. Ja, könnte man automatisieren, war ich aber zu Faul zu :D

    Ich kann es wirklich empfehlen sich damit einmal auseinander zu setzen.

    Im Sinne von Infrasturcture as Code

  • Ist es auch!

    Aber ich hab mir in der Vergangenheit wegen diesem Anspruch Migrationen auch schon unnötig kompliziert gemacht :D

    Das stimmt, im Firmenumfeld ist das natürlich noch einmal eine ganz andere Sache mit der Ausfallzeit – keine Frage!

    Im privaten Bereich möchte ich die Ausfallzeit so kurz wie möglich halten, aber wenn es etwas länger dauert, ist das natürlich auch kein Drama.

    Ich hab mein Playbook welches die ganze Grundinstallationen durchführt und meinen Serverzoo mit Updates versorgt.

    Playbook ist dann ein kleiner Server auf dem die Ansible Konfiguration läuft und Serverzoo dann deine produktiven Server?

    Ich kann es wirklich empfehlen sich damit einmal auseinander zu setzen.

    Hast du hier einen Link für eine gute Dokumentation für Ansible?

  • Ich nutze neue Server dazu, Debian von einer früheren Version auf die aktuelle Version abzudaten (11 -> 13 bzw. 12 -> 13 bei meinen beiden). Ansonsten lasse ich alles über Docker laufen und ziehe in erster Linie die Docker Compose Files rüber, mache mir dabei Gedanken, ob ich noch alles benötige und verbessere dabei an vielen Stellen (z.B. Healthchecks bei allen Containern, Modernisierung von App Komponenten z.B. Postgres 15.2 -> 17, dank Claude Code sogar wenns das Original Compose File eigentlich gar nicht vorsieht).

    RS 2000 G12 Pro BW25 (8C EPYC 9645, 16GB, 1TB) | RS 500 G12 BW25 (2C EPYC 9645, 4GB, 128GB) | RS Cyber Quack (1C,2GB,40GB)

  • Ansible o. ä. hat natürlich den Vorteil, daß das Aufsetzen des Servers "auf Knopfdruck" jederzeit wiederholbar ist und man dann ein sauberes System ohne Altlasten (inkl. möglicher Schadsoftware) hat. Außerdem kann man die Konfiguration in einem Git-Repository versionieren. Ein kleiner separater Server zum Testen von Konfigurationsänderungen wäre dabei sicher ganz praktisch. Ich selbst bin aber auch noch nicht so weit...

    Was die DNS-Umstellung angeht, solltest Du den TTL-Wert schon einige Tage vor der Migration runtersetzen, damit die Umschaltung am Migrationstag schneller geht.

  • Playbook ist dann ein kleiner Server auf dem die Ansible Konfiguration läuft und Serverzoo dann deine produktiven Server?

    Nein.
    Ansible ist ein kleines Tool um Server zu verwalten.
    Das alles ist hier, im Gegensatz zu Terraform, Stateless.

    Terraform verwendest du für die Infrastruktur (Server Provisionieren, Netzwerke, Storages u.s.w.), Ansible für die Server (Config auf dem Server, Updates, Tools).

    Das heißt: Terraform hat seine Statefile und weiß wie die Umgebung ist, Ansible hat sein Playbook und arbeitet das einfach ab.

    Einfach gerade einmal kurz bisschen Background :D

    Bei Ansible hast du auf deinem System - Bei mir ist es ein Ubuntu als WSL - wo Ansible drauf läuft.

    Dort hast du deine Inventory (Hier sind deine Server eingetragen) und deine Playbooks. In einem Playbook steht dann sowas wie dieses hier:

    Code
    - hosts: all
      become: true
      pre_tasks:
    
      - name: install updates
        tags: always
        apt:
          upgrade: dist
          update_cache: yes
        when: ansible_distribution == "Ubuntu"

    Also bei welchen Host soll er was machen. Become: true bedeutet: Hier braucht er root rechte und fragt nach dem sudo Passwort.

    Wenn du dann Ansbile startest connected er sich via SSH (Mit SSH Key) gegen die Server in der inventory.yml und führt das Playbook aus. Anbei mein Default Befehl. Wenn er das ganze Playbook ausführen soll mit Pakete installieren lass ich das -t always weg.

    Code
    ansible-playbook --ask-become-pass -t always basic-installation.yml

    Jetzt rattert Ansible einmal durch und guckt: Was habe ich im Playbook stehen? Das führt er aus. Updates installieren, Pakete installieren, Configs anpassen u.s.w.

    Da gibt es viele Beispiele und viel Doku. Offizielle und YouTube und co.

    Ist eine kleine Lernkurve, aber dafür hast du dann IaC. Jeder Server hat damit die Basisinstallation die er haben soll. Alle sind da gleich. (Außer natürlich du hast im Playbook und Inventory noch mal abgrenzungen, weil die Mailserver (Mailcow) jq noch als Paket benötigen.

    Doku:

    https://docs.ansible.com/projects/ansible/latest/getting_started/index.html

    Und ich meine ich hab es mal mit dieser Playlist hier bei mir eingerichtet. Zumindest habe ich die immer noch gespeichert :D

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • TBT

    Hast du dann auf deinem Servern nur Docker laufen oder auch noch weitere Software, die deinen Server absichern wie Fail2Ban oder nutzt du sowas nicht?

    fvbor

    Besten Dank für deine kurze Einweisung in Ansible, das werde ich mir einmal ansehen, falls ich nicht weiter komme, weiß ich an wen ich mich wenden kann. ;)

  • TBT

    Hast du dann auf deinem Servern nur Docker laufen oder auch noch weitere Software, die deinen Server absichern wie Fail2Ban oder nutzt du sowas nicht?

    Nur Docker, SSH ist durch die NC Firewall zu und nur via Tailscale offen.

    RS 2000 G12 Pro BW25 (8C EPYC 9645, 16GB, 1TB) | RS 500 G12 BW25 (2C EPYC 9645, 4GB, 128GB) | RS Cyber Quack (1C,2GB,40GB)

  • Nur Docker, SSH ist durch die NC Firewall zu und nur via Tailscale offen.

    Also bedeutet das in deinem Fall, dass du beim Serverumzug das System einfach neu aufsetzt, anschließend Tailscale sowie Docker installierst und damit direkt wieder einen sauberen, frischen Stand hast? In der netcup-Firewall wären dann lediglich die Ports 80 und 443 freigegeben, beispielsweise für einen im Docker laufenden Caddy-Reverse-Proxy, und der restliche Zugriff erfolgt über Tailscale.

  • Also bedeutet das in deinem Fall, dass du beim Serverumzug das System einfach neu aufsetzt, anschließend Tailscale sowie Docker installierst und damit direkt wieder einen sauberen, frischen Stand hast? In der netcup-Firewall wären dann lediglich die Ports 80 und 443 freigegeben, beispielsweise für einen im Docker laufenden Caddy-Reverse-Proxy, und der restliche Zugriff erfolgt über Tailscale.

    Jep. So in etwa. Wenn ich noch die Daten mitnehmen will, übertrage ich über SSH direkt zwischen alt und neu noch die Docker Volumes, bei meinen aktuell verwendeten Containern ist das nicht nötig. Ja, Port 80 und 443 sind freigegeben, ich verwende https://nginxproxymanager.com , weil ich mich damit schon immer am Besten anfreunden konnte (vs. Caddy, Traefik). Pangolin könnte jedoch den NPM ersetzen.

    Und ja, der Zugriff auf die https://dockhand.pro/ Weboberfläche erfolgt ausschließlich über Tailscale, wie auch der Zugriff auf https://getwud.github.io/wud/#/ (automatische Docker Updates), beides braucht ja nicht ins Internet gelegt werden.

    Es gibt noch einige weitere Anwendungen, die dann neben dem Webinterface eigene Ports brauchen, hierzu lege ich in der FW jeweils ein Profil an, das dann pro Server aktiv oder eben nicht aktiv geschaltet werden kann. Ich baue da für jede Anwendung ein Set aus allen Ports, TCP/UDP etc.

    RS 2000 G12 Pro BW25 (8C EPYC 9645, 16GB, 1TB) | RS 500 G12 BW25 (2C EPYC 9645, 4GB, 128GB) | RS Cyber Quack (1C,2GB,40GB)

  • ...noch die Docker Volumes,..

    Prinzipielle Frage: Nutzt du ausschließlich Docker-Volumes oder arbeitest du auch mit gemappten Host-Pfaden, in denen die Daten abgelegt werden?

    Dann mache ich mich mal ans Werk. An dieser Stelle schon einmal vielen Dank für den äußerst hilfreichen Input von euch allen – ich habe wieder einiges dazugelernt und kann den Serverumzug entsprechend angehen und kann weitere Sicherheitsmaßnahmen umsetzen.

    Fail2Ban kann ich mir nach meinem aktuellen Verständnis dann vermutlich sparen zu übernehmen.

  • Nutzt du ausschließlich Docker-Volumes oder arbeitest du auch mit gemappten Host-Pfaden, in denen die Daten abgelegt werden?

    Ich nutze zum Teil Docker Volumes (Nextcloud All in One), aber zum größtenteil habe ich folgende Ordnerstruktur

    Code
    /opt/containers/
    |-> sub.domain.tld (Wie der Service verfügbar ist)
        |-> compose.yml, .env und ggf. weitere Files
        |-> data
            |-> Hier liegen dann Die Daten des Containers und deren Datenbank und so weiter in weiteren Unterordnern

    So habe ich alles, was einen Service betrifft, in einem Ordner.

    Der wird auch via Borgbackup gesichert und kann in kürzester Zeit auf jedem Server wieder aufgebaut werden.

    Da ich persönlich auf Pangolin setze muss ich keine Config in der Caddyfile oder in der compose.yml (wie z.B. bei der Verwendung von traefik) anpassen.