rsync ist ein mächtiges Kopiertool, mit dem man sehr genau steuern kann, welche Dateien kopiert werden. Mit rsync kann ich prüfen, was im Zielverzeichnis schon vorhanden ist und damit nur die neuen Dateien nachziehen und noch einiges mehr. So lassen sie die nicht versionierten Dateien schnell und sehr effizient abgleichen.
Grundprinzip
rsync [Optionen] QUELLE/ ZIEL/Wichtig: die Schrägstriche am Ende.
quelle/ ziel/→ der Inhalt von quelle landet in ziel. Das wollen wir.quelle ziel/(ohne Schrägstrich) → es entstehtziel/quelle/, also ein Ordner zu viel.
Liegt eine Seite auf einem anderen Rechner, steht der Server davor: SERVER:pfad/. Der Pfad nach dem Doppelpunkt gilt ab dem Home-Ordner auf dem Server.
Die wichtigsten Optionen
| Option | Bedeutung |
|---|---|
-a | Archiv-Modus: Unterordner mitnehmen, Datum und Rechte erhalten. Fast immer dabei. |
-v | Listet jede übertragene Datei auf |
--dry-run | Probelauf: zeigt nur, was passieren würde, überträgt nichts |
--info=progress2 | Eine einzige Fortschrittszeile statt langer Liste |
-z | Komprimiert während der Übertragung. Lohnt sich übers Internet (live → local), nicht auf demselben Server. |
--exclude=NAME | Ordner oder Dateien mit diesem Namen weglassen, mehrfach möglich |
--delete | Löscht im Ziel, was es in der Quelle nicht gibt (echter Spiegel). Vorsicht, nur bewusst und nur mit vorherigem --dry-run. |
Die Fortschrittszeile lesen:
24,747,926 0% 226.64MB/s 0:00:00 (xfr#36, to-chk=0/4505)24,747,926→ so viele Bytes wurden übertragen, also rund 25 MB0%→ rsync rechnet den Fortschritt an allen Dateien im Ordner (2,8 GB). 25 MB davon sind weniger als 1 %, darum zeigt es 0 %. Das heisst nicht «nichts gemacht», sondern «nur ein winziger Teil musste übertragen werden».226.64MB/s→ Geschwindigkeit. So hoch, weil live und stage auf demselben Server liegen0:00:00→ Dauer, unter einer Sekundexfr#36→ 36 Dateien wurden übertragen («xfr» = transfer)to-chk=0/4505→ von 4505 Dateien sind noch 0 zu prüfen, also fertig
Meine Regeln
- Immer zuerst
--dry-runund die Liste anschauen. - Nie nach live.
- Kein
--deleteim Normalfall. So kommt nur dazu, gelöscht wird nichts. - Fall nötig lassen wir die von Drupal erzeugten Daten weg: (
styles,css,js,php,languages,translations). Das erzeugt Drupal auf jeder Umgebung neu. - Backups und Einstellungen bleiben, wo sie sind (
backup_migrate,deployment-settings,tmp). - Danach
drushh cr. - Die Dateien nützen nur, wenn die Datenbank sie auch kennt. Darum am besten nach einem frischen Live-Dump abgleichen.
Verbindung zum Server
SERVER: Hier kann man einfach den SSH-Hostnamen aus ~/.ssh/config verwenden, also meine üblichen Kürzel für den SSH-Zugang.
Vorlagen
hbm (alte Struktur)
Die Struktur ist historisch gewachsen, darum arbeiten wir hier mit Ausnahmen: alles holen, ausser was Drupal selbst erzeugt.
Live → stage (auf dem Server, beides liegt dort):
rsync -a --info=progress2 --exclude=styles --exclude=css --exclude=js --exclude=php --exclude=languages --exclude=translations --exclude=library-definitions ~/httpdocs/web/sites/default/files/ ~/stage.hbmhealthcare.com/web/sites/default/files/rsync -a --info=progress2 --exclude=backup_migrate ~/httpdocs/private/files/ ~/stage.hbmhealthcare.com/private/files/Live → local (auf dem Mac, im Projektordner):
rsync -az --info=progress2 --exclude=styles --exclude=css --exclude=js --exclude=php --exclude=languages --exclude=translations --exclude=library-definitions SERVER:httpdocs/web/sites/default/files/ web/sites/default/files/rsync -az --info=progress2 --exclude=backup_migrate SERVER:httpdocs/private/files/ private/files/Live → dev: wie stage, nur mit ~/dev.hbmhealthcare.com/ als Ziel.
Vorlagen modestia (neue Struktur)
Der Composer-Root liegt hier eine Ebene tiefer (public/), private daneben. Lokal arbeiten wir darum im Projektordner über public/.
Live → stage (auf dem Server):
rsync -a --info=progress2 --exclude=styles --exclude=css --exclude=js --exclude=php --exclude=languages --exclude=translations ~/httpdocs/public/web/media/ ~/stage.modestia.ch/public/web/media/rsync -a --info=progress2 ~/httpdocs/private/feeds/ ~/stage.modestia.ch/private/feeds/In private holen wir nur feeds. backup_migrate, deployment-settings und tmp bleiben pro Umgebung.
Live → local (auf dem Mac, im Projektordner über public/):
rsync -az --info=progress2 --exclude=styles --exclude=css --exclude=js --exclude=php --exclude=languages --exclude=translations SERVER:httpdocs/public/web/media/ public/web/media/rsync -az --info=progress2 SERVER:httpdocs/private/feeds/ private/feeds/Live → dev: wie stage, mit ~/dev.modestia.ch/ als Ziel.
Die letzten Backups holen
Das geht am einfachsten via SFTP.
Ausblick: Starter-Struktur
Im Starter speichern alle Upload-Felder in feste Oberordner, darunter feiner nach Inhalt:
public/web/media/
images/ ← alle Bildfelder und CKEditor-Bilder
files/ ← alle Dateifelder und CKEditor-Dateien
(styles, css, js, php … erzeugt Drupal selbst daneben)
private/
images/ ← geschützte Bilder (falls nötig)
files/ ← geschützte Dateien
feeds/, backup_migrate/, tmp/, deployment-settings/Dann braucht rsync keine Ausnahmen mehr, sondern nur noch die zwei oder drei Nutzerordner:
rsync -az --info=progress2 SERVER:httpdocs/public/web/media/images/ public/web/media/images/
rsync -az --info=progress2 SERVER:httpdocs/public/web/media/files/ public/web/media/files/
rsync -az --info=progress2 SERVER:httpdocs/private/files/ private/files/Neue Ordner, die Drupal oder ein Modul irgendwann anlegt, landen automatisch ausserhalb und können nichts durcheinanderbringen.