itdatex Sync Gate

itdatex Sync Gate ist der granulare Table- und File-Sync zwischen zwei gepairten WordPress-Sites — ohne Cloud-Broker, mit HMAC-signierten REST-Endpoints. Positioniert gegen WP Migrate DB Pro (Table-Level, aber schwerfaellig) und WP Staging (nur ganze Site) fuer den typischen Fall “Kunde hat neue Seiten auf Staging getestet, live sollen die dazu, aber die neuen Bestellungen und Kommentare der Live-Site bleiben”.

Selektiver Table-Sync in beide Richtungen

Pull (Remote -> Local) und Push (Local -> Remote) einzelner DB-Tabellen. Vor jedem Overwrite wird ein SQL-Dump nach wp-content/uploads/itdatex-sync-gate/backups/ geschrieben (HTTP-Zugriff via .htaccess-Deny geblockt). URL-Rewrite ist serialization-safe: PHP-serialize + JSON + verschachtelte Strukturen werden korrekt entpackt und wieder gepackt.

File-Sync fuer wp-content/uploads/ mit Chunking

Diff-Basis size + mtime, Transfer nur der Deltas, atomic write via temp+rename. Chunked bis 500 MB pro Datei, SHA256-Integritaetspruefung auf jedem Chunk und ueber die ganze Datei. Themes und Plugins bleiben ausgenommen (gehoeren via Git/Composer deployt). .php-, .phar- und .htaccess-Dateien werden aus Sicherheitsgruenden nie gesynct.

Parallel und resume-faehig

Chunk-Transfer laeuft via curl_multi parallel — seit v0.9 sowohl beim Push als auch beim Pull. Concurrency 1..10 konfigurierbar (Default 3). Abgebrochene Uploads werden automatisch resumt: die naechste Session prueft per /files/put-status, welche Offsets der Server schon hat, und sendet nur die fehlenden.

HMAC-Sicherheitsmodell

Jeder REST-Call zwischen gepairten Sites traegt vier Header: X-Itdatex-SG-Signature (HMAC-SHA256 ueber method || path || sha256(body) || nonce || timestamp), X-Itdatex-SG-Nonce (16 Byte hex, 10min Replay-Guard via Transient), X-Itdatex-SG-Timestamp (Unix-Sekunden, +/-60s Fenster), X-Itdatex-SG-Remote-URL (Absender-URL zur Pair-Suche). Das Secret wird ueber HTTPS uebertragen und liegt im Klartext in der Pair-Tabelle — wer DB-Zugriff auf eine der beiden Sites hat, hat effektiv Zugriff auf die andere, daran wuerde Encryption at Rest nichts aendern.

Sensible Default-Exclusions

Users, Usermeta, WooCommerce-Orders/Order-Items und itdatex-eigene Tabellen stehen auf der Default-Exclusion-Liste und werden nur mit --force uebertragen. Der Server prueft die Liste ebenfalls (defense-in-depth).

Web-UI und WP-CLI

Unter Werkzeuge -> Sync Gate mit Tabs Pairs / Tables / Files / Settings / Log. WP-CLI: wp sync-gate pair-init, pair-connect, pair-list, list-tables, pull, push, files pull|push, config list|get|set, files-resume-list, files-resume-forget.

Technisches

  • WP 6.4+, PHP 8.1+, GPL-2.0+
  • Nonce-basierter Replay-Schutz (10min TTL), Zeitfenster +/-60s
  • Path-Traversal-Schutz, .php/.phar-Ausschluss, Symlink-Ignore
  • Peak-RAM waehrend Chunk-Transfer: chunk_concurrency * chunk_size * ~1.33 (Default 3 * 5 MB ~= 20 MB)
  • Konfigurierbar: chunk_concurrency (1..10), chunk_size (256 KB..20 MB), session_ttl_hours (1..168)
  • Kein Row-Level-Sync innerhalb einer Tabelle (all-or-nothing), kein bidirektionales Konflikt-Resolution (last-write-wins)