Files
Homelab--Bratonein-Kontroll…/Kapitel 07/Free Rohtext.md

775 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kapitel 7 Affine (Open-Source Notion-Alternative)
Affine ist eine vollständig selbst gehostete Plattform für Notizen, Aufgaben, Whiteboards und Projekte eine private Alternative zu Diensten wie Notion, Miro oder ClickUp.
Sie läuft auf deinem eigenen UCC-Server und speichert alle Daten ausschließlich unter deiner Kontrolle.
Für Content Creator, Streamer und kleine Teams ist Affine ideal:
Du kannst Ideen sammeln, Projekte planen, Redaktionsabläufe organisieren und gemeinsam an Inhalten arbeiten alles ohne externe Anbieter.
> [!TIP]
> Affine vereint klassische Textverarbeitung, Whiteboard-Visualisierung und Tabellen in einem System.
> So kannst du deine Planung, Notizen und Konzepte direkt in einem zentralen Workspace verwalten.
### Ziel dieses Kapitels
Wir installieren Affine in einem eigenen **Debian 12 LXC-Container** und kombinieren zwei wichtige Komponenten:
- **PostgreSQL** als Datenbank für Projekte, Dokumente und Workspaces
- **Redis** für schnellen Cache und Hintergrundprozesse
Anschließend binden wir die Instanz über den **Nginx Proxy Manager (NPM)** sicher an deine Domain an und aktivieren die Weboberfläche für mehrere Benutzer.
So entsteht ein vollständiger Notiz- und Projektarbeitsbereich, der auf jedem Gerät erreichbar ist übersichtlich, stabil und unter deiner Kontrolle.
> [!NOTE]
> Wir bauen hier direkt auf den Grundlagen aus den vorherigen Kapiteln auf.
> Du brauchst also keine neuen Tools, nur denselben Proxmox-Host, den du bereits nutzt.
👉 *Screenshot geeignet: Affine-Dashboard mit geöffnetem Board und Dokumentenansicht.*
## Voraussetzungen & Ressourcen
Affine ist eine moderne, aber ressourcenschonende Plattform.
Damit alle Funktionen Dokumente, Boards und Datenbankzugriffe zuverlässig arbeiten, sollte der Container eine stabile Basis bieten.
### Anforderungen an den Container
- **Betriebssystem:** Debian 12 (Bookworm)
Debian ist schlank, stabil und hervorragend für LXC-Container geeignet.
- **CPU:** 2 Kerne
- **RAM:** 4 GB
- **Speicherplatz:** 20 GB
- **Netzwerk:** Statische IPv4-Adresse per DHCP-Reservierung, z. B. `192.168.1.70`
> [!TIP]
> Weise die IP-Adresse im Router per **DHCP-Reservierung** zu.
> So bleibt sie dauerhaft gleich und verhindert Konflikte mit automatisch vergebenen Adressen.
> [!NOTE]
> Affine benötigt keine zusätzliche Datenplatte.
> Alle Inhalte werden in der Datenbank (PostgreSQL) und im Cache (Redis) gespeichert.
> Wenn du nicht sicher bist, wie du einen LXC-Container anlegst,
> findest du die vollständige Anleitung in **Kapitel 2 Pi-hole + Unbound**.
👉 *Screenshot geeignet: Proxmox-Maske „Neuen LXC erstellen“ mit aktivierter Option „Nesting“.*
---
### Voraussetzungen im UCC
Affine wird später über den bereits eingerichteten **Nginx Proxy Manager (NPM)** erreichbar gemacht.
Dieser übernimmt die SSL-Verschlüsselung und die Verbindung zwischen Internet und deiner Affine-Instanz.
Für dieses Kapitel genügt es, wenn der Proxy bereits läuft und deine Domain erreichbar ist.
> [!NOTE]
> Die konkrete Einrichtung des Proxy Hosts erfolgt im Hauptteil des Tutorials,
> sobald der Container fertig installiert und Affine lokal erreichbar ist.
👉 *Screenshot geeignet: UCC-Strukturübersicht mit NPM-Container und geplantem Affine-LXC.*
### Dienste im Überblick
Im Container installieren wir zwei zentrale Dienste:
1. **PostgreSQL** Datenbank für Projekte, Dokumente und Workspaces
2. **Redis** Cache und Synchronisations-Backend für schnelle Zugriffe
Diese beiden Komponenten bilden die technische Basis für eine stabile Affine-Instanz.
> [!NOTE]
> Redis beschleunigt die Bearbeitung und ermöglicht gleichzeitige Zugriffe auf gemeinsame Boards,
> ohne dass es zu Datei-Sperren oder Datenkonflikten kommt.
👉 *Screenshot geeignet: Diagramm mit Verbindung Affine ↔ Redis + PostgreSQL.*
---
## Schritt für Schritt
Bevor wir mit der eigentlichen Installation beginnen, stellen wir sicher, dass der Container bereit ist und alle Systempakete aktuell sind.
Alle folgenden Befehle werden **direkt im Container-Terminal** ausgeführt.
### System aktualisieren
Führe die Aktualisierung aus:
```bash
apt update && apt upgrade -y
```
> [!NOTE]
> Dieser Schritt stellt sicher, dass alle installierten Pakete auf dem neuesten Stand sind.
> Führe ihn immer vor neuen Installationen aus, um Versionskonflikte zu vermeiden.
👉 *Screenshot geeignet: Terminal mit abgeschlossener Paketaktualisierung.*
### Basis-Tools installieren
Einige Werkzeuge werden für Docker, PostgreSQL und Redis benötigt.
Installiere sie in einem Schritt:
```bash
apt install -y curl gnupg2 ca-certificates lsb-release apt-transport-https software-properties-common unzip nano sudo
```
> [!TIP]
> Diese Tools sind systemweit nützlich du kannst sie auch in anderen Containern wiederverwenden.
👉 *Screenshot geeignet: Terminal mit erfolgreicher Installation der Basis-Tools.*
### Docker installieren
Affine wird über Docker Compose betrieben.
Damit Docker im Container korrekt funktioniert, richten wir zunächst das offizielle Repository ein und installieren anschließend die Pakete.
```bash
# Docker GPG-Schlüssel importieren
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Repository hinzufügen
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
> /etc/apt/sources.list.d/docker.list
# Paketlisten aktualisieren und Docker installieren
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
> [!NOTE]
> Nach der Installation steht der Befehl `docker compose` systemweit zur Verfügung.
> Damit können mehrere Dienste wie Affine, PostgreSQL und Redis gemeinsam gestartet werden.
👉 *Screenshot geeignet: Terminal mit installierten Docker-Paketen.*
### Docker-Dienst aktivieren und prüfen
Starte und aktiviere den Docker-Dienst:
```bash
systemctl enable --now docker
```
Prüfe anschließend die Installation:
```bash
docker --version
docker compose version
```
Wenn beide Befehle Versionen ausgeben, läuft Docker korrekt.
Docker startet künftig automatisch beim Hochfahren des Containers du musst ihn nicht manuell aktivieren.
👉 *Screenshot geeignet: Terminal mit erfolgreicher Docker-Versionsanzeige.*
### Verzeichnisstruktur für Affine anlegen
Affine wird in einem eigenen Anwendungsverzeichnis betrieben.
Dort liegen später die Docker-Konfigurationsdateien und Datenbanken.
```bash
mkdir -p /srv/affine
cd /srv/affine
```
> [!NOTE]
> In diesem Verzeichnis legen wir gleich die `docker-compose.yml` ab,
> über die Affine, PostgreSQL und Redis gemeinsam gestartet werden.
👉 *Screenshot geeignet: Dateistruktur /srv/affine im Terminal.
### Docker-Compose-Datei erstellen und Affine installieren
Affine wird zusammen mit PostgreSQL und Redis in Containern betrieben.
Alle Dienste lassen sich über eine einzige `docker-compose.yml` steuern.
Wir legen sie jetzt an und konfigurieren sie Schritt für Schritt.
Wechsle in das Arbeitsverzeichnis und öffne den Editor:
```bash
cd /srv/affine
nano docker-compose.yml
```
Füge folgenden Inhalt ein:
```yaml
version: "3.9"
services:
affine:
image: ghcr.io/toeverything/affine-graphql:stable
container_name: affine
restart: unless-stopped
depends_on:
- db
- redis
ports:
- "3000:3000"
environment:
- AFFINE_SERVER_PORT=3000
- DATABASE_URL=postgresql://affine:DEIN_SICHERES_PASSWORT@db:5432/affine
- REDIS_URL=redis://redis:6379
volumes:
- affine_data:/app/.affine
db:
image: postgres:16
container_name: affine_db
restart: unless-stopped
environment:
- POSTGRES_DB=affine
- POSTGRES_USER=affine
- POSTGRES_PASSWORD=DEIN_SICHERES_PASSWORT
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: redis:7
container_name: affine_redis
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
affine_data:
db_data:
redis_data:
```
> [!NOTE]
> Ersetze `DEIN_SICHERES_PASSWORT` an beiden Stellen durch ein starkes Passwort mit Sonderzeichen.
> Dieses Passwort sichert sowohl die Datenbank als auch den internen Zugriff des Affine-Servers auf PostgreSQL.
Speichern mit **Strg + O**, bestätigen mit **Enter**, schließen mit **Strg + X**.
👉 *Screenshot geeignet: Editor mit vollständiger docker-compose.yml.*
### Container starten
Starte anschließend alle Dienste:
```bash
docker compose up -d
```
Docker lädt die benötigten Images und startet die Container automatisch.
Der erste Start kann einige Minuten dauern, da mehrere Abhängigkeiten eingerichtet werden.
> [!TIP]
> Mit `docker compose ps` kannst du jederzeit prüfen, ob alle Dienste laufen.
> In der Spalte „State“ sollte bei allen Containern „running“ stehen.
👉 *Screenshot geeignet: Terminal mit Ausgabe von docker compose ps.*
### Funktion prüfen
Öffne im Browser die Adresse deines Servers:
```
http://192.168.1.70:3000
```
Es sollte die Willkommensseite von **Affine** erscheinen.
> [!NOTE]
> Wenn die Seite nicht geladen wird, überprüfe mit
> ```bash
> docker compose logs affine
> ```
> ob der Dienst fehlerfrei gestartet wurde.
👉 *Screenshot geeignet: Browserfenster mit Affine-Startseite.*
### Affine im Nginx Proxy Manager einrichten
Affine ist nun lokal im Container über Port 3000 erreichbar.
Damit du die Anwendung auch verschlüsselt über deine Domain aufrufen kannst,
richten wir im **Nginx Proxy Manager (NPM)** einen neuen Proxy Host ein.
#### Anmeldung im Dashboard
Öffne im Browser das NPM-Dashboard:
```
https://proxy.DEINE-DOMAIN.tld
```
Alternativ kannst du dich auch über die interne IP deines Proxy-Containers anmelden:
```
http://192.168.1.10:81
```
Melde dich mit deinem Administrator-Konto an.
Im Menü klickst du links auf **Hosts → Proxy Hosts**
und anschließend oben rechts auf **Add Proxy Host**.
👉 *Screenshot geeignet: NPM-Dashboard mit geöffnetem Menü „Proxy Hosts“.*
#### Proxy Host anlegen
Trage die Daten wie folgt ein:
| Feld | Wert |
|------|------|
| **Domain Names** | `affine.DEINE-DOMAIN.tld` |
| **Scheme** | `http` |
| **Forward Hostname / IP** | IP-Adresse des Affine-Containers, z. B. `192.168.1.70` |
| **Forward Port** | `3000` |
| **Block Common Exploits** | ✅ aktiviert |
| **Websockets Support** | ✅ aktiviert |
> [!NOTE]
> Affine läuft intern über HTTP auf Port 3000.
> Der Proxy Manager übernimmt die HTTPS-Verschlüsselung und kümmert sich automatisch um das Zertifikat.
👉 *Screenshot geeignet: ausgefüllte Proxy-Maske mit Beispielwerten.*
#### SSL-Zertifikat erstellen
Wechsle in den Reiter **SSL**
und wähle **Request a new SSL Certificate**.
1. Aktiviere folgende Optionen:
- ✅ Force SSL
- ✅ HTTP/2 Support
- ✅ HSTS (optional, empfohlen)
2. Gib deine E-Mail-Adresse ein (für Lets Encrypt).
3. Klicke auf **Save**.
Nach wenigen Sekunden erscheint das Zertifikat mit dem Status *Active*.
> [!TIP]
> Falls die Zertifikatserstellung fehlschlägt, prüfe,
> ob Port 80 und 443 in deiner Firewall und im Router korrekt weitergeleitet sind
> und die Domain auf die öffentliche IP deines UCC zeigt.
👉 *Screenshot geeignet: SSL-Reiter mit aktiviertem Lets-Encrypt-Zertifikat.*
#### Erweiterte Einstellungen
Affine kann große Datenmengen und komplexe Whiteboards verarbeiten.
Damit der Proxy keine Timeouts verursacht, erweitern wir die Standardwerte.
1. Öffne beim selben Proxy Host den Reiter **Advanced**.
2. Füge folgenden Text ein:
```nginx
client_max_body_size 10G;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
```
3. Klicke auf **Save**.
> [!NOTE]
> Diese Werte verhindern Abbrüche bei größeren Dokumenten, Importen oder längeren Sitzungen.
👉 *Screenshot geeignet: Reiter „Advanced“ mit eingetragenen Timeout-Werten.*
#### Verbindung prüfen
Öffne im Browser:
```
https://affine.DEINE-DOMAIN.tld
```
Wenn alles korrekt eingerichtet ist, erscheint das Anmeldefenster bzw. die Startseite von Affine.
Damit ist der externe Zugriff über den Proxy erfolgreich hergestellt.
> [!TIP]
> Sollte stattdessen eine Fehlermeldung oder eine Nginx-Standardseite erscheinen,
> prüfe, ob **Forward Hostname/IP** und **Port 3000** richtig eingetragen sind
> und die Domain auf den NPM-Server zeigt.
👉 *Screenshot geeignet: Browserfenster mit geöffneter Affine-Oberfläche über HTTPS.*
### Ersteinrichtung & Benutzerkonto anlegen
Nachdem die Verbindung über den Proxy funktioniert, kannst du Affine direkt im Browser einrichten.
Öffne dazu die Adresse deiner Instanz:
```
https://affine.DEINE-DOMAIN.tld
```
Nach kurzer Ladezeit erscheint die Startseite von Affine mit der Aufforderung, ein erstes Konto zu erstellen.
👉 *Screenshot geeignet: Browserfenster mit Affine-Anmeldemaske.*
#### Erstes Benutzerkonto erstellen
Trage deine gewünschten Zugangsdaten ein:
| Feld | Beschreibung |
|------|--------------|
| **E-Mail-Adresse** | dient als Benutzername und zur Anmeldung |
| **Passwort** | ein sicheres Kennwort mit Sonderzeichen |
| **Workspace-Name** | frei wählbar, z. B. `UCC Projekte` |
Klicke anschließend auf **Create Account** oder **Register**.
> [!TIP]
> Verwende eine gültige E-Mail-Adresse, auch wenn du keine E-Mail-Bestätigung erhältst.
> Sie dient später zur Anmeldung und kann für Benachrichtigungen genutzt werden,
> sobald du einen Mail-Dienst angebunden hast.
👉 *Screenshot geeignet: Formular mit ausgefüllten Feldern.*
#### Anmeldung im Dashboard
Nach der Registrierung wirst du automatisch in dein Dashboard weitergeleitet.
Hier siehst du deinen ersten Workspace, eine leere Startseite und die linke Navigationsleiste mit den Bereichen:
- **Docs** klassische Textdokumente mit Überschriften, Listen und Medien
- **Whiteboards** visuelle Notizen und Planungen
- **Database / Tables** strukturierte Datensammlungen (z. B. Projektlisten oder Aufgaben)
- **Settings** Benutzer- und Workspace-Einstellungen
> [!NOTE]
> Die Free-Version von Affine unterstützt mehrere Workspaces,
> aber keine geteilten Benutzerkonten mit erweiterten Berechtigungen.
> Diese Funktionen sind der späteren Premium-Version vorbehalten.
👉 *Screenshot geeignet: Affine-Dashboard nach der Ersteinrichtung.*
#### Grundeinstellungen prüfen
Bevor du beginnst, Inhalte zu erstellen, prüfe die Basiskonfiguration.
1. Öffne links das Menü **Settings → System**.
2. Überprüfe, ob die Verbindung zu **PostgreSQL** und **Redis** aktiv ist.
Beide sollten als *Connected* angezeigt werden.
3. Unter **About** kannst du die aktuelle Version und Build-Nummer sehen.
> [!TIP]
> Wenn einer der Dienste als „Disconnected“ angezeigt wird,
> starte die Container neu:
> ```bash
> docker compose restart
> ```
> In der Regel behebt das Verbindungsprobleme sofort.
👉 *Screenshot geeignet: Einstellungen-Seite mit aktiven Diensten.*
Damit ist Affine vollständig eingerichtet und einsatzbereit.
Im nächsten Schritt richten wir optionale Synchronisationsfunktionen und den automatischen Neustart des Containers ein.
### Affine verwenden Grundlagen der Oberfläche
Nach der Ersteinrichtung kannst du Affine sofort nutzen.
Die Oberfläche ist klar strukturiert und ähnelt bekannten Tools wie Notion oder Miro.
Wir gehen jetzt die wichtigsten Bereiche durch, um dir den Einstieg zu erleichtern.
#### Aufbau der Oberfläche
Die Benutzeroberfläche besteht aus drei Hauptbereichen:
1. **Linke Seitenleiste** Navigation zwischen Workspaces, Dokumenten und Boards
2. **Arbeitsbereich** zentrale Fläche, auf der du schreibst, zeichnest oder planst
3. **Obere Menüleiste** Aktionen wie Speichern, Teilen oder Ansicht wechseln
👉 *Screenshot geeignet: Affine-Hauptfenster mit markierten Bereichen.*
> [!NOTE]
> Die Oberfläche ist vollständig webbasiert.
> Änderungen werden automatisch gespeichert, sobald du tippst oder ein Element verschiebst.
> Ein manuelles Speichern ist nicht nötig.
#### Neues Dokument anlegen
Um ein neues Dokument zu erstellen, klickst du in der linken Seitenleiste auf **New Doc** oder das **Plus-Symbol**.
Im Arbeitsbereich öffnet sich eine leere Seite.
Du kannst direkt mit dem Schreiben beginnen oder Textblöcke hinzufügen.
**Wichtige Funktionen:**
- **Überschrift hinzufügen:** `#` + Leertaste
- **Liste erstellen:** `-` + Leertaste
- **Checkliste:** `[ ]` + Leertaste
- **Trennlinie:** `---`
- **Befehlspalette:** `/` öffnet alle verfügbaren Block-Typen
👉 *Screenshot geeignet: Beispielseite mit Text, Liste und Überschrift.*
> [!TIP]
> Du kannst Blöcke jederzeit verschieben, indem du links neben dem Text auf die sechs Punkte klickst
> und sie per Drag-and-Drop an eine andere Stelle ziehst.
#### Whiteboards nutzen
Affine kombiniert Textdokumente und Whiteboards im selben Workspace.
Um in den visuellen Modus zu wechseln, klickst du oben rechts auf **Edgeless**.
Jetzt kannst du frei zeichnen, Formen platzieren, Textfelder anlegen oder Notizen verbinden.
**Nützliche Aktionen:**
- Formen hinzufügen: `O` für Kreise, `R` für Rechtecke
- Textfeld erstellen: `T`
- Linien und Pfeile ziehen: `L`
- Zoomen: `Strg + Mausrad` oder Touch-Gesten
- Rückgängig machen: `Strg + Z`
👉 *Screenshot geeignet: Offenes Whiteboard mit Notizen und Pfeilen.*
> [!NOTE]
> Alle Inhalte Text und Grafiken werden automatisch gespeichert.
> Du kannst jederzeit zurück in die Dokumentansicht wechseln, ohne Daten zu verlieren.
#### Tabellen und Listen
Affine bietet einfache Tabellen- und Datenbankfunktionen.
Damit kannst du z. B. Redaktionspläne, Stream-Ideen oder To-Do-Listen verwalten.
Klicke auf **New Table**, gib Spaltennamen ein und wähle den Datentyp (Text, Zahl, Datum, Auswahl).
Neue Zeilen fügst du über das Plus-Symbol unterhalb der Tabelle hinzu.
> [!TIP]
> Tabellen lassen sich in Dokumente einbetten oder auf einem Whiteboard verknüpfen.
> So kannst du Projektlisten visuell darstellen oder mit Textnotizen kombinieren.
👉 *Screenshot geeignet: Beispiel-Tabelle mit Projektnamen und Status-Spalte.*
#### Eigenes Dashboard erstellen
Ein Dashboard ist eine Übersichtsseite mit deinen wichtigsten Informationen und Verknüpfungen.
So kannst du dir z. B. ein **Content-Planungs-Dashboard** oder eine **Projektübersicht** bauen.
1. Erstelle ein neues Dokument mit dem Titel `Dashboard`.
2. Füge mit `/table` eine oder mehrere Tabellen ein z. B. eine Liste deiner Projekte.
3. Füge darüber eine Textüberschrift hinzu, z. B. `# UCC Übersicht`.
4. Mit `/link to page` kannst du direkt auf andere Dokumente oder Whiteboards verweisen.
5. Optional kannst du Emojis oder Icons vor Überschriften setzen, um Kategorien visuell zu trennen.
> [!TIP]
> Nutze Tabellen als interaktive Listen:
> - Spalte **Status** mit Optionen wie „In Arbeit“, „Fertig“, „Geplant“
> - Spalte **Typ** für die Kategorie (z. B. Video, Stream, Blogpost)
> - Spalte **Veröffentlichung** als Datum
>
> So kannst du dein Dashboard wie eine kleine Redaktionsplanung verwenden.
👉 *Screenshot geeignet: Beispiel-Dashboard mit Tabelle und internen Verknüpfungen.*
#### Ansichten und Filter
Affine erlaubt es, Tabellen nach Bedarf zu filtern oder zu sortieren.
Damit kannst du z. B. nur geplante Projekte oder abgeschlossene Aufgaben anzeigen.
1. Öffne eine Tabelle.
2. Klicke oben auf **Filter → Add Filter**.
3. Wähle die Spalte und Bedingung, z. B. `Status = In Arbeit`.
4. Du kannst mehrere Filter kombinieren oder eine eigene Ansicht speichern.
> [!NOTE]
> Diese Funktion entspricht der Ansichtsauswahl in Notion.
> Jede gespeicherte Ansicht kann unterschiedliche Filter, Sortierungen und Layouts enthalten.
👉 *Screenshot geeignet: Tabelle mit aktivem Filter-Menü.*
#### Arbeiten mit Workspaces
Ein Workspace ist der zentrale Arbeitsbereich in Affine.
Er enthält deine Dokumente, Boards und Tabellen.
- Standardmäßig wird beim ersten Start ein Workspace erstellt.
- Weitere Workspaces kannst du über das Menü **Switch Workspace → New Workspace** anlegen.
- Jeder Workspace ist unabhängig und hat eigene Berechtigungen und Inhalte.
> [!NOTE]
> In der Free-Version ist die Anzahl der Workspaces begrenzt,
> sie reicht jedoch für den persönlichen oder kreativen Gebrauch vollständig aus.
👉 *Screenshot geeignet: Workspace-Übersicht mit mehreren Projekten.*
Damit kennst du die Grundfunktionen von Affine und kannst eigene Dashboards, Projektlisten und Boards anlegen.
Im nächsten Abschnitt gehen wir auf häufige Probleme, Systemmeldungen und deren Lösungen ein.
---
## Troubleshooting & Tipps
Nach der Einrichtung kann es in Affine zu kleineren Problemen oder Warnmeldungen kommen.
In diesem Abschnitt gehen wir auf typische Ursachen und deren Lösungen ein.
### Container starten nicht korrekt
Wenn nach einem Neustart des LXC einer oder mehrere Container nicht laufen, prüfe zunächst den Status:
```bash
cd /srv/affine
docker compose ps
```
In der Spalte **State** sollte bei allen Einträgen *running* stehen.
Wenn ein Dienst mit *exited* oder *restarting* angezeigt wird, überprüfe die Logs:
```bash
docker compose logs affine
docker compose logs db
docker compose logs redis
```
> [!NOTE]
> Häufigste Ursache ist ein falsch gesetztes Passwort in der `docker-compose.yml`.
> PostgreSQL verweigert dann die Verbindung.
> Öffne in diesem Fall die Datei erneut und prüfe die Passwörter.
👉 *Screenshot geeignet: Terminal mit Ausgabe von docker compose ps.*
### Zugriff im Browser nicht möglich
Wenn du Affine über `https://affine.DEINE-DOMAIN.tld` nicht erreichst,
teste zuerst den direkten Zugriff auf den Container:
```
http://192.168.1.70:3000
```
Wenn die Seite lokal funktioniert, liegt das Problem meist im **Nginx Proxy Manager**.
1. Öffne den Proxy Host in NPM.
2. Prüfe, ob die **IP-Adresse** und der **Port 3000** korrekt eingetragen sind.
3. Kontrolliere im Reiter **SSL**, ob das Zertifikat aktiv ist.
4. Speichere den Eintrag erneut und teste die Domain nach wenigen Minuten.
> [!TIP]
> Wenn die Domain zwar lädt, aber nur eine leere Seite zeigt,
> hilft häufig ein Browser-Cache-Reset (Strg + F5).
👉 *Screenshot geeignet: Proxy-Host-Maske mit korrekten Einträgen.*
### Änderungen werden nicht gespeichert
Affine speichert Inhalte automatisch, sobald du sie änderst.
Wenn neue Dokumente oder Boards nach einem Neustart fehlen,
ist meist das Volume für die App-Daten nicht korrekt eingebunden.
Prüfe im Container:
```bash
docker volume ls
```
In der Liste müssen die Volumes `affine_affine_data`, `affine_db_data` und `affine_redis_data` vorhanden sein.
Falls eines fehlt, starte die Container komplett neu:
```bash
docker compose down
docker compose up -d
```
> [!NOTE]
> Docker legt fehlende Volumes automatisch wieder an.
> Bereits vorhandene Inhalte bleiben erhalten.
👉 *Screenshot geeignet: Terminal mit docker volume ls.*
### Datenbankfehler oder „connection refused“
Wenn Affine beim Start eine Fehlermeldung wie
`database connection failed` anzeigt, ist die Verbindung zu PostgreSQL unterbrochen.
Führe folgende Prüfung aus:
```bash
docker exec -it affine_db pg_isready
```
Wenn die Ausgabe `accepting connections` lautet, ist die Datenbank aktiv.
Andernfalls hilft ein Neustart:
```bash
docker compose restart db
```
> [!TIP]
> In seltenen Fällen ist das Volume beschädigt.
> Du kannst die Datenbank neu anlegen, indem du die Container stoppst,
> das Volume `affine_db_data` löschst und die Container erneut startest.
> Die App legt dann eine frische leere Datenbank an.
👉 *Screenshot geeignet: Terminal mit pg_isready-Ausgabe.*
### Container regelmäßig neu starten
Wenn Affine nach längerer Laufzeit träge reagiert oder Speicherprobleme zeigt,
hilft ein periodischer Neustart der Container.
Das ist kein Fehler, sondern normales Wartungsverhalten bei Web-Anwendungen.
Führe diesen Befehl aus, um alle Container neu zu starten:
```bash
cd /srv/affine
docker compose restart
```
> [!NOTE]
> Dadurch bleiben alle Daten erhalten.
> Nur der Arbeitsspeicher wird freigegeben, was die Performance verbessert.
👉 *Screenshot geeignet: Terminal mit Neustart-Ausgabe.*
### Updates installieren
Affine wird regelmäßig aktualisiert.
Um auf die neueste Version zu wechseln, führe im Container folgende Befehle aus:
```bash
cd /srv/affine
docker compose pull
docker compose up -d
```
> [!TIP]
> `docker compose pull` lädt nur neue Versionen herunter,
> ohne die bestehenden Daten zu löschen.
> So kannst du sicher aktualisieren, ohne den Workspace zu verlieren.
👉 *Screenshot geeignet: Terminal mit erfolgreichem Update-Vorgang.*
Damit bist du auf typische Situationen vorbereitet und kannst Affine im laufenden Betrieb warten.
Im nächsten Abschnitt folgt die Zusammenfassung und der Ausblick auf die nächsten Schritte.
## Zusammenfassung & Nächste Schritte
Mit diesem Kapitel hast du eine vollständig funktionsfähige Affine-Instanz eingerichtet
von der Installation über Docker bis hin zur sicheren Bereitstellung über den Nginx Proxy Manager.
Du hast gelernt:
- wie du einen eigenen **Debian 12 LXC-Container** für Affine vorbereitest
- wie du **Docker Compose** installierst und eine gemeinsame Umgebung mit PostgreSQL und Redis aufbaust
- wie du Affine über den **Nginx Proxy Manager** sicher mit HTTPS veröffentlichst
- wie du Benutzerkonten, Dokumente, Whiteboards und Tabellen anlegst
- wie du eigene Dashboards und Ansichten erstellst, um Projekte zu strukturieren
- wie du häufige Fehler erkennst und behebst
Damit steht dir jetzt ein zentraler Arbeitsbereich im UCC zur Verfügung,
mit dem du Notizen, Planungen und Projektideen unabhängig von Cloud-Diensten verwalten kannst.
> [!TIP]
> Du kannst Affine jederzeit über deinen Browser öffnen:
> **https://affine.DEINE-DOMAIN.tld**
>
> Änderungen werden automatisch gespeichert es ist kein manuelles Speichern notwendig.
>
> Für den Zugriff im Heimnetz kannst du in Nginx Proxy Manager eine Access-List mit lokalen IP-Bereichen anlegen.
👉 *Screenshot geeignet: Affine-Dashboard mit geöffnetem Dokument und aktiver Verbindung über HTTPS.*
### Ausblick
Im nächsten Kapitel geht es um das **Archiv** den zentralen Speicherort deines UCC-Systems.
Hier legst du fest, wie Daten aus Nextcloud, Affine und zukünftigen Diensten dauerhaft aufbewahrt werden.
Damit schaffst du eine klare Trennung zwischen aktiver Nutzung und langfristiger Sicherung.
Das Archiv dient als Grundlage für Backups, Versionierung und strukturierte Ablage.
So bleibt dein System auch bei wachsender Datenmenge übersichtlich,
und du kannst jederzeit nachvollziehen, wo sich welche Inhalte befinden.
> [!NOTE]
> Das Archiv ist der nächste logische Schritt im Aufbau deines UCC.
> Es sorgt dafür, dass deine gespeicherten Dokumente, Boards und Projekte
> langfristig sicher und zentral verwaltet werden.
👉 *Screenshot geeignet: UCC-Dashboard mit markierten Containern Nextcloud, Affine und Archiv.*