Firefox-Sync-Server selbst hosten
(blog.diego.dev)- Nach dem Wechsel von Firefox zu LibreWolf sollte die Browser-Synchronisierung selbst betrieben werden; nach der Prüfung mehrerer Repositories und Docker-Konfigurationen entstand schließlich ein funktionierender Server
- Mozillas alter syncserver ist zwar eine All-in-one-Konfiguration, warnt aber vor eingestellter Wartung, sodass das Rust-basierte syncstorage-rs die realistischere Option wurde
- Das offizielle Docker-Verfahren war wegen der Kopiervorgänge für
grpcio,protobufundmozilla-rust-sdkschwer nachzuvollziehen; die Community-Konfiguration syncstorage-rs-docker wurde zur tatsächlichen Deployment-Basis - Die endgültige Konfiguration startet per
docker-compose.yamlMariaDB 10.6.13 undfirefox_syncserver; Caddy fungiert als Reverse Proxy auffirefox_syncserver:8000 - Persistente DB-Daten, knapper Speicherplatz und Experimente mit Docker-Abläufen waren die größten Hürden; wer mit Docker- oder DB-Betrieb nicht vertraut ist, muss mit hoher Einrichtungskomplexität rechnen
Warum der Wechsel von syncserver zu syncstorage-rs erfolgte
- Nach dem Umstieg von Firefox auf LibreWolf begann die Arbeit daran, einen Firefox-Sync-Server selbst zu hosten
- Der zuerst gefundene Mozilla syncserver war ein All-in-one-Paket fürs Self-Hosting
- Enthielt den tokenserver für die Authentifizierung und syncstorage für die Speicherung gemeinsam
- In der Build-Historie gab es ein „failed“-Tag
- Im Repository wird darauf hingewiesen, dass es nicht mehr gewartet wird und man zum neuen Rust-basierten Projekt wechseln soll
- Anschließend fiel die Wahl auf syncstorage-rs
- Eine moderne, Rust-basierte Version des bisherigen Projekts
- Es gab kein sofort nutzbares Docker-Image
- Die Dokumentation enthielt zwar Anweisungen zum Ausführen mit Docker, der Konfigurationsablauf war jedoch komplex
- In der offiziellen Docker-Dokumentation gab es mehrere Stellen, an denen es nicht weiterging
- Es wurde empfohlen, die Versionen von
grpcioundprotobufan die vongoogle-cloud-rust-rawverwendeten Versionen anzupassen - Der Inhalt von
mozilla-rust-sdkmusste manuell in das oberste Root-Verzeichnis kopiert werden - Auch nach Prüfung von Repository, Dockerfile, Makefile und CircleCI-Workflow war der nächste Schritt nicht klar
- Es wurde empfohlen, die Versionen von
- syncstorage-rs-docker bietet eine einfachere Docker-Konfiguration
- Dort wurde beschrieben, dass nach Problemen mit der ursprünglichen Dokumentation ein Docker-Container für die eigene Infrastruktur erstellt wurde
- Auf Basis dieser Konfiguration wurde die tatsächliche Servereinrichtung umgesetzt
Mit Docker Compose und Caddy abgeschlossene Deployment-Konfiguration
- In
docker-compose.yamlwurden Dienste für MariaDB und den Firefox-Sync-Server hinzugefügtfirefox_mariadbnutzt das Imagelinuxserver/mariadb:10.6.13- Das DB-Daten-Volume ist auf
/data/ffsync/dbdata:/configgesetzt firefox_syncserverbaut das Dockerfile aus/root/ffsyncund exponiert den Port8000:8000- Zu den wichtigsten Umgebungsvariablen gehören
SYNC_URL,SYNC_CAPACITY,SYNC_MASTER_SECRET,METRICS_HASH_SECRET,SYNC_SYNCSTORAGE_DATABASE_URLundSYNC_TOKENSERVER_DATABASE_URL
- Bei DB-Passwörtern sollte man Sonderzeichen wie
"/|%"eher vermeiden- Während der Einrichtung konnten dadurch Probleme entstehen
- Um die Build-Zeit während der Tests zu verkürzen, wurde das Argument
BUILDKIT_INLINE_CACHEzu Docker Compose hinzugefügt - Die DB-Initialisierung erfolgte, indem das Repository geklont und anschließend Dockerfile sowie
initdb.shauf den Server kopiert und teilweise angepasst wurden- MariaDB-Container starten:
docker-compose up -d firefox_mariadb - Initialisierungsskript ausführen:
chmod +x initdb.sh ./initdb.sh - Gesamten Stack starten:
docker-compose up -d
- MariaDB-Container starten:
- Der Caddy-Reverse-Proxy wurde so konfiguriert, dass er auf den neuen Sync-Server zeigt
- Das Konfigurationsbeispiel verbindet
mydomain:443mitreverse_proxy firefox_syncserver:8000 - Nach dem Aktualisieren des DNS-Eintrags wurde Caddy neu gestartet, und der Sync-Server funktionierte
- Das Konfigurationsbeispiel verbindet
Hürden und Zeitaufwand bei der Einrichtung
- Das größte Problem waren die persistenten MariaDB-Daten; bei Container-Neustarts mussten alte Daten bei Bedarf gelöscht werden
- Durch wachsende Docker-Images und Zwischendateien wurde der Speicherplatz auf dem Server knapp
- Bis der richtige Ablauf gefunden war, mussten mehrere Docker-Konfigurationen ausprobiert werden
- Ein eigener Firefox-Sync-Server ist ohne Erfahrung mit Docker oder DB-Verwaltung nicht schnell erledigt, wurde aber dank Community-Arbeiten wie
syncstorage-rs-dockereinrichtbar - Die gesamte Einrichtung dauerte etwa 2 Stunden
1 Kommentare
Hacker-News-Kommentare
Auch diese Konfiguration hängt für einige Begleitdienste wie Authentifizierung, E-Mail und Account-Metadaten weiterhin von der Mozilla-Infrastruktur ab
https://github.com/dan-r/syncstorage-rs-docker/blob/main/app...
Trotzdem ist es ein guter Ausgangspunkt, und wenn man eine Account-Migration in Kauf nimmt, kann man diese Teile später ergänzen. Es ist auch möglich, alle Komponenten vollständig selbst zu hosten, aber das ist etwas aufwendiger. Im Vergleich zu meiner letzten Einrichtung scheinen sich Dokumentation und Developer Experience verbessert zu haben
https://github.com/mozilla/fxa
https://mozilla.github.io/ecosystem-platform/tutorials/devel...
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Für Firefox for iOS 9.0 oder neuer hieß es: In die Einstellungen gehen, fünfmal auf die Versionsnummer tippen, unter „Advance Account Settings“ die content-server-URL eintragen und „Use Custom Account Service“ aktivieren
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Garuda Linux betreibt schon seit ziemlich langer Zeit einen eigenen Firefox-Sync-Server für den FireDragon-Browser
defaultPref("identity.sync.tokenserver.uri", "https://ffsync.garudalinux.org/token/1.0/sync/1.5"); // --> FIREDRAGON CONFIGAllerdings scheint dort der alte Sync-Server zu laufen, nicht die Rust-Version
[1] https://firedragon.garudalinux.org/
[2] https://gitlab.com/garuda-linux/infra-nix/-/blob/main/docker...
Meine Erfahrungen mit Self-Hosting habe ich ebenfalls hier dokumentiert
https://kyzer.me.uk/syncserver/
Es ist möglich, aber wirklich eine langweilige und mühsame Arbeit. Die frühere Version wurde aufgegeben und war in Python 2 geschrieben, also völlig veraltet, war aber deutlich besser
Man braucht weder Docker noch Python, derzeit aber MySQL. Ein Freiwilliger arbeitet daran, wie in der alten Version standardmäßig SQLite zu unterstützen; die Hauptbeitragenden scheinen jedoch eher damit beschäftigt zu sein, Firma zu spielen und Texte zu schreiben, die das Sammeln von Metriken und die Einführung neuer Metrik-Frameworks rechtfertigen, statt Self-Hosting einfacher zu machen
Es lohnt sich auch, https://github.com/canvas-ai/canvas-browser-extensions anzuschauen oder zu verfolgen
Das ist ein Tool, das Chrome-/Firefox-Browser-Tabs in einen selbst gehosteten virtuellen Verzeichnisbaum synchronisieren soll, der von LMDB und Roaring-Bitmap-Indizes angetrieben wird. Rückblickend hätte ich von Anfang an rxdb oder pouchdb verwenden und nur die Bitmaps beibehalten sollen, aber dorthin wird es am Ende gehen
Der Ablauf ist, passend zur aktuellen Aufgabe einen neuen Kontextpfad wie
universe://travel/2024/03/barcelonaanzulegen, je nach Konfiguration die aktuellen Tabs zu speichern und sie dann zu schließen; neue Arbeits-Tabs wie Airbnb-Suchen werden diesem Kontext hinzugefügt. Der Ehepartner kann denselben Kontext öffnen und gemeinsam daran arbeiten, und wenn automatische Synchronisierung aktiviert ist, kann das auch so funktionieren, dass man gegenseitig die Tabs schließtDie Serverkomponente wird derzeit neu geschrieben, und genau da zeigt sich mein Amateurismus. Auf einer Basis mit zwei Nutzern kann man sogar den dummen Fehler machen, gleichzeitig die gesamte API, das Backend und die Module neu zu schreiben und dabei bestehende Funktionen unwiederbringlich kaputtzumachen. Mit heutigen Tools wie Cursor und Claude 3.7 ist die größte Grenze für Ideen am Ende die Zeit
Ich habe das eine Zeit lang so genutzt und sogar die Authentifizierung selbst gehostet, bin aber letztlich zu dem Schluss gekommen, dass Mozilla eines der sehr wenigen Unternehmen ist, denen ich meine Daten anvertrauen würde. Vielleicht ist dieses Vertrauen fehl am Platz. Der Sync-Server ist relativ einfach einzurichten, der Authentifizierungsserver dagegen deutlich komplexer; verglichen mit einem öffentlich gehosteten Dienst sehe ich darin keinen großen Mehrwert
Danke. Das war der einzige Punkt, der mich bisher davon abgehalten hat, zu LibreWolf zu wechseln.
Derzeit scheinen nur MySQL und Spanner als Datenbank-Engines unterstützt zu werden, aber an Support für SQLite und Postgres wird ebenfalls gearbeitet[1]. Wenn das bald gemergt wird, dürfte es deutlich einfacher werden, den gesamten Sync-Speicher als eine einzige SQLite-Datei zu sichern. Bei einer Multi-User-Instanz wäre es allerdings wohl besser, in Postgres zu speichern, weil dort parallele Updates besser unterstützt werden.
Nachtrag nach eigenem Ausprobieren: Wie genau kann man Firefox (LibreWolf) dazu zwingen, die selbst gehostete URL zu verwenden? Gibt es dafür eine
about:config-Einstellung?1: https://github.com/mozilla-services/syncstorage-rs/issues/49...
about:config-Variable zu ändern.In Firefox soll man zu
about:configgehen undidentity.sync.tokenserver.uriauf http://localhost:5000/1.0/sync/1.5 ändern. Natürlich muss man die URL an die eigene Umgebung anpassen.Wenn Firefox Sync Ende-zu-Ende-verschlüsselt ist, frage ich mich, welchen Vorteil das aus Datenschutzsicht bringt.
https://support.mozilla.org/en-US/kb/sync
Etwas Ähnliches wie Firefox Sync ist Floccus. Wenn man nur Lesezeichen und Tabs synchronisieren möchte, wirkt die Einrichtung recht einfach.
https://floccus.org/
Es wäre gut, klarzustellen, dass LibreWolf und Waterfox den Kurs geändert haben und den Mozilla Sync Server verwenden, und das wie unten optional zu machen:
Wählen Sie zum Synchronisieren eine der folgenden Optionen:
[x] Custom Sync Server: ___________[ ] Mozilla SyncDas liegt lange brach, und der Code ist nur ein mieser Proof of Concept, aber es bedeutet immerhin, dass ich mir zu dem Thema ein halbwegs fundiertes Urteil erlauben kann.
Für technische Nutzer wäre es meiner Ansicht nach am besten, wenn Firefox-Forks Sync durch etwas Standardisierteres wie S3 oder WebDAV ersetzen würden. Wenn ich mich richtig erinnere, gibt es in Sync keine Funktion, die diese Protokolle nicht genauso gut oder sogar besser abdecken könnten. Diese sind nämlich tatsächlich einigermaßen interoperable Standards.
Es wäre schön, wenn Mozilla das ebenfalls täte, aber die Vorliebe für Eigenentwicklungen scheint dort zu stark zu sein, daher erwarte ich das kaum. Ich bin sehr froh, dass aus dieser Neigung Rust entstanden ist, aber Sync ist nahezu Müll, der gar nicht erst hätte gebaut werden sollen.
https://blog.mozilla.org/services/2011/03/22/get-syncing-wit...
Eine der ersten Fragen war, ob man einen Custom Sync Server verwenden möchte, und dieser „Custom Sync Server“ konnte auch etwas so Einfaches wie ein WebDAV-Server sein. Wenn man einen öffentlichen HTTP-Server hatte, wurde das fast schon unterstützt oder erforderte nur sehr wenige zusätzliche Abhängigkeiten. Außerdem wurde zusätzlich zum Login-Schlüssel auch nach einem Ende-zu-Ende-Verschlüsselungsschlüssel gefragt.
Dass das Self-Hosting gelungen ist, ist erfreulich. Allerdings wirkt die Lösung unnötig komplex. Man sollte keinen Datenbankserver und Docker aufsetzen müssen, nur um eine sehr kleine Datenmenge zu synchronisieren. Ideal wäre SQLite und eine eigenständig ausführbare Sync-Server-Implementierung.
Jemand könnte https://github.com/mozilla-services/syncstorage-rs forken, den Zusatzballast entfernen und das Ganze ohne zusätzliche Datenbank und ohne Google-Cloud-basierte Architektur neu implementieren. Wie bei vielen Dingen müsste man dafür aber erst genug Leute mit Interesse und freier Zeit finden, um es zu entwickeln.
https://github.com/mozilla-services/syncstorage-rs/issues/49...