Eigener Firefox Sync Server mit nginx

Firefox Logo

Ein Browser ist auf fast allen Plattformen wohl das am meisten genutzte Programm. Nach den Browserkriegen sind leider viele Browser auf der Strecke geblieben, so dass es heutzutage nur noch zwei ernstzunehmende Alternativen gibt: Firefox und Chrome.

Wer Wert auf Datenschutz und Privatsphäre legt, wird allerdings um Chrome einen großen Bogen machen und stattdessen lieber Firefox nutzen.

Firefox bietet schon sehr lange ein Feature mit dem alle Browser-Einstellungen in der Cloud synchronisiert werden: Firefox Sync. Dazu wird ein Firefox-Konto benötigt, mit dem man sich im Browser einloggt. Anschließend können alle Firefox-Einstellungen (Lesezeichen, Chronik, verwendete Addons, etc.) mit der Mozilla-Cloud synchronisiert werden und sind so auch auf mehreren Endgeräten immer auf dem aktuellsten Stand.

Damit vertraut man der Mozilla Foundation seine Daten an. Die Speicherung erfolgt dabei meistens auf US-Servern. Wer dies nicht möchte, kann zunächst einmal keine Synchronisierung bei Firefox verwenden, so dass alle Einstellungen und Addons mit jeder Browser-Installation immer manuell konfiguriert werden müssen.

Allerdings kann man auch auf dem eigenen Server einen Firefox Sync Server installieren und über diesen synchronisieren. In diesem Fall profitiert man von den Sync-Funktionen des Browsers und stellt sicher, dass alle Daten nur auf dem privaten Server gespeichert werden.

Dieser Artikel zeigt nun die Installation und Konfiguration eines eigenen Firefox Sync Servers.

Wichtiger Hinweis: Die hier gezeigte Version des Firefox Sync Servers basiert noch auf Python 2. Python 2 ist allerdings seit Anfang 2020 „End of Life“, d.h. diese Version wird nicht mehr unterstützt. Damit findet auch keine Weiterentwicklung oder die Behebung von Bugs/Sicherheitslücken mehr statt. Aus diesem Grund ist meiner Meinung nach davon abzuraten, diese Version des Firefox Sync Servers aufzusetzen.
Eine neue Version des Sync Servers (auf der Basis von Rust) ist bereits in der Entwicklung, allerdings ist hier nicht bekannt, wann diese neue Version als stabil anzusehen ist.

Hinweis: Dieser Artikel ist eher etwas für Fortgeschrittene. Den Firefox Sync Server kann man nicht einfach installieren, sondern dieser muss erst aus dem entsprechenden Repository auf GitHub gecloned und anschließend selbst gebaut werden. Auch die Konfiguration ist alles andere als trivial. Daher sollte man schon etwas Erfahrung mit Linux mitbringen.

Übrigens: Wem es hauptsächlich nur um die Synchronisierung von Lesezeichen im Browser geht, der muss nicht unbedingt einen eigenen Firefox Sync Server betreiben. In diesem Fall können bei einer vorhandenen Nextcloud-Instanz die Lesezeichen auch einfach über die private Cloud synchronisiert werden. Wie das genau funktioniert, wurde bereits in einem anderen Artikel erklärt: Nextcloud: Lesezeichen synchronisieren mit Chrome/Firefox

Update-Historie (letztes Update 22.03.2021)
  • 22.03.2021:
    • Hinweise bzgl. „End of Life“ Python 2 hinzugefügt.
  • 08.05.2019:
    • Hinwies hinzugefügt, dass die Angabe eines eigenen Sync Servers für Firefox auf iOS nicht funktioniert (siehe hier).
  • 05.05.2019:
    • Ergänzende Informationen hinzugefügt, falls andere Datenbank-Systeme für den Sync Server zum Einsatz kommen sollen (PostgreSQL oder MySQL/MariaDB).

Voraussetzungen

Alle Schritte wurden mit Ubuntu Server 18.04 LTS durchgeführt, sollten aber auch mit anderen Distributionen funktionieren.

Voraussetzung ist auf jeden Fall ein bereits fertig konfigurierter Webserver (in diesem Fall nginx). Dieser muss bereits so eingerichtet sein, dass Verbindungen mittels HTTPS möglich sind.

Die gezeigte Konfiguration basiert darauf, dass der Firefox Sync Server auf einer eigenen Subdomain (firefox-sync.meinedomain.de) betrieben wird. Es ist allerdings auch möglich, den Server in einem Unterverzeichnis des Webservers zu betreiben (z.B. meinedomain.de/firefox-sync). Hier unterscheidet sich lediglich die Webserver-Konfiguration (vHost). Dies wird im Abschnitt über die Webserver-Konfiguration behandelt.

Da eine detaillierte Beschreibung der Webserver-Konfiguration den Rahmen des Artikels sprengen würde, verweise ich an dieser Stelle auf weitere Artikel, die für das Thema relevant sind:

Installation

Wie bereits erwähnt, kann der Firefox Sync Server nicht einfach über die Paketverwaltung installiert werden, sondern es sind einige manuelle Handgriffe notwendig.

Wir beginnen wie üblich damit, das System auf den neusten Stand zu bringen:

apt-get update && apt-get upgrade -V

Anschließend werden die Pakete installiert, die wir zum Bauen des Sync Servers benötigen:

apt-get install make python-dev git-core python-virtualenv g++

Nun wird das entsprechende GitHub-Repository gecloned und der Sync Server gebaut:

cd /opt
git clone https://github.com/mozilla-services/syncserver
cd syncserver
make build

Die Dateien für den Sync Server liegen dann unter /opt/syncserver.

Konfiguration

Nun geht es an die Konfiguration des Sync Servers.

Als erstes benötigen wir ein „Secret“, welches dann später in der Konfiguration angegeben wird. Auch wenn es so wirkt: Dieser Schritt ist nicht optional, ohne Angabe des Secrets wird der Sync Server später nicht funktionieren.
Um das Secret zu erzeugen, nutzen wir einfach folgenden Befehl (anschließend in die Zwischenablage kopieren):

head -c 20 /dev/urandom | sha1sum

Danach kann es auch schon an die Bearbeitung der Konfiguration gehen:

cd /opt/syncserver 
nano syncserver.ini

Hier zunächst die komplette Datei zur Übersicht:

[server:main]
use = egg:gunicorn
host = 127.0.0.1
port = 5000
workers = 1
timeout = 30

[app:main]
use = egg:syncserver

[syncserver]
# This must be edited to point to the public URL of your server,
# i.e. the URL as seen by Firefox.
public_url = https://firefox-sync.meinedomain.de

# By default, syncserver will accept identity assertions issued by
# any BrowserID issuer.  The line below restricts it to accept assertions
# from just the production Firefox Account servers.  If you are hosting
# your own account server, put its public URL here instead.
identity_provider = https://accounts.firefox.com/

# This defines the database in which to store all server data.
sqluri = sqlite:////opt/syncserver/syncserver.db

# This is a secret key used for signing authentication tokens.
# It should be long and randomly-generated.
# The following command will give a suitable value on *nix systems:
#
#    head -c 20 /dev/urandom | sha1sum
#
# If not specified then the server will generate a temporary one at startup.
secret = b6ff9a32108ca32272bcf8322b5274e93031fb90

# Set this to "false" to disable new-user signups on the server.
# Only requests by existing accounts will be honoured.
# allow_new_users = true

# Set this to "true" to work around a mismatch between public_url and
# the application URL as seen by python, which can happen in certain reverse-
# proxy hosting setups.  It will overwrite the WSGI environ dict with the
# details from public_url.  This could have security implications if e.g.
# you tell the app that it's on HTTPS but it's really on HTTP, so it should
# only be used as a last resort and after careful checking of server config.
force_wsgi_environ = true

