Website umziehen ohne Ausfallzeit: Schritt-für-Schritt-Anleitung
Website-Migration ohne Ausfallzeit. Dateiübertragung, Datenbank-Export, DNS-Umstellung, SSL auf neuem Server.
Kurzfassung (TL;DR)
Eine Website-Migration ohne Ausfallzeit erfordert eine sorgfaeltige Planung und eine bestimmte Reihenfolge: DNS-TTL Tage im Voraus senken, alle Dateien und Datenbanken auf den neuen Server replizieren, alles konfigurieren und ueber einen lokalen Hosts-Eintrag testen, dann erst DNS umstellen. Der alte Server bedient den Traffic weiterhin, bis die Propagierung abgeschlossen ist. Diese Anleitung fuehrt durch jeden Schritt fuer Linux-basiertes Hosting mit Apache/Nginx, MySQL/PostgreSQL und Let's-Encrypt-SSL.
Voraussetzungen
- SSH-Zugang zu beiden Servern (alt und neu)
- Root- oder Sudo-Berechtigung auf dem neuen Server
- Zugang zur DNS-Verwaltung (Registrar oder DNS-Provider)
- Gleicher oder kompatibler Software-Stack auf dem neuen Server (Webserver, PHP-/Python-/Node-Version, Datenbank-Engine)
rsync,mysqldumpoderpg_dumpinstalliert- Ein funktionierendes Backup der Website (immer zuerst erstellen)
- Ausreichend Speicherplatz auf dem neuen Server
Schritt 1: Checkliste vor der Migration
1.1 Bestandsaufnahme der aktuellen Konfiguration
Bevor irgendetwas geaendert wird, muss der aktuelle Zustand dokumentiert werden. Melden Sie sich auf dem alten Server an und sammeln Sie folgende Informationen:
# Webserver und Version pruefen
nginx -v 2>&1 || apache2 -v 2>&1 || httpd -v 2>&1
# PHP-Version pruefen (falls zutreffend)
php -v
# Datenbank-Version pruefen
mysql --version 2>/dev/null || psql --version 2>/dev/null
# Alle Cronjobs auflisten
crontab -l
sudo ls /etc/cron.d/
# Speicherverbrauch des Web-Roots pruefen
du -sh /var/www/ihre-seite/
# Datenbankgroesse pruefen
mysql -u root -p -e "SELECT table_schema AS 'Datenbank', \
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Groesse (MB)' \
FROM information_schema.tables GROUP BY table_schema;"
1.2 Neuen Server vorbereiten
Richten Sie den neuen Server mit identischen Software-Versionen ein. Versionsunterschiede sind die haeufigste Ursache fuer Probleme nach der Migration.
# Beispiel fuer Ubuntu/Debian - Web-Stack installieren
sudo apt update && sudo apt upgrade -y
sudo apt install nginx php8.2-fpm php8.2-mysql php8.2-xml \
php8.2-curl php8.2-mbstring mariadb-server -y
# Versionen abgleichen
nginx -v
php -v
mysql --version
1.3 Vollstaendiges Backup erstellen
Starten Sie niemals eine Migration ohne ein verifiziertes Backup. Das ist Ihr Sicherheitsnetz.
# Auf dem alten Server - vollstaendiges Archiv erstellen
tar czf /tmp/site-backup-$(date +%Y%m%d).tar.gz /var/www/ihre-seite/
# Datenbank sichern
mysqldump -u root -p --all-databases --single-transaction \
--routines --triggers > /tmp/db-backup-$(date +%Y%m%d).sql
Schritt 2: DNS-TTL-Werte senken
Dieser Schritt muss mindestens 24-48 Stunden vor der eigentlichen Migration erfolgen. DNS-Eintraege haben einen TTL-Wert (Time-To-Live), der Resolvern mitteilt, wie lange ein Eintrag zwischengespeichert werden soll. Standardmaessig liegt dieser oft bei 3600 Sekunden (1 Stunde) oder hoeher. Durch das Senken wird sichergestellt, dass die Aenderung nach dem IP-Wechsel schnell propagiert.
# Aktuellen TTL-Wert pruefen
dig +noall +answer ihre-domain.de
# Beispiel-Ausgabe:
# ihre-domain.de. 3600 IN A 203.0.113.10
# ^^^^ Das ist der TTL-Wert in Sekunden
Melden Sie sich im DNS-Verwaltungspanel Ihres Providers an und senken Sie den TTL fuer alle relevanten Eintraege (A, AAAA, CNAME, MX) auf 60-300 Sekunden. Warten Sie mindestens so lange wie der alte TTL-Wert, bevor Sie mit der Migration fortfahren. War der alte TTL 3600 (1 Stunde), warten Sie mindestens eine Stunde nach der Aenderung.
# Pruefen, ob der neue TTL-Wert propagiert wurde
dig +noall +answer ihre-domain.de
# Sollte jetzt anzeigen: ihre-domain.de. 300 IN A 203.0.113.10
Schritt 3: Website-Dateien auf den neuen Server kopieren
3.1 Mit rsync (empfohlen)
rsync ist der Goldstandard fuer Dateitransfers bei Migrationen. Es arbeitet inkrementell, ist fortsetzbar und bewahrt Berechtigungen.
# Vom alten Server aus Dateien auf den neuen Server uebertragen
rsync -avz --progress --delete \
-e "ssh -p 22" \
/var/www/ihre-seite/ \
benutzer@neue-server-ip:/var/www/ihre-seite/
# Flags erklaert:
# -a Archivmodus (bewahrt Berechtigungen, Eigentuemer, Zeitstempel)
# -v Ausfuehrliche Ausgabe
# -z Komprimiert Daten waehrend der Uebertragung
# --progress Zeigt Fortschritt an
# --delete Entfernt Dateien am Ziel, die an der Quelle nicht existieren
Bei sehr grossen Websites sollte rsync in einer Screen- oder Tmux-Sitzung ausgefuehrt werden, damit es SSH-Unterbrechungen uebersteht:
# Tmux-Sitzung starten
tmux new -s migration
# rsync innerhalb der Sitzung ausfuehren
rsync -avz --progress /var/www/ihre-seite/ benutzer@neue-server-ip:/var/www/ihre-seite/
# Abtrennen: Strg+B, dann D
# Spaeter wieder verbinden: tmux attach -t migration
3.2 Mit SFTP (Alternative)
Falls rsync nicht verfuegbar ist (manche Shared-Hosting-Umgebungen), verwenden Sie SFTP:
# Per SFTP mit dem neuen Server verbinden
sftp benutzer@neue-server-ip
# Navigieren und hochladen
sftp> cd /var/www/ihre-seite/
sftp> put -r /lokales/backup/ihre-seite/*
# Fuer automatisierte Transfers lftp zum Spiegeln verwenden
lftp -u benutzer,passwort sftp://neue-server-ip -e "\
mirror --reverse --delete --verbose \
/var/www/ihre-seite/ /var/www/ihre-seite/; quit"
3.3 Korrekte Eigentuemer und Berechtigungen setzen
# Auf dem neuen Server Eigentuemer korrigieren
sudo chown -R www-data:www-data /var/www/ihre-seite/
# Verzeichnis- und Dateiberechtigungen korrigieren
find /var/www/ihre-seite/ -type d -exec chmod 755 {} \;
find /var/www/ihre-seite/ -type f -exec chmod 644 {} \;
Schritt 4: Datenbank exportieren und importieren
4.1 MySQL / MariaDB
# Export auf dem alten Server
mysqldump -u root -p --single-transaction --routines --triggers \
ihre_datenbank > /tmp/ihre_datenbank.sql
# Auf den neuen Server uebertragen
rsync -avz /tmp/ihre_datenbank.sql benutzer@neue-server-ip:/tmp/
# Auf dem neuen Server: Datenbank und Benutzer anlegen
mysql -u root -p -e "\
CREATE DATABASE ihre_datenbank CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\
CREATE USER 'ihr_benutzer'@'localhost' IDENTIFIED BY 'sicheres_passwort';\
GRANT ALL PRIVILEGES ON ihre_datenbank.* TO 'ihr_benutzer'@'localhost';\
FLUSH PRIVILEGES;"
# Dump importieren
mysql -u root -p ihre_datenbank < /tmp/ihre_datenbank.sql
# Tabellenanzahl pruefen
mysql -u root -p -e "SELECT COUNT(*) AS Tabellen FROM information_schema.tables \
WHERE table_schema = 'ihre_datenbank';"
4.2 PostgreSQL
# Export auf dem alten Server
pg_dump -U postgres -Fc ihre_datenbank > /tmp/ihre_datenbank.dump
# Auf den neuen Server uebertragen
rsync -avz /tmp/ihre_datenbank.dump benutzer@neue-server-ip:/tmp/
# Auf dem neuen Server: Datenbank und Benutzer anlegen
sudo -u postgres psql -c "CREATE USER ihr_benutzer WITH PASSWORD 'sicheres_passwort';"
sudo -u postgres psql -c "CREATE DATABASE ihre_datenbank OWNER ihr_benutzer;"
# Dump importieren
pg_restore -U postgres -d ihre_datenbank /tmp/ihre_datenbank.dump
# Pruefen
sudo -u postgres psql -d ihre_datenbank -c "\dt" | tail -1
4.3 Umgang mit grossen Datenbanken
Bei Datenbanken ueber einige hundert Megabyte den Dump komprimieren und direkt durchleiten:
# MySQL - direkt streamen ohne Zwischendatei
mysqldump -u root -p --single-transaction ihre_datenbank \
| gzip | ssh benutzer@neue-server-ip "gunzip | mysql -u root -p ihre_datenbank"
# PostgreSQL - gleicher Ansatz
pg_dump -U postgres -Fc ihre_datenbank \
| ssh benutzer@neue-server-ip "pg_restore -U postgres -d ihre_datenbank"
Schritt 5: Konfigurationsdateien anpassen
5.1 Webserver-Konfiguration
Kopieren oder erstellen Sie die Virtual-Host-Konfiguration auf dem neuen Server:
# Nginx - Website-Konfiguration erstellen
sudo nano /etc/nginx/sites-available/ihre-seite.conf
# Minimale Nginx-Konfigurationsvorlage:
# server {
# listen 80;
# server_name ihre-domain.de www.ihre-domain.de;
# root /var/www/ihre-seite;
# index index.php index.html;
#
# location ~ \.php$ {
# fastcgi_pass unix:/run/php/php8.2-fpm.sock;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
# }
# }
# Website aktivieren
sudo ln -s /etc/nginx/sites-available/ihre-seite.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
5.2 Anwendungskonfiguration
Aktualisieren Sie alle hartcodierten Pfade, Datenbank-Zugangsdaten oder serverspezifischen Einstellungen:
# Konfigurationsdateien finden, die die alte Server-IP oder den Hostnamen referenzieren
grep -rl "203.0.113.10\|alter-server-hostname" /var/www/ihre-seite/ \
--include="*.php" --include="*.conf" --include="*.env" --include="*.yml"
# Haeufig zu pruefende Dateien:
# WordPress: wp-config.php
# Laravel: .env
# Django: settings.py
# Generisch: config.php, database.yml, .env
Speziell fuer WordPress:
# wp-config.php mit neuen Datenbank-Zugangsdaten aktualisieren
define('DB_NAME', 'ihre_datenbank');
define('DB_USER', 'ihr_benutzer');
define('DB_PASSWORD', 'sicheres_passwort');
define('DB_HOST', 'localhost');
5.3 Cronjobs
# Cronjobs vom alten Server exportieren
crontab -l > /tmp/crontab-backup.txt
# Auf den neuen Server uebertragen und importieren
rsync -avz /tmp/crontab-backup.txt benutzer@neue-server-ip:/tmp/
# Auf dem neuen Server:
crontab /tmp/crontab-backup.txt
crontab -l # Pruefen
Schritt 6: SSL auf dem neuen Server einrichten
SSL muss vor der DNS-Umstellung bereitstehen. Verwenden Sie Let's Encrypt mit einer temporaeren Verifizierungsmethode oder kopieren Sie bestehende Zertifikate.
6.1 Bestehende Zertifikate kopieren (schnelle Methode)
# Auf dem alten Server Zertifikate archivieren
sudo tar czf /tmp/letsencrypt-backup.tar.gz /etc/letsencrypt/
# Auf neuen Server uebertragen
rsync -avz /tmp/letsencrypt-backup.tar.gz benutzer@neue-server-ip:/tmp/
# Auf dem neuen Server
sudo tar xzf /tmp/letsencrypt-backup.tar.gz -C /
sudo apt install certbot python3-certbot-nginx -y
6.2 Neues Zertifikat per DNS-Challenge ausstellen
Diese Methode funktioniert auch, bevor der DNS-Eintrag auf den neuen Server zeigt:
# Certbot auf dem neuen Server installieren
sudo apt install certbot -y
# DNS-Challenge verwenden - Domain muss noch nicht hierher zeigen
sudo certbot certonly --manual --preferred-challenges dns \
-d ihre-domain.de -d www.ihre-domain.de
# Certbot fordert auf, einen DNS-TXT-Eintrag zu erstellen
# Den Anweisungen auf dem Bildschirm folgen, dann pruefen:
dig +short TXT _acme-challenge.ihre-domain.de
6.3 Webserver-SSL-Konfiguration aktualisieren
# Nginx-SSL-Konfiguration
# server {
# listen 443 ssl http2;
# server_name ihre-domain.de www.ihre-domain.de;
# ssl_certificate /etc/letsencrypt/live/ihre-domain.de/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/ihre-domain.de/privkey.pem;
# ... restliche Konfiguration ...
# }
sudo nginx -t && sudo systemctl reload nginx
Schritt 7: Testen auf dem neuen Server vor dem DNS-Wechsel
Dies ist der wichtigste Schritt. Sie muessen ueberpruefen, dass die Website auf dem neuen Server funktioniert, bevor Sie den DNS-Eintrag aendern. Der Hosts-Datei-Trick erlaubt es, die Domain nur auf Ihrem lokalen Rechner auf die neue Server-IP zeigen zu lassen.
7.1 Der Hosts-Datei-Trick
# Auf Ihrem lokalen Rechner (macOS/Linux)
sudo nano /etc/hosts
# Diese Zeile hinzufuegen (IP des NEUEN Servers verwenden)
198.51.100.20 ihre-domain.de www.ihre-domain.de
# Unter Windows: C:\Windows\System32\drivers\etc\hosts bearbeiten
# DNS-Cache leeren
# macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
# Linux:
sudo systemd-resolve --flush-caches
7.2 Pruefungsliste
Oeffnen Sie Ihren Browser und testen Sie gruendlich:
- Startseite laedt korrekt
- Alle internen Links funktionieren
- Bilder und Assets laden (Browser-DevTools auf 404-Fehler pruefen)
- Formulare werden korrekt abgesendet
- Anmeldung/Authentifizierung funktioniert
- SSL-Zertifikat ist gueltig (Schloss-Symbol pruefen)
- Datenbankgestuetzte Seiten zeigen korrekte Daten
- Suchfunktion funktioniert
- Datei-Uploads funktionieren (falls zutreffend)
# Kommandozeilen-Verifizierung
curl -I https://ihre-domain.de # Sollte 200 zurueckgeben
curl -sL https://ihre-domain.de | grep -o ".* " # Titel pruefen
# Alle wichtigen URLs testen
for url in "/" "/ueber-uns" "/kontakt" "/blog" "/login"; do
status=$(curl -o /dev/null -s -w "%{http_code}" https://ihre-domain.de$url)
echo "$url -> $status"
done
7.3 Hosts-Eintrag nach dem Testen entfernen
# WICHTIG: Hosts-Eintrag nach dem Testen entfernen oder auskommentieren
sudo sed -i '/ihre-domain.de/d' /etc/hosts
Schritt 8: DNS-Umstellung
8.1 Letzte Datensynchronisation
Unmittelbar vor der DNS-Umstellung eine letzte Synchronisation durchfuehren, um alle Aenderungen seit der ersten Kopie zu erfassen:
# Letzte Dateisynchronisation
rsync -avz --delete /var/www/ihre-seite/ benutzer@neue-server-ip:/var/www/ihre-seite/
# Letzte Datenbanksynchronisation
mysqldump -u root -p --single-transaction ihre_datenbank \
| ssh benutzer@neue-server-ip "mysql -u root -p ihre_datenbank"
8.2 DNS-Eintraege aendern
Aktualisieren Sie den DNS-A-Eintrag (und AAAA, falls zutreffend) auf die IP-Adresse des neuen Servers. Da Sie den TTL-Wert in Schritt 2 gesenkt haben, wird die Propagierung schnell verlaufen.
# Nach der DNS-Aktualisierung die Propagierung ueberwachen
watch -n 10 "dig +short ihre-domain.de"
# Propagierung von mehreren Standorten pruefen
for ns in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
echo "$ns: $(dig +short @$ns ihre-domain.de)"
done
8.3 Alten Server weiterlaufen lassen
Fahren Sie den alten Server nicht sofort herunter. Manche DNS-Resolver ignorieren niedrige TTL-Werte. Lassen Sie den alten Server mindestens 48-72 Stunden nach der Umstellung laufen. Optional koennen Sie auf dem alten Server eine Weiterleitung einrichten:
# Optional: Auf dem alten Server verbleibenden Traffic umleiten
# Nginx-Konfiguration auf dem alten Server:
# server {
# listen 80;
# listen 443 ssl;
# server_name ihre-domain.de;
# return 301 $scheme://ihre-domain.de$request_uri;
# }
Schritt 9: Nachkontrolle
9.1 Automatisierter Gesundheitscheck
#!/bin/bash
# nachkontrolle.sh
DOMAIN="ihre-domain.de"
ERWARTETE_IP="198.51.100.20" # IP des neuen Servers
echo "=== Nachkontrolle der Migration ==="
# DNS-Pruefung
AKTUELLE_IP=$(dig +short $DOMAIN)
if [ "$AKTUELLE_IP" = "$ERWARTETE_IP" ]; then
echo "[OK] DNS zeigt auf neuen Server ($AKTUELLE_IP)"
else
echo "[FEHLER] DNS zeigt noch auf $AKTUELLE_IP (erwartet: $ERWARTETE_IP)"
fi
# HTTP-Status-Pruefung
HTTP_STATUS=$(curl -o /dev/null -s -w "%{http_code}" https://$DOMAIN)
if [ "$HTTP_STATUS" = "200" ]; then
echo "[OK] HTTP-Status: $HTTP_STATUS"
else
echo "[FEHLER] HTTP-Status: $HTTP_STATUS"
fi
# SSL-Pruefung
SSL_ABLAUF=$(echo | openssl s_client -connect $DOMAIN:443 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
echo "[INFO] SSL laeuft ab: $SSL_ABLAUF"
# Antwortzeit
ANTWORTZEIT=$(curl -o /dev/null -s -w "%{time_total}" https://$DOMAIN)
echo "[INFO] Antwortzeit: ${ANTWORTZEIT}s"
# Auf Mixed-Content / defekte Assets pruefen
DEFEKT=$(curl -sL https://$DOMAIN | grep -c 'http://' || true)
echo "[INFO] Moegliche Mixed-Content-Referenzen: $DEFEKT"
9.2 Logs ueberwachen
# Auf dem neuen Server nach Fehlern schauen
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.2-fpm.log
sudo tail -f /var/log/mysql/error.log
9.3 TTL wiederherstellen
Nach 48-72 Stunden den DNS-TTL-Wert wieder auf einen normalen Wert erhoehen (3600 oder hoeher), um die DNS-Abfragelast zu reduzieren:
# Endgueltigen TTL-Wert pruefen
dig +noall +answer ihre-domain.de
# Sollte den wiederhergestellten TTL-Wert anzeigen
Fehlerbehebung
Website zeigt eine leere Seite oder 500-Fehler
# Webserver-Fehlerlog pruefen
sudo tail -50 /var/log/nginx/error.log
# Haeufige Ursachen:
# - Fehlende PHP-Module: sudo apt install php8.2-{modul}
# - Berechtigungsprobleme: sudo chown -R www-data:www-data /var/www/ihre-seite/
# - Falsche PHP-Version in der Konfiguration: fastcgi_pass Socket-Pfad pruefen
# Pruefen ob PHP-FPM laeuft
sudo systemctl status php8.2-fpm
Datenbankverbindung fehlgeschlagen
# Pruefen ob MySQL laeuft
sudo systemctl status mariadb
# Datenbank-Zugangsdaten testen
mysql -u ihr_benutzer -p ihre_datenbank -e "SELECT 1;"
# Socket-Pfad pruefen bei Socket-Verbindung
ls -la /var/run/mysqld/mysqld.sock
# Datenbank-Host in der Konfiguration pruefen (localhost vs. 127.0.0.1)
# localhost = Socket, 127.0.0.1 = TCP
SSL-Zertifikatsfehler
# Zertifikatstatus pruefen
sudo certbot certificates
# SSL-Konfiguration testen
openssl s_client -connect ihre-domain.de:443 -servername ihre-domain.de
# Zertifikatserneuerung erzwingen
sudo certbot renew --force-renewal
# Nginx-SSL-Konfigurationssyntax pruefen
sudo nginx -t
E-Mails funktionieren nach der Migration nicht
# MX-Eintraege pruefen - diese sollten sich NICHT geaendert haben
dig +short MX ihre-domain.de
# Falls Sie einen eigenen Mailserver betreiben, SPF und DKIM pruefen
dig +short TXT ihre-domain.de | grep spf
# SPF-Eintrag aktualisieren, falls die alte Server-IP enthalten ist
# Alt: v=spf1 ip4:203.0.113.10 ...
# Neu: v=spf1 ip4:198.51.100.20 ...
rsync-Uebertragung unterbrochen
# rsync ist fortsetzbar - einfach denselben Befehl erneut ausfuehren
rsync -avz --progress --partial /var/www/ihre-seite/ benutzer@neue-server-ip:/var/www/ihre-seite/
# --partial bewahrt teilweise uebertragene Dateien fuer die Fortsetzung
Praevention und Best Practices
Vor jeder Migration
- Alles dokumentieren - Erstellen Sie ein Migrations-Runbook mit allen Serverdetails, Zugangsdaten und den spezifischen Schritten fuer Ihre Umgebung
- Wiederherstellung testen - Ein Backup ist wertlos, wenn Sie die Wiederherstellung nie getestet haben
- Wartungsfenster waehlen - Auch bei einer Migration ohne Ausfallzeit sollten die finale Synchronisation und die DNS-Umstellung waehrend verkehrsarmer Zeiten erfolgen
- Beteiligte informieren - Teilen Sie Ihrem Team mit, dass eine Migration stattfindet, und nennen Sie einen Zeitplan
Infrastruktur-Praktiken
- Infrastructure as Code verwenden - Wenn Ihre Servereinrichtung geskriptet ist (Ansible, Terraform, Docker), werden Migrationen reproduzierbar und weniger fehleranfaellig
- TTL niedrig halten bei haeufigen Migrationen - Ein TTL von 300 Sekunden ist fuer die meisten Websites angemessen und erleichtert zukuenftige Migrationen
- Datenbank-Backups automatisieren - Taegliche automatisierte Backups mit Aufbewahrungsrichtlinie, ausserhalb des Servers gespeichert
- Konfigurationen versionieren - Webserver-Konfigurationen, Anwendungskonfigurationen und Cronjobs gehoeren in Git
Nach der Migration
- Alten Server stilllegen - Fruehestens nach 72 Stunden und nur nach Bestaetigung, dass kein Traffic mehr in den Access-Logs erscheint
- Monitoring aktualisieren - Uptime-Checks und Alerting auf die neue Server-IP umstellen
- Externe Dienste aktualisieren - Webhook-URLs, API-Whitelists, CDN-Origin-Einstellungen, Firewall-Regeln
- Sicherheitsaudit durchfuehren - Ein frischer Server ist ein guter Anlass, offene Ports, Firewall-Regeln und Software-Updates zu pruefen
- Neue Umgebung dokumentieren - Interne Dokumentation mit den neuen Serverdetails aktualisieren
Experten-Hilfe gebraucht?
Professionelle Migration ohne Ausfallzeit? €99.
Jetzt buchen — €99100% Geld-zurück-Garantie