# reMarkable Backup (offizielle Cloud) + lokale Web-UI Dieses Projekt ist auf einen klaren Workflow reduziert: - Tablet bleibt in der **offiziellen reMarkable-Cloud** (OCR/Convert bleibt aktiv). - `rmapi` laeuft im Docker-Container und zieht periodisch Daten aus der offiziellen Cloud. - `.rmdoc`-Dateien werden automatisch zu **PDF konvertiert** (Originale bleiben erhalten). - Lokale Ablage im Docker-Volume `remarkable_notizen` mit inkrementellem Stand + datierten Snapshots. - Web-UI zum Browsen und Oeffnen von PDFs direkt im Browser. ## Dateien in diesem Projekt ``` /opt/remarkable/ ├── docker-compose.yml Orchestrierung beider Container ├── backup/ │ ├── Dockerfile Backup-Container (rmapi, rmc, inkscape) │ └── entrypoint.sh Cron-Setup + Start ├── scripts/ │ ├── backup-official-cloud.sh Backup + Snapshot-Versionierung │ └── convert-to-pdf.sh .rmdoc → PDF Konvertierung └── web/ ├── Dockerfile Web-UI-Container (PHP) ├── index.php Dateibaum + PDF-Viewer └── index2.php Archiv-Suche ``` ## Voraussetzungen - Docker + Docker Compose - Einmaliger reMarkable-Login (Token wird im Volume gespeichert) ## Ersteinrichtung ### 1. Token einrichten ```bash cd /opt/remarkable docker compose run --rm --entrypoint bash backup -c "rmapi ls" # Code von https://my.remarkable.com/device/desktop/connect eingeben ``` Token wird im Volume `remarkable_rmapi-config` gespeichert und bleibt bei Container-Updates erhalten. ### 2. Container starten ```bash cd /opt/remarkable docker compose up -d ``` ### 3. Erstes Backup manuell ausfuehren ```bash docker compose exec backup remarkable-backup.sh /data / ``` ## Normalbetrieb Backup + PDF-Konvertierung laufen automatisch per Cron (Standard: taeglich 03:15). Web-UI erreichbar unter: `http://SERVER_IP:8080` ## Datenstruktur (im Volume `remarkable_notizen`) ``` current/ Aktueller Stand (inkl. konvertierter PDFs) snapshots/ 2026-03-23_031500/ latest -> ... logs/ ``` ## Umgebungsvariablen (docker-compose.yml) | Variable | Standard | Beschreibung | |----------|----------|--------------| | `BACKUP_CRON` | `15 3 * * *` | Cron-Zeitplan | | `SNAPSHOT_KEEP` | `60` | Anzahl aufzubewahrender Snapshots | | `RUN_ON_START` | `0` | Backup beim Container-Start ausfuehren (`1` = ja) | ## Manuelles Backup mit Optionen ```bash # Vollsync (alle Dateien neu laden) docker compose exec backup env BACKUP_FULL=1 remarkable-backup.sh /data / # Spiegelmodus (lokal geloeschte Dateien entfernen) docker compose exec backup env BACKUP_MIRROR_DELETE=1 remarkable-backup.sh /data / ``` ## PDF-Konvertierung (convert-to-pdf.sh) Das Skript konvertiert alle `.rmdoc`-Dateien nach dem Backup automatisch zu PDFs. ### Verhalten nach Dokumenttyp | Typ | Inhalt im rmdoc | Ergebnis | |-----|-----------------|---------| | Handschrift-Notiz | `.rm`-Dateien | Seiten werden einzeln via `rmc` + `inkscape` konvertiert und mit `pdfunite` zusammengefuegt | | Importiertes PDF | `.pdf`-Datei | PDF wird direkt extrahiert | | Reines EPUB | nur `.epub` | Wird uebersprungen (kein PDF moeglich) | ### Seitenreihenfolge Die Reihenfolge der Seiten wird aus der `.content`-Datei im rmdoc gelesen. Damit stimmt die Reihenfolge im PDF mit der des Tablets ueberein. ### Bekannte Einschraenkungen - **Custom ARGB-Farben** (Highlighter, farbige Stifte): werden als grau dargestellt. `rmc` 0.3.0 unterstuetzt keine benutzerdefinierten ARGB-Farbcodes. Issue: https://github.com/ricklupton/rmc/issues - **Neuere rm-Formate**: Einige `.rm`-Dateien enthalten Daten in einem neueren Format als `rmscene` unterstuetzt — diese Seiten koennen fehlerhaft oder leer erscheinen. ### Konvertierung manuell neu ausfuehren ```bash # Alle PDFs loeschen und neu konvertieren docker compose exec backup bash -c "find /data/current -name '*.pdf' -delete && remarkable-convert.sh /data/current" # Nur neue/geaenderte Dateien konvertieren (Standard) docker compose exec backup remarkable-convert.sh /data/current ``` ## Warum dieser Aufbau - OCR bleibt verfuegbar, weil die offizielle Cloud weiter genutzt wird. - Kein Vendor-Lock fuer Aufbewahrung: Daten liegen lokal. - `.rmdoc`-Originale bleiben erhalten — jederzeit zurueckspielbar. - Vollstaendig containerisiert: keine Host-Abhaengigkeiten ausser Docker.