Erläuterungen zu den einzelnen Einstellungen:

  • host = 127.0.0.1
    

    Sorgt dafür, dass der Sync Server nur lokal aufgerufen werden kann – die Kommunikation „nach außen“ übernimmt später ja nginx.

  • public_url = https://firefox-sync.meinedomain.de
    

    Dies ist die öffentliche URL des Sync Servers. Die konkrete URL hängt dabei von der Webserver-Konfiguration ab (siehe nächster Abschnitt).

  • identity_provider = https://accounts.firefox.com/
    

    Zur Authentifizierung wird ein vorhandener Firefox-Account eingesetzt.

  • sqluri = sqlite:////opt/syncserver/syncserver.db
    

    Angabe der Datenbank, in der die synchonisierten Objekte gespeichert werden. Hier verwenden wir einfach eine SQLite Datenbank, es wäre aber auch möglich, eine PostgreSQL oder MySQL/MariaDB Datenbank zu verwenden (Erläuterungen siehe unten).

  • secret = b6ff9a32108ca32272bcf8322b5274e93031fb90
    

    Hier wird einfach der Wert eingetragen, den wir gerade über die Kommandozeile generiert haben.

  • allow_new_users =true
    

    Dies sorgt dafür, dass automatisch neue Benutzerkonten angelegt werden, wenn sich diese zum erstem Mal mit diesem Sync Server verbinden. Wenn dieser Wert auf false gesetzt wird, wird die Synchronisierung für neue Accounts nicht mehr funktionieren (dazu später mehr).

  • force_wsgi_environ = true
    

    Diese Einstellung muss in der gezeigten Konfiguration auf true gesetzt werden und sogt dafür, dass der Sync Server auch dann noch funktioniert, wenn die Public URL (die über nginx konfiguriert wird) von der URL abweicht, die der Sync Server intern „sieht“. Durch die Verwendung von nginx als Proxy für den Sync Server werden diese beiden URLs in diesem Kontext nie gleich sein, daher muss der Wert an dieser Stelle angepasst werden.

Ergänzende Informationen bei anderen Datenbanken

Für kleinere Sync Server Instanzen reicht die SQLite-Datenbank vollkommen aus. Ebenso ist diese am einfachsten zu konfigurieren, da hier keine zusätzlichen Schritte erforderlich sind.

Allerdings können auch andere Datenbank-Systeme zum Speichern der Daten eingesetzt werden, z.B. PostgreSQL oder MySQL/MariaDB. Empfehlenswert dürfte dies nur bei Servern sein, die sehr viele Nutzer bedienen müssen, oder wenn das entsprechende Datenbank-System bereits auf dem Server installiert ist. Aus diesem Grund gehe ich bei den folgenden Schritten davon aus, dass PostgreSQL bzw. MySQL/MariaDB bereits auf dem System installiert und konfiguriert ist.

PostgreSQL

Um eine Verbindung zu PostgreSQL herstellen zu können, sind ein paar zusätzliche Programme zu installieren:

apt-get install postgresql-server-dev-10 python-pip
cd /opt/syncserver
./local/bin/pip install psycopg2

Nun muss noch eine Datenbank speziell für den Sync Server erstellt werden. Am besten geschieht das über die PostgreSQL Kommandozeile:

sudo -u postgres psql

Die Datenbank mit dem entsprechenden User wird dann folgendermaßen angelegt:

CREATE USER firefox_sync_db_user WITH PASSWORD 'MeInPaSsw0rT'; 
CREATE DATABASE firefox_sync_db WITH OWNER firefox_sync_db_user TEMPLATE template0 ENCODING 'UTF8'

Beendet wird die PostgreSQL Kommandozeile durch die Eingabe von /q.

In der syncserver.ini wird die Verbindung zur Datenbank dann mittels dieser Einstellung konfiguriert:

sqluri = postgresql://firefox_sync_db_user:MeInPaSsw0rT@localhost/firefox_sync_db

MySQL/MariaDB

Ähnliche Schritte sind durchzuführen, wenn MySQL/MariaDB zum Einsatz kommt:

apt-get install python-pip
cd /opt/syncserver
./local/bin/pip install PyMySQL

Anschließend öffnet man die MySQL-Kommandozeile:

mysql -u root -p

Nun folgt die Anlage der Datenbank:

CREATE USER firefox_sync_db_user@localhost IDENTIFIED BY 'MeInPaSsw0rT';
CREATE DATABASE firefox_sync_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on firefox_sync_db.* to firefox_sync_db_user@localhost;
FLUSH privileges;
exit;

In der syncserver.ini wird die Datanbnak dann folgendermaßen angesprochen:

sqluri = pymysql://firefox_sync_db_user:MeInPaSsw0rT@localhost/firefox_sync_db

Webserver konfigurieren

Bevor das System nun einsatzfähig ist, muss zunächst noch der Webserver entsprechend konfiguriert werden. Die genauen Details zur Konfiguration des Webservers würden leider den Rahmen des Artikels sprengen, daher erwähne ich hier nur zwei mögliche Webserver-Konfigurationen.

Wichtig ist hier nur, dass der Webserver bereits so konfiguriert ist, dass dieser mittels HTTPS angesprochen werden kann und die Verbindung damit stets verschlüsselt ist.

Nach der Anpassung des Webserver muss dieser in jedem Fall noch neu gestartet werden:

service nginx restart

Wichtig: Je nach verwendeter Konfiguration unterscheidet sich die URL, unter der der Sync Server erreichbar ist. Dies muss im weiteren Verlauf des Tutorials beachtet werden, da entsprechende URLs angepasst werden müssen.

Sync Server mit eigener Subdomain

Wenn der Sync Server mit einer eigenen Subdomain betrieben werden soll (https://firefox-sync.meinedomain.de), dann benötigt man einen separaten vHost, der für diese Subdomain verantwortlich ist.

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name firefox-sync.meinedomain.de;

        root /var/www;

	location / {
		return 301 https://$host$request_uri;
	}
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name firefox-sync.meinedomain.de;

        # Include SSL configuration (and certificates)
        include /etc/nginx/snippets/ssl.conf;

	# Include headers
        include /etc/nginx/snippets/headers.conf;

        #
        # Configuration for Firefox Sync Server
        #

        location / {
		proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_redirect off;
                proxy_read_timeout 120;
                proxy_connect_timeout 10;
                proxy_pass http://127.0.0.1:5000/;
        }
}

Sync Server in einem Unterverzeichnis des Webservers

Man kann den Sync Server allerdings auch in einem Unterverzeichnis einer bereits bestehenden (Sub-)Domain installieren. Die URL lautet dann beispielsweise https://meindomain.de/firefox-sync

Hierzu muss ein bereits bestehender vHost, der für die Domain meinedomain.de verantworlich ist, um folgenden location-Block erweitert werden. Die hinzuzufügenden Zeilen sind hier markiert:

server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name meinedomain.de;

	# Include SSL configuration
	include /etc/nginx/snippets/certs_pub.conf;
	include /etc/nginx/snippets/ssl.conf;

	# Include headers
	include /etc/nginx/snippets/headers.conf;

	location ^~ /firefox-sync/ {
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_redirect off;
		proxy_read_timeout 120;
		proxy_connect_timeout 10;
		proxy_pass http://127.0.0.1:5000/;
	}
}

Sync Server starten

Manueller Start

Nun kann der Sync Server über folgenden Befehl gestartet werden:

cd /opt/syncserver 
make serve

Hier sollten keine Fehler angezeigt werden. Die Anzeige ist allerdings „live“, d.h. es scheint erst einmal so, als ob nichts weiter passieren würde:

./local/bin/gunicorn –paste ./syncserver.ini
[2019-04-27 17:23:21 +0000] [2292] [INFO] Starting gunicorn 19.6.0
[2019-04-27 17:23:21 +0000] [2292] [INFO] Listening at: http://127.0.0.1:5000 (2292)
[2019-04-27 17:23:21 +0000] [2292] [INFO] Using worker: sync
[2019-04-27 17:23:21 +0000] [2296] [INFO] Booting worker with pid: 2296

Daher stoppen wir nach diesem kurzen Test den Prozess mit STRG+C.

Nun ist es natürlich nicht optimal, wenn man den Sync Server immer manuell starten muss und dieser dann immer die Konsole blockiert. Hier könnte man sich zwar mit einem Screen weiterhelfen, aber das ist auch nicht die beste Lösung. Der Sync Server sollte im Idealfall direkt bei Systemstart automatisch mitgestartet werden.

Autostart

Um dies zu erreichen, legen wir zunächst einen eigenen User für den Sync Server an:

useradd firefox-sync -s /bin/false --no-create-home

Dieser User muss der Owner des Programmverzeichnisses sein:

chown -R firefox-sync:firefox-sync /opt/syncserver

Nun kann auch schon eine systemd Unit angelegt werden:

nano /etc/systemd/system/firefox-sync.service

Mit folgenden Zeilen wird die Unit definiert:

