Einen Drive-Ordner alle zehn Minuten nach S3 spiegeln
Ein geteilter Drive-Ordner ist der richtige Ort, an dem Leute Dateien ablegen. Er ist der falsche Ort, um darauf zu verlinken. Ein Drive-Link öffnet eine Vorschauseite, verlangt die halbe Zeit ein Login, sieht je nach Klicker anders aus und taugt nicht als src-Attribut oder in einem Massen-Upload. Ich wollte den Ordner so, wie die Leute ihn benutzen, und ein schlichtes https://.../ordner/datei.mp4 für alles darin.
rclone macht das in einem Befehl, und cron führt ihn alle zehn Minuten aus.
Der Aufbau
Zwei rclone-Remotes: eins für Drive, eins für S3. Das Drive-Remote richtest du mit rclone config und einem OAuth-Durchlauf im Browser ein, einmal. Das S3-Remote bekommt einen Zugangsschlüssel mit Schreibrechten auf genau einen Bucket, sonst nichts. Dann das Kopieren:
rclone sync drive:Creatives s3:mein-oeffentlicher-bucket/creatives \
--drive-shared-with-me=false \
--s3-acl public-read \
--transfers 4 --checkers 8 \
--exclude "*.gdoc" --exclude "*.gsheet" --exclude "~$*" \
--log-file ~/mirror.log --log-level NOTICE
Pack das in flock, damit ein langsamer Lauf mit einem großen Video nie mit dem nächsten Takt überlappt, und trag es mit */10 * * * * in die crontab ein. Das ist das ganze System.
sync oder copy
rclone sync macht das Ziel gleich mit der Quelle, Löschungen eingeschlossen. Entfernt ein Cutter eine Datei aus Drive, ist sie zehn Minuten später aus S3 verschwunden, und jeder Link darauf ist tot. rclone copy fügt nur hinzu und aktualisiert, löscht nie. Was du willst, hängt davon ab, ob "ist aus dem Ordner raus" auch "ist aus dem Netz raus" bedeuten soll. Für einen Ordner mit Werbemitteln wollte ich sync, weil eine alte Version unter einer stabilen URL genau der Weg ist, wie die falsche Datei in einer Kampagne landet. Für ein Archiv würde ich copy nehmen. Entscheide das vor dem ersten Lauf, nicht nach der ersten überraschten Nachricht.
Was mich erwischt hat
Google-eigene Dokumente sind keine Dateien. Ein Google Doc im Ordner hat keine Bytes zum Kopieren; rclone kann es als .docx exportieren oder überspringen. Ich schließe sie aus, denn der Ordner ist für fertige Medien, und ein Doc darin ist ein Versehen.
Leerzeichen und Umlaute in Dateinamen werden in der URL prozentkodiert. Die Datei ist in Ordnung, der Link ist hässlich und bricht beim Einfügen. Ich habe die Cutter um eine Namensregel gebeten (klein, Bindestriche, keine Leerzeichen) und vor dem Sync einen winzigen Umbenennungsschritt eingebaut für alles, was sie verletzt. Nach einer Woche hatte sich die Regel durchgesetzt.
Content-Types kommen aus der Endung. Ein .mp4 bekommt video/mp4 und spielt direkt ab; eine Datei ohne Endung bekommt binary/octet-stream und lädt herunter. Wieder die Namensregel.
Die Drive-API hat ein Tageskontingent, und rclones Standardanzahl an Checkern ist höflich genug, dass ein Zehn-Minuten-Takt auf ein paar tausend Dateien es nie berührt. Wächst der Ordner darüber hinaus, spart --fast-list die Listenaufrufe.
Public-read auf einem Bucket ist eine Entscheidung. In den Ordner kommt nichts, was nicht im offenen Netz stehen darf, und der Ordnername sagt das auch.
Warum zehn Minuten
Schnell genug, dass ein Cutter eine Datei fertigstellt, einen Kaffee holt und die URL einfügt. Langsam genug, dass ein Lauf fast nie den nächsten überlappt. Ein Webhook wäre schneller und wäre auch ein Ding mehr, das kaputtgehen kann; eine Cron-Zeile ist das nicht.
