Eigentlich will ich schon seit längerem meinen eigenen Firefox Sync Server einrichten, um meine Bookmarks über verschiedene Computer hinweg zu synchronisieren.
Wermutstropfen war, dass man trotzdem einen Mozilla-Account einrichten muss, um das selbstgehostete Sync verwenden zu können (außer, man richtet auch noch einen eigenen Account-Server ein) und dass Firefox Sync generell alle Bookmarks synchronisiert, ohne dass man sagen könnte "dieser und jener Überordner bitte nicht".

Dann bin ich auf xbrowsersync gestoßen.
Gleich vorneweg: Nach dem Einrichten musste ich feststellen, dass xbrowsersync auch keine Einschränkung zulässt, bestimmte Bookmark-Überordner nicht zu synchronisieren. Nur die Lesezeichen-Symbolleiste lässt sich von der Synchronisation ausschließen.

Die Lesezeichen von zwei verschiedenen Browsern zusammenzuwerfen, führte bei mir auch zu Problemen, so dass sich der Browser entweder während der darauffolgenden Aufräumaktion aufhängte oder einfach alles löscht und die Lesezeichen des ersten Browsers drüberbügelt, wenn ich die Lesezeichen offline aufräume.

Ich sehe schon: Da muss ich wohl selbst etwas entwickeln.

Bis dahin eine kleine Erklärung, wie man xbrowsersync per Docker bei sich hosten kann.
Verwenden lässt sich xbrowsersync mit Chrome, Firefox und als Android-App.

Meine Konstellation

Frei nach der Anleitung "Running a production-ready service" auf github wollte ich mir einen Docker-Dienst einrichten.

Allerdings funktionierte die Sache (natürlich!) nicht direkt wie dokumentiert – ich musste noch ein paar Modifikationen vornehmen.

Meine Konstellation:
Docker version 18.09.1 auf macOS 10.13 (mit VirtualBox)
Die ganze Sache soll via Apache Reverse Proxy unter einer eigenen Subdomain gehostet werden.

Docker: MongoDB und xbs-api

Mit dem github-Befehl die Konfiguration für "Running a production-ready service" herunterladen.

git clone https://github.com/xbrowsersync/api-docker.git
cd api-docker/

.env-Datei öffnen, um vorgesehenen Domain-Namen und Benutzername und Passwort für die Datenbank einzutragen.
Benutzername und Passwort können frei gewählt werden. Bei der Erstinstallation wird der entsprechende Benutzer dann in der Datenbank eingerichtet.

In der docker-compose.yml habe ich alle Verweise zu traefik rausgeschmissen. Beim api:-Service die Ports "8080:8080" hinzugefügt.
In der vorgegebenen Konfiguration wird noch der traefik-Proxy mit installiert, allerdings hatte das bei mir nicht so wirklich funktioniert und ich frage mich auch, für was ich den benötige, wenn auf meinem Mac-Server sowieso Apache läuft, den ich als ReverseProxy verwenden kann.

api-docker/.env
COMPOSE_CONVERT_WINDOWS_PATHS=1
XBS_API_HOSTNAME=xbrowsersync.apfel-z.net
XBS_DB_PASSWORD=meinGeheimesPasswort
XBS_DB_USERNAME=meinGeheimerUsername

api-docker/docker-compose.yml
version: "3.7"

volumes:
  xbs-db-data:

services:
  db:
    container_name: "xbs-db"
    environment:
      - "MONGO_INITDB_DATABASE=xbrowsersync"
      - "MONGO_INITDB_ROOT_PASSWORD=$XBS_DB_PASSWORD"
      - "MONGO_INITDB_ROOT_USERNAME=$XBS_DB_USERNAME"
    image: "mongo:4.2.6"
    networks:
      - "xbs-net"
    restart: "always"
    volumes:
      - "xbs-db-data:/data/db"
      - "./mongoconfig.js:/docker-entrypoint-initdb.d/mongoconfig.js"
  api:
    container_name: "xbs-api"
    depends_on:
      - "db"
    environment:
      - "XBROWSERSYNC_DB_PWD=$XBS_DB_PASSWORD"
      - "XBROWSERSYNC_DB_USER=$XBS_DB_USERNAME"
    image: "xbrowsersync/api:1.1.12"
    networks:
      - "xbs-net"
    ports:
      - "8080:8080"
    restart: "always"
    volumes:
      - "./settings.json:/usr/src/api/config/settings.json"

