mollysocket für mollyim, tusky, davx5 u.v.m.

Ein weit verbreiteter Messenger neben Threema und WhatsApp ist Signal, der auf Android-Geräten mit GrapheneOS auch ohne Google Play Services (respektive ohne Firebase Cloud Messaging/FCM) betrieben werden kann. Signal hat bei der Verwendung der dedizierten APK Installation einen automatischen Fallback auf WebSockets implementiert, der (sofern das Handy keine Google-Services bereitstellt) automatisch verwendet wird. Dieser Fallback funktioniert technisch auch, führt aber oft und insbesondere in den mobilen Netzen, zu signifikanten Akkuproblemen, dem sogenannten „Akkudrain“. Mit Hilfe eines eigenen MollySockets und der Verwendung des Signal-Forks Mollyim wirken Sie diesem erfolgreich entgegen und können weiterhin geschützt und gesichert mit Signal und Molly kommunizieren.

Sowohl der Mollysocket als auch die Unified/NextPush-Integration lassen sich auch für weitere Apps wie tusky, DAVx5 u.a. nutzen.

Voraussetzung:
Eigener Nextcloud Server und die aktivierte Nextcloud UnifiedPush Provider-App

Nextcloud UnifiedPush App

Verbinden Sie sich per SSH zu Ihrem Cloudserver und folgen den nachfolgenden Anweisungen:

sudo -s
mkdir -p /var/opt/docker/mollysocket
cd /var/opt/docker/mollysocket
nano docker-compose.yaml
services:
  mollysocket:
    image: ghcr.io/mollyim/mollysocket:1
    container_name: mollysocket
    restart: always
    volumes:
      - ./data:/data
    working_dir: /data
    command: server
    environment:
      - MOLLY_DB="/data/mollysocket.db"
      - MOLLY_ALLOWED_ENDPOINTS=["https://your.nextclouddomain.de"]
      - MOLLY_ALLOWED_UUIDS=["*"]
      # - MOLLY_VAPID_PRIVKEY="» docker compose exec mollysocket mollysocket vapid gen «"
      - MOLLY_HOST=0.0.0.0
      - MOLLY_PORT=8020
      - RUST_LOG=info
    ports:
      - "8020:8020"

Starten Sie Docker und generieren den „MOLLY_VAPID_PRIVKEY“:

docker compose up -d
docker compose exec mollysocket mollysocket vapid gen

Notieren Sie sich den String, im Beispiel: „U9HlI6oD0rkK6T2vxMcuzzR8svbYzE2UT0REfFyBct0“

Stoppen Sie Docker und editieren die docker-compose.yml-Datei:

docker compose down
nano docker-compose.yaml

Entfernen Sie das führende ‚#‘-Zeichen und Fügen das zuvor notierte Secret (im Beispiel „U9HlI6oD0rkK6T2vxMcuzzR8svbYzE2UT0REfFyBct0“) als Wert der Variable „MOLLY_VAPID_PRIVKEY“ hinzu:

Starten Sie den Docker und analysieren im Log den erfolgreichen Start:

docker compose up -d --force-recreate
docker logs mollysocket -f

Nun erweitern wir den ReverseProxy/Webserver (nginx) um den molly-vHost:

nano /etc/nginx/conf.d/molly.conf
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;
  server_name mollysocket.ihredomain.de;
  ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
  ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_protocols TLSv1.3 TLSv1.2;
  ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA>
  ssl_ecdh_curve X448:secp521r1:secp384r1;
  ssl_prefer_server_ciphers on;
  client_max_body_size 1G;
  client_body_timeout 86400s;
  client_body_buffer_size 512k;
  fastcgi_buffers 64 4K;
  gzip on;
  gzip_vary on;
  gzip_comp_level 4;
  gzip_min_length 256;
  gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
  gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json applica>
  add_header Strict-Transport-Security            "max-age=15768000; includeSubDomains; preload;" always;
  add_header Permissions-Policy                   "interest-cohort=()";
  add_header Referrer-Policy                      "no-referrer"   always;
  add_header X-Content-Type-Options               "nosniff"       always;
  add_header X-Download-Options                   "noopen"        always;
  add_header X-Frame-Options                      "SAMEORIGIN"    always;
  add_header X-Permitted-Cross-Domain-Policies    "none"          always;
  add_header X-Robots-Tag                         "noindex, nofollow" always;
  add_header X-XSS-Protection                     "1; mode=block" always;
  location / {
          proxy_set_header Connection "";
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_set_header Host $http_host;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_pass http://127.0.0.1:8020;
          proxy_buffering off;
          proxy_buffer_size 4k;
          proxy_buffers 64 4k;
          proxy_read_timeout 86400s;
          proxy_send_timeout 86400s;
  }
}

