Ctrl K
ComunidadGuías…

README_DE.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
<img src="docs/icon.png" width="88" alt="">

# dsm-mini

[English](README.md) · [Русский](README_RU.md) · [Español](README_ES.md) · [Português](README_PT.md) · **Deutsch** · [Français](README_FR.md) · [Italiano](README_IT.md) · [Türkçe](README_TR.md) · [Українська](README_UK.md) · [Polski](README_PL.md)

[![Prüfungen](https://github.com/alexlnos/dsm-mini/actions/workflows/ci.yml/badge.svg)](https://github.com/alexlnos/dsm-mini/actions/workflows/ci.yml)
[![MIT-Lizenz](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

Ein Telegram-Bot mit Mini App für das heimische Synology-NAS: Downloads der
Download Station und Dateien der File Station direkt aus dem Messenger, ohne VPN
und ohne die DSM-Weboberfläche.

Einen Magnet-Link in den Chat geworfen — der Bot fragt mit Schaltflächen, wohin
damit, und stellt ihn in die Warteschlange. Die App geöffnet — und man sieht, was
lädt, wie lange es noch dauert, was auf den Platten liegt und wie es dem NAS
geht.

<p align="center">
  <img src="docs/screenshots/de-home.webp" width="19%" alt="NAS-Übersicht">
  <img src="docs/screenshots/de-downloads.webp" width="19%" alt="Downloads">
  <img src="docs/screenshots/de-task.webp" width="19%" alt="Eine Aufgabe">
  <img src="docs/screenshots/de-files.webp" width="19%" alt="Dateien">
  <img src="docs/screenshots/de-storage.webp" width="19%" alt="Speicher">
</p>

> Funktioniert: der Bot, die Mini App und die Benachrichtigungen. Nötig ist DSM
> 7 oder neuer — auf DSM 6 lässt sich das Paket nicht installieren, und geprüft
> wurde es dort nie. Getestet auf DSM 7.2.2 mit Download Station 4.1.2 und
> File Station 1.4.4.

## Was es kann

**Downloads**

- Die Aufgabenliste: Fortschritt, Geschwindigkeit, Restzeit, Seeds und Peers
- Pausieren, fortsetzen, löschen
- Hinzufügen per Magnet-Link, per direktem Link und per `.torrent`-Datei
- Auswahl des Zielordners, mit einer einstellbaren Schnellzugriffsliste
- Auswahl der Dateien innerhalb eines Torrents und ihrer Priorität
- Eine Nachricht im Chat, wenn eine Aufgabe fertig ist oder scheitert

**Dateien**

- Ordner durchsehen, Vorschau, Hochladen auf das NAS
- Umbenennen, kopieren, verschieben, löschen

**Zustand des NAS**

- CPU- und Speicherauslastung, Laufzeit, Netzwerk
- Platten, Pools und Volumes: Temperatur, belegter Platz, Zustand
- Virtuelle Maschinen und Container: starten und stoppen
- Das DSM-Ereignisprotokoll

**Benachrichtigungen und Einstellungen**

- Was DSM selbst meldet — Sicherheitsberater, Platten, Updates — kommt in den Chat
- Die Wahl, was der Bot schicken darf: nichts, nur Downloads, alles
- Ein eigener Bildschirm im DSM-Hauptmenü: dort wird das Paket nach der Installation eingerichtet und später jede Einstellung geändert, ohne Neustart

**Sprache**

App und Bot sprechen die in Telegram gewählte Sprache: Englisch, Russisch,
Spanisch, Portugiesisch, Deutsch, Französisch, Italienisch, Türkisch,
Ukrainisch, Polnisch. Eine unbekannte Sprache bekommt Englisch.

---

## Installation

Eine halbe Stunde, der größte Teil davon geht für das Zertifikat drauf, nicht
für den Dienst. Nötig sind ein Synology-NAS mit DSM 7 und die Download Station;
sonst muss vorher nichts installiert werden.

> **Eine öffentliche Adresse braucht nur die Mini App.** Telegram öffnet eine
> Mini App nur über `https://` mit einem echten Zertifikat — ein lokales
> `192.168.…` oder ein selbstsigniertes geht nicht auf. Ohne Adresse arbeitet
> der Bot allein — Links, `.torrent`-Dateien, `/status` und Benachrichtigungen —
> und das NAS muss von außen nicht erreichbar sein. Drei Wege zu einer Adresse
> stehen in Schritt 4, zwei davon ohne Portweiterleitung am Router.

**1. Den Bot anlegen.** [@BotFather](https://t.me/BotFather) → `/newbot` → ein
Name und ein Benutzername, der auf `bot` endet. Zurück kommt ein Token; heben
Sie es auf, es ist das Passwort zu Ihrem Bot.

**2. Die eigene Nummer herausfinden.** [@userinfobot](https://t.me/userinfobot)
→ Start. Er antwortet mit der Zeile `Id`.

**3. Einen DSM-Benutzer für den Dienst anlegen.** Systemsteuerung → Benutzer &
Gruppe → Erstellen. Zugriff nur auf Download Station und File Station, ohne
zweistufige Verifizierung — einen Einmalcode kann eine Konfigurationsdatei nicht
liefern. Keinen Administrator: der Dienst kann Dateien löschen. Ob das Konto
genügt, zeigt die Schaltfläche **Konto prüfen** im Fenster DSM mini (Schritt 6):
sie meldet sich als dieser Benutzer an und listet auf, was DSM ihm erlaubt.

**4. Eine Adresse für die Mini App besorgen** — oder diesen Schritt überspringen
und den Bot allein nutzen. Die Adresse muss sich per `https://` auf dem Telefon
öffnen, auf dem Sie Telegram nutzen. Es gibt drei Wege. Der erste führt über DSM
und braucht Portweiterleitungen am Router; überspringen, wenn das NAS schon eine
Domain mit gültigem Zertifikat hat:

- Systemsteuerung → Externer Zugriff → DDNS → Hinzufügen, Anbieter `Synology` —
  heraus kommt so etwas wie `alex-nas.synology.me`.
- Am Router die Ports **80** und **443** auf das NAS weiterleiten. Ohne 80 wird
  kein Zertifikat ausgestellt, ohne 443 geht die App nicht auf.
- Systemsteuerung → Sicherheit → Zertifikat → Hinzufügen → von Let's Encrypt,
  für genau diesen Namen.

Prüfen Sie es vom Telefon über mobiles Internet:
`https://alex-nas.synology.me:5001` muss DSM ohne Warnungen öffnen.

Der zweite ist **Cloudflare Tunnel**, ohne geöffnete Ports; er braucht eine
Domain, deren DNS bei Cloudflare liegt. Legen Sie im Cloudflare-Dashboard einen
Tunnel an, installieren Sie das Paket **Cloudflare Tunnel** von
[SynoCommunity](https://synocommunity.com) mit dem Token des Tunnels und geben
Sie dem Tunnel einen öffentlichen Hostnamen — etwa `mini.example.com` — mit dem
Dienst `http://localhost:58080`.

Der dritte ist **Tailscale**, nur für die eigenen Geräte. Installieren Sie
Tailscale auf dem NAS und auf dem Telefon, schalten Sie in den DNS-Einstellungen
Ihres Tailnets die HTTPS-Zertifikate ein und führen Sie auf dem NAS
`sudo tailscale serve --bg 58080` aus: es gibt eine Adresse wie
`https://nas.tail1234.ts.net` aus. Die App öffnet sich dann, solange das Telefon
mit Tailscale verbunden ist.

**5. Das Paket installieren.** Paket-Zentrum → Einstellungen → Paketquellen →
Hinzufügen, Name `dsm-mini` und die Adresse für Ihre Architektur:

- Intel und AMD, die meisten Modelle: `https://alexlnos.github.io/dsm-mini/amd64.json`
- ARM, günstige Modelle: `https://alexlnos.github.io/dsm-mini/arm64.json`

Danach Einstellungen → Allgemein → Vertrauensebene → **Beliebiger Herausgeber**,
und **DSM mini — Telegram Mini App** aus dem Bereich **Community** installieren.
Unsicher bei der Architektur? Probieren Sie `amd64`: ein unpassendes Paket wird
einfach abgelehnt.

Bei der Installation wird nichts abgefragt. Oder die `.spk` aus den
[Veröffentlichungen](https://github.com/alexlnos/dsm-mini/releases) von Hand
installieren, über Paket-Zentrum → Manuelle Installation.

**6. Einrichten.** Öffnen Sie **DSM mini** im DSM-Hauptmenü oder klicken Sie im
Paket-Zentrum auf **Öffnen** — das Paket-Zentrum weist nach der Installation
selbst darauf hin. Tragen Sie die Werte aus den Schritten oben ein — das Fenster
erklärt jeden davon — und wählen Sie unter **Zugang zur Mini App** den Weg aus
Schritt 4 oder **Nur der Bot, ohne Mini App**. Klicken Sie auf **Speichern** und
dann oben im Fenster auf **Starten**. Der Status dort zeigt, wann DSM und der
Bot geantwortet haben, und was nicht stimmt, falls nicht.

Für den ersten Weg legt das Fenster die Reverse-Proxy-Regel selbst an: tragen
Sie Ihren Namen unter **Einen Namen auf den Dienst richten** ein. Von Hand ist
es Systemsteuerung → Anmeldeportal → Erweitert → Reverse Proxy → Erstellen.
Quelle: `HTTPS`, Ihr Name, Port `443`. Ziel: `HTTP`, `localhost`, Port `58080`.
Mit einem Tunnel oder Tailscale wählen Sie **Ein anderer Weg** und tragen die
Adresse ein, die diese vergeben haben.

> Port **80** für diesen Namen nicht proxen: darüber erneuert DSM das
> Zertifikat, und ein Abfangen zerlegt die Erneuerung drei Monate später.

**7. Prüfen.** Mit Adresse muss `https://ihre-adresse/healthz` im Browser
`{"status":"ok"}` antworten. Ohne Telegram-Signatur wird nichts herausgegeben.

**8. Die App öffnen.** Den Bot über seinen Benutzernamen finden, Start drücken —
neben dem Eingabefeld erscheint eine Schaltfläche **Downloads**. Schicken Sie
ihm irgendeinen Magnet-Link, er bietet Ordner als Schaltflächen an. Ohne Adresse
gibt es die Schaltfläche nicht: schicken Sie die Links einfach im Chat an den
Bot.

## Wenn etwas schiefgegangen ist

| Was du siehst | Woran es liegt | Was zu tun ist |
|---|---|---|
| Der Bot schweigt auf `/start` | Der Bot ist ausgeschaltet oder nicht eingerichtet, oder das Token ist falsch | **DSM mini** im DSM-Hauptmenü öffnen: der Status oben sagt, was davon, und **Starten** schaltet den Bot ein |
| „Der Zugang zu diesem Bot ist geschlossen“ | Deine ID steht nicht auf der Liste | Die Nummer aus Schritt 2 im Fenster **DSM mini** zu den erlaubten IDs hinzufügen |
| Es gibt keine App-Schaltfläche | Die öffentliche Adresse ist leer — dann gibt es nur den Bot — oder nicht `https://` | Das Fenster **DSM mini**, **Zugang zur Mini App** |
| Die Schaltfläche ist da, die App geht nicht auf | Reverse Proxy oder Zertifikat funktionieren nicht | `https://deine-adresse/healthz` im Browser öffnen |
| „Öffne die App über den Bot“ | Die App wurde per direktem Link im Browser geöffnet | So ist es gedacht: aus dem Bot heraus öffnen |
| „Zugriff verweigert: deine Telegram-ID…“ | Der Dienst hat dich nicht erkannt | In den erlaubten IDs nur Ziffern, durch Komma getrennt |
| Das Fenster meldet, DSM habe die Anmeldung abgelehnt | Das Passwort, 2FA oder die Rechte des Benutzers | Schritt 3: Passwort ohne Tippfehler, 2FA aus, Anwendungen erlaubt |
| Das Fenster meldet, Download Station laufe nicht | Sie ist nicht installiert oder dem Benutzer verboten | Paket-Zentrum und die Rechte aus Schritt 3 |
| Das Paket stoppt gleich nach dem Start | Sein Port ist anderweitig belegt — das Protokoll sagt es | `LISTEN_ADDR` in `config.env` über SSH ändern (siehe unten) |

Der erste Blick gehört der Statuszeile oben im Fenster **DSM mini**: sie sagt,
ob DSM und Telegram geantwortet haben, und wenn nicht, warum. Die Einzelheiten
stehen im Protokoll des Pakets, `/var/packages/dsm-mini/var/dsm-mini.log`, das
sich auch aus dem Paket-Zentrum öffnet. Das Protokoll läuft auf Englisch,
Fenster, Oberfläche und Bot-Nachrichten in deiner Sprache.

### Einstellungen ändern

**Öffnen Sie DSM mini im DSM-Hauptmenü** — dort sind alle Einstellungen.
Passwort und Token sind nur schreibbar: ein leeres Feld behält den alten Wert.
Gespeichertes gilt sofort: der Dienst startet sich selbst mit den neuen
Einstellungen neu, das Paket muss nicht neu gestartet werden.

Die Einstellungen stehen auf dem NAS in einer Datei,
`/var/packages/dsm-mini/var/config.env`, Rechte `600`. Sie lässt sich auch über
SSH bearbeiten (Systemsteuerung → Terminal & SNMP → SSH einschalten); danach das
Paket neu starten:

```bash
sudo sed -i "s|^TELEGRAM_BOT_TOKEN=.*|TELEGRAM_BOT_TOKEN='dein-neues-token'|" /var/packages/dsm-mini/var/config.env
sudo synopkg restart dsm-mini
```

Eine Aktualisierung lässt die Datei in Ruhe, darum überstehen die Einstellungen
ein Update.

## Aktualisieren

Ist die Paketquelle eingetragen, zeigt das Paket-Zentrum die Aktualisierung von
selbst. Ohne Quelle die frische `.spk` aus den
[Veröffentlichungen](https://github.com/alexlnos/dsm-mini/releases) laden und
darüber installieren.

Einstellungen und Datenbank bleiben in beiden Fällen: sie liegen im
`var`-Verzeichnis des Pakets, das eine Aktualisierung nicht anrührt.

## Wo die Daten liegen

Alles in `/var/packages/dsm-mini/var/`:

- `config.env` — die Einstellungen aus dem Fenster DSM mini, Rechte `600`;
- `dsm-mini.db` — eine SQLite-Datenbank: die angehefteten Ordner, die Sprache
  und die zuletzt bekannten Aufgabenzustände, an denen der Dienst erkennt,
  worüber er schon berichtet hat;
- `dsm-mini.log` — das Protokoll.

Ein Upgrade des Pakets behält alle drei. Das Deinstallieren löscht sie.

## Sicherheit

Der Dienst steht im Internet und kann Dateien auf dem NAS löschen, darum:

- **Ein eigener DSM-Benutzer**, kein Administrator (Schritt 3).
- **Ohne zweistufige Verifizierung** bei diesem Konto: ein Einmalcode kann aus
  einer Konfigurationsdatei nicht funktionieren.
- **Die erlaubten IDs sind eine Positivliste.** Eine leere Liste schließt den
  Zugang für alle, sie öffnet ihn nicht.
- Jede Anfrage an `/api/` wird zweimal geprüft: die `initData`-Signatur mit
  einem Schlüssel aus dem Bot-Token, und die Kennung gegen die Liste. Die
  Signatur beweist nur, dass jemand den Bot geöffnet hat — und öffnen kann ihn
  jeder.
- Nach außen geht ein allgemeiner Satz, die Einzelheiten ins Protokoll: eine
  Meldung, was genau an der Signatur nicht gestimmt hat, wäre ein Hinweis
  darauf, wie man sie fälscht.
- Bot-Token und DSM-Passwort stehen nur in `config.env` auf dem NAS selbst,
  Rechte `600`, und gelangen nie ins Protokoll: bei einer Ablehnung wird der
  Grund geschrieben, nie der Wert.
- Der Dienst lauscht nur auf `127.0.0.1` — also vom NAS selbst. Alles von außen
  läuft über das, was die öffentliche Adresse bedient — den Reverse Proxy von
  DSM, einen Tunnel oder Tailscale —, das auch das TLS beendet. Ohne Adresse
  erreicht ihn von außen gar nichts.

## Entwicklung

```bash
cd web && npm install && npm run build   # die Mini App landet in internal/web/dist
cd .. && go build ./cmd/dsm-mini         # eine Binärdatei mit eingebetteter App
go test ./...
```

Das Frontend für sich, mit automatischem Neuladen:

```bash
cd web && npm run dev    # spricht mit dem Backend auf localhost:58080
```

Das Backend lokal zu starten liest `config.env` aus `STATE_DIR`, wie das Paket
auch, und Umgebungsvariablen ergänzen, was in der Datei fehlt. Praktisch ist es,
sie in einer Datei zu halten:

```bash
cp .env.example .env     # ausfüllen
set -a; . ./.env; set +a
go run ./cmd/dsm-mini
```

Die gebaute Oberfläche liegt im Repository (`internal/web/dist`) — von dort holt
sie `go:embed`. Nach Änderungen am Frontend neu bauen und das Ergebnis
committen, sonst gehen die Prüfungen nicht durch.

Die Integrationstests laufen gegen ein echtes NAS und werden standardmäßig
übersprungen:

```bash
DSM_URL=https://192.168.1.10:5001 DSM_USER=... DSM_PASSWORD=... \
  DSM_INSECURE_TLS=true go test -tags=integration ./...
```

Tests, die den Zustand des NAS ändern, brauchen eine gesonderte Erlaubnis:
`DSM_TEST_MUTATIONS=1`, und für Dateioperationen zusätzlich `DSM_TEST_FOLDER` —
den Ordner, in dem temporäre Dateien angelegt werden dürfen. Alles Angelegte
räumen sie hinter sich weg.

Eine neue Oberflächensprache ist je eine Wörterbuchdatei auf beiden Seiten:
`web/src/i18n/<Code>.ts` und `internal/i18n/<Code>.go`. Eine Zeile auszulassen
geht nicht: im Frontend wacht der Typ darüber, auf dem Server ein Test.

Code, Kommentare und Protokoll sind im Projekt englisch; die übrigen Sprachen
leben nur in den Wörterbüchern. Einzelheiten stehen in [CLAUDE.md](CLAUDE.md).

## Besonderheiten der Synology-API

Die Synology-Web-API verhält sich stellenweise anders als ihre Dokumentation:
ein und dieselbe Aktion antwortet in drei verschiedenen Formaten, `limit = -1`
legt die File Station lahm, und `_sid` muss beim Hochladen einer Datei anders
übergeben werden als überall sonst. Alles, was an einem echten NAS
herausgefunden wurde, steht in [docs/synology-api.md](docs/synology-api.md).

## Lizenz

[MIT](LICENSE)