Sync-1.5 Server mit public accounts

In der ersten Ausbaustuffe sollte man sich den Firefox Sync-1.5 Server auf seinem Host installieren und die Accountverwaltung über den Mozilla (public) Account Server realisieren.

Installation

In dem ${SCRIPT_FOLDER} Ordner befinden sich Skripte, die alle erforderlichen Schritte für eine Installation durchführen.

$ sudo -H ./scripts/mozcloud_setup.sh installMozCloudEnv
$ sudo -i -u mozcloud
mozcloud$ ${SCRIPT_FOLDER}/mozcloud_fxsync.sh installSyncServer

Die oben durchgeführte Installation besteht aus folgenden Schritten:

  1. Es müssen die Entwicklerpakete auf dem OS installiert werden. Sie werden benötigt um die virtualenv Umgebung aufzubauen und die Python Module die ggf. compiliert werden müssen zu compilieren (s.u. make build).

sudo -H apt-get install python-dev git-core python-virtualenv g++
  1. Es muss ein System-Benutzer (mozcloud) für die Cloud Dienste angelegt werden (siehe Allgemeines zum Setup). Es wird in den Account dieses System-Benutzers gewechselt um darin die Installation des Firefox Sync-1.5 Server durchzuführen.

  2. Es wird der Firefox Sync-1.5 Server (unter dem System-Benutzer) eingerichtet und es werden die dort angebotenen Tests ausgeführt (checkt, ob Installation soweit OK). Siehe Run your own Firefox Sync-1.5 Server (github).

$ sudo -i -u mozcloud
...
mozcloud$ git clone https://github.com/mozilla-services/syncserver
mozcloud$ cd syncserver
mozcloud$ make build
...
mozcloud$ make test

Durch das make build wird virtaulenv Umgebung (~/syncserver/local) eingerichtet in der alle erforderlichen Python-Pakete gleich installiert wurden.

Die Konfiguration des Sync-Servers erfolgt in der syncserver.ini. Für einen ersten Test sollte man dort einstellen.

[server:main]
# ...
host = localhost
port = 5000
# ...
[syncserver]
public_url = https://<hostname>/fxSyncServer

# für gunicorn muss die die public_url wie folgt geändert werden
#
# public_url = http://localhost:5000/

secret = b2ec16d7192d6162ebab5cfc723821e23ce9deab  -
# ...
sqluri = sqlite://///home/mozcloud/syncserver/syncserver.db

Die [server:main] Einträge sind nur für den Test mit dem gunicorn WEB-Server (Entwicklerumgebung) erforderlich.

In der public_url muss die URL eingestellt werden unter der ein FFox-Browser den Dienst erreichen kann. In Abschnitt Site fxSyncServer.conf wird eine Site im Apache eingerichtet, die den Sync-Server unter der URL https://<hostname>/fxSyncServer bereit stellt.

Meiner Erfahrung nach sollte der Secret-Key (secret = ...) in der Konfigurationsdatei unbedingt gesetzt werden. Der Server berechnet auch selber einen, wenn man ihn nicht setzt. Dieser hat jedoch den Nachteil, dass er flüchtig ist, wass zu Problemen führt. Bei mir gab es eine Fehlermeldung im Log des Sync-Servers:

WARNING:syncstorage:Authentication Failed: invalid hawk id

Mit der Folge, dass im FFox-Browser die Synchronisierung mit Fehler abbricht, zu erkennen an dem kleinen gelben Achtung-Ausrufungszeichen-Dreieck.

Entwickler Test

Für den Entwickler Test wird ein gunicorn Server gestartet, dafür muss die public_url in der syncserver.ini auf http://localhost:5000/ gesetzt werden.

[server:main]
# ...
host = localhost
port = 5000
# ...
[syncserver]
public_url = http://localhost:5000/

In dem ${SCRIPT_FOLDER} Ordner befindet sich ein Skript, mit dem ein debug-Server (gunicorn) gestartet werden kann.

$ sudo -i -u mozcloud
...
mozcloud$ ${SCRIPT_FOLDER}/mozcloud_fxsync.sh runSyncServer

Der Test dauert ein paar Sekunden, mit ihm wird ein gunicorn Server gestartet und es wird ein curl Kommando abgesetzt. Die Ausgabe des curl Kommandos wird unten noch interpretiert.