Alternatives Beispiel für einen Apache vHost:

# APACHE2 vHost-Beispiel
<VirtualHost *:80>
   ServerAdmin mail.ihredomain.de
   ServerName mollysocket.ihredomain.de
   Redirect permanent / https://mollysocket.ihredomain.de/
    ErrorLog ${APACHE_LOG_DIR}/molly-error.log
    CustomLog ${APACHE_LOG_DIR}/molly-access.log combined
</VirtualHost>

<VirtualHost *:443>
   ServerAdmin mail.ihredomain.de
   ServerName mollysocket.ihredomain.de
   ProxyPreserveHost On
   ErrorLog ${APACHE_LOG_DIR}/molly-error.log
   CustomLog ${APACHE_LOG_DIR}/molly-access.log combined
   ProxyPass / http://127.0.0.1:8200/ upgrade=websocket
   ProxyPassReverse / http://127.0.0.1:8200/ 
   ProxyPreserveHost On
   #Websockets für Apaches < 2.4.47
   #RewriteEngine on
   #RewriteCond %{HTTP:Upgrade} websocket [NC]
   #RewriteCond %{HTTP:Connection} upgrade [NC]
   #RewriteRule .* "ws://127.0.0.1:8200%{REQUEST_URI}" [P]
   SSLCertificateFile /etc/letsencrypt/ecc-certs/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/ecc-certs/privkey.pem
</VirtualHost>

Starten Sie den Webserver (nginx) neu

systemctl restart nginx.service

und rufen die molly-Domain auf:

» https://mollysocket.ihredomain.de

Ihnen wird dann der QR-Code zum Einrichten in der NextPush-Mobile App angezeigt.

Wechseln Sie zu Ihrem Mobiltelefon und installieren Sie die NextPush App.

Installieren Sie nun bspw. Molly, Tusky und DAVx5, die alle NotifyPush unterstützen und nutzen. Am Beispiel von Molly zeigen wir Ihnen, wie Sie den mollysocket und die NextPush – App einrichten und nutzen: Rufen Sie die Einstellungen in Molly auf und navigieren zu den „Benachrichtigungen:

Wechseln Sie den Push-Service von bspw. WebSocket auf „UnifiedPush“

um dann den QR-Code ihrer mollysocket-Domain abzuscannen:

Nach dem erfolgreichen Abscannen des QR-Codes wird Ihnen die erfolgreiche Einrichtung sowohl mit einer ersten Push-Benachrichtigung als auch mit dem Status „OK“ sowie Ihrer „neuen“ Konto-ID (UUID) quittiert.

Den Versandt und Erhalt Ihrer Pushbenachrichtigungen können Sie bspw. in der NextPush App betrachten:

Weitere Apps wie Tusky und DAVx5 werden nach ihrer Registrierung ebenfalls in der NextPush App angezeigt:

Weiterführende Links:
https://github.com/mollyim/mollysocket/tree/main
https://f-droid.org/de/packages/org.unifiedpush.distributor.nextpush

Möchten Sie Ihren mollysocket ausschließlich für sich und Ihre registrierten Apps nutzen, so fügen Sie der docker-compose.yml – Datei einen Endpoint, den oder die UUID(s) sowie den MOLLY_VAPID_PRIVKEY hinzu.

Empfohlene Einstellungen // exemplarisch:

[...]
environment:
      - MOLLY_DB="/data/mollysocket.db"
      - MOLLY_ALLOWED_ENDPOINTS=["https://ihre.nextclouddomain.de"]
      - MOLLY_ALLOWED_UUIDS=["abcdefghijklmnop","qwertzasdfghyxcvbn"]
      - MOLLY_VAPID_PRIVKEY="U9HlI6oD0rkK6T2vxMcuzzR8svbYzE2UT0REfFyBct0"
      - MOLLY_HOST=0.0.0.0
[...]

Eine Registrierung oder gar der Misbrauch Dritter kann so ausgeschlossen werden. In Nextcloud zeigt es sich wie folgt:


Ich nutze diese Konfiguration übrigens auf einem Pixel10a mit GrapheneOS. Dadurch wird mein Akku geschont und ich habe mich erneut ein Stück unabhängiger von BigTech gemacht!

Über Ihre Unterstützung würden wir uns sehr freuen – vorab vielen und herzlichen Dank dafür.

Unterstützung mit WERO
Folge mir auf Mastodon