LocalEye

Vellaphine

Selbst-gehostetes Tagebuch für Wechseljahres-Beschwerden und Zyklus-Tracking. Alle Daten bleiben auf deinem eigenen Server, niemand außerhalb deines Haushalts hat Zugriff.

Vellaphine — Installationsanleitung

Dein persönlicher Begleiter durch jede Lebensphase.

Selbst-gehostetes Tagebuch für Wechseljahres-Beschwerden und Zyklus-Tracking. Alle Daten bleiben auf deinem eigenen Server, niemand außerhalb deines Haushalts hat Zugriff.

Diese Anleitung deckt alle gängigen Plattformen ab — Linux, macOS, Windows, NAS-Geräte, Raspberry Pi und Cloud-Server.

---

Inhaltsverzeichnis

  1. Voraussetzungen
  2. Schnellstart (universell)
  3. Linux — Ubuntu / Debian
  4. Linux — Fedora / RHEL / Rocky
  5. Linux — Arch / Manjaro
  6. macOS
  7. Windows 10 / 11 (WSL2)
  8. Synology DSM 7
  9. UGREEN NASync (UGOS)
  10. QNAP Container Station
  11. TrueNAS SCALE
  12. Raspberry Pi (ARM64)
  13. Cloud-VPS (Hetzner / IONOS / Hostinger / DigitalOcean)
  14. Erst-Login und erste Schritte
  15. Reverse-Proxy mit eigener Domain
  16. Push-Notifications einrichten
  17. Backup & Restore
  18. Updates einspielen
  19. Logs einsehen und Debugging
  20. Häufige Fehler und Lösungen

---

Voraussetzungen

| Komponente | Minimum | Empfohlen | |------------|---------|-----------| | Docker Engine | 20.10 | 24.0+ | | Docker Compose | v2 (Plugin) | v2.20+ | | Festplatte | 250 MB | 1 GB | | Arbeitsspeicher | 256 MB | 512 MB | | CPU | 1 Kern (x86_64 oder ARM64) | 2 Kerne | | Port | 8421 (frei) | beliebig konfigurierbar | | Netzwerk | nur LAN für Erst-Setup | Internet für Updates | | HTTPS | optional | erforderlich für Push-Benachrichtigungen |

Vellaphine läuft headless als Docker-Container. Eine grafische Oberfläche wird nicht benötigt.

---

Schnellstart (universell)

Auf jedem System mit installiertem Docker und Docker Compose:

# 1. ZIP entpacken
unzip vellaphine.zip -d vellaphine
cd vellaphine

# 2. Container bauen und starten
docker compose up -d --build

# 3. App im Browser öffnen
# http://<host>:8421

Standard-Login:

  • Benutzername: admin
  • Passwort: admin

⚠️ Sofort ändern unter "Konto" → "Passwort" nach dem ersten Login.

Beim ersten Start werden automatisch erstellt:

  • SQLite-Datenbank in data/vellaphine.db
  • Session-Schlüssel in data/secret.key
  • VAPID-Schlüsselpaar für Web-Push in data/vapid_priv.pem + data/vapid_pub.txt

---

Linux — Ubuntu / Debian

Docker installieren (falls noch nicht vorhanden)
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

Bei Debian den Pfad in der Repository-Zeile durch linux/debian ersetzen.

Vellaphine deployen
mkdir -p ~/docker/vellaphine
cd ~/docker/vellaphine
unzip /pfad/zu/vellaphine.zip -d .
docker compose up -d --build

Beim ersten Build werden u.a. bcrypt und cryptography (für Push) kompiliert. Auf x86_64 dauert das ca. 2–3 Minuten, auf ARM64 (Pi) ca. 4–6 Minuten.

Autostart (systemd)

Docker-Container mit restart: unless-stopped (bereits in docker-compose.yml gesetzt) starten automatisch nach Reboot.

sudo systemctl enable docker

---

Linux — Fedora / RHEL / Rocky

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo systemctl enable --now docker
sudo usermod -aG docker $USER

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip /pfad/zu/vellaphine.zip -d .
docker compose up -d --build

Auf RHEL/Rocky/AlmaLinux den Pfad durch linux/centos ersetzen.

Firewall (firewalld)
sudo firewall-cmd --permanent --add-port=8421/tcp
sudo firewall-cmd --reload
SELinux

Bei aktivem SELinux:

chcon -Rt svirt_sandbox_file_t ./data

---

Linux — Arch / Manjaro

sudo pacman -S docker docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip /pfad/zu/vellaphine.zip -d .
docker compose up -d --build

---

macOS

Docker Desktop installieren
  1. Docker Desktop für Mac von https://www.docker.com/products/docker-desktop/ herunterladen
  2. .dmg öffnen, App in den Programme-Ordner ziehen
  3. Docker starten und Lizenz akzeptieren