Alternativ zu obigem Test mit dem Skript kann der Sync-Server auch in der Entwicklerumgebung mit dem make Target serve gestartet werden.

$ sudo -i -u mozcloud
...
mozcloud$ cd syncserver
mozcloud$ make serve

In einem zweiten Terminal kann man mit curl eine erste Abfrage des Servers testen.

$ curl http://localhost:5000/token/1.0/sync/1.5
{"status": "error", "errors": [{"location": "body", "name": "", "description": "Unauthorized"}]}

Erhält man obige Ausgabe, so kann man sich zumindest sicher sein, dass der Dienst läuft und unautorisierte Zugriffe ablehnt ;-) Ein abschließender Test sollte noch im FireFox WEB-Browser durchgeführt werden (siehe FireFox Browser Sync-Setup). Danach sollten sich die FFox-Browser (mit gleichem FFox Account) automatisch synchronisieren.

FireFox Browser Sync-Setup

Das Setup in den Firefox Instanzen ist recht einfach, es muss einmal ein Account angelegt werden und in allen Clients muss der oben eingerichtete Sync-Server als Tokenserver eingetragen werden. Die Clients syncen mit diesem Server, sobald sie einmal mit dem Account angemeldet wurden.

public Account anlegen

Es wird auf dem Mozilla (public) Account Server ein Account zum Testen angelegt. Will man hierfür nicht seine eigene eMail Adresse verschwenden, so reicht es für einen ersten Test aus, sich über den Mailinator einen Account bei Mozilla zu holen.

Im Mozilla (public) Account Server beim Anlegen eines Logins die gewünschte eMail Adresse (z.B. dit_un_dat@mailinator.com) angeben – bitte dit_un_dat durch was Eigenes, Ausgedachtes ersetzen – und dann das Postfach to=dit_un_dat beim Mailinator http://mailinator.com/inbox.jsp?to=dit_un_dat abrufen.

Hinweis

Der Mailinator sollte nur für Tests genutzt werden. In keinem Fall sollte sich eine produktive Instanz über ein solches Konto verifizieren oder gar Daten auf die öffentlichen Mozilla Server syncen.

ersten FFox Browser anmelden

Ein FFox-Browser muss über den zuvor erstellten Account angemeldet werden und in der about:config muss der oben eingerichtete Sync-Server (dessen public_url) eingetragen werden. Will man den, über Site fxSyncServer.conf freigegebenen Server nutzen, so eignet sich die SSL Adresse des Intranet-Servers:

identity.sync.tokenserver.uri :: https://<hostname>/fxSyncServer/token/1.0/sync/1.5

Hinweis

Wenn man in seinem FFox Client den Token-Server wechselt (also den Eintrag für die uri ändert), dann muss man sync erst mal trennen und neu Anmelden. Ansonsten ist der Account nicht auf dem neuen Token-Server bekannt.

Hinweis

Wer auf seinem Apache ein Self-Signed SSL Certificate (z.B. snake-oil) installiert hat, der sollte sich einmal über https://<hostname> das Zertifikat in den Firefox holen, resp. das dort angemaulte Zertifikat des Servers seinem Browser hinzufügen.

Bei der Firefox App des Android geht man im Grunde analog vor (tokenserver.uri eintragen). Da der Sync-Client der FFox App jedoch den Java SLL Stack des Android nutzt, hat man i.d.R. Probleme mit einem Self-Signed SSL Certificate. Wie man auch ein Android dazu bekommt selbst signierte Zertifikate zu aktzeptieren, beschreibe ich in dem Abschnitt: Android.

Will man nur einen Test durchführen, so sollte man hier die gunicorn URL eintragen. Diese URL ist eine http:// URL, kein SSL:

identity.sync.tokenserver.uri :: http://localhost:5000/

Will man diese Browser-Einstellung für alle Benutzer eines Systems einrichten, so kann man in der /etc/firefox/syspref.js folgende JavaScript Zeile einfügen.

lockPref(
    "identity.sync.tokenserver.uri"
    , "https://<hostname>/fxSyncServer/token/1.0/sync/1.5"
    );

Nachdem der erste Browser angemeldet ist synchronisiert er seine Bookmarks und Einstellungen. Was alles synchronisiert werden soll, kann im FFox unter den Einstellungen eingestellt werden:

