Cover Image

Nach einigen Jahren mit Google Chrome und Vivaldi Browser teste ich gerade ob ich mit Firefox klarkommen. Firefox bietet deutlich bessere Möglichkeiten die eigenen Daten zu schützen. Zudem scheint er unter Linux etwas besser integriert zu sein wie Vivaldi. Darauf möchte ich aber jetzt in dem Blog-Post nicht genauer eingehen. Es geht vielmehr darum, wie man mehrere Browser-Einstellungen synchronisieren kann und die eigentlichen Daten auf dem eigenen Servern bleiben.

Firefox bietet die Möglichkeit über ein Konto alle Einstellungen des Browsers in der Cloud von Mozilla abzulegen. Das ist keine neue Funktion. So gut wie jeder aktuelle Browser verfügt heute über die Möglichkeit die Bookmarks, Einstellungen, Extension etc. auf einem zentralen Server abzulegen. Das ist praktisch, wenn man mehrere Geräte (Workstation, Laptop, Mobilgerät) nutzt. Wer etwas kritischer ist, was die Daten angeht, und überlegt wo er diese ablegt und wem er hier vertraut findet möchte diese vielleicht selbst unter Kontrolle haben. Ich selbst habe keine Probleme meine Bookmarks in irgendeiner Cloud abzulegen. Allerdings möchte ich meine Daten etwas mehr verteilen damit nicht ein Anbieter alle Daten hortet. Wenn es funktioniert lege ich die Daten aber gerne in meinem eigenen Netzwerk Zuhause ab.

Mozilla bietet zwei wichtige Komponenten Open Source an:

  1. Firefox Account Server Account-Server für Mozilla Single Sign-On Dienst.
  2. Sync-Server für die eigentlichen Daten

Das bedeutet in der Praxis, dass man sich über den Account-Server anmeldet und über den Syncserver seine Daten synchronisiert. Im ersten Schritt habe ich einen Syncserver aufgesetzt. Mal sehen… vielleicht setze ich mir auch einen Account-Server auf um auch die Kontroller über den Login selbst zu haben.

Docker Image

Da meine Infrastruktur mit Docker aufgebaut ist, habe ich zuerst nach einem offiziellen Docker-Image gesucht. Und sieht da, es gibt eins im Docker-Hub.
https://hub.docker.com/r/mozilla/syncserver

Leider nutzt das offizielle Image Sqlite als Datenbank-Backend. Da Sqlite nicht für den Mehrbenutzerbetrieb ausgelegt ist, habe ich mich dazu entschieden das Datenbank-Backend auf Postgres umzustellen. Das funktioniert indem man die Python Bibliothek psycopg2 installiert. Das Basis-Image ist ein Alpine-Linux mit einem alten Python 2.7. Damit die psycopg2 beim erstellen des Image richtig kompiliert, muss noch das postgresql-dev Paket installiert sein. Wenn ihr sqlite verwenden möchtet, kann einfach das offizielle mozilla/syncserver Docker-Image verwendet werden. Es ist auch möglich MySQL als Datenbank-Backend zu verwenden. Ich habe allerdings einen zentralen Postgres-Server am laufen und wollte den dafür nutzen.

Das Dockerfile sieht dann wie folgt aus:

FROM mozilla/syncserver

USER root

RUN apk add --no-cache postgresql-dev && \
    pip install psycopg2

USER 1000

Netzwerk / Traefik Konfiguration

Das ganze muss natürlich auch irgendwie von außen erreichbar sein. Ich nutze in meinem Netzwerk einen Traefik-Server.

Das docker-compose.yml meines Projekts sieht wie folgt aus:

version: '3.7'
services:
    mozilla-sync:
        container_name: mozilla-sync
        build: .
        env_file:
            - syncserver.env
        restart: always
        labels:
            - "com.centurylinklabs.watchtower.enable=false"
            - "traefik.enable=true"
            - "traefik.http.routers.mozilla-sync.rule=Host(`<your-public-domain>`)"
            - "traefik.http.routers.mozilla-sync.tls=true"
            - "traefik.http.routers.mozilla-sync.tls.certresolver=letsencrypt"
            - "traefik.http.routers.mozilla-sync.entrypoints=https"
            - "traefik.http.services.mozilla-sync.loadbalancer.server.port=4500"

Die Umgebungsvariablen habe ich die Datei syncserver.env ausgelagert:

SYNCSERVER_PUBLIC_URL=https://<your-public-server-url>
SYNCSERVER_SECRET=<your-secret-for-encryption>
SYNCSERVER_SQLURI=postgresql://<db-user>:<db-pass>@<db-host>/<db>
SYNCSERVER_BATCH_UPLOAD_ENABLED=true
SYNCSERVER_FORCE_WSGI_ENVIRON=true

# nach erstem Sync die Variable wieder auf "false" setzen und Container mit "docker-compose up -d" neu erstellen
SYNCSERVER_ALLOW_NEW_USER=true
PORT=4500

Ersetzt einfach die Platzhalter für die Datenbank-Daten mit euren und natürlich tragt ihr bei der Public-URL die Domäne ein die im Traefik-Server freigegeben wurde.

Wenn alles läuft, solltet ihr in eurer Datenbank diese Tabellen sehen:

Wenn die Datenbank-Verbindung fehlschlägt, sieht man das im Log des Containers.

Browser-Einstellungen

Desktop

Damit euer Firefox Browser den neuen Sync-Server nutzt, muss man diesen über about:config eintragen.

Sucht nach identity.sync.tokenserver.uri und tragt dann die Public-URL eures Sync-Servers und den Pfad zur Token Endpunkt ein.

/token/1.0/sync/1.5

Android

Unter Android ist es ähnlich aber etwas komplizierter. Um den Sync-Server einzutragen, darf man nicht bei Mozilla eingeloggt sein. Loggt euch also vorher aus.

Danach geht ihr in die Einstellungen unter “Über Firefox” und drückt 5x hintereinander auf das Firefox-Logo.

Danach erscheint in den Einstellungen die Möglichkeit den Syncserver einzutragen. Dort tragt ihr die gleiche URL ein.

Firefox for Android - Syncserver Einstellungen

Jetzt noch einloggen und die Synchronisation sollte funktionieren.

Fehlersuche

Sollte die Synchronisation nicht funktionieren kann man auf im Desktop-Firefox die URL about:sync-log öffnen und dort die Log-Dateien anschauen. Ich selbst hatte erste 404 Meldungen da in meiner URL das “/token” gefehlt hatte.

Bestehende Daten bei Mozilla löschen

Wer bereits den offiziellen Mozilla-Syncserver genutzt hatte, möchte vielleicht seine vorhandenen Daten, nach der Einrichtung des eigenen Servers, löschen.

Im Syncserver ist ein kleines Script enthalten das ihr dazu aufrufen könnt.

Ich habe das Script wie folgt aufgerufen:

docker-compose exec mozilla-sync python bin/delete_user_data.py <firefox account email>

Nach dem Aufruf wird noch nach dem Login-Passwort gefragt. Das eingeben und bestätigen. Danach sollten die Daten auf dem Mozilla Server gelöscht sein und ihr habt dann die Hoheit über die eigenen Daten.