networks:
  xbs-net:

Jetzt können wir die beiden Container starten.
Dies kann beim ersten Mal etwas dauern, bis die Docker-Images alle heruntergeladen sind.

docker-compose up -d

Nun weiße ich die VirtualBox noch noch an, den xbs-api-Port 8080 auf dem Server, auf welchem Docker läuft, auf Port 8003 umzuleiten.
8080 benötige ich dort für andere Zwecke und ich nummeriere die Web-Dienste meiner Docker-Container alle schön ab 8001 durch. Lässt sich natürlich auch ein anderer Port verwenden oder bei 8080 belassen. Der VBoxManage-Befehl muss aber auf jeden Fall verwendet werden, sollte Docker über VBox laufen.

VBoxManage controlvm "default" natpf1 "xbs,tcp,,8003,,8080"

Nun sollte xbrowsersync im Browser unter http://127.0.0.1:8003 aufrufbar sein.

Auf eigener Domain mit HTTPS hosten

Erstellen wir über letsencrypt noch ein Zertifikat und hosten den Dienst öffenlich unter xbrowsersync.apfel-z.net

Zuerst den VirtualHost für HTTP in der Apache-Konfiguration hinzufügen, zugehöriges Verzeichnis erstellen (der certbot von letsencrypt benötigt dies), Apache neustarten und Zertifikat erstellen lassen.

Mehr über letsencrypt ist in diesem Artikel zu erfahren.

/etc/apaches/extras/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webmaster@apfel-z.net
    DocumentRoot "/Library/WebServer/Documents/xbrowsersync.apfel-z.net"
    ServerName apfel-z.net
    ServerAlias xbrowsersync.apfel-z.net
    ErrorLog "/private/var/log/apache2/xbrowsersync.apfel-z.net.de-error_log"
    CustomLog "/private/var/log/apache2/xbrowsersync.apfel-z.net-access_log" common
</VirtualHost>

sudo mkdir /Library/WebServer/Documents/xbrowsersync.apfel-z.net
sudo apachectl restart
sudo certbot certonly --webroot -w /Library/WebServer/Documents/xbrowsersync.apfel-z.net/ -d xbrowsersync.apfel-z.net

Sollte dies erfolgreich verlaufen sein, gehen wir mal davon aus, dass die erstellten Zertifikate in /etc/letsencrypt/live/xbrowsersync.apfel-z.net/ abgelegt wurden und erstellen den VirtualHost für HTTPS

/etc/apaches/extras/httpd-ssl.conf
<VirtualHost *:443>
    SSLEngine on
    ServerName xbrowsersync.apfel-z.net:443
    ServerAlias xbrowsersync.apfel-z.net
    ServerAdmin webmaster@apfel-z.net

    ErrorLog "/private/var/log/apache2/error_log"
    TransferLog "/private/var/log/apache2/access_log"
    CustomLog "/private/var/log/apache2/ssl_request_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

    BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
    Include /etc/letsencrypt/options-ssl-apache.conf

    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile    /etc/letsencrypt/live/xbrowsersync.apfel-z.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/xbrowsersync.apfel-z.net/privkey.pem

    ProxyPass / http://127.0.0.1:8003/

    ProxyPreserveHost On
    ProxyRequests Off
</VirtualHost>

Apache nochmals neu starten, dann sollte xbrowsersync unter https://xbrowsersync.apfel-z.net aufrufbar sein, was ebenfalls in den Sync-Einstellungen des xbrowsersync-Browserplugins einzutragen wäre.

sudo apachectl restart

Achtung Vor Installation des Browser-Plugins die Bookmarks auf jeden Fall backupen!