Weitere FFox Instanzen anmelden

In allen weiteren FFox Instanzen, die an der Synchronisierung teilnehmen sollen, muss wieder der FFox-Browser über den zuvor erstellten Account angemeldet werden und in der about:config muss der oben eingerichtete Sync-Server (dessen public_url) eingetragen werden (siehe oben beim ersten FFox Browser).

Site fxSyncServer.conf

Der Firefox Sync-1.5 Server ist eine WSGI Anwendung und kann hinter jeden WSGI fähigen WEB-Server gelegt werden. Folgend wird eine kleine Konfiguration vorgestellt, mit der man den Dienst in seinen (bereits SSL verschlüsselten) Apache Server verlegt.

Es wird davon ausgegangen, das bereits Apache mod_wsgi installiert ist (mod_wsgi RTD). Eine exemplarische Installation ist in dem Abschnitt WSGI Anwendungen des Artikels Setup Apache2 HTTP Server zu finden.

In dem ${SCRIPT_FOLDER} Ordner befindet sich ein Skript, mit dem die Installation durchgeführt werden kann.

$ sudo -H ./scripts/mozcloud.sh installApacheSite

Die oben durchgeführte Installation besteht aus einer Site, die in der Datei

  • /etc/apache2/sites-available/fxSyncServer.conf angelegt wurde.

<IfModule mod_wsgi.c>

    WSGIDaemonProcess fxSyncServer \
      user=mozcloud group=nogroup \
      processes=2 threads=5 \
      python-path=/home/mozcloud/syncserver/local/lib/python2.7/site-packages/

    WSGIScriptAlias /fxSyncServer \
      /home/mozcloud/syncserver/syncserver.wsgi
...

In der Konfiguration wird eine Prozessgruppe fxSyncServer eingerichtet, deren Prozesse unter dem Account mozcloud (und nogroup) laufen. Es wird ein Alias auf die syncserver.wsgi Datei, das WSGI Interface gelegt (s.a. Alias Direktive).

Die eben eingerichtete Prozessgruppe fxSyncServer wird nun in der Resource /home/mozcloud/syncserver genutzt. Die Resource wird eingerichtet und im Subnetz verfügbar gemacht, Zugriffe aus dem Internet sollen nicht möglich sein (s.a. Allow-Direktive).

...
    <Directory /home/mozcloud/syncserver>

        Require all granted

        # Die Seiten sind nur im Subnetz verfügbar, nicht von *draußen*
        Order deny,allow
        Deny from all
        Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
        AllowOverride None
...

Nun wird in der Resource die Prozessgruppe fxSyncServer genutzt. Hierbei ist zu darauf zu achten, dass sich der Sync-Server selber authentifiziert – die Authentifizierung wird beim FFox Sync-Server nicht vom Apache gemacht. Damit der Sync-Server authentifizieren kann, benötigt er die HTTP Authorization Header aus dem Request, siehe auch HTTP-Headerfelder (wiki). Der Apache wird mit WSGIPassAuthorization On angewiesen diese Header Felder an die WSGI-Anwendung durchzureichen. Für Anwendungen die vom Apache authentifiziert werden, sollte WSGIPassAuthorization auf Off gesetzt werden.

...
        WSGIApplicationGroup %{GLOBAL}
        WSGIProcessGroup fxSyncServer
        WSGIPassAuthorization On
...

Da es sich um einen Sync-Dienst handelt, sollen die Robots nicht versuchen diesen zu indizieren.

...
        <IfModule mod_headers.c>
            Header always set X-Robots-Tag "none"
        </IfModule>

    </Directory>

</IfModule>

Hinweis

Die WSGI.... Direktieven sind in der mod_wsgi RTD Konfiguration beschrieben, siehe auch py-apps.conf.

Der WSGI Sync-Server wird im Apache unter der URL:

  • https://<myhost>/fxSyncServer

bereit gestellt. Der Port ist der Standard https: Port 443 und nicht mehr 5000 wie in der Test-Instanz.

Die identity.sync.tokenserver.uri in den FFox Browsern muss entsprechend gesetz werden (siehe FireFox Browser Sync-Setup).

lockPref(
    "identity.sync.tokenserver.uri"
    , "https://<hostname>/fxSyncServer/token/1.0/sync/1.5"
    );