Für die Synchronisierung meiner Browser-Lesezeichen zwischen verschiedenen Computern und Betriebssystemen habe ich bisher das Xmarks-Plugin für Firefox benutzt. Mir war schon immer nicht besonders wohl dabei, persönliche Daten auf einen fremden Server abzulegen, einerseits aus Gründen des Schutzes der Privatsphäre, andererseits weil ich wenn möglich Kontrolle über die Verfügbarkeit der Netzwerkdienste, die ich nutze, haben will. Man kann zwar Xmarks so konfigurieren, dass es die Daten auf einem eigenen Server über FTP oder WebDAV abgelegt, aber einen FTP-Server wollte ich auf meinem virtuellen Server nicht einrichten und die WebDAV-Konfiguration des von mir benutzen Webservers nginx war mir, ehrlich gesagt, bisher zu umständlich. Als Xmarks vorgestern ankündigte, ihren Service zum Anfang des Jahres 2011 einzustellen, war das für mich ein Anlass, endlich auf eine alternative Synchronisierungslösung umzusteigen.
Auftritt Firefox Sync. Die technischen Information darüber auf der Homepage sind etwas spärlich, aber durch ein wenig Recherche ist schnell herauszufinden, dass dahinter ein offenes Protokoll steht und sowohl Server als auch das Client-Plugin Open Source Software sind. Letzteres muss man in aktuellen Firefox-Versionen der 3.x Linie noch selbst installieren, ab Firefox 4.0 wird der Firefox Sync-Client dann fester Bestandteil des Browsers sein. Der Weave Server, mit dem der offizielle Firefox Sync Server betrieben wird, ist anscheinend auf größere Installationen mit tausenden Benutzern ausgelegt und dementsprechend etwas umständlich zu installieren und erfordert einen “richtigen” Datenbankserver. Mozilla.com empfiehlt deshalb selbst, wenn man einen eigenen Weave Server für kleinere Installationen aufsetzen will, den Minimal Server zu verwenden, zu dessen Betrieb nur ein Webserver mit PHP-Unterstützung und SQLite benötigt wird. Da beide Voraussetzungen auf meinem Server bereits gegeben waren, habe ich mich entschlossen, die entsprechenden PHP-Skripte testweise zu installieren und möchte euch hier eine kurze Anleitung dazu geben, die auf die Besonderheiten meines Setups (nginx mit PHP als FastCGI-Service) eingeht.
Ich gehe von einem debian-ähnlichen Serversystem aus. Auf diesem wird ein
Webserver mit einem Virtual Host für die Domäne yourdomain.tld
eingerichtet.
Der Weave Server soll nur über HTTPS erreichbar sein.
Zuerst muss natürlich die notwendige Software installiert werden:
sudo apt-get install nginx php5-cgi php5-sqlite3
Dann wird ein Verzeichnis für den Virtualhost angelegt. Ich erstelle für jeden
Virtual Host ein Verzeichnis unterhalb von /home/www
, diese Verzeichnisse
können aber an jedem beliebigen Ort im Dateisystem liegen, es müssen dann nur
die Pfade in der unten aufgeführten Konfiguration angepasst werden.
sudo mkdir -p /home/www/yourdomain.tld/{etc,htdocs,log} sudo chown -R root.www-data /home/www/yourdomain.tld sudo chmod -R 750 /home/www/yourdomain.tld
Es folgt die nginx-Konfiguration
für den Virtual Host, der den HTTPS Port (443) bedient. Diese wird unter
/etc/nginx/sites-available/yourdomain.tld.conf
abgelegt. Die Konfiguration
für den normalen HTTP Server, der auf Port 80 lauscht, habe ich hier
ausgelassen. Diese kommt normalerweise in die selbe Datei in einen eigenen
server { ... }
Block.
server { listen 443; server_name yourdomain.tld www.yourdomain.tld; ssl on; ssl_certificate /home/www/yourdomain.tld/etc/ssl-cert.pem; ssl_certificate_key /home/www/yourdomain.tld/etc/ssl-key.pem; ssl_session_timeout 5m; access_log /home/www/yourdomain.tld/log/access-ssl.log; error_log /home/www/yourdomain.tld/log/error-ssl.log; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } location / { root /home/www/yourdomain.tld/htdocs; index index.html index.htm; autoindex off; } # Configuration for the PHP minimal weave server # (aka Firefox Sync) # Pass configured PHP scripts to FastCGI server # listening on 127.0.0.1:9000 location /weave { index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/yourdomain.tld/weave/index.php; fastcgi_param SCRIPT_NAME /home/www/yourdomain.tld/weave/index.php; include /etc/nginx/fastcgi_params.conf; if ( $request_uri ~ "/weave/([^?]*)" ) { set $path_info /$1; } fastcgi_param PATH_INFO $path_info; } }
Und hier noch der Inhalt der Datei /etc/nginx/fastcgi_params.conf,
die in der Konfiguration oben über die include
-Direktive eingelesen wird.
Diese wird in eine eigene Datei ausgelagert, weil diese Parameter von allen
Virtual Host-Konfigurationen, die einen FastCGI-Server nutzen wollen, benötigt werden.
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect # fastcgi_param REDIRECT_STATUS 200;
Jetzt müssen noch das SSL-Zertifikat und der zugehörige Key für den Server
erstellt und installiert werden. Ich habe mir ein freies, von CACert signiertes Zertifikat
besorgt, man kann aber natürlich auch ein selbst signiertes Zertifikat
verwenden, man muss dann nur mit den entsprechenden Sicherheitswarnhinweisen
der Browser leben. Auf die Zertifikatserstellung einzugehen, würde hier zu weit
vom Thema wegführen. Anleitungen dazu gibt es zuhauf im Netz, ich verweise
beispielhaft auf den entsprechenden Abschnitt im Ubuntu Server Guide. Das
Zertifikat und der Key werden an die Orte, die in der Konfiguration oben
angegeben sind - /home/www/yourdomain.tld/etc/ssl-cert.pem
und
/home/www/yourdomain.tld/etc/ssl-key.pem
- kopiert, wobei darauf zu achten
ist, dass sie für den User, unter dem der nginx-Server läuft (www-data
)
lesbar sind und für sonst niemand (außer natürlich root).
Als nächstes muss dafür gesorgt werden, dass PHP als FastCGI-Server gestartet werden kann. Ich benutze dazu das Init-Skript aus diesem Blogartikel. Der Einfachheit halber stelle ich das Init-Skript und die zugehörige Konfigurationsdatei, die in /etc/default kopiert wird, auf meinem Webserver zum Download zur Verfügung. Hier folgen die Schritte, um beide herunterzuladen und zu installieren:
wget http://chrisarndt.de/projects/weave/php-fastcgi.init wget http://chrisarndt.de/projects/weave/php-fastcgi.default sudo install php-fastcgi.init /etc/init.d/php-fastcgi sudo install -m 644 php-fastcgi.default /etc/default/php-fastcgi sudo update-rc.d php-fastcgi defaults
Zuletzt muss die Virtual Host Konfiguration noch aktiviert werden. Dann können der Webserver und der PHP FastCGI Server (neu) gestartet werden:
sudo ln -s ../sites-available/yourdomain.tld.conf /etc/nginx/sites-enabled sudo invoke-rc.d php-fastcgi restart sudo invoke-rc.d nginx restart
Damit ist die Konfiguration des Webservers und von PHP abgeschlossen und der Weave Server kann installiert werden:
wget http://people.mozilla.org/~telliott/weave_minimal.tgz tar -xzf weave_minimal.tgz sudo cp -r weave_minimal /home/www/yourdomain.tld/weave sudo chown -R root.www-data /home/www/yourdomain.tld/weave sudo chmod 2770 /home/www/yourdomain.tld/weave
Durch das Setzen des Benutzers, der Gruppe und der Rechte auf das Verzeichnis
/home/www/yourdomain.tld/weave
wird erreicht, dass nur root und Benutzer der
Gruppe www-data
dieses Verzeichnis lesen und darin schreiben können. Außerdem
werden alle Dateien, die darin angelegt werden, der Gruppe www-data
zugewiesen. Der letzte Punkt wird im nächsten Schritt wichtig, denn der Weave
Server legt seine SQLite-Datenbank automatisch an, sobald er das erste mal
aufgerufen wird. Dazu wird z.B. folgende URL benutzt:
https://yourdomain.tld/weave/1.0/<foo>/info/collections
Anstelle von <foo>
kann ein beliebiger Benutzername eingesetzt
werden. Der Browser sollte beim Aufruf der URL einen Dialog zur Abfrage des
Benutzernamens und Passworts für die HTTP-Authentifizierung anzeigen. Dieser
kann in diesem Fall mit “Abbrechen” geschlossen werden. Falls man ein selbst
signiertes Zertifikat verwendet hat, muss man vorher noch eine
Sicherheitsausnahmeregel hinzufügen, damit der Browser das Zertifikat
akzeptiert. Jetzt sollte im Verzeichnis des Servers eine neue Datei weave_db
angelegt worden sein. Jetzt kann mit dem mitgeliefertem Skript ‘create_user`
ein Benutzer hinzugefügt werden:
cd /home/www/yourdomain.tld/weave sudo php create_user (c)reate, (d)elete or change (p)assword: c Please enter username: joe Please enter password: secret joe created
Zu guter letzt sollte man noch mal sicherstellen, dass die Datenbankdatei auch wirklich (nur) vom Webserver/PHP gelesen und geschrieben werden kann:
sudo chmod 660 weave_db
Damit ist die Installation des Weave Servers komplett und jetzt müssen nur noch die Clients (Browser) auf allen Systemen, die an der Synchronisierung Teilnehmen sollen, installiert und eingerichtet werden. Wenn Firefox nach der Installation des Firefox Sync Plugins neu startet, wird der Dialog zur Konfiguration des Plugins direkt angezeigt. Hier wählt gibt man an, dass man bereits einen Sync-Account hat (“Ich nutze Sync bereits auf einem anderen Computer”) und wählt dann aus, dass man einen eigen Sync-Server benutzen will. Als URL des Servers gibt man an:
https://yourdomain.tld/weave/
Wichtig ist der abschließende Schrägstrich! Bei Benutzername und Passwort trägt man die Daten des Benutzers ein, den man in der Datenbank des Weave Servers angelegt hat. Die E-Mailadresse ist für den Minimal Server nicht von Belang, hier kann eine beliebige Adresse eingetragen werden. Nach Eingabe einer Passphrase für die Verschlüsselung der Daten auf dem Weave Server sollte die Erstsynchronisierung ohne weiteres funktionieren. Beim ersten Gerät ist es ratsam, die Option “Überschreiben aller anderen Geräte mit den lokalen Daten” zu wählen, bei weiteren Clients sollte man die Option “Zusammenführen der Daten auf diesem Computer mit Ihren Sync-Daten” wählen.
Wer will, kann sich auf dem Server vergewissern, dass die SQLite-Datenbankdatei
des Weave Servers nach dem ersten Synchronisierungsvorgang auf einige Megabyte
(je nach Anzahl der Lesezeichen und anderer synchronisierter Daten)
angeschwollen ist und sich die Struktur der Daten mit dem sqlite3
Kommandozeilentool anschauen. Die eigentlichen Daten sind jedoch verschlüsselt
und nur mit der beim Einrichten des Clients eingegebenen Passphrase zu
entziffern. Selbst wenn der eigene Server gehackt werden sollte, sind die Daten
also vor dem Zugriff Anderer sicher.
Fröhliches Synchronisieren wünscht
Chris