Der Messenger Signal kann auch auf Android-Geräten ohne Google Play Services verwendet werden, dabei zieht die App aber ganz massiv am Akku. Das Problem ist beim Hersteller seit Jahren bekannt, es scheint aber leider keine Motivation zu geben, es zu beheben.

In diese Bresche springt seit einiger Zeit Molly, ein inoffizieller Fork von Signal, welcher eine Version anbietet, die UnifiedPush implementiert.

Zur Nutzung ist ein weiter Dienst namens MollySocket nötig, dessen Installation ich hier beschreibe.

Docker Setup

Das Setup via Docker ist recht einfach, Voraussetzung ist ein Linux-System (in meinem Fall ist das Debian 12) mit Docker. Auf die Installation von Docker selbst gehe ich hier nicht ein.

Folgende beiden Dateien auf dem System ablegen:

nginx.conf

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  server {
    listen      80;
    listen      [::]:80;

    server_name molly.inittab.de;

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

  server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name molly.inittab.de;

    ssl_certificate /etc/letsencrypt/live/molly.inittab.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/molly.inittab.de/privkey.pem;

    location / {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://mollysocket:8020;
    }
  }
}

Quelle: Codeberg

docker-compose.yml

services:
  certbot:
    restart: "no"
    image: certbot/certbot:v3.0.1
    command: certonly --standalone --noninteractive --email norbert@tretkowski.de --agree-tos --domains molly.inittab.de
    volumes:
      - $PWD/certs:/etc/letsencrypt
    ports:
      - "80:80"
      - "443:443"
    networks:
      - external
      - internal

  nginx:
    image: nginx:1.27.3-alpine-slim
    restart: unless-stopped
    depends_on:
      - mollysocket
    volumes:
      - $PWD/certs:/etc/letsencrypt:ro
      - $PWD/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
      - "443:443"
    networks:
      - external
      - internal

  mollysocket:
    image: ghcr.io/mollyim/mollysocket:1.5.4-alpine
    container_name: mollysocket
    restart: always
    volumes:
      - ./data:/data
    working_dir: /data
    command: server
    environment:
      - MOLLY_DB="/data/mollysocket.db"
      - MOLLY_ALLOWED_ENDPOINTS=["https://up.conversations.im/","https://ntfy.sh/"]
      #- MOLLY_ALLOWED_UUIDS=["7d6ffb3e-6a0d-4335-8e6e-7acee0d20d34"]
      #- MOLLY_VAPID_PRIVKEY="paste output of `docker compose mollysocket vapid gen` here"
      - MOLLY_HOST=0.0.0.0
      - MOLLY_PORT=8020
      - RUST_LOG=info
    ports:
      - "127.0.0.1:8020:8020"
    networks:
      - external
      - internal

networks:
  external:
  internal:
    internal: true

Quelle: Codeberg

In der Datei nginx.conf noch den Hostnamen und in der Datei docker-compose.yml den Hostnamen und die E-Mail-Adresse anpassen und dann den certbot Container starten:

# docker compose up certbot -d
[+] Running 1/1
 ✔ Container root-certbot-1  Started                                       0.3s

Der Container beendet sich nach erfolgreich erstelltem SSL Zertifikat direkt wieder und es können dann die beiden für MollySocket nötigen Container mollysocket und nginx gestartet werden:

# docker compose up nginx mollysocket -d
[+] Running 2/2
 ✔ Container mollysocket   Started                                         0.3s
 ✔ Container root-nginx-1  Started                                         0.6s

Für die Aktualisierung der SSL Zertifikate sollte der Let’s Encrypt Container regelmäßig gestartet werden, da die Zertifikate nur drei Monate gültig sind.

Molly für UnifiedPush

In F-Droid muss dann das Molly F-Droid Repo eingebunden und daraufhin die Molly (UnifiedPush) App installiert werden.

Molly F-Droid Repo

Neben Molly ist auch noch ntfy oder Conversations nötig, beide können ebenfalls über den F-Droid Store installiert werden. Für Conversations muss auch noch ein XMPP Account vorhanden sein, daher konzentrieren wir uns hier auf die Nutzung von ntfy. Diese App muss nach der Installation einmalig gestartet werden.

Nach der initialen Einrichtung von Molly muss noch in den Einstellungen unter Benachrichtigungen beim Punkt “Push Strategy” von “WebSocket” auf UnifiedPush umgestellt und die Server URL eingetragen werden:

Molly UnifiedPush Einstellungen

Im Logfile des MollySocket Containers taucht dann die neue Verbindung auf:

# docker logs mollysocket -f
[...]
[2024-05-25T10:32:17Z INFO  rocket::server] POST / application/json:
[2024-05-25T10:32:17Z INFO  rocket::server::_] Matched: (register) POST / application/json
[2024-05-25T10:32:17Z INFO  rocket::server::_] Outcome: Success(200 OK)
[2024-05-25T10:32:17Z INFO  mollysocket::server::connections] Starting connection for 7d6ffb3e-6a0d-4335-8e6e-7acee0d20d34
[2024-05-25T10:32:17Z INFO  rocket::server::_] Response succeeded.
[2024-05-25T10:32:18Z INFO  mollysocket::ws::websocket_connection] WebSocket handshake has been successfully completed

Wenn der MollySocket Server nur für die eigenen Molly Installationen genutzt werden soll, können die erlaubten UUIDs in der docker-compose.yml unter services.mollysocket.environment noch explizit aufgeführt werden:

services:
  mollysocket:
    environment:
      - MOLLY_ALLOWED_UUIDS=["7d6ffb3e-6a0d-4335-8e6e-7acee0d20d34"]

Für ntfy muss dann noch die Batterieoptimierung deaktiviert werden, die App weist beim nächsten Start darauf hin und listet auch die UnifiedPush Verbindung für Molly:

Batterieoptimierung

Zum Testen der Verbindung kann nach der Einrichtung ein ping abgesetzt werden:

# docker exec mollysocket mollysocket connection ping 7d6ffb3e-6a0d-4335-8e6e-7acee0d20d34
[2024-05-25T10:57:54Z INFO  mollysocket::config] No config file supplied

Dies sollte auf dem Smartphone zu einer Benachrichtigung führen:

Molly Test Notification

Und weil Molly die Möglichkeit zur Spende an Signal aus der App entfernt hat sei noch der Hinweis erlaubt, dass man Signal auch über deren Webseite Spenden zukommen lassen kann…