jpk.ch

Jean-Pierre A. Kousz

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

DomainWebrootDatenbankZweck
www.villa-wellentanz.ch/data/www/villa-wellentanz.chwellentanzProduktiv (alt)
beta.villa-wellentanz.ch/data/www/beta.villa-wellentanz.chwellentanz_betaBeta / Test

Zielzustand

DomainWebrootDatenbankZweck
www.villa-wellentanz.ch/data/www/villa-wellentanz.chwellentanz_betaProduktiv (neu)
archiv.villa-wellentanz.ch/data/www/archiv.villa-wellentanz.chwellentanzArchiv (read-only)
beta.villa-wellentanz.ch/data/www/beta.villa-wellentanz.chwellentanz_beta_devNeuer Testserver

Was passiert mit den Verzeichnissen

SchrittAktion
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ÄnderungSSL
archiv.villa-wellentanz.chNeu erstellenNeues Zertifikat
www.villa-wellentanz.chKeine (root-Pfad stimmt nach Umbenennung)Bestehendes Zertifikat bleibt
beta.villa-wellentanz.chKeine (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 wie wp_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.ch auf 300 Sekunden setzen
  • Neuen A-Record für archiv.villa-wellentanz.ch anlegen → 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.ch archiviert.
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.ch erreichbar
  • [ ] 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.ch erreichbar
  • [ ] Admin-Login funktioniert
  • [ ] Events und Einstellungen vorhanden

7. Zeitplan

ZeitpunktAktion
FreitagDNS vorbereiten, Backups, Dry-Run
SamstagFinale Backups, Ergebnisse prüfen
Sonntag MorgenMigration 1: www → Archiv (ca. 15 Min.)
Sonntag MorgenMigration 2: Beta → www (ca. 15 Min.)
Sonntag MorgenVerifikation www + Archiv (ca. 15 Min.)
Sonntag MorgenMigration 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:

DomainWebroot
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