Migration: Beta → Produktiv
Projekt: VWT Event Suite – Villa Wellentanz
Datum: März 2026
Server: server.imaago.ch (89.58.54.109)
Webserver: Nginx + PHP 8.3-FPM
Durchführung: Sonntag Morgen (alle drei Migrationen am Stück)
1. Übersicht
Alle Instanzen laufen auf demselben Server. Die Migration besteht aus drei aufeinanderfolgenden Schritten, die alle am Sonntag Morgen durchgeführt werden. Nach der Migration heissen alle Webroots so, wie sie zur jeweiligen Domain gehören. Nur für das Archiv kommt ein neues Verzeichnis dazu.
Ausgangszustand
| Domain | Webroot | Datenbank | Zweck |
|---|---|---|---|
www.villa-wellentanz.ch | /data/www/villa-wellentanz.ch | wellentanz | Produktiv (alt) |
beta.villa-wellentanz.ch | /data/www/beta.villa-wellentanz.ch | wellentanz_beta | Beta / Test |
Zielzustand
| Domain | Webroot | Datenbank | Zweck |
|---|---|---|---|
www.villa-wellentanz.ch | /data/www/villa-wellentanz.ch | wellentanz_beta | Produktiv (neu) |
archiv.villa-wellentanz.ch | /data/www/archiv.villa-wellentanz.ch | wellentanz | Archiv (read-only) |
beta.villa-wellentanz.ch | /data/www/beta.villa-wellentanz.ch | wellentanz_beta_dev | Neuer Testserver |
Was passiert mit den Verzeichnissen
| Schritt | Aktion |
|---|---|
| Migration 1 | /data/www/villa-wellentanz.ch → umbenennen zu /data/www/archiv.villa-wellentanz.ch |
| Migration 2 | /data/www/beta.villa-wellentanz.ch → umbenennen zu /data/www/villa-wellentanz.ch |
| Migration 3 | /data/www/villa-wellentanz.ch klonen → neues /data/www/beta.villa-wellentanz.ch |
So heisst am Ende jedes Webroot genau wie seine Domain.
Nginx-Änderungen im Überblick
| vHost | Änderung | SSL |
|---|---|---|
archiv.villa-wellentanz.ch | Neu erstellen | Neues Zertifikat |
www.villa-wellentanz.ch | Keine (root-Pfad stimmt nach Umbenennung) | Bestehendes Zertifikat bleibt |
beta.villa-wellentanz.ch | Keine (root-Pfad stimmt nach Klon) | Bestehendes Zertifikat bleibt |
Was bleibt erhalten
- Alle Events (
wp_vwt_events,wp_vwt_event_meta) - Alle Kurse (
wp_vwt_courses,wp_vwt_course_dates,wp_vwt_course_exclusions) - Alle Ticket-Typen (
wp_vwt_ticket_types) - Alle Einstellungen (
wp_vwt_settings) - WordPress-Konfiguration, Themes, Plugins, Medien
Testdaten
Testdaten sind bereits gelöscht. Alle ehemaligen Tickets von vergangenen Konzerten sind bereits übernommen.
2. Voraussetzungen
- SSH-Zugang als
jpk@server.imaago.ch(sudo-Rechte) - DNS-Verwaltung für
villa-wellentanz.ch - Certbot installiert (für SSL-Zertifikate)
- WP-CLI installiert auf dem Server (Prüfung:
sudo -u web-vwt wp --info)
Hinweis zu WP-CLI
WP-CLI wird für alle URL-Umschreibungen in der Datenbank verwendet. Der Vorteil gegenüber manuellen SQL-Queries: wp search-replace behandelt serialisierte Daten korrekt (z.B. in Widget-Einstellungen, Theme-Optionen, Plugin-Konfigurationen), was mit reinem SQL nicht sicher möglich ist.
cd /data/www/[instanz]
sudo -u web-vwt wp [kommando]
Wichtige Flags:
--all-tables-with-prefix→ erfasst auch Custom Tables wiewp_vwt_*--skip-columns=guid→ GUIDs sind permanente Identifier und dürfen nicht geändert werden--dry-run --report-changed-only→ Vorschau ohne Änderungen
3. Vorbereitung (Freitag / Samstag)
3.1 – DNS vorbereiten (Freitag)
- TTL für
www.villa-wellentanz.chauf 300 Sekunden setzen - Neuen A-Record für
archiv.villa-wellentanz.chanlegen →89.58.54.109, TTL 300
3.2 – Vollbackups erstellen (Freitag)
# Datenbank-Dumps per WP-CLI
cd /data/www/villa-wellentanz.ch
sudo -u web-vwt wp db export /data/backups/$(date +%Y%m%d)_wellentanz.sql
cd /data/www/beta.villa-wellentanz.ch
sudo -u web-vwt wp db export /data/backups/$(date +%Y%m%d)_wellentanz_beta.sql
# Dateisystem sichern
tar czf /data/backups/$(date +%Y%m%d)_www.tar.gz /data/www/villa-wellentanz.ch
tar czf /data/backups/$(date +%Y%m%d)_beta.tar.gz /data/www/beta.villa-wellentanz.ch
3.3 – URL-Referenzen identifizieren (Freitag)
cd /data/www/beta.villa-wellentanz.ch
sudo -u web-vwt wp search-replace 'beta.villa-wellentanz.ch' 'www.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix
Ergebnis notieren – zeigt alle Stellen, die in Migration 2 angepasst werden.
3.4 – Finale Vorbereitung (Samstag)
- Finale Backups erstellen (DB + Dateisystem)
- Ergebnisse des Dry-Runs nochmals prüfen
4. Migration 1: www → Archiv (Sonntag Morgen)
Der alte Produktiv-Server wird unter
archiv.villa-wellentanz.charchiviert.
Das Verzeichnis wird umbenannt:/data/www/villa-wellentanz.ch→/data/www/archiv.villa-wellentanz.ch
Einzige neue Nginx-Konfiguration + SSL-Zertifikat der gesamten Migration.
4.1 – Webroot umbenennen
sudo mv /data/www/villa-wellentanz.ch /data/www/archiv.villa-wellentanz.ch
4.2 – Nginx-vHost für Archiv erstellen
sudo cp /etc/nginx/sites-available/www.villa-wellentanz.ch \
/etc/nginx/sites-available/archiv.villa-wellentanz.ch
sudo nano /etc/nginx/sites-available/archiv.villa-wellentanz.ch
# → server_name archiv.villa-wellentanz.ch;
# → root /data/www/archiv.villa-wellentanz.ch;
sudo ln -s /etc/nginx/sites-available/archiv.villa-wellentanz.ch \
/etc/nginx/sites-enabled/
4.3 – Alten www-vHost deaktivieren
sudo rm /etc/nginx/sites-enabled/www.villa-wellentanz.ch
4.4 – Nginx prüfen und neu laden
sudo nginx -t
sudo systemctl reload nginx
4.5 – SSL-Zertifikat für Archiv
sudo certbot --nginx -d archiv.villa-wellentanz.ch
4.6 – WordPress-URLs umschreiben
cd /data/www/archiv.villa-wellentanz.ch
# Dry-Run
sudo -u web-vwt wp search-replace 'https://www.villa-wellentanz.ch' 'https://archiv.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Ausführen
sudo -u web-vwt wp search-replace 'https://www.villa-wellentanz.ch' 'https://archiv.villa-wellentanz.ch' \
--all-tables-with-prefix --skip-columns=guid
# Auch ohne Protokoll (hartcodierte Referenzen)
sudo -u web-vwt wp search-replace 'www.villa-wellentanz.ch' 'archiv.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Falls Treffer: ohne --dry-run wiederholen
sudo -u web-vwt wp cache flush
4.7 – Archiv absichern (read-only)
In /data/www/archiv.villa-wellentanz.ch/wp-config.php hinzufügen:
define('DISALLOW_FILE_MODS', true);
4.8 – Verifikation Archiv
cd /data/www/archiv.villa-wellentanz.ch
sudo -u web-vwt wp option get siteurl
# → https://archiv.villa-wellentanz.ch
- [ ]
https://archiv.villa-wellentanz.cherreichbar - [ ] Altes System sichtbar und funktionstüchtig
- [ ] Schreibzugriff gesperrt
5. Migration 2: Beta → www (Sonntag Morgen, direkt im Anschluss)
Der Beta-Server wird zum neuen Produktiv-Server.
Das Verzeichnis wird umbenannt:/data/www/beta.villa-wellentanz.ch→/data/www/villa-wellentanz.ch
Kein neuer vHost und kein neues SSL-Zertifikat nötig – der bestehende www-vHost zeigt auf/data/www/villa-wellentanz.ch, was nach dem Umbenennen das ehemalige Beta-Verzeichnis ist.
5.1 – Beta-vHost deaktivieren
sudo rm /etc/nginx/sites-enabled/beta.villa-wellentanz.ch
5.2 – Webroot umbenennen
sudo mv /data/www/beta.villa-wellentanz.ch /data/www/villa-wellentanz.ch
5.3 – www-vHost reaktivieren
Der bestehende www-vHost zeigt auf root /data/www/villa-wellentanz.ch; – das ist jetzt das ehemalige Beta-Verzeichnis. Kein Editieren nötig.
sudo ln -s /etc/nginx/sites-available/www.villa-wellentanz.ch \
/etc/nginx/sites-enabled/
5.4 – WordPress-URLs umschreiben
cd /data/www/villa-wellentanz.ch
# Dry-Run
sudo -u web-vwt wp search-replace 'https://beta.villa-wellentanz.ch' 'https://www.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Ausführen
sudo -u web-vwt wp search-replace 'https://beta.villa-wellentanz.ch' 'https://www.villa-wellentanz.ch' \
--all-tables-with-prefix --skip-columns=guid
# Auch ohne Protokoll
sudo -u web-vwt wp search-replace 'beta.villa-wellentanz.ch' 'www.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Falls Treffer: ohne --dry-run wiederholen
sudo -u web-vwt wp cache flush
sudo -u web-vwt wp rewrite flush
5.5 – Nginx prüfen und neu laden
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart php8.3-fpm
5.6 – Verifikation Produktiv
cd /data/www/villa-wellentanz.ch
# Site-URLs verifizieren
sudo -u web-vwt wp option get siteurl
sudo -u web-vwt wp option get home
# → Beide: https://www.villa-wellentanz.ch
# Keine Beta-Referenzen mehr?
sudo -u web-vwt wp search-replace 'beta.villa-wellentanz.ch' 'www.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix
# → 0 replacements
# Datenintegrität
sudo -u web-vwt wp db query "SELECT 'events' AS tbl, COUNT(*) AS cnt FROM wp_vwt_events
UNION ALL SELECT 'courses', COUNT(*) FROM wp_vwt_courses
UNION ALL SELECT 'ticket_types', COUNT(*) FROM wp_vwt_ticket_types
UNION ALL SELECT 'settings', COUNT(*) FROM wp_vwt_settings
UNION ALL SELECT 'visitors (=0)', COUNT(*) FROM wp_vwt_visitors
UNION ALL SELECT 'bookings (=0)', COUNT(*) FROM wp_vwt_bookings
UNION ALL SELECT 'payments (=0)', COUNT(*) FROM wp_vwt_payments;"
Manuelle Prüfung:
- [ ] Startseite / Programmseite laden korrekt
- [ ] Event-Detailseiten mit Bildern sichtbar
- [ ] Admin-Login (wp-admin) funktioniert
- [ ] Dashboard: Events und Einstellungen vorhanden
- [ ] Neue Besucher-Registrierung testen → E-Mail kommt an
- [ ] Gratis-Buchung durchspielen → Bestätigungs-E-Mail kommt an
- [ ] QR-Code-URLs zeigen auf
www.villa-wellentanz.ch - [ ] Brevo SMTP: Absender-Domain korrekt
6. Migration 3: Neuer Beta-Server (Sonntag Morgen, direkt im Anschluss)
Ein frischer Beta-Server wird als Klon des neuen Produktivs aufgesetzt.
Neues Verzeichnis:/data/www/beta.villa-wellentanz.ch(Klon vom Produktiv)
Eigene Datenbank:wellentanz_beta_dev
Kein neuer vHost und kein neues SSL-Zertifikat nötig – der bestehende beta-vHost zeigt auf/data/www/beta.villa-wellentanz.ch, was nach dem Klonen das richtige Verzeichnis ist.
6.1 – Webroot klonen
sudo cp -a /data/www/villa-wellentanz.ch /data/www/beta.villa-wellentanz.ch
6.2 – Datenbank klonen
cd /data/www/villa-wellentanz.ch
sudo -u web-vwt wp db export /tmp/prod_snapshot.sql
mysql -u root -p -e "CREATE DATABASE wellentanz_beta_dev;"
mysql -u root -p wellentanz_beta_dev < /tmp/prod_snapshot.sql
rm /tmp/prod_snapshot.sql
6.3 – wp-config.php anpassen
sudo nano /data/www/beta.villa-wellentanz.ch/wp-config.php
# → DB_NAME auf 'wellentanz_beta_dev' ändern
6.4 – URLs in neuer Beta-DB umschreiben
cd /data/www/beta.villa-wellentanz.ch
# Dry-Run
sudo -u web-vwt wp search-replace 'https://www.villa-wellentanz.ch' 'https://beta.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Ausführen
sudo -u web-vwt wp search-replace 'https://www.villa-wellentanz.ch' 'https://beta.villa-wellentanz.ch' \
--all-tables-with-prefix --skip-columns=guid
# Auch ohne Protokoll
sudo -u web-vwt wp search-replace 'www.villa-wellentanz.ch' 'beta.villa-wellentanz.ch' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# Falls Treffer: ohne --dry-run wiederholen
sudo -u web-vwt wp cache flush
sudo -u web-vwt wp rewrite flush
6.5 – Beta-vHost reaktivieren
Der bestehende beta-vHost zeigt auf root /data/www/beta.villa-wellentanz.ch; – das geklonte Verzeichnis liegt genau dort. Kein Editieren nötig.
sudo ln -s /etc/nginx/sites-available/beta.villa-wellentanz.ch \
/etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
6.6 – Dateiberechtigungen
sudo chown -R web-vwt:web-vwt /data/www/beta.villa-wellentanz.ch
6.7 – Verifikation Beta
cd /data/www/beta.villa-wellentanz.ch
sudo -u web-vwt wp option get siteurl
# → https://beta.villa-wellentanz.ch
- [ ]
https://beta.villa-wellentanz.cherreichbar - [ ] Admin-Login funktioniert
- [ ] Events und Einstellungen vorhanden
7. Zeitplan
| Zeitpunkt | Aktion |
|---|---|
| Freitag | DNS vorbereiten, Backups, Dry-Run |
| Samstag | Finale Backups, Ergebnisse prüfen |
| Sonntag Morgen | Migration 1: www → Archiv (ca. 15 Min.) |
| Sonntag Morgen | Migration 2: Beta → www (ca. 15 Min.) |
| Sonntag Morgen | Verifikation www + Archiv (ca. 15 Min.) |
| Sonntag Morgen | Migration 3: Neuer Beta (ca. 15 Min.) |
| Geschätzte Gesamtdauer Sonntag: ca. 1 Stunde |
8. Rollback-Plan
Falls bei der Umstellung am Sonntag Probleme auftreten:
# 1. Verzeichnisse zurück-umbenennen
sudo mv /data/www/villa-wellentanz.ch /data/www/beta.villa-wellentanz.ch
sudo mv /data/www/archiv.villa-wellentanz.ch /data/www/villa-wellentanz.ch
# 2. WordPress-URLs in alter DB zurücksetzen
cd /data/www/villa-wellentanz.ch
sudo -u web-vwt wp search-replace 'https://archiv.villa-wellentanz.ch' 'https://www.villa-wellentanz.ch' \
--all-tables-with-prefix --skip-columns=guid
sudo -u web-vwt wp cache flush
# 3. Beta-URLs zurücksetzen
cd /data/www/beta.villa-wellentanz.ch
sudo -u web-vwt wp search-replace 'https://www.villa-wellentanz.ch' 'https://beta.villa-wellentanz.ch' \
--all-tables-with-prefix --skip-columns=guid
sudo -u web-vwt wp cache flush
# 4. Archiv-vHost entfernen, www + beta reaktivieren
sudo rm /etc/nginx/sites-enabled/archiv.villa-wellentanz.ch
sudo ln -s /etc/nginx/sites-available/www.villa-wellentanz.ch /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/beta.villa-wellentanz.ch /etc/nginx/sites-enabled/
# 5. Nginx neu laden
sudo nginx -t && sudo systemctl reload nginx
sudo systemctl restart php8.3-fpm
9. Nach der Migration: Deployment-Workflow
Alle Webroots heissen korrekt:
| Domain | Webroot |
|---|---|
www.villa-wellentanz.ch | /data/www/villa-wellentanz.ch |
beta.villa-wellentanz.ch | /data/www/beta.villa-wellentanz.ch |
archiv.villa-wellentanz.ch | /data/www/archiv.villa-wellentanz.ch |
Lokal entwickeln → Beta testen → scp auf Produktiv deployen
Lokal:
scp datei.php jpk@server.imaago.ch:/tmp/
Server:
sudo mv /tmp/datei.php /data/www/villa-wellentanz.ch/wp-content/plugins/vwt-events/...
sudo chown web-vwt:web-vwt /data/www/villa-wellentanz.ch/wp-content/plugins/vwt-events/...
sudo systemctl restart php8.3-fpm
10. WP-CLI Kurzreferenz
# Immer zuerst ins richtige Verzeichnis wechseln
cd /data/www/[instanz]
# Site-URL prüfen
sudo -u web-vwt wp option get siteurl
sudo -u web-vwt wp option get home
# URL ersetzen (Dry-Run)
sudo -u web-vwt wp search-replace 'alte-url' 'neue-url' \
--dry-run --report-changed-only --all-tables-with-prefix --skip-columns=guid
# URL ersetzen (Ausführen)
sudo -u web-vwt wp search-replace 'alte-url' 'neue-url' \
--all-tables-with-prefix --skip-columns=guid
# Datenbank exportieren / importieren
sudo -u web-vwt wp db export /pfad/zum/backup.sql
sudo -u web-vwt wp db import /pfad/zum/backup.sql
# Cache leeren / Permalinks neu generieren
sudo -u web-vwt wp cache flush
sudo -u web-vwt wp rewrite flush
# Beliebige SQL-Query
sudo -u web-vwt wp db query "SELECT COUNT(*) FROM wp_vwt_events;"
# WordPress-Status
sudo -u web-vwt wp core version
sudo -u web-vwt wp plugin list
sudo -u web-vwt wp theme list