Alternative: OrbStack (https://orbstack.dev) — schneller und ressourcenschonender als Docker Desktop. Kostenlos für Privatnutzung.

Vellaphine deployen
mkdir -p ~/Docker/vellaphine
cd ~/Docker/vellaphine
unzip ~/Downloads/vellaphine.zip -d .
docker compose up -d --build

App im Browser öffnen: http://localhost:8421

Autostart

Docker Desktop → Einstellungen → "Start Docker Desktop when you log in" aktivieren.

---

Windows 10 / 11 (WSL2)

WSL2 + Docker Desktop installieren
  1. WSL2 aktivieren in PowerShell (als Administrator):

   wsl --install
   wsl --set-default-version 2
   
Reboot durchführen.

  1. Ubuntu aus dem Microsoft Store installieren.
  1. Docker Desktop für Windows von https://www.docker.com/products/docker-desktop/ installieren. "Use WSL2 instead of Hyper-V" auswählen.
  1. In Docker Desktop → Einstellungen → Resources → WSL Integration → Ubuntu aktivieren.
Vellaphine deployen

In der WSL2-Shell (Ubuntu):

mkdir -p ~/docker/vellaphine
cd ~/docker/vellaphine
cp /mnt/c/Users/<DeinUser>/Downloads/vellaphine.zip .
unzip vellaphine.zip
docker compose up -d --build

App im Browser öffnen: http://localhost:8421

---

Synology DSM 7

Container Manager nutzen (empfohlen)
  1. Paket-Zentrum → "Container Manager" installieren
  2. Per File Station: Ordner /docker/vellaphine anlegen, ZIP-Inhalt dort entpacken
  3. Container Manager → "Projekt" → "Erstellen"

- Projekt-Name: vellaphine - Pfad: /docker/vellaphine - Quelle: "docker-compose.yml verwenden, das im Ordner existiert"

  1. "Erstellen" → "Aktiv"
Per SSH (Power-User)
ssh admin@nas
sudo -i
cd /volume1/docker
mkdir vellaphine && cd vellaphine
unzip /volume1/homes/admin/vellaphine.zip -d .
docker compose up -d --build

App: http://nas-ip:8421

Reverse-Proxy mit DSM

DSM-Schalttafel → "Anmeldeportal" → "Erweitert" → "Reverse-Proxy" → "Erstellen":

  • Quelle: HTTPS, Hostname vellaphine.deine-domain.tld, Port 443
  • Ziel: HTTP, localhost, Port 8421

DSM kümmert sich um das Let's Encrypt-Zertifikat unter "Sicherheit" → "Zertifikat".

---

UGREEN NASync (UGOS)

UGOS basiert auf Debian. Vellaphine läuft hier sehr gut.

Vorbereitung
  1. SSH aktivieren: NAS-Web-UI → "Systemeinstellungen" → "Terminal & SSH" → SSH einschalten
  2. Docker und Container Manager sind ab UGOS 1.4+ vorinstalliert
Installation
ssh user@nas-ip
sudo -i
mkdir -p /volume1/docker/vellaphine
cd /volume1/docker/vellaphine

unzip /volume1/uploads/vellaphine.zip -d .
docker compose up -d --build

App: http://nas-ip:8421

Container-Manager-GUI als Alternative

UGREEN Container Manager öffnen → "Projekt erstellen" → Pfad /volume1/docker/vellaphine → Compose-Datei verwenden.

PUID/PGID

UGOS-Standard: PUID=1000, PGID=10. Falls Vellaphine die data/-Files nicht schreiben kann, im docker-compose.yml ergänzen:

services:
  vellaphine:
    user: "1000:10"

---

QNAP Container Station

  1. Container Station im App-Center installieren
  2. "Anwendungen" → "Erstellen" → "Compose erstellen"
  3. Inhalt der docker-compose.yml einfügen, Volume-Pfad anpassen:

   volumes:
     - /share/Container/vellaphine/data:/data
   

  1. ZIP-Inhalt nach /share/Container/vellaphine/ kopieren
  2. "Erstellen" → "Anwendung starten"

---

TrueNAS SCALE

ssh root@truenas
cd /mnt/<pool>/docker
mkdir vellaphine && cd vellaphine
unzip /tmp/vellaphine.zip -d .
docker compose up -d --build

TrueNAS SCALE 24.10+ nutzt offiziell Docker, vorher k3s. Bei k3s-Versionen "Custom App" mit den Container-Parametern aus dem Dockerfile nutzen.

---

Raspberry Pi (ARM64)

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip ~/vellaphine.zip
docker compose up -d --build

Erste Build-Phase auf einem Pi 4 dauert ca. 6–8 Minuten (bcrypt + cryptography werden kompiliert). Danach läuft die App mit ~80–120 MB RAM.

64-Bit-OS empfohlen (Raspberry Pi OS 64-bit oder Ubuntu Server arm64).

---

Cloud-VPS (Hetzner / IONOS / Hostinger / DigitalOcean)

apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
apt install -y unzip

mkdir -p /opt/vellaphine && cd /opt/vellaphine
unzip ~/vellaphine.zip
docker compose up -d --build

App via öffentlicher IP: http://<vps-ip>:8421

⚠️ Auf öffentlichen Servern unbedingt:

  1. Reverse-Proxy mit HTTPS aufsetzen (Pflicht für Push-Notifications, siehe unten)
  2. Port 8421 in der Firewall schließen, nur 80/443 offen lassen:

   ufw allow 22/tcp
   ufw allow 80/tcp
   ufw allow 443/tcp
   ufw deny 8421/tcp
   ufw enable
   

  1. Default-Passwort ändern
  2. Selbst-Registrierung deaktiviert lassen (Standard)

---

Erst-Login und erste Schritte

  1. Browser öffnen: http://<host>:8421
  2. Mit admin / admin einloggen
  3. Burger-Menü → "Konto"
  4. Passwort ändern
  5. Erscheinungsbild wählen (Hell/Dunkel/Auto + Akzentfarbe Rosé/Lavendel/Bernstein/Salbei)
  6. Hintergrund wählen (animiert oder ohne)
  7. Zykluslänge und Pausendauer eintragen
  8. Optional: Eigene Symptome anlegen (Konto → "Eigene Symptome")
  9. Optional: Benachrichtigungen aktivieren (HTTPS-Setup nötig — siehe unten)
Selbst-Registrierung freischalten

Standardmäßig deaktiviert. Aktivieren unter:

  • Admin-Panel → "Globale Einstellungen" → "Selbst-Registrierung aktivieren"

---

Reverse-Proxy mit eigener Domain

Für HTTPS und einen schönen Domainnamen brauchst du einen Reverse-Proxy. Web-Push-Notifications funktionieren nur mit HTTPS. Ohne TLS akzeptiert der Browser keine Subscription.

Caddy (einfachste Lösung)

/etc/caddy/Caddyfile ergänzen:

vellaphine.deine-domain.tld {
    reverse_proxy localhost:8421
    encode gzip zstd
    header {
        X-Frame-Options "SAMEORIGIN"
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        -Server
    }
}

HTTPS mit Let's Encrypt automatisch eingerichtet. sudo systemctl reload caddy.

Nginx Proxy Manager (NPM, GUI)
  1. NPM-Web-UI öffnen
  2. "Hosts" → "Proxy Hosts" → "Add Proxy Host"
  3. Domain: vellaphine.deine-domain.tld
  4. Forward Hostname/IP: <docker-host-ip> oder vellaphine
  5. Forward Port: 8421
  6. Tab "SSL" → "Let's Encrypt" + Force-SSL aktivieren
Nginx (manuell)

/etc/nginx/sites-available/vellaphine.conf:

server {
    listen 443 ssl http2;
    server_name vellaphine.deine-domain.tld;

    ssl_certificate /etc/letsencrypt/live/.../fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8421;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
server {
    listen 80;
    server_name vellaphine.deine-domain.tld;
    return 301 https://$server_name$request_uri;
}
sudo ln -s /etc/nginx/sites-available/vellaphine.conf /etc/nginx/sites-enabled/
sudo certbot --nginx -d vellaphine.deine-domain.tld
sudo nginx -t && sudo systemctl reload nginx
Traefik (Docker-Labels)

docker-compose.yml erweitern:

services:
  vellaphine:
    labels:
      - traefik.enable=true
      - traefik.http.routers.vellaphine.rule=Host(`vellaphine.deine-domain.tld`)
      - traefik.http.routers.vellaphine.tls.certresolver=letsencrypt
      - traefik.http.services.vellaphine.loadbalancer.server.port=8421
    networks:
      - traefik
networks:
  traefik:
    external: true
HTTPS-spezifisch: Secure-Cookie aktivieren

Sobald Vellaphine ausschließlich über HTTPS erreichbar ist:

services:
  vellaphine:
    environment:
      - SECURE_COOKIES=1

⚠️ Erst aktivieren, wenn HTTPS läuft.

---

Push-Notifications einrichten

Vellaphine kann erinnern an erwartete Periode, Eisprung-Tag und tägliche Tagebuch-Einträge.

Voraussetzungen
  1. HTTPS-Setup (Reverse-Proxy mit gültigem TLS-Zertifikat)
  2. Modernes Browser-Backend mit Push-Support (Chrome/Edge/Firefox/Safari 16.4+)
  3. Docker-Container mit installiertem pywebpush (im Dockerfile bereits vorgesehen)
VAPID-Schlüssel

Werden beim ersten Container-Start automatisch generiert in:

  • data/vapid_priv.pem (privat, niemals weitergeben)
  • data/vapid_pub.txt (Public Key, vom Frontend abgefragt)

Niemals löschen — bei Verlust müssen alle Subscriptions neu erstellt werden.

VAPID-Subject (optional konfigurieren)

Im docker-compose.yml:

environment:
  - VAPID_SUBJECT=mailto:dein-name@deine-domain.tld

Standardmäßig mailto:admin@example.com. Manche Push-Services (besonders Mozilla Autopush) verlangen eine echte Mail-Adresse — sonst kommen Pushes nicht an.

Aktivierung pro Benutzerin
  1. Konto → Sektion "Benachrichtigungen"
  2. Button "Auf diesem Gerät aktivieren" → Browser fragt nach Permission
  3. Drei Notification-Typen einzeln einschaltbar:

- Periode-Erinnerung — wenn die Periode für heute erwartet wird - Eisprung-Hinweis — am Tag des geschätzten Eisprungs - Tägliche Tagebuch-Erinnerung — frei wählbare Uhrzeit (Default 20:00)

  1. "Test-Push senden" verifiziert die Verbindung
Background-Worker

Im Container läuft ein Background-Thread, der alle 5 Minuten prüft, ob Push-Notifications fällig sind. Bei Mehr-Worker-Setup (z. B. gunicorn mit 2 Workern) sorgt ein File-Lock (data/notify.lock) dafür, dass nur ein Worker tatsächlich sendet.

Pro Gerät / Browser

Jedes Gerät und jeder Browser muss separat aktiviert werden — das ist Browser-bedingt, nicht Vellaphine. Eine Subscription gehört genau einem Browser-Profil. Bei Cookie-Löschung muss neu aktiviert werden.

Troubleshooting Push
# Im Container prüfen, ob pywebpush funktioniert
docker compose exec vellaphine python -c \
  "from pywebpush import webpush; print('OK')"

# VAPID-Keys vorhanden?
docker compose exec vellaphine ls -la /data/vapid_*

# /api/push/key liefert den Public Key?
curl -s http://localhost:8421/api/push/key
# erwartete Antwort: {"public_key":"BG...","enabled":true}

# Health zeigt has_webpush
curl -s http://localhost:8421/healthz
# erwartete Antwort: {"app":"Vellaphine","has_webpush":true,"status":"ok",...}

Wenn enabled: false oder has_webpush: false: pywebpush-Modul wurde nicht installiert (Build-Problem). Logs prüfen:

docker compose logs vellaphine | grep -i pywebpush

Lösung meist: Container neu bauen mit --no-cache:

docker compose build --no-cache && docker compose up -d

---

Backup & Restore

Alle Daten liegen ausschließlich in ./data/ neben der docker-compose.yml:

  • vellaphine.db — SQLite-Datenbank (User, Einträge, Symptome, Custom-Symptome, Push-Subscriptions, Mood/Energy)
  • secret.key — Session-Schlüssel
  • vapid_priv.pem + vapid_pub.txt — Push-Schlüssel
  • notify.lock — Background-Worker-Lock (kann ignoriert werden)
Backup
cd /pfad/zu/vellaphine
tar czf vellaphine-backup-$(date +%F).tar.gz data/
Automatisiertes Backup (Cron)

/etc/cron.daily/vellaphine-backup:

#!/bin/bash
cd /opt/vellaphine
tar czf "/mnt/backup/vellaphine-$(date +\%F).tar.gz" data/
find /mnt/backup/ -name "vellaphine-*.tar.gz" -mtime +30 -delete
chmod +x /etc/cron.daily/vellaphine-backup
Eigener Daten-Export pro Benutzerin

Zusätzlich zum Server-Backup kann jede Benutzerin ihre eigenen Daten exportieren:

  • Konto → "Daten exportieren"
  • CSV (Excel-kompatibel) — eine Zeile pro Tag, alle Symptome als Spalten
  • JSON — vollständig strukturiert
  • PDF — druckoptimierter Bericht für die Frauenärztin
Restore
cd /pfad/zu/vellaphine
docker compose down
rm -rf data
tar xzf vellaphine-backup-2026-05-10.tar.gz
docker compose up -d

---

Updates einspielen

data/-Volume bleibt immer unangetastet — Schema-Änderungen werden automatisch via ALTER TABLE migriert (z. B. neue Spalten für Mood, Energy, Custom-Symptome, Notifications).

cd /pfad/zu/vellaphine
docker compose down
unzip -o vellaphine-neu.zip -d .
docker compose up -d --build

Nach Update prüfen:

docker compose logs vellaphine | tail -30
Major-Version-Update
  1. Backup erstellen
  2. Release-Notes lesen
  3. Update einspielen
  4. Erst-Login testen
  5. Bei Push-Aktivierung: testen, ob Subscriptions noch gültig sind (sonst neu aktivieren)

---

Logs einsehen und Debugging

docker compose logs -f vellaphine                  # Live
docker compose logs --tail=100 vellaphine          # Letzte 100 Zeilen
docker compose logs --since=$(date -I) vellaphine  # Nur ab heute
docker compose ps                                  # Container-Status
docker compose exec vellaphine bash                # Shell im Container
Healthcheck
curl http://localhost:8421/healthz
# {"app":"Vellaphine","status":"ok","time":"...","has_webpush":true}
DB direkt inspizieren
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT username, is_admin, color_mode, accent_palette, notify_period_expected FROM users').fetchall())"
Push-Subscriptions zählen
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT user_id, COUNT(*) FROM push_subscriptions GROUP BY user_id').fetchall())"
Custom-Symptome eines Users sehen
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT label, sym_group FROM custom_symptoms WHERE user_id=1').fetchall())"

---

Häufige Fehler und Lösungen

"Port 8421 already allocated"

Anderer Service nutzt den Port. Im docker-compose.yml:

ports:
  - "8488:8421"
"Permission denied" beim Schreiben in /data
sudo chown -R 1000:1000 ./data
Login schlägt fehl

Admin-Reset:

docker compose exec vellaphine python -c \
  "import bcrypt, sqlite3; \
   h = bcrypt.hashpw(b'NeuesPasswort', bcrypt.gensalt()).decode(); \
   c = sqlite3.connect('/data/vellaphine.db'); \
   c.execute('UPDATE users SET password_hash=? WHERE username=?', (h, 'admin')); \
   c.commit()"
Push-Aktivierung schlägt fehl

Reihenfolge der Prüfungen:

  1. Wird die App über https:// aufgerufen? Ohne TLS verweigert der Browser die Permission.
  2. Hat der Browser Notifications grundsätzlich erlaubt? (Site-Settings → Benachrichtigungen)
  3. Liefert /api/push/key einen gültigen Key? (siehe oben)
  4. Im Browser-DevTools-Console nach Errors suchen.

Auf iOS Safari: Push funktioniert erst ab iOS 16.4 und nur, wenn die App vorher als "Zum Home-Bildschirm hinzufügen" gespeichert wurde.

Animationen ruckeln

Konto → Hintergrund → "Keiner". Spart CPU komplett.

"Cannot connect to the Docker daemon"
sudo systemctl start docker
sudo usermod -aG docker $USER
newgrp docker
Build hängt bei "Building cryptography"

Auf ARM-Geräten (Pi, Apple Silicon) braucht cryptography (Push-Dependency) 3–6 Minuten. Geduld haben — wird gecached, Folge-Builds sind schnell.

Falls Build dennoch fehlschlägt: prüfen, ob gcc, libffi-dev, libssl-dev im Dockerfile enthalten sind (sind im Standard-Dockerfile drin). Bei sehr alten ARM-Systemen ggf. pip install --upgrade pip im Build-Step ergänzen.

Container startet, aber App nicht erreichbar
docker compose ps
docker compose exec vellaphine curl -s http://localhost:8421/healthz
sudo ufw status
sudo iptables -L
Export-PDF zeigt unscharfe Schrift

Das ist Browser-Druck-Verhalten. Im Druck-Dialog "Mehr Einstellungen" → "Hintergrundgrafiken" deaktivieren für reines Schwarz/Weiß. Oder Firefox statt Chrome — rendert PDF-Druck oft kontrastreicher.

Heatmap leer obwohl Symptome erfasst

Heatmap zeigt die Top 12 Symptome an Häufigkeit. Wenn keine Symptome erfasst sind oder nur Mood/Energy: kein Inhalt. Range erweitern (90 → 365 Tage) hilft manchmal.

"Database disk image is malformed"

Aus Backup wiederherstellen:

docker compose down
mv data data-broken
tar xzf vellaphine-backup-2026-05-10.tar.gz
docker compose up -d
Hintergrund-Animation verschwindet auf bestimmten Geräten

Browser hat prefers-reduced-motion aktiviert (Betriebssystem-Einstellung "Bewegung reduzieren"). Vellaphine respektiert das absichtlich.

---

Support & Quellcode

  • Issues und Fragen: GitHub-Repository (falls publik) oder direkter Kontakt
  • Quellcode: vollständig im ZIP enthalten
  • Lizenz: siehe LICENSE-Datei im ZIP (falls vorhanden)

Vellaphine ist ein eigen-gehostetes Tool: keine Telemetrie, keine externen Aufrufe (außer Google Fonts beim ersten Laden und — falls aktiviert — Push-Endpoints von Mozilla/Google für Notifications), keine Tracker.

Vellaphine — Installation Guide

Your personal companion through every life phase.

Self-hosted journal for menopause symptoms and cycle tracking. All data remains on your own server; nobody outside your household has access.

This guide covers all common platforms — Linux, macOS, Windows, NAS devices, Raspberry Pi, and cloud servers.

---

Table of Contents

  1. Requirements
  2. Quick Start (Universal)
  3. Linux — Ubuntu / Debian
  4. Linux — Fedora / RHEL / Rocky
  5. Linux — Arch / Manjaro
  6. macOS
  7. Windows 10 / 11 (WSL2)
  8. Synology DSM 7
  9. UGREEN NASync (UGOS)
  10. QNAP Container Station
  11. TrueNAS SCALE
  12. Raspberry Pi (ARM64)
  13. Cloud VPS (Hetzner / IONOS / Hostinger / DigitalOcean)
  14. First Login and First Steps
  15. Reverse Proxy with Custom Domain
  16. Setting Up Push Notifications
  17. Backup & Restore
  18. Applying Updates
  19. Viewing Logs and Debugging
  20. Common Errors and Solutions

---

Requirements

| Component | Minimum | Recommended | |-----------|---------|-------------| | Docker Engine | 20.10 | 24.0+ | | Docker Compose | v2 (Plugin) | v2.20+ | | Disk Space | 250 MB | 1 GB | | RAM | 256 MB | 512 MB | | CPU | 1 core (x86_64 or ARM64) | 2 cores | | Port | 8421 (available) | freely configurable | | Network | LAN only for initial setup | Internet for updates | | HTTPS | optional | required for push notifications |

Vellaphine runs headless as a Docker container. A graphical interface is not required.

---

Quick Start (Universal)

On any system with Docker and Docker Compose installed:

# 1. Extract ZIP
unzip vellaphine.zip -d vellaphine
cd vellaphine

# 2. Build and start container
docker compose up -d --build

# 3. Open app in browser
# http://<host>:8421

Default login:

  • Username: admin
  • Password: admin

⚠️ Change immediately under "Account" → "Password" after first login.

On first startup, the following are automatically created:

  • SQLite database in data/vellaphine.db
  • Session key in data/secret.key
  • VAPID key pair for web push in data/vapid_priv.pem + data/vapid_pub.txt

---

Linux — Ubuntu / Debian

Install Docker (if not already present)
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

For Debian, replace the repository path with linux/debian.

Deploy Vellaphine
mkdir -p ~/docker/vellaphine
cd ~/docker/vellaphine
unzip /path/to/vellaphine.zip -d .
docker compose up -d --build

On first build, bcrypt and cryptography (for push) are compiled. On x86_64 this takes about 2–3 minutes; on ARM64 (Pi) about 4–6 minutes.

Autostart (systemd)

Docker containers with restart: unless-stopped (already set in docker-compose.yml) start automatically after reboot.

sudo systemctl enable docker

---

Linux — Fedora / RHEL / Rocky

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo systemctl enable --now docker
sudo usermod -aG docker $USER

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip /path/to/vellaphine.zip -d .
docker compose up -d --build

On RHEL/Rocky/AlmaLinux, replace the path with linux/centos.

Firewall (firewalld)
sudo firewall-cmd --permanent --add-port=8421/tcp
sudo firewall-cmd --reload
SELinux

If SELinux is active:

chcon -Rt svirt_sandbox_file_t ./data

---

Linux — Arch / Manjaro

sudo pacman -S docker docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip /path/to/vellaphine.zip -d .
docker compose up -d --build

---

macOS

Install Docker Desktop
  1. Download Docker Desktop for Mac from https://www.docker.com/products/docker-desktop/
  2. Open .dmg, drag app to Applications folder
  3. Start Docker and accept license

Alternative: OrbStack (https://orbstack.dev) — faster and more resource-efficient than Docker Desktop. Free for personal use.

Deploy Vellaphine
mkdir -p ~/Docker/vellaphine
cd ~/Docker/vellaphine
unzip ~/Downloads/vellaphine.zip -d .
docker compose up -d --build

Open app in browser: http://localhost:8421

Autostart

Docker Desktop → Preferences → "Start Docker Desktop when you log in" → enable.

---

Windows 10 / 11 (WSL2)

Install WSL2 + Docker Desktop
  1. Enable WSL2 in PowerShell (as Administrator):

   wsl --install
   wsl --set-default-version 2
   
Reboot.

  1. Install Ubuntu from Microsoft Store.
  1. Install Docker Desktop for Windows from https://www.docker.com/products/docker-desktop/. Select "Use WSL2 instead of Hyper-V".
  1. In Docker Desktop → Settings → Resources → WSL Integration → enable Ubuntu.
Deploy Vellaphine

In the WSL2 shell (Ubuntu):

mkdir -p ~/docker/vellaphine
cd ~/docker/vellaphine
cp /mnt/c/Users/<YourUser>/Downloads/vellaphine.zip .
unzip vellaphine.zip
docker compose up -d --build

Open app in browser: http://localhost:8421

---

Synology DSM 7

Using Container Manager (recommended)
  1. Package Center → install "Container Manager"
  2. Via File Station: create folder /docker/vellaphine, extract ZIP contents there
  3. Container Manager → "Project" → "Create"

- Project name: vellaphine - Path: /docker/vellaphine - Source: "Use docker-compose.yml that exists in the folder"

  1. "Create" → "Activate"
Via SSH (Power Users)
ssh admin@nas
sudo -i
cd /volume1/docker
mkdir vellaphine && cd vellaphine
unzip /volume1/homes/admin/vellaphine.zip -d .
docker compose up -d --build

App: http://nas-ip:8421

Reverse Proxy with DSM

DSM Control Panel → "Login Portal" → "Advanced" → "Reverse Proxy" → "Create":

  • Source: HTTPS, hostname vellaphine.your-domain.tld, port 443
  • Destination: HTTP, localhost, port 8421

DSM handles Let's Encrypt certificate under "Security" → "Certificate".

---

UGREEN NASync (UGOS)

UGOS is based on Debian. Vellaphine runs very well here.

Preparation
  1. Enable SSH: NAS web UI → "System Settings" → "Terminal & SSH" → turn on SSH
  2. Docker and Container Manager are pre-installed in UGOS 1.4+
Installation
ssh user@nas-ip
sudo -i
mkdir -p /volume1/docker/vellaphine
cd /volume1/docker/vellaphine

unzip /volume1/uploads/vellaphine.zip -d .
docker compose up -d --build

App: http://nas-ip:8421

Container Manager GUI as Alternative

Open UGREEN Container Manager → "Create Project" → path /volume1/docker/vellaphine → use Compose file.

PUID/PGID

UGOS standard: PUID=1000, PGID=10. If Vellaphine cannot write to data/ files, add to docker-compose.yml:

services:
  vellaphine:
    user: "1000:10"

---

QNAP Container Station

  1. Install Container Station from App Center
  2. "Applications" → "Create" → "Create Compose"
  3. Paste contents of docker-compose.yml, adjust volume path:

   volumes:
     - /share/Container/vellaphine/data:/data
   

  1. Copy ZIP contents to /share/Container/vellaphine/
  2. "Create" → "Start Application"

---

TrueNAS SCALE

ssh root@truenas
cd /mnt/<pool>/docker
mkdir vellaphine && cd vellaphine
unzip /tmp/vellaphine.zip -d .
docker compose up -d --build

TrueNAS SCALE 24.10+ officially uses Docker; earlier versions use k3s. For k3s versions, use "Custom App" with container parameters from the Dockerfile.

---

Raspberry Pi (ARM64)

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

mkdir -p ~/docker/vellaphine && cd ~/docker/vellaphine
unzip ~/vellaphine.zip
docker compose up -d --build

First build on a Pi 4 takes about 6–8 minutes (bcrypt + cryptography compile). Then the app runs with ~80–120 MB RAM.

64-bit OS recommended (Raspberry Pi OS 64-bit or Ubuntu Server arm64).

---

Cloud VPS (Hetzner / IONOS / Hostinger / DigitalOcean)

apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
apt install -y unzip

mkdir -p /opt/vellaphine && cd /opt/vellaphine
unzip ~/vellaphine.zip
docker compose up -d --build

Access app via public IP: http://<vps-ip>:8421

⚠️ On public servers, always:

  1. Set up reverse proxy with HTTPS (required for push notifications — see below)
  2. Close port 8421 in firewall, open only 80/443:

   ufw allow 22/tcp
   ufw allow 80/tcp
   ufw allow 443/tcp
   ufw deny 8421/tcp
   ufw enable
   

  1. Change default password
  2. Keep self-registration disabled (default)

---

First Login and First Steps

  1. Open browser: http://<host>:8421
  2. Log in with admin / admin
  3. Hamburger menu → "Account"
  4. Change password
  5. Choose appearance (Light/Dark/Auto + accent color Rose/Lavender/Amber/Sage)
  6. Choose background (animated or none)
  7. Enter cycle length and pause duration
  8. Optional: Create custom symptoms (Account → "Custom Symptoms")
  9. Optional: Enable notifications (HTTPS setup required — see below)
Enable Self-Registration

Disabled by default. Enable under:

  • Admin Panel → "Global Settings" → "Enable Self-Registration"

---

Reverse Proxy with Custom Domain

For HTTPS and a nice domain name, you need a reverse proxy. Web push notifications only work with HTTPS. Without TLS, browsers refuse permission.

Caddy (Easiest Solution)

Add to /etc/caddy/Caddyfile:

vellaphine.your-domain.tld {
    reverse_proxy localhost:8421
    encode gzip zstd
    header {
        X-Frame-Options "SAMEORIGIN"
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        -Server
    }
}

HTTPS with Let's Encrypt is set up automatically. Run sudo systemctl reload caddy.

Nginx Proxy Manager (NPM, GUI)
  1. Open NPM web UI
  2. "Hosts" → "Proxy Hosts" → "Add Proxy Host"
  3. Domain: vellaphine.your-domain.tld
  4. Forward Hostname/IP: <docker-host-ip> or vellaphine
  5. Forward Port: 8421
  6. Tab "SSL" → "Let's Encrypt" + enable Force SSL
Nginx (Manual)

/etc/nginx/sites-available/vellaphine.conf:

server {
    listen 443 ssl http2;
    server_name vellaphine.your-domain.tld;

    ssl_certificate /etc/letsencrypt/live/.../fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8421;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
server {
    listen 80;
    server_name vellaphine.your-domain.tld;
    return 301 https://$server_name$request_uri;
}
sudo ln -s /etc/nginx/sites-available/vellaphine.conf /etc/nginx/sites-enabled/
sudo certbot --nginx -d vellaphine.your-domain.tld
sudo nginx -t && sudo systemctl reload nginx
Traefik (Docker Labels)

Extend docker-compose.yml:

services:
  vellaphine:
    labels:
      - traefik.enable=true
      - traefik.http.routers.vellaphine.rule=Host(`vellaphine.your-domain.tld`)
      - traefik.http.routers.vellaphine.tls.certresolver=letsencrypt
      - traefik.http.services.vellaphine.loadbalancer.server.port=8421
    networks:
      - traefik
networks:
  traefik:
    external: true
HTTPS-Specific: Enable Secure Cookie

Once Vellaphine is reachable exclusively via HTTPS:

services:
  vellaphine:
    environment:
      - SECURE_COOKIES=1

⚠️ Only enable once HTTPS is running.

---

Setting Up Push Notifications

Vellaphine can remind you of expected period, ovulation day, and daily journal entries.

Prerequisites
  1. HTTPS setup (reverse proxy with valid TLS certificate)
  2. Modern browser with push support (Chrome/Edge/Firefox/Safari 16.4+)
  3. Docker container with installed pywebpush (already in Dockerfile)
VAPID Keys

Generated automatically on first container start in:

  • data/vapid_priv.pem (private, never share)
  • data/vapid_pub.txt (public key, requested by frontend)

Never delete — if lost, all subscriptions must be recreated.

VAPID Subject (Optional Configuration)

In docker-compose.yml:

environment:
  - VAPID_SUBJECT=mailto:your-name@your-domain.tld

Defaults to mailto:admin@example.com. Some push services (especially Mozilla Autopush) require a real email address — otherwise pushes don't arrive.

Enable Per User
  1. Account → "Notifications" section
  2. Click "Enable on this device" → browser asks for permission
  3. Three notification types can be toggled individually:

- Period reminder — when period is expected today - Ovulation hint — on estimated ovulation day - Daily journal reminder — custom time (default 20:00)

  1. "Send test push" verifies the connection
Background Worker

A background thread in the container checks every 5 minutes if push notifications are due. In multi-worker setups (e.g. gunicorn with 2 workers), a file lock (data/notify.lock) ensures only one worker actually sends.

Per Device / Browser

Each device and browser must be enabled separately — this is browser-dependent, not Vellaphine. A subscription belongs to exactly one browser profile. Clearing cookies requires re-enabling.

Troubleshooting Push
# Check if pywebpush works in container
docker compose exec vellaphine python -c \
  "from pywebpush import webpush; print('OK')"

# VAPID keys present?
docker compose exec vellaphine ls -la /data/vapid_*

# Does /api/push/key return the public key?
curl -s http://localhost:8421/api/push/key
# expected response: {"public_key":"BG...","enabled":true}

# Health endpoint shows has_webpush
curl -s http://localhost:8421/healthz
# expected response: {"app":"Vellaphine","has_webpush":true,"status":"ok",...}

If enabled: false or has_webpush: false: pywebpush module not installed (build issue). Check logs:

docker compose logs vellaphine | grep -i pywebpush

Solution usually: rebuild container with --no-cache:

docker compose build --no-cache && docker compose up -d

---

Backup & Restore

All data lives exclusively in ./data/ next to docker-compose.yml:

  • vellaphine.db — SQLite database (users, entries, symptoms, custom symptoms, push subscriptions, mood/energy)
  • secret.key — session key
  • vapid_priv.pem + vapid_pub.txt — push keys
  • notify.lock — background worker lock (can be ignored)
Backup
cd /path/to/vellaphine
tar czf vellaphine-backup-$(date +%F).tar.gz data/
Automated Backup (Cron)

/etc/cron.daily/vellaphine-backup:

#!/bin/bash
cd /opt/vellaphine
tar czf "/mnt/backup/vellaphine-$(date +\%F).tar.gz" data/
find /mnt/backup/ -name "vellaphine-*.tar.gz" -mtime +30 -delete
chmod +x /etc/cron.daily/vellaphine-backup
Per-User Data Export

In addition to server backups, each user can export their own data:

  • Account → "Export Data"
  • CSV (Excel-compatible) — one row per day, all symptoms as columns
  • JSON — fully structured
  • PDF — print-optimized report for your gynecologist
Restore
cd /path/to/vellaphine
docker compose down
rm -rf data
tar xzf vellaphine-backup-2026-05-10.tar.gz
docker compose up -d

---

Applying Updates

The data/ volume always remains untouched — schema changes are automatically applied via ALTER TABLE migrations (e.g. new columns for mood, energy, custom symptoms, notifications).

cd /path/to/vellaphine
docker compose down
unzip -o vellaphine-new.zip -d .
docker compose up -d --build

Check after update:

docker compose logs vellaphine | tail -30
Major Version Update
  1. Create backup
  2. Read release notes
  3. Apply update
  4. Test first login
  5. If push is active: test if subscriptions still work (otherwise re-enable)

---

Viewing Logs and Debugging

docker compose logs -f vellaphine                  # Live
docker compose logs --tail=100 vellaphine          # Last 100 lines
docker compose logs --since=$(date -I) vellaphine  # Since today
docker compose ps                                  # Container status
docker compose exec vellaphine bash                # Shell in container
Health Check
curl http://localhost:8421/healthz
# {"app":"Vellaphine","status":"ok","time":"...","has_webpush":true}
Inspect DB Directly
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT username, is_admin, color_mode, accent_palette, notify_period_expected FROM users').fetchall())"
Count Push Subscriptions
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT user_id, COUNT(*) FROM push_subscriptions GROUP BY user_id').fetchall())"
View Custom Symptoms of a User
docker compose exec vellaphine python -c \
  "import sqlite3; c=sqlite3.connect('/data/vellaphine.db'); \
   print(c.execute('SELECT label, sym_group FROM custom_symptoms WHERE user_id=1').fetchall())"

---

Common Errors and Solutions

"Port 8421 already allocated"

Another service is using the port. In docker-compose.yml:

ports:
  - "8488:8421"
"Permission denied" writing to /data
sudo chown -R 1000:1000 ./data
Login fails

Admin reset:

docker compose exec vellaphine python -c \
  "import bcrypt, sqlite3; \
   h = bcrypt.hashpw(b'NewPassword', bcrypt.gensalt()).decode(); \
   c = sqlite3.connect('/data/vellaphine.db'); \
   c.execute('UPDATE users SET password_hash=? WHERE username=?', (h, 'admin')); \
   c.commit()"
Push activation fails

Check in order:

  1. Is the app accessed via https://? Without TLS, browsers refuse permission.
  2. Has the browser allowed notifications globally? (Site settings → Notifications)
  3. Does /api/push/key return a valid key? (see above)
  4. Check browser DevTools console for errors.

On iOS Safari: push only works from iOS 16.4+ and only if the app was previously "Add to Home Screen".

Animations stutter

Account → Background → "None". Saves CPU entirely.

"Cannot connect to the Docker daemon"
sudo systemctl start docker
sudo usermod -aG docker $USER
newgrp docker
Build hangs on "Building cryptography"

On ARM devices (Pi, Apple Silicon), cryptography (push dependency) takes 3–6 minutes. Be patient — subsequent builds are cached and fast.

If build still fails: verify gcc, libffi-dev, libssl-dev are in Dockerfile (they are in standard Dockerfile). On very old ARM systems, possibly add pip install --upgrade pip in build step.

Container starts but app unreachable
docker compose ps
docker compose exec vellaphine curl -s http://localhost:8421/healthz
sudo ufw status
sudo iptables -L
Export PDF shows blurry font

This is browser print behavior. In print dialog, click "More settings" → disable "Background graphics" for pure black/white. Or try Firefox instead of Chrome — often renders PDF print with better contrast.

Heatmap empty despite logged symptoms

Heatmap shows top 12 symptoms by frequency. If no symptoms logged or only mood/energy: no content. Expanding range (90 → 365 days) sometimes helps.

"Database disk image is malformed"

Restore from backup:

docker compose down
mv data data-broken
tar xzf vellaphine-backup-2026-05-10.tar.gz
docker compose up -d
Background animation disappears on certain devices

Browser has prefers-reduced-motion enabled (OS "reduce motion" setting). Vellaphine respects this intentionally.

---

Support & Source Code

  • Issues and questions: GitHub repository (if public) or direct contact
  • Source code: fully included in ZIP
  • License: see LICENSE file in ZIP (if present)

Vellaphine is a self-hosted tool: no telemetry, no external calls (except Google Fonts on first load and — if enabled — push endpoints from Mozilla/Google for notifications), no trackers.

Preise

Einmal kaufen, dauerhaft nutzen

Vellaphine
Meine Frau fand nie eine praktische App - also habe ich sie gefragt wie es aussehen soll und was es braucht. Herausgekommen ist Vellaphine.
Kostenlos

  • Export-Funktion (CSV/JSON/PDF) für eigene Daten zum Mitnehmen zur Frauenärztin oder als Backup
  • Custom-Symptome zur festen Liste hinzufügen, mit eigener Bezeichnung und Gruppen-Zuordnung
  • Web-Push-Benachrichtigungen für erwartete Periode, Eisprung-Fenster oder als tägliche Tagebuch-Erinnerung
  • Wochen- und Jahresansicht zusätzlich zur Monatsansicht im Kalender, plus Heatmap zur Mustererkennung
  • Stimmungs- und Energie-Tracking pro Tag mit eigener 1–5-Skala, separat von Symptomen, mit Verlaufsdiagramm im Konto
Weitere Produkte

Entdecken Sie auch unsere anderen Projekte

Lade Produkte…