[Unit]
Description=Firefox Sync Server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
User=firefox-sync
Group=firefox-sync
Umask=007
Restart=on-abort
ExecStart=/opt/syncserver/local/bin/gunicorn --paste /opt/syncserver/syncserver.ini

[Install]
WantedBy=multi-user.target

Nun sollte der Service über folgenden Befehl gestartet werden können (anschließend mit service firefox-sync status testen):

service firefox-sync start

Damit der Service nun immer automatisch bei Systemstart hochgefahren wird, ist noch ein Befehl notwendig:

systemctl enable firefox-sync

Am besten auch hier nochmal das System neu starten und dann mit service firefox-sync status prüfen, ob der Autostart auch wirklich klappt.

Browser-Konfiguration

Bevor nun Firefox den neuen Sync Server nutzen kann, sollte noch ein kurzer Test erfolgen, ob der Sync Server wie gewünscht zu erreichen ist. Dazu einfach die URL des eigenen Sync Servers in die Adress-Leiste des Browsers eingeben (https://firefox-sync.meinedomain.de). Der Browser sollte dies mit einer simplen Meldung „it works!“ quittieren. Wenn es noch nicht wie erwartet funktioniert, wird eine Meldung ausgegeben, die einen Hinweis auf das Problem liefern sollte. In diesem Fall muss zunächst dieses Problem beseitigt werden, da ansonsten kein Browser mit dem Sync Server synchronisieren kann.

Wenn der Sync Server einwandfrei läuft, kann man nun Firefox so konfigurieren, dass dieser auch den eigenen Sync Server nutzt.

Wenn der Browser schon über ein Firefox-Konto synchronisiert wurde, muss die Verknüpfung mit diesem Konto zunächst einmal getrennt werden, da sich ansonsten kein neuer Sync Server konfigurieren lässt. Dazu einfach in die Browser-Einstellungen gehen, unter Firefox-Konto findet man die Schaltfläche zum Trennen des Kontos.

Nun fragt Firefox, ob er die bereits synchronisierten Daten  auch lokal entfernen soll. Hier sollte man keine Optionen anhaken, sondern einfach nur auf Nur trennen klicken.

Die Verbindung zum Firefox-Konto wird erst einmal getrennt
Die Verbindung zum Firefox-Konto wird erst einmal getrennt

Für die Angabe des eigenen Sync Servers muss man nun in die erweiterte Browser-Konfiguration wechseln, indem man in der Adress-Leiste about:config eingibt.

Hier suchen wir nun nach folgendem Wert: identity.sync.tokenserver.uri

Mit einem Doppelklick kann der Wert geändert werden und wir geben hier die URL des eigenen Sync Servers an: https://firefox-sync.meinedomain.de/token/1.0/sync/1.5

Über about:config wird der eigene Sync-Server angegeben
Über about:config wird der eigene Sync-Server angegeben

Wichtig ist, dass neben der eigentlichen Domain, die man in der syncserver.ini angegeben hat, noch die Erweiterung token/1.0/sync/1.5 notwendig ist.

Nachdem die Einstellung gesetzt ist, muss der Browser kurz beendet und neu gestartet werden. Nun kann man wieder in die Account-Einstellungen in Firefox gehen und die Verbindung zum Firefox-Konto wieder herstellen. Der Account an sich ist dabei der gleiche, aber der verwendete Sync Server ist nun ein anderer.

Nach ein paar Augenblicken sollte die erste Synchronisierung erfolgreich durchgelaufen sein. Allerdings erhält man keine Fehlermeldung, wenn der Sync aus irgendeinem Grund nicht klappen sollte. Daher gibt man am besten nach der ersten Synchronisierung about:sync-log in die Adress-Zeile des Browsers ein. Hier sollten dann keine Einträge zu finden sein, die zeitlich zur ersten Synchronisierung passen.

Falls doch, kann man dem Eintrag öffnen und Firefox gibt technische Details zu diesem Fehler preis. Damit sollte man den Fehler dann weiter eingrenzen können.

Diese Schritte zur Verbindung vom Firefox zum eigenen Sync Server müssen dann auf allen Rechnern wiederholt werden, damit nur noch der eigene Sync Server genutzt wird.

Auf Mobilgeräten (z.B. Firefox auf Android) funktioniert das Vorgehen übrigens analog: Firefox-Konto trennen, about:config bearbeiten und erneut mit dem Firefox-Konto anmelden. Leider funktioniert die Angabe eines eigenen Sync Servers unter Firefox für iOS (noch) nicht (siehe hier).
Die mobile Version von Firefox zeigt hier übrigens in den Einstellungen Details zum verwendeten Sync Server an (bei Firefox für den Desktop ist das leider nicht der Fall).

Firefox auf Android zeigt die URL des verwendeten Sync Servers an
Firefox auf Android zeigt die URL des verwendeten Sync Servers an

Abschließende Schritte

Wenn man nun alle Firefox-Konten auf den eigenen Sync Server umgehoben hat, sollten noch ein paar Schritte durchgeführt werden.

Sync Server auf bekannte Accounts beschränken

Der Sync Server wäre nun öffentlich über das Internet erreichbar. Damit niemand sonst den Server nutzen kann, wird das Anlegen neuer User im Sync Server einfach unterbunden:

cd /opt/syncserver 
nano syncserver.ini

Hier ändern wir einfach den entsprechenden Konfig-Eintrag:

allow_new_users = false

Ab jetzt können sich keine neuen Accounts mehr am Sync Server anmelden. Wenn man hier nachträglich doch noch andere Firefox-Accounts hinzufügen möchte (z.B. für Familienmitglieder), dann muss man diesen Wert natürlich temporär wieder auf true ändern.

Abschließend wird der Sync Server neu gestartet:

service firefox-sync restart

Daten auf den Mozilla-Servern entfernen

Ganz zum Schluss kann man ebenfalls sämtliche Daten von den Mozilla-Servern entfernen. Hier kann ein einfaches Script genutzt werden. Wenn die Zwei-Faktor-Authentifizierung für den Firefox-Account aktiv ist, muss diese zuvor alledings deaktiviert werden, da das Skript ansonsten auf Fehler läuft. Nach dem Ausführen des Skripts kann diese wieder aktiviert werden.

apt-get update && apt-get install python-pip
cd /opt/syncserver
pip install PyFxA
python ./bin/delete_user_data.py meine@email.de

Die E-Mail-Adresse muss natürlich die Adresse des eigenen Mozilla-Accounts sein.

Sync Server updaten

Von Zeit zu Zeit können Updates für den Sync Server erscheinen. In diesem Fall kann man das Update auch lokal „nachziehen“.

Zunächst wird dazu der Service gestoppt:

service firefox-sync stop

Da Update an sich funktioniert dann wieder über git:

cd /opt/syncserver
git stash
git pull
git stash pop
make build

Nun werden noch die Rechte entsprechend angepasst:

chown -R firefox-sync:firefox-sync /opt/syncserver

Der Service sollte sich danach problemlos mit service firefox-sync start gestartet werden können. Auch das automatische Starten nach Systemstart sollte weiterhin funktionieren.

Fazit

Zugegeben: Die Einrichtung eines eigenen Firefox Sync Servers ist nicht gerade einfach, da dieser nicht einfach aus der Paketverwaltung der verwendeten Distribution installiert werden kann. Da ist schon einiges an Handarbeit notwendig.

Wenn man die Schritte durchgearbeitet hat, kann man aber sicher sein, dass die Browser-Daten nicht mehr in „irgendeiner Cloud“ synchronisiert werden, sondern ausschließlich auf dem eigenen Server gespeichert werden.

Es wird zur Synchronisierung zwar weiterhin ein Firefox-Konto benötigt, dieses dienst von nun an allerdings nur noch zur Authentifizierung. Die Daten werden nur noch mit dem eigenen Firefox Sync Server abgeglichen.

Weiterführende Artikel

Links

85 Kommentare zu „Eigener Firefox Sync Server mit nginx“

    1. Hi,

      ist auf den ersten Blick zwar etwas aufwändiger, aber machbar.
      Allerdings ist das wichtigste ja, dass die Daten an sich auf dem eigenen Server liegen. Der Firefox-Account wird ja nur noch zur Authentifizierung benötigt. Damit kann ich erst einmal gut leben. ;-)

      Gruß,
      Jan

    1. Hi Hans,

      zunächst brauchst du nur irgendeine (Sub-)Domain, mit der du bei deinem Server „rauskommst“. Wenn du schon andere Webdienste über eine DynDNS-Domain laufen lässt, dann ist der von dir verlinkte Artikel genau der richtige. Ich überlege gerade, ob ich einen separaten Artikel über dieses Thema angehen sollte.

      Ansonsten tut es – wie in diesem Artikel erwähnt – auch ein Unterverzeichnis einer Domain.

      Gruß,
      Jan

  1. Hallo Jan,

    Du machst echt super klasse Anleitungen hier. Was ich vor allem mag ist die Ausführlichkeit. Somit hat man einfach ein besseres Verständnis für die ganze Materie. Vielen Dank dafür.

    Gruß,
    Christian

    1. Hallo Christian,

      danke für das Lob!
      Gerade bei diesem Thema hier sollte ein bisschen Verständnis für das Thema herrschen, da es doch etwas tricky ist.
      Bist du also mit dem Artikel und dem Vorgehen gut zurecht gekommen?

      Gruß,
      Jan

      1. Hi Jan,

        sorry für die späte Antwort. Also ich bin gut klar gekommen mit allem.
        Es funktioniert alles tadellos. Es kommt immer drauf, ich fand den Artikel zur Nextcloud und einigen Erweiterungen komplexer, aber mit deinen Atrikeln und ein wenig experimentierfreude klappt das schon. Ist ja eher ein Hobby von mir. ;)
        Aber wei gesagt toll, dass es so gute Anleitungen gibt.

        Gruß
        Christian

  2. Hi Jan,

    wieder mal eine super Anleitung von Dir!
    Wie würde denn der Code aussehen, wenn man MariaDB benutzen möchte?
    Vielen Dank

    1. Hi,

      ich habe den Artikel mal um einen speziellen Abschnitt erweitert, der auf die Verbindung zu anderen Datenbank-Systemen (MySQL/MariaDB und PostgreSQL) eingeht.

      Gruß,
      Jan

  3. Super!

    Ein kleiner Schreibfehler hat sich eingeschlichen: „apt-get install phthon-pip“
    sollte „apt-get install python-pip“ heißen.

    Dann hat sich MariaDB noch wegen des Bindestrichs in „firefox-sync_db_user“ beschwert. Mit Unterstrich funktioniert es: „firefox_sync_db_user“

    Vielen Dank nochmal für die tollen Anleitungen

    Beste Grüße

  4. Hallo Jan,

    klappt soweit ganz gut jedoch unter iOS kann der Sync-Server so nicht eigerichtet werden.

    Dies nur zur Info.

    Gruß Hans

        1. Hi Hans,

          OK, dann passe ich den Artikel gleich mal an.
          Sorry, aber ich habe kein iPhone, mit dem ich das testen könnte.
          Danke für den Hinweis!

          Gruß,
          Jan

          1. Hallo,

            sehr interessantes Thema und danke für den Artikel.

            Beim Verfolgen des fxa-account links ( https://moz-services-docs.readthedocs.io/en/latest/howtos/run-fxa.html ) ist mir folgende Passage aufgefallen (Zitat):

            For Firefox for iOS version 9.0 or later:

            Go to Settings.
            Tap on the Version number 5 times.
            Tap on “Advance Account Settings”
            Enter your content-server URL
            Toggle “Use Custom Account Service” to on.


            Vielleicht geht es ja doch…

            Gruß
            M

          2. Hi,

            OK, das klingt vielversprechend. Da ich allerdings immer noch kein iPhone habe, müsste dies jemand anderes mal testen. Würde mich interessieren, ob es mit dieser Anleitung funktioniert.

            Gruß,
            Jan

  5. Hallo Jan,

    erstmal Danke für deine Super Tutorials.
    Ich will mir einen FF-Sync Server und einen Nextcloud Server auf einem Raspberry Pi einrichten. Dazu werde ich wohl auch dein anderes Tutorial https://decatec.de/home-server/eigener-firefox-sync-server-mit-nginx/ durcharbeiten.

    Auf jeden Fall sehr gute Arbeit, die du da machst.

    Jetzt zu meiner Frage:
    Wenn der Account-Server von Firefox die Authentifizierung übernimmt, haben die aber doch auch die Zugangsdaten zu meinem Sync Server. So KÖNNTEN die doch trotzdem auf meine Daten auf meinem Server zugreifen, oder?
    Ich will denen aber nix unterstellen, aber dann wäre der eigene Sync-Server für mich eigentlich sinnlos.

    Beste Wünsche und weiter so!
    Daniel

    1. Hi Daniel,

      erst einmal danke für dein Lob!
      Dein Einwand ist meiner Meinung nach aber eher theoretischer Natur. Es gibt allerdings zwei Möglichkeiten, dies auszuschließen:
      Du könntest zum einen neben dem Sync-Server auch noch einen Account-Server betreiben (siehe hier). Dann wird die Authentifizierung auch nur lokal durchgeführt.
      Die wesentlich einfachere Variante wäre, dass du für den FF-Account die Zwei-Faktor-Authentifizierung aktivierst.

      Gruß,
      Jan

  6. Hallo Jan,

    vielen Dank für dieses weitere tolle Tutorial. Großes Lob für deine Arbeit! :-)

    Ich habe mir den Sync-Server erfolgreich eingerichtet.

    Nun wollte ich meine Daten bei Mozilla löschen per genannten Script. Die 2FA für mein Konto habe ich vorher deaktiviert.
    Leider bekomme ich jedoch beim ausführen des Scripts, trotz korrekter E-Mailadresse, immer folgenden Fehler:

    Traceback (most recent call last):
    File „./delete_user_data.py“, line 91, in
    main(sys.argv[1:])
    File „./delete_user_data.py“, line 50, in main
    s = c.login(args.email, password, keys=True)
    File „/.local/lib/python2.7/site-packages/fxa/core.py“, line 90, in login
    resp = self.apiclient.post(url, body)
    File „/.local/lib/python2.7/site-packages/fxa/_utils.py“, line 335, in post
    return self.request(„POST“, url, json, **kwds)
    File „/.local/lib/python2.7/site-packages/fxa/_utils.py“, line 321, in request
    raise fxa.errors.ClientError(body)
    fxa.errors.ClientError: Incorrect email case

    Kannst du mir dazu weiterhelfen?

    Danke!

    Gruß

    1. Hi Ben,

      das einzige, was mir an der Fehlermeldung auffällt, ist folgendes:

      Incorrect email case

      In der Theorie sind E-Mail-Adressen case-sensitive. Hast du diese beim Löschen der Daten entsprechend angegeben?

      Gruß,
      Jan

  7. Hallo Jan,

    Nach erfolgreicher Installation von Nextcloud, versuche ich nun mir zusätzlich einen Firefox Sync Server einzurichten.

    Es hat bis zum Aufruf von der Url https://meinedomain.de/firefox-sync alles ohne Probleme funktioniert.

    Beim Aufruf der Url https://meinedomain.de/firefox-sync bekomme ich eine Fehlermeldung 404 Not found.
    Beim Aufruf von 127.0.0.1:5000 bekomme ich die Rückmeldung: It works

    Ich habe unter /etc/nginx/conf.d/meinedomain.de im Serverblock (443) Deine blau marktierten Block eingefügt.

    Wo kann hier der Fehler liegen, dass die Seite nicht gefunden wird?

    Muss ich beim Router einen Port freischalten?

    Gruß Andreas

    1. Hi Andreas,

      nein, einen Port brauchst du nicht freizuschalten, da die Kommunikation nach außen immer über Port 443 abläuft (darauf basiert ja das ganze Konstrukt).
      Ich würde zunächst das nginx error.log checken. Hier sollte drin stehen, welche Datei er unter welchem Verzeichnis sucht und nicht finden kann. Das bringt einen meistens dann schon auf die richtige Fährte.

      Gruß,
      Jan

  8. Hallo Jan,
    nach einem Neustart funktioniert nun auch der Sync-Server.

    Die offenen Tabs von meinem Handy, werden nun auf meinem PC angezeigt.
    Am Handy werden die Lesezeichen von meinem PC angezeigt.

    Nun habe ich „nur noch“ in der about:sync-log einige Fehler:

    1567089287309 Sync.LogManager DEBUG Flushing file log
    1567089287311 FirefoxAccounts TRACE not checking freshness of profile as it remains recent
    1567089287318 FirefoxAccounts TRACE not checking freshness of profile as it remains recent
    1567089287353 Sync.LogManager DEBUG Log cleanup threshold time: 1566225287353
    1567089287392 Sync.LogManager DEBUG Done deleting files.
    1567089295378 Sync.Service DEBUG User-Agent: Firefox/60.8.0 (Linux x86_64) FxSync/1.62.0.20190703131111.desktop
    1567089295378 Sync.Service INFO Starting sync at 2019-08-29 16:34:55 in browser session u0R4cwQKjT3z
    1567089295378 Sync.Service DEBUG In sync: should login.
    1567089295379 Sync.Service INFO User logged in successfully – verifying login.
    1567089295380 Sync.BrowserIDManager DEBUG unlockAndVerifyAuthState already has (or can fetch) sync keys
    1567089295380 Sync.Status DEBUG Status.login: error.login.reason.network => success.status_ok
    1567089295380 Sync.Status DEBUG Status.service: error.login.failed => error.login.failed
    1567089295380 Sync.Service DEBUG Fetching unlocked auth state returned success.status_ok
    1567089295381 Sync.BrowserIDManager INFO Getting keys
    1567089295381 Sync.BrowserIDManager INFO Getting an assertion from: https://meinedomain.de/firefox-sync/token/1.0/sync/1.5
    1567089295382 FirefoxAccounts DEBUG enter getAssertion()
    1567089295382 FirefoxAccounts DEBUG getKeypairAndCertificate: already have keyPair and certificate
    1567089295382 FirefoxAccounts DEBUG getAssertionFromCert
    1567089295383 FirefoxAccounts DEBUG getAssertionFromCert returning signed: true
    1567089295384 Sync.BrowserIDManager DEBUG Getting a token
    1567089295384 Services.Common.TokenServerClient DEBUG Beginning BID assertion exchange: https://meinedomain.de/firefox-sync/token/1.0/sync/1.5
    1567089295385 Services.Common.RESTRequest DEBUG GET request to https://meinedomain.de/firefox-sync/token/1.0/sync/1.5
    1567089295385 Services.Common.RESTRequest TRACE HTTP Header accept: application/json
    1567089295385 Services.Common.RESTRequest TRACE HTTP Header authorization: ***** (suppressed)
    1567089295385 Services.Common.RESTRequest TRACE HTTP Header x-client-state: 35467e9ab2f98599379d0af59e8c5247
    1567089295412 Services.Common.RESTRequest TRACE onStartRequest: GET https://meinedomain.de/firefox-sync/token/1.0/sync/1.5
    1567089295413 Services.Common.RESTRequest TRACE Channel for GET https://meinedomain.de/firefox-sync/token/1.0/sync/1.5 returned status code 0
    1567089295413 Services.Common.RESTRequest DEBUG GET https://meinedomain.de/firefox-sync/token/1.0/sync/1.5 502
    1567089295413 Services.Common.RESTRequest TRACE GET body:
    502 Bad Gateway

    502 Bad Gateway
    nginx

    1567089295413 Services.Common.TokenServerClient DEBUG Got token response: 502
    1567089295413 Services.Common.RESTResponse TRACE Processing response headers.
    1567089295413 Services.Common.TokenServerClient WARN Did not receive JSON response. Misconfigured server?
    1567089295413 Services.Common.TokenServerClient DEBUG Content-Type: text/html
    1567089295413 Services.Common.TokenServerClient DEBUG Body:
    502 Bad Gateway

    502 Bad Gateway
    nginx

    1567089295414 Sync.BrowserIDManager ERROR Non-authentication error in _fetchTokenForUser: TokenServerClientServerError({„now“:“2019-08-29T14:34:55.413Z“,“message“:“Non-JSON response.“,“cause“:“malformed-response“,“response_body“:“\r\n502 Bad Gateway\r\n\r\n502 Bad Gateway\r\nnginx\r\n\r\n\r\n“,“response_headers“:{„server“:“nginx“,“date“:“Thu, 29 Aug 2019 14:34:55 GMT“,“content-type“:“text/html“,“content-length“:“150″,“strict-transport-security“:“max-age=63072000; includeSubdomains; preload;“,“x-content-type-options“:“nosniff“,“x-xss-protection“:“1; mode=block“,“x-robots-tag“:“none“,“x-download-options“:“noopen“,“x-permitted-cross-domain-policies“:“none“,“referrer-policy“:“no-referrer“,“x-firefox-spdy“:“h2″},“response_status“:502}) (resource://services-common/tokenserverclient.js:36:36) JS Stack trace: TokenServerClientServerError@tokenserverclient.js:103:16
    _processTokenResponse@tokenserverclient.js:280:19
    getTokenFromBrowserIDAssertion@tokenserverclient.js:251:14
    1567089295414 Sync.Status DEBUG Status.login: success.status_ok => error.login.reason.network
    1567089295414 Sync.Status DEBUG Status.service: error.login.failed => error.login.failed
    1567089295415 Sync.BrowserIDManager INFO Failed to fetch the cluster URL: TokenServerClientServerError({„now“:“2019-08-29T14:34:55.413Z“,“message“:“Non-JSON response.“,“cause“:“malformed-response“,“response_body“:“\r\n502 Bad Gateway\r\n\r\n502 Bad Gateway\r\nnginx\r\n\r\n\r\n“,“response_headers“:{„server“:“nginx“,“date“:“Thu, 29 Aug 2019 14:34:55 GMT“,“content-type“:“text/html“,“content-length“:“150″,“strict-transport-security“:“max-age=63072000; includeSubdomains; preload;“,“x-content-type-options“:“nosniff“,“x-xss-protection“:“1; mode=block“,“x-robots-tag“:“none“,“x-download-options“:“noopen“,“x-permitted-cross-domain-policies“:“none“,“referrer-policy“:“no-referrer“,“x-firefox-spdy“:“h2″},“response_status“:502}) (resource://services-common/tokenserverclient.js:36:36) JS Stack trace: TokenServerClientServerError@tokenserverclient.js:103:16
    _processTokenResponse@tokenserverclient.js:280:19
    getTokenFromBrowserIDAssertion@tokenserverclient.js:251:14
    1567089295415 Sync.Service DEBUG verifyLogin failed: TokenServerClientServerError({„now“:“2019-08-29T14:34:55.413Z“,“message“:“Non-JSON response.“,“cause“:“malformed-response“,“response_body“:“\r\n502 Bad Gateway\r\n\r\n502 Bad Gateway\r\nnginx\r\n\r\n\r\n“,“response_headers“:{„server“:“nginx“,“date“:“Thu, 29 Aug 2019 14:34:55 GMT“,“content-type“:“text/html“,“content-length“:“150″,“strict-transport-security“:“max-age=63072000; includeSubdomains; preload;“,“x-content-type-options“:“nosniff“,“x-xss-protection“:“1; mode=block“,“x-robots-tag“:“none“,“x-download-options“:“noopen“,“x-permitted-cross-domain-policies“:“none“,“referrer-policy“:“no-referrer“,“x-firefox-spdy“:“h2″},“response_status“:502}) (resource://services-common/tokenserverclient.js:36:36) JS Stack trace: TokenServerClientServerError@tokenserverclient.js:103:16
    _processTokenResponse@tokenserverclient.js:280:19
    getTokenFromBrowserIDAssertion@tokenserverclient.js:251:14
    1567089295415 Sync.Status DEBUG Status.login: error.login.reason.network => error.login.reason.network
    1567089295415 Sync.Status DEBUG Status.service: error.login.failed => error.login.failed
    1567089295416 Sync.ErrorHandler ERROR Sync encountered a login error
    1567089295417 Sync.SyncScheduler DEBUG Clearing sync triggers and the global score.
    1567089295418 Sync.SyncScheduler DEBUG Next sync in 600000 ms. (why=schedule)
    1567089295426 Sync.Service DEBUG Exception calling WrappedLock: Error: Login failed: error.login.reason.network (resource://services-sync/service.js:853:15) JS Stack trace: onNotify@service.js:853:15
    1567089295429 Sync.Service DEBUG Not syncing: login returned false.
    1567089295435 Sync.ErrorHandler DEBUG Addons installed: 4
    1567089295435 Sync.ErrorHandler DEBUG – uBlock Origin, version 1.21.2, id uBlock0@raymondhill.net
    1567089295436 Sync.ErrorHandler DEBUG – Geschlossenen Tab wiederherstellen, version 4.7.0, id {4853d046-c5a3-436b-bc36-220fd935ee1d}
    1567089295437 Sync.ErrorHandler DEBUG – New Tab Homepage, version 0.6.2, id {66E978CD-981F-47DF-AC42-E3CF417C1467}
    1567089295439 Sync.ErrorHandler DEBUG – Startpage.com — Datenschutz-Suchmaschine, version 1.1.4, id {20fc2e06-e3e4-4b2b-812b-ab431220cada}

    Sind diese normal oder läuft etwas noch nicht rund?
    Gruß Andreas

    1. Hallo Andreas,

      wenn alles so weit funktioniert, dann sollte der Fehler nicht kritisch sein. Tritt das immer mal wieder auf, oder war das eine einmalige Sache?
      Ich würde da jetzt nicht weiter rumprobieren, sondern die Sache einfach mal die nächste Zeit etwas beobachten.

      Gruß,
      Jan

  9. Hallo,

    ich bekomme leider eine fehlermeldung:

    Error: HTTP 507 Insufficient Storage

    Was kann man da machen??

    1570649472529 Sync.CollectionKeyManager INFO Clearing collection keys…
    1570649472529 Sync.CollectionKeyManager INFO Saving downloaded keys.
    1570649472529 Sync.CollectionKeyManager INFO Bumping last modified to 1570583874224
    1570649472557 Sync.Engine.Extension-Storage INFO Successfully synced ‚https-everywhere@eff.org‘
    1570649472816 Sync.Engine.Extension-Storage ERROR Syncing {73a6fe31-595d-460b-a920-fcc0f8843232}: request failed: Error: HTTP 507 Insufficient Storage: Resource access is forbidden for this user (Maximum bytes per object exceeded “ „(17255 > 16384 Bytes.)(resource://services-common/kinto-http-client.js:2771:5) JS Stack trace: ServerResponse@kinto-http-client.js:2771:5
    processResponse@kinto-http-client.js:2918:13
    1570649472816 Sync.Engine.Extension-Storage WARN Syncing failed: Error: HTTP 507 Insufficient Storage: Resource access is forbidden for this user (Maximum bytes per object exceeded “ „(17255 > 16384 Bytes.)(resource://services-common/kinto-http-client.js:2771:5) JS Stack trace: ServerResponse@kinto-http-client.js:2771:5
    processResponse@kinto-http-client.js:2918:13
    1570649472816 Sync.Status DEBUG Status for engine extension-storage: error.engine.reason.unknown_fail
    1570649472817 Sync.Status DEBUG Status.service: success.status_ok => error.sync.failed_partial
    1570649472817 Sync.ErrorHandler DEBUG extension-storage failed: Error: HTTP 507 Insufficient Storage: Resource access is forbidden for this user (Maximum bytes per object exceeded “ „(17255 > 16384 Bytes.)(resource://services-common/kinto-http-client.js:2771:5) JS Stack trace: ServerResponse@kinto-http-client.js:2771:5
    processResponse@kinto-http-client.js:2918:13
    1570649472817 Sync.Doctor INFO Skipping check of prefs – disabled via preferences
    1570649472817 Sync.Doctor INFO Skipping check of passwords – disabled via preferences
    1570649472817 Sync.Doctor INFO Skipping check of tabs – disabled via preferences
    1570649472817 Sync.Doctor INFO Skipping check of bookmarks – disabled via preferences
    1570649472818 Sync.Doctor INFO Skipping check of addons – disabled via preferences
    1570649472818 Sync.Doctor INFO Skipping check of forms – disabled via preferences
    1570649472818 Sync.Doctor INFO Skipping check of history – disabled via preferences
    1570649472818 Sync.Doctor INFO Skipping check of extension-storage – disabled via preferences
    1570649472818 Sync.Doctor INFO Skipping validation: no engines qualify
    1570649472818 Sync.Synchronizer INFO Sync completed at 2019-10-09 21:31:12 after 2.61 secs.

    1. Hi,

      dies ist mir durchaus bewusst und daher habe ich mir syncstorage-rs auch schon einmal angesehen. Leider kann ich dies momentan nicht wirklich empfehlen, da das Projekt noch sehr nach „Work in progress“ aussieht.
      Wie es sich für mich darstellt, wird der „alte“ Sync Server auch für die neue Lösung benötigt, lediglich das (Storage-)Backend wird durch eine Rust-Implementierung ausgetauscht.
      Dennoch ist es momentan nicht wirklich möglich, syncstorage-rs zu bauen (weder lokal, noch per Docker). Das liegt v.a. daran, dass eine Dependency (mozilla-rust-sdk) nicht aufgelöst werden kann. Dabei handelt es sich wohl um Code, der Abhängigkeiten zu Libraries von Google hat, die leider nicht als Open Source zur Verfügung stehen.

      Ich werde das Thema daher auf meine Todo-Liste setzen und weiterhin beobachten. Wenn es hier etwas neues gibt, wird es einen neuen Artikel über Firefox Sync (mit neuem Storage-Backend) geben.

      Gruß,
      Jan

      1. Das ist irgendwie unschön. Python 2 erreicht EOL, die neue Lösung ist aktuell noch WIP & benötigt den alten Sync Server und Mozilla weigert sich den alten Syncserver auf Python 3 zu migrieren…

        Letzteres wäre wahrscheinlich, zumindest vorübergehend, die beste Lösung aber Mozilla weigert sich. Echt super das ganze…

        Mozilla lässt also lieber Menschen ab dem 01.01.20 auf Software sitzen, dessen Basis den EOL Status erreicht hat und in absehbarer Zeit Sicherheitslücken aufweisen könnte.

        Oder seh ich das falsch?

        1. Hi,

          das siehst du meiner Meinung nach leider richtig.
          Ich frage mich ja, welchen Stand die offizielle Synchronisierung bei Firefox hat…

          Auf jeden Fall werde ich das Thema weiterhin beobachten.

          Gruß,
          Jan

  10. Danke für die schöne Anleitung.

    Nur falls jemand auch auf dieses Problem stößt (solange es noch keine brauchbare Alternative gibt), hier meine Lösung.

    IOS geht sehr wohl mit dem Sync Server. Der Tipp mit dem 5 mailigen auf die Version tippen und dann den Sync Server eintragen Funktioniert.

    Allerdings synchronierste danach immer noch nichts richtig auf die IOS Geräte.

    Hier war das Problem, dass es wohl zwischen IOS / Firefox und dem Server Probleme mit http2 gibt. Nachdem ich meinem NGINX Reverse Proxy http2 für den VHOST (achtung,dazu muss dieser VHOST auf einem anderen Port laufen, sonst deaktiviert NGINX http2 nicht. Bei mir lauscht der VHOST für den Sync Server z.B. auf 8443) deaktiviert habe, und die URL auf den neuen Port angepasst habe, klappt nun alles (Bookmarks, und auch geöffnete Tabs).

    Bin gespannt, wann der Nachfolger erscheint.
    Vielleicht hilft es ja jemanden.

    1. Hallo Georg,

      danke für diesen Hinweis!
      Wundert mich aber etwas, denn das bedeutet ja, dass iOS (oder der iOS-Firefox) nicht kompatibel zu HTTP/2 ist. Da es ein schon recht alter Standard ist, hätte ich nun erwartet, dass es auch unter iOS funktioniert.

      Gruß,
      Jan

  11. Hallo,
    großes Lob und vielen Dank für diese Anleitung auch von mir! Hat prima geklappt.

    Ich hab gerade festgestellt, dass die firefox_sync_db im mysql-Ordner bereits 1,5GB groß ist. Ich synchronisiere damit zwar um die 10 Geräte – teils Desktop-Broswer, teils Android mit zig offenen Tabs -, aber das kommt mir doch sehr viel vor. Gerade die Tabelle „batch_upload_items“ nimmt ~97% des Platzes ein.
    Ist das normal?
    Kann man das irgendwie reduzieren/bereinigen?
    Wächst die Datenbank weiter an oder ist die Größe gedeckelt bei 1,5GB?

    An und für sich ist die Größe *noch* kein Problem, aber sollte sie noch weiter anwachsen, muss ich wohl die entsprechende Partition erweitern.

    Gruß, Bodo

    1. Hi Bodo,

      OK, das scheint doch viel Speicherplatz zu sein, weil hier wird ja nicht wirklich viel gespeichert.
      Ich habe den SyncServer schon sehr lange im Betrieb und synchronisiere hier ca. 5 Geräte. Bei mit hat die batch_upload Datei gerade einmal 19 MB.

      Hast du die Registrierung weiterer Accounts in der ini-Datei vom Sync Server ausgeschaltet?

      Gruß,
      Jan

      1. „allow_new_users“ hatte ich bisher auskommentiert, also war es wohl nicht ausgeschaltet. Jetzt aber. Mal schauen, ob es was ändert.

        Laut der Accountverwaltung sind aber auch nicht mehr Geräte registriert, als ich selbst registriert hatte.

        Es gibt eine „batch_uploads“ und eine „batch_upload_items“. Erstere ist bei mir keine 100 KB groß. Reden wir hier von der gleichen Tabelle?

        1. Hi Bodo,

          bei mir sieht das z.B. so aus:
          /var/lib/mysql/firefox_sync_db# ls -lh
          total 76M
          -rw-rw---- 1 mysql mysql 1,2K Jun 2 2019 batch_upload_items.frm
          -rw-rw---- 1 mysql mysql 19M Mär 8 14:39 batch_upload_items.ibd
          -rw-rw---- 1 mysql mysql 989 Jun 2 2019 batch_uploads.frm
          -rw-rw---- 1 mysql mysql 96K Mär 8 14:39 batch_uploads.ibd
          -rw-rw---- 1 mysql mysql 2,2K Jun 2 2019 bso.frm
          -rw-rw---- 1 mysql mysql 56M Mär 8 14:39 bso.ibd
          -rw-rw---- 1 mysql mysql 1,5K Jun 2 2019 collections.frm
          -rw-rw---- 1 mysql mysql 112K Jun 2 2019 collections.ibd
          -rw-rw---- 1 mysql mysql 67 Jun 2 2019 db.opt
          -rw-rw---- 1 mysql mysql 997 Jun 2 2019 user_collections.frm
          -rw-rw---- 1 mysql mysql 96K Mär 8 14:39 user_collections.ibd
          -rw-rw---- 1 mysql mysql 2,9K Jun 2 2019 users.frm
          -rw-rw---- 1 mysql mysql 112K Jun 2 2019 users.ibd

          Gruß,
          Jan

  12. Vielen Dank für die Anleitung. Nach mehrfacher Installation stehe ich immer wieder am Punkt dass ich folgende Meldung in den Logs sehe:
    Services.Common.RESTRequest DEBUG GET https://ff.domain.tld/1.0/sync/1.5 404
    Services.Common.TokenServerClient DEBUG Got token response: 404
    Services.Common.TokenServerClient WARN Error processing token server response: TypeError: right-hand side of ‚in‘ should be an object, got number(resource://services-common/tokenserverclient.js:308:11) JS Stack trace: _processTokenResponse@tokenserverclient.js:308:11
    [Domain geändert]
    Ich kann tun was ich will. In den nginx error.log steht kein Hinweis darauf. Nur dass „conflicting server name“ (verursacht durch certbot) ignoriert wurde. Ist aktuell ein Fehler in der Source? – Stehe endgültig am Berg.

    Danke & Grüsse
    René

    1. Hallo René,

      hast du einfach die aktuellsten Sourcen genommen?
      Da würde ich mal ausprobieren, die Sourcen eines Releases zu nehmen.

      Wegen nginx und „conflicting server name“: Das sollte eigentlich auch nicht passieren. Was sagt „nginx -t“?

      Gruß,
      Jan

  13. Danke für die tolle Anleitung.
    Mein Sync Server läuft auf einem Proxmox Container ohne Probleme.

    Leider habe ich ein Problem mit dem Skript zum löschen auf dem Server von Mozilla.

    python ./bin/delete_user_data.py email@emailprovider.org

    Traceback (most recent call last):
    File „./bin/delete_user_data.py“, line 91, in
    main(sys.argv[1:])
    File „./bin/delete_user_data.py“, line 50, in main
    s = c.login(args.email, password, keys=True)
    File „/usr/local/lib/python2.7/dist-packages/fxa/core.py“, line 90, in login
    resp = self.apiclient.post(url, body)
    File „/usr/local/lib/python2.7/dist-packages/fxa/_utils.py“, line 335, in post
    return self.request(„POST“, url, json, **kwds)
    File „/usr/local/lib/python2.7/dist-packages/fxa/_utils.py“, line 321, in request
    raise fxa.errors.ClientError(body)
    fxa.errors.ClientError: The request was blocked for security reasons

    Kann es vielleicht daran liegen, dass ich vorher noch nichts mit Mozilla syncronisiert hatte? Hab erst bevor ich meinen eigenen Server in Betrieb genommen habe, ein Konto bei Mozilla angelegt – ohne zu syncronisieren.

    1. Hi Andreas,

      wenn noch nichts in das Mozilla-Konto synchronisiert wurde, dann brauchst du das Skript auch nicht aufzurufen.
      „Blocked for security reasons“ klingt aber eher nach einer aktiven Zwei-Faktor-Authentifizierung. Wenn diese aktiv ist, dann bitte kurz vor dem Aufruf des Skripts deaktivieren.

      Gruß,
      Jan

      1. Hallo Jan,
        danke für die Antwort.
        Zwei-Faktor-Authntifizierung habe ich nicht aktiviert.

        Dafür bin ich auf einen anderen Fehler drauf gekommen, bin mir aber nicht sicher ob der dafür verantwortlich ist.

        Beim Ausführen von systemctl status firefox-sync bekam ich nachstehende Fehlermeldung:

        firefox-sync.service: Failed to reset devices.list: Operation not permitted

        Kannst Du etwas damit anfangen?

        1. Hi Andreas,

          direkt kann ich damit leider nichts anfangen. Schau dir mal den erweiterten Output von folgendem Befehl an: journalctl -u firefox-sync.service
          Vielleicht taucht hier ja eine Fehlermeldung auf, die auf die Ursache schließen lässt.

          Gruß,
          Jan

  14. Hallo,
    super Artikel.
    Ich selbst habe den Syncserver schon länger laufen, jedoch bekomme ich meine Androids nicht gesynct. Tokenserver ist eingestellt und ich bin auch eingeloggt.
    Wenn ich auf „Jetzt synchronisieren“ drücke, dreht es sich kurz und „Letzte Synchronisation: nie“ steht immer da.
    Hat schon jemand dieses Problem gelöst?
    Serverlog finde ich irgendwie nichts…

    Danke und viele Grüße
    Basti

  15. Hi Jan,

    danke für den Artikel. Ich komme beim Löschen der Daten vom Server mit dem verlinkten Code-Snippet jedoch nicht weiter.

    Alle Quellen, die ich bisher gefunden haben beinhalten genau diese Code-Zeilen aus deinem Artikel, aber weder unter Manjaro Linux noch unter Debian funktionieren sie.

    Es kommt immer die gleiche Fehlermeldung:
    can’t open file ‚./bin/delete_user_data.py‘: [Errno 2] No such file or directory

    Auch finde ich nirgends im Dateisystem die Datei „delete_user_data.py“, so dass ich wenigstens den Source ansehen und den Fehler eingrenzen könnte.

    Es spielt auch keine Rolle, ob ich es mit python2.7, python 3.7 oder python 3.8 ausführe. Auch mit dem neuesten pip 20.1 keine Veränderung bei der Installation. Diese läuft ohne Fehler durch.

    Nochmal die ausgeführten Befehle:
    pip install PyFxA
    python ./bin/delete_user_data.py meine@email.de

    Upgrade von pip ohne Verbesserung:
    python2.7 -m pip install –user –upgrade pip

    Ausgabe nach der Installation von PyFxA unter Debian mit python2.7 als root:
    Requirement already satisfied: PyFxA in /usr/local/lib/python2.7/dist-packages (0.7.7)
    Requirement already satisfied: PyJWT in /usr/local/lib/python2.7/dist-packages (from PyFxA) (1.7.1)
    Requirement already satisfied: hawkauthlib in /usr/local/lib/python2.7/dist-packages (from PyFxA) (2.0.0)
    Requirement already satisfied: six>=1.14 in /usr/local/lib/python2.7/dist-packages (from PyFxA) (1.15.0)
    Requirement already satisfied: PyBrowserID in /usr/local/lib/python2.7/dist-packages (from PyFxA) (0.14.0)
    Requirement already satisfied: cryptography in /usr/lib/python2.7/dist-packages (from PyFxA) (2.6.1)
    Requirement already satisfied: requests>=2.4.2 in /usr/local/lib/python2.7/dist-packages (from PyFxA) (2.24.0)
    Requirement already satisfied: webob in /usr/local/lib/python2.7/dist-packages (from hawkauthlib->PyFxA) (1.8.6)
    Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,=1.21.1 in /usr/local/lib/python2.7/dist-packages (from requests>=2.4.2->PyFxA) (1.25.10)
    Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/dist-packages (from requests>=2.4.2->PyFxA) (2020.6.20)
    Requirement already satisfied: chardet=3.0.2 in /usr/local/lib/python2.7/dist-packages (from requests>=2.4.2->PyFxA) (3.0.4)
    Requirement already satisfied: idna=2.5 in /usr/local/lib/python2.7/dist-packages (from requests>=2.4.2->PyFxA) (2.10)

    Ausgabe nach der Installation mit python3.8 unter Manjaro Linux als user:
    Defaulting to user installation because normal site-packages is not writeable
    Requirement already satisfied: PyFxA in ./.local/lib/python3.8/site-packages (0.7.7)
    Requirement already satisfied: hawkauthlib in ./.local/lib/python3.8/site-packages (from PyFxA) (2.0.0)
    Requirement already satisfied: PyBrowserID in ./.local/lib/python3.8/site-packages (from PyFxA) (0.14.0)
    Requirement already satisfied: PyJWT in ./.local/lib/python3.8/site-packages (from PyFxA) (1.7.1)
    Requirement already satisfied: six>=1.14 in /usr/lib/python3.8/site-packages (from PyFxA) (1.15.0)
    Requirement already satisfied: requests>=2.4.2 in /usr/lib/python3.8/site-packages (from PyFxA) (2.24.0)
    Requirement already satisfied: cryptography in /usr/lib/python3.8/site-packages (from PyFxA) (2.9.2)
    Requirement already satisfied: webob in ./.local/lib/python3.8/site-packages (from hawkauthlib->PyFxA) (1.8.6)
    Requirement already satisfied: chardet>=3.0.2 in /usr/lib/python3.8/site-packages (from requests>=2.4.2->PyFxA) (3.0.4)
    Requirement already satisfied: idna>=2.5 in /usr/lib/python3.8/site-packages (from requests>=2.4.2->PyFxA) (2.10)
    Requirement already satisfied: urllib3>=1.21.1 in /usr/lib/python3.8/site-packages (from requests>=2.4.2->PyFxA) (1.25.9)
    Requirement already satisfied: cffi!=1.11.3,>=1.8 in /usr/lib/python3.8/site-packages (from cryptography->PyFxA) (1.14.0)
    Requirement already satisfied: pycparser in /usr/lib/python3.8/site-packages (from cffi!=1.11.3,>=1.8->cryptography->PyFxA) (2.20)

    Ich weiß nicht, wo ich noch schauen soll :/

    Vielleicht hast du eine Idee?

    Gruß
    Christian

  16. Hmm.. Die Einrichtung des Sync-Servers hat soweit geklappt, d.h. das sync-log vom ersten Gerät schaut ok aus.. allerdings kann ich mich auf dem 2ten Gerät nicht richtig bei FF Sync anmelden..

    Wenn ich mich mit meinen Zugangsdaten auf dem 2ten Gerät im FF anmelde, so öffnet sich die site accounts.firefox.com auf welcher ich auch erfolgreich bei meinem account eingeloggt bin.. ich kann dort unter „Geräte & Apps“ auch die Web-Sitzung dieses Gerätes sehen, aber der FF-Browser selbst möchte von der Anmeldung nichts wissen – da steht im Menu immer noch „Bei Firefox anmelden“ .. Natürlich hat dieser FF auch keine Einträge im about:sync-log ..

    Ich werde es mal zusätzlich auf nem Androiden probieren..

  17. Auf einem weiteren Gerät hat alles wunderbar funktioniert – d.h. ich werde die bookmarks sichern und den FF auf dem erwähnten Gerät neu installieren, dann sollte es wohl auch gehen..

    Danke für die Kommentar-Möglichkeit :-)

  18. Hallo Jan,

    ich wollte grade den Sync-Server neben einer frischen NC-Installation auf Ubuntu Server 20.04 LTS installieren, allerdings benötige ich dafür python2-virtualenv. Das ist unter der 20.04 nicht installiert, deshalb kann man den Server nicht bauen:

    apt-get install make python-dev git-core python-virtualenv g++

    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Note, selecting ‚python-dev-is-python2‘ instead of ‚python-dev‘
    Note, selecting ‚git‘ instead of ‚git-core‘
    Package python-virtualenv is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    Wie bekomme ich die richtige python-virtualenv installiert?

    Gruß und vielen Dank für Deine tollen Anleitungen,
    Sascha

    E: Package ‚python-virtualenv‘ has no installation candidate

    1. Hi Sascha,

      als Workaround würde ich zunächst mal ausprobieren, das Paket „python-virtualenv“ per deb-Datei manuell herunter zu laden und zu installieren.
      Ansonsten wird es wohl etwas komplizierter, siehe z.B. hier.

      Gruß,
      Jan

      1. Hallo Jan,
        der einfache Weg hat leider nicht geklappt, vielleicht habe ich auch einen Denkfehler:
        1. phyton2 und virtualenv installiert:
        https://computingforgeeks.com/how-to-install-python2-with-virtualenv-on-ubuntu/
        2. um zwischen phyton 2 und 3 umschalten zu können:
        https://www.fosslinux.com/39384/switching-between-python-2-and-3-versions-on-ubuntu-20-04.htm

        Dann wie unter 1. beschrieben ein virtualenv erzeugt, über pip virtualenv installiert, in das sycserver-verzeichniss gegangen und:
        (env) root@sukufum-cloud:/opt/syncserver# make build
        `which python2 python | head -n 1` -m virtualenv –python=`which python2 python | head -n 1` –no-site-packages ./local
        usage: virtualenv [–version] [–with-traceback] [-v | -q] [–app-data APP_DATA] [–reset-app-data] [–upgrade-embed-wheels] [–discovery {builtin}] [-p py] [–creator {builtin,cpython2-posix}] [–seeder {app-data,pip}] [–no-seed]
        [–activators comma_sep_list] [–clear] [–system-site-packages] [–symlinks | –copies] [–no-download | –download] [–extra-search-dir d [d …]] [–pip version] [–wheel version] [–setuptools version] [–no-pip]
        [–no-wheel] [–no-setuptools] [–no-periodic-update] [–symlink-app-data] [–prompt prompt] [-h]
        dest
        virtualenv: error: unrecognized arguments: –no-site-packages
        SystemExit: 2
        make: *** [Makefile:27: local/COMPLETE] Error 2

        Irgendwo ist da noch ein Knoten drin….
        Gruß,
        Sascha

  19. Hi Jan,

    seit dem neuen Firefox for Android (ab Version 79) lässt sich about:config auf der Android-Version nicht mehr aufrufen. So kann der Sync-Server nicht mehr angepasst werden.
    Wie sich dieser trotzdem einstellen lässt steht hier:
    https://www.soeren-hentzschel.at/firefox-android/fenix-eigener-sync-server/
    Nicht verwirren lassen, hier ist zwar von Nightly usw. die Rede, aber mit dem neuen Firefox funktionierit es immer noch.

    Für alle anderen noch die Info, beim Update auf den neuen Firefox auf Andorid wird der benutzerdefinierte Sync-Server aus den Einstellungen gelöscht! Der muss also nach dem Update neu gesetzt werden!

    Gruß
    Ben

    1. Hi Ben,

      das ist in der Tat ein guter Hinweis, da es in der aktuellen App kein „about:config“ mehr gibt. Dies soll aber in einer zukünftigen Version wieder zur Verfügung stehen.
      Ist auf jeden Fall meiner Meinung nach nicht der richtige Weg von Mozilla, ich hoffe, dass sie dies in Zukunft anders lösen werden. Auch dass nach jedem Update der Sync Server weg ist, ist äußerst ärgerlich.

      Auf jeden Fall danke für den Hinweis!

      Gruß,
      Jan

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert