---
author: "Norbert Tretkowski"
title: "MollySocket Installation"
date: "2024-03-15"
tags: ['Android', 'Conversations', 'Docker', 'Messenger', 'Molly', 'MollySocket', 'Ntfy', 'Signal', 'UnifiedPush', 'XMPP']
cover: "/uploads/2024/mollysocket.jpg"
---
Der Messenger [Signal](https://signal.org/) 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](https://github.com/signalapp/Signal-Android/issues/9729), es scheint aber leider keine Motivation zu geben, es zu beheben.

In diese Bresche springt seit einiger Zeit [Molly](https://molly.im), ein inoffizieller Fork von Signal, welcher eine Version anbietet, die [UnifiedPush](https://unifiedpush.org/) implementiert.

Zur Nutzung ist ein weiter Dienst namens [MollySocket](https://github.com/mollyim/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](https://docs.docker.com/engine/install/debian/) selbst gehe ich hier nicht ein.

Folgende beiden Dateien auf dem System ablegen:

### nginx.conf
```nginx
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](https://codeberg.org/tretkowski/mollysocket/raw/branch/main/nginx.conf)

### docker-compose.yml
```Dockerfile
services:
  certbot:
    restart: "no"
    image: certbot/certbot:v3.2.0
    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.4-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.6.0-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 run 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](https://codeberg.org/tretkowski/mollysocket/raw/branch/main/docker-compose.yml)

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:
```bash
# 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:
```bash
# 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](https://molly.im/fdroid/foss/repo/) eingebunden und daraufhin die Molly (UnifiedPush) App installiert werden.

![Molly F-Droid Repo](/uploads/2024/molly1.png "Molly F-Droid Repo")

Neben Molly ist auch noch [ntfy](https://ntfy.sh/) oder [Conversations](https://conversations.im/) 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](/uploads/2024/molly3.png "Molly UnifiedPush Einstellungen")

Im Logfile des MollySocket Containers taucht dann die neue Verbindung auf:
```bash
# 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:
```Dockerfile
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](/uploads/2024/molly4.png "Batterieoptimierung Ntfy")

Zum Testen der Verbindung kann nach der Einrichtung ein `ping` abgesetzt werden:
```bash
# 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](/uploads/2024/molly5.png "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](https://signal.org/de/donate/) zukommen lassen kann...
