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

929 lines
29 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 (Premium)
## Einleitung
Affine ist dein digitales Planungssystem der Ort, an dem Ideen, Notizen und Projekte zusammenlaufen.
Im Premium-Kapitel erweitern wir diese Arbeitsumgebung um alle Funktionen,
die sie zu einem professionellen, selbstverwalteten System machen:
von automatischen Backups über Vorlagen-Bibliotheken bis hin zu Performance-Optimierungen und Statusprüfungen.
Ziel ist ein Affine-Server, der sich selbst pflegt, regelmäßig sichert und gleichzeitig mehr Komfort bei der täglichen Nutzung bietet.
So arbeitest du produktiv, ohne dich um Wartung, Updates oder Datenverlust sorgen zu müssen.
> [!NOTE]
> Premium bedeutet im UCC-Tutorial nicht mehr Komplexität, sondern mehr Automatisierung und Zuverlässigkeit.
> Jede Erweiterung lässt sich Schritt für Schritt aktivieren, unabhängig davon,
> ob du Affine allein oder im Team nutzt.
### Themen dieses Kapitels
1. **Vorlagen-Paket für Affine**
fertige Workspaces, Boards und Dokumentstrukturen zur direkten Nutzung
2. **Automatische Sicherung der PostgreSQL-Datenbank**
tägliche Backups inklusive Protokollierung und Aufbewahrungszeit
3. **Mail-Benachrichtigung über Backup-Status**
automatische E-Mail bei Erfolg oder Fehler
4. **Workspace-Export & Archivierung**
automatische JSON- oder ZIP-Exporte deiner Workspaces für das UCC-Archiv
5. **Automatischer Container-Healthcheck & Neustart**
regelmäßige Prüfung und Selbstheilung des Affine-Stacks
6. **Manuelles Update-Skript für Docker Compose**
einfache Befehlsausführung zur Aktualisierung aller Container
7. **Performance-Tuning für PostgreSQL & Redis**
optimierte Konfigurationswerte für schnellere Reaktionszeiten
8. **Abschluss & Nächste Schritte**
Übersicht aller Erweiterungen und Wartungsroutinen
> [!TIP]
> Wenn du alle Schritte in diesem Kapitel umsetzt, erhältst du eine Affine-Instanz,
> die sich automatisch aktualisiert, sichert und überwacht
> ganz ohne externe Tools oder manuelle Eingriffe.
👉 *Screenshot geeignet: Affine-Dashboard mit geöffnetem Workspace und angezeigtem Backup-Status.*
---
## Vorlagen-Paket (Bratonien Creator Panel)
Das Vorlagen-Paket ist der praktische Kern dieses Premium-Kapitels.
Es enthält einen vollständig vorbereiteten Workspace mit dem Namen **„Bratonien Creator Panel“**,
der alle Strukturen, Tabellen, Ansichten und Beispielinhalte enthält, die Content Creator für ihre tägliche Arbeit benötigen.
Dieser Workspace bildet die Grundlage für eigene Projekte, Ideen, Streams und Aufgaben innerhalb deines UCC-Systems.
> [!NOTE]
> Der Workspace ist sofort einsatzbereit.
> Du kannst ihn importieren, anpassen und nach Belieben erweitern.
> Alle Anpassungen bleiben beim nächsten Update erhalten, da die Datei nur als Vorlage dient.
### Ziel des Vorlagen-Pakets
- Einheitliche Arbeitsumgebung für alle Creator-Prozesse
- Planung, Produktion und Veröffentlichung in einer Oberfläche
- Sponsoren- und Aufgabenverwaltung integriert
- Kombinierte Kalender-, Board- und Listenansichten
- Kompatibel mit späteren n8n-Automatisierungen und Backup-Routinen
### Import des Workspaces
1. Lade die bereitgestellte JSON-Datei von der Premium-Downloadseite:
`https://ucc.brationien.de/downloads/affine/bratonien-creator-panel.json`
2. Öffne Affine → **Workspaces → Import Workspace**
3. Wähle die heruntergeladene Datei aus.
Der neue Bereich erscheint danach automatisch in der linken Seitenleiste.
4. Öffne den Workspace und aktiviere den **Dark-Mode** über das Zahnrad-Symbol oben rechts.
> [!NOTE]
> Beim Import erzeugt Affine automatisch neue interne IDs.
> Der Inhalt bleibt unverändert, sodass du sofort loslegen kannst.
### Inhalt des Vorlagen-Pakets
Der Workspace enthält mehrere vollständig vorbereitete Bereiche:
| Bereich | Beschreibung |
|----------|--------------|
| **Projekte** | Übersicht aller geplanten oder laufenden Inhalte wie Videos, Streams oder Posts |
| **Aufgaben** | Eigenständige oder projektbezogene To-Dos mit Status und Priorität |
| **Sponsoren** | Verwaltung aktiver Kooperationen und Partner |
| **Ideen & Themen** | Sammelstelle für neue Konzepte und Formate |
| **Content-Kalender** | Terminplanung für Veröffentlichungen und Streams |
| **Dashboard** | Zusammenfassung aller Module mit Filter- und Fortschrittsanzeigen |
> [!TIP]
> Alle Bereiche sind miteinander verknüpft.
> Eine Änderung, etwa am Status eines Projekts, wird in allen Ansichten automatisch übernommen.
### Platzhalter für die JSON-Datei
Im finalen Tutorial-Release wird hier der vollständige JSON-Block des „Bratonien Creator Panel“ eingefügt.
Bis dahin findest du die aktuelle Version stets auf der Premium-Downloadseite.
```
[AFFINE_JSON_WORKSPACE]
```
> [!IMPORTANT]
> Der Platzhalter wird im veröffentlichten Premium-Material automatisch ersetzt,
> sobald der geprüfte JSON-Export aus Affine vorliegt.
> Damit bleibt dieses Kapitel immer aktuell, auch wenn später neue Felder oder Ansichten ergänzt werden.
## Automatische Sicherung der PostgreSQL-Datenbank
Damit alle Daten deines Affine-Workspaces Projekte, Aufgaben, Ideen und Beziehungen dauerhaft gesichert bleiben,
richten wir eine tägliche automatische Sicherung der PostgreSQL-Datenbank ein.
Das Skript erstellt nicht nur ein neues Backup, sondern löscht gleichzeitig alle älteren Sicherungen,
die länger als 30 Tage gespeichert sind.
So bleibt dein Speicherplatz sauber, ohne dass du manuell eingreifen musst.
> [!NOTE]
> Gesichert wird ausschließlich die Affine-Datenbank.
> Template-Dateien oder JSON-Exporte werden separat im Abschnitt „Workspace-Export & Archivierung“ behandelt.
### Ziel
- Tägliche automatische Sicherung der Affine-Datenbank
- Automatische Löschung von Backups älter als 30 Tage
- Zeitstempel im Dateinamen für klare Nachverfolgbarkeit
- Protokollierung aller Abläufe in einer Logdatei
- Sichere Wiederherstellung im Bedarfsfall
### Sicherungsskript anlegen
Öffne im Terminal des Affine-Containers den Editor und erstelle das Skript:
```bash
nano /usr/local/bin/affine_backup.sh
```
Füge folgenden Inhalt ein:
```bash
#!/bin/bash
#
# affine_backup.sh
# Erstellt ein tägliches Backup der Affine-Datenbank
# und löscht automatisch alle Backups, die älter als 30 Tage sind.
#
BACKUP_DIR="/mnt/hdd/affine_backups"
DATE=$(date +'%Y-%m-%d_%H-%M')
DB_NAME="affine"
DB_USER="affine"
DB_PASS="DEIN_SICHERES_PASSWORT"
LOGFILE="/var/log/affine_backup.log"
mkdir -p "$BACKUP_DIR"
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Backup gestartet" >> "$LOGFILE"
# Datenbank sichern
pg_dump -U "$DB_USER" "$DB_NAME" > "$BACKUP_DIR/db_${DATE}.sql"
if [ $? -eq 0 ]; then
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Backup erfolgreich erstellt: db_${DATE}.sql" >> "$LOGFILE"
else
echo "[$(date +'%d.%m.%Y %H:%M:%S')] FEHLER: Backup fehlgeschlagen" >> "$LOGFILE"
fi
# Alte Backups löschen (älter als 30 Tage)
find "$BACKUP_DIR" -type f -name "db_*.sql" -mtime +30 -print -delete >> "$LOGFILE" 2>&1
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Alte Backups (älter als 30 Tage) gelöscht" >> "$LOGFILE"
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Backup abgeschlossen" >> "$LOGFILE"
```
Datei speichern (**STRG + O**, Enter) und schließen (**STRG + X**).
Dann ausführbar machen:
```bash
chmod +x /usr/local/bin/affine_backup.sh
```
> [!NOTE]
> Das Skript legt alle Sicherungen unter `/mnt/hdd/affine_backups` ab und behält immer nur die letzten 30 Tage.
> Dadurch bleibt der Speicherverbrauch stabil und das Backup-Verzeichnis übersichtlich.
### Automatische Ausführung einrichten
Öffne die Cron-Konfiguration:
```bash
crontab -e
```
Am Ende hinzufügen:
```bash
0 4 * * * /usr/local/bin/affine_backup.sh
```
> [!TIP]
> Der Eintrag startet das Backup täglich um **04:00 Uhr**.
> Du kannst die Uhrzeit jederzeit anpassen, z. B. `0 2 * * *` für 02:00 Uhr.
### Ergebnis prüfen
Nach der ersten Ausführung kannst du die Sicherung überprüfen:
```bash
ls -lh /mnt/hdd/affine_backups
```
Du solltest eine Datei mit aktuellem Zeitstempel sehen, z. B.:
```
db_2025-10-05_04-00.sql
```
Das Protokoll zeigst du mit:
```bash
tail -n 20 /var/log/affine_backup.log
```
> [!TIP]
> Um das Backup sofort zu testen, führe das Skript manuell aus:
> ```bash
> /usr/local/bin/affine_backup.sh
> ```
> So erkennst du sofort, ob Pfade, Berechtigungen und Cron-Einträge korrekt sind.
👉 *Screenshot geeignet: Terminal mit erfolgreichem Backup-Lauf und Logeinträgen über gelöschte alte Sicherungen.*
### Wiederherstellung eines Backups
Eine Sicherung ist nur dann wertvoll, wenn sie sich im Notfall auch sicher zurückspielen lässt.
Mit den folgenden Schritten stellst du deine Affine-Datenbank vollständig wieder her
egal ob nach einem Defekt, einem fehlerhaften Update oder einem Systemumzug.
#### Vorbereitung
1. **Dienste stoppen**, damit keine Schreibvorgänge stattfinden:
```bash
systemctl stop affine
systemctl stop postgresql
```
2. **Backup-Verzeichnis prüfen:**
```bash
ls -lh /mnt/hdd/affine_backups
```
Wähle die gewünschte Datei, z. B. `db_2025-10-05_04-00.sql`.
#### Datenbank wiederherstellen
1. PostgreSQL starten:
```bash
systemctl start postgresql
```
2. Alte Datenbank löschen und neu anlegen:
```bash
su - postgres
psql -c "DROP DATABASE affine;"
psql -c "CREATE DATABASE affine;"
psql -c "GRANT ALL PRIVILEGES ON DATABASE affine TO affine;"
exit
```
3. Sicherung einspielen:
```bash
psql -U affine -d affine < /mnt/hdd/affine_backups/db_2025-10-05_04-00.sql
```
> [!NOTE]
> Ersetze den Dateinamen durch das gewünschte Sicherungsdatum.
> Nach Abschluss siehst du im Terminal keine Fehlermeldung, wenn alles korrekt war.
#### Neustart der Dienste
Nach erfolgreicher Wiederherstellung startest du die Dienste neu:
```bash
systemctl start affine
```
> [!TIP]
> Falls du Redis oder zusätzliche Container (z. B. Nginx-Proxy) nutzt, starte sie ebenfalls neu,
> damit alle Abhängigkeiten sofort wieder aktiv sind.
#### Funktionsprüfung
Rufe deine Affine-Instanz im Browser auf:
```
https://affine.DEINE-DOMAIN.tld
```
Melde dich an und prüfe, ob deine Workspaces, Projekte und Aufgaben wieder sichtbar sind.
> [!NOTE]
> Wenn der Start ungewöhnlich lange dauert, initialisiert PostgreSQL interne Indexe neu.
> Nach wenigen Minuten ist das System wieder vollständig einsatzbereit.
👉 *Screenshot geeignet: Terminal mit erfolgreicher Wiederherstellung und geöffneter Affine-Oberfläche.*
## Mail-Benachrichtigung über Backup-Status
Damit du nicht täglich manuell prüfen musst, ob deine automatischen Backups erfolgreich waren,
richten wir eine Benachrichtigung per E-Mail ein.
So erhältst du nach jedem Backup-Lauf eine kurze Nachricht, sobald ein Fehler oder Erfolg im Log vermerkt wurde.
> [!NOTE]
> Die Benachrichtigung nutzt das System-Mail-Programm des Containers.
> Es wird keine zusätzliche Software außerhalb von Affine benötigt.
### Ziel
- E-Mail-Benachrichtigung bei erfolgreichem oder fehlgeschlagenem Backup
- Kein manuelles Prüfen der Logdatei mehr nötig
- Verwendung des integrierten Mail-Systems (Postfix oder SSMTP)
### Mail-System installieren
Öffne im Terminal des Affine-Containers:
```bash
apt install -y mailutils
```
> [!TIP]
> Dieses Paket stellt den Befehl `mail` bereit, mit dem Systemmeldungen versendet werden können.
> Bei Debian oder Ubuntu wird automatisch eine Basiskonfiguration erstellt, die sofort nutzbar ist.
### Skript anpassen
Öffne das zuvor angelegte Backup-Skript:
```bash
nano /usr/local/bin/affine_backup.sh
```
Ersetze den unteren Teil durch folgende erweiterte Version:
```bash
# Alte Backups löschen (älter als 30 Tage)
find "$BACKUP_DIR" -type f -name "db_*.sql" -mtime +30 -print -delete >> "$LOGFILE" 2>&1
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Alte Backups (älter als 30 Tage) gelöscht" >> "$LOGFILE"
# Mail-Benachrichtigung
MAIL_TO="admin@DEINE-DOMAIN.tld"
MAIL_SUBJECT="Affine Backup am $(date +'%d.%m.%Y %H:%M')"
if grep -q "FEHLER" "$LOGFILE"; then
MAIL_SUBJECT="[FEHLER] $MAIL_SUBJECT"
mail -s "$MAIL_SUBJECT" "$MAIL_TO" < "$LOGFILE"
else
mail -s "$MAIL_SUBJECT" "$MAIL_TO" < <(tail -n 20 "$LOGFILE")
fi
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Mail-Benachrichtigung versendet" >> "$LOGFILE"
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Backup abgeschlossen" >> "$LOGFILE"
```
> [!NOTE]
> Ersetze `admin@DEINE-DOMAIN.tld` durch deine eigene E-Mail-Adresse.
> Falls du einen externen SMTP-Relay verwendest, kannst du die Serverdaten in `/etc/mail.rc` eintragen.
> Für lokale Benachrichtigungen reicht die Standardkonfiguration.
Speichern (**STRG + O**, Enter) und schließen (**STRG + X**).
### Funktion testen
Starte das Skript manuell:
```bash
/usr/local/bin/affine_backup.sh
```
Wenn alles korrekt eingerichtet ist, erhältst du innerhalb weniger Sekunden eine E-Mail mit den letzten Logeinträgen.
> [!TIP]
> Wenn keine Nachricht ankommt, prüfe mit
> ```bash
> tail -n 50 /var/log/mail.log
> ```
> ob der Versand vom Mail-Dienst erfolgreich war oder eine Anmeldung am SMTP-Server fehlschlug.
👉 *Screenshot geeignet: E-Mail-Posteingang mit erfolgreicher Backup-Benachrichtigung.*
## Workspace-Export & Archivierung
Neben der täglichen Datenbanksicherung empfiehlt es sich, regelmäßig komplette Workspaces als JSON-Dateien zu exportieren.
So kannst du deine Projekte, Aufgaben und Boards jederzeit wiederherstellen, auch wenn du versehentlich Daten gelöscht hast oder Affine auf einem neuen System einrichtest.
> [!NOTE]
> Der Export enthält alle Seiten, Tabellen und Inhalte deines Workspaces aber keine Benutzerkonten oder Logins.
> Er eignet sich ideal als persönliche Sicherung oder zum Austausch mit anderen Systemen.
### Ziel
- Regelmäßiger Export aller Workspaces als JSON
- Automatische Ablage mit Datum im Dateinamen
- Automatische Komprimierung der Exporte
- Einfache Wiederherstellung direkt über die Affine-Oberfläche
### Export-Skript anlegen
Öffne im Terminal deines Affine-Containers den Editor:
```bash
nano /usr/local/bin/affine_export.sh
```
Füge folgenden Inhalt ein:
```bash
#!/bin/bash
#
# affine_export.sh
# Exportiert alle Affine-Workspaces als JSON und erstellt ein tägliches Archiv
#
EXPORT_DIR="/mnt/hdd/affine_exports"
DATE=$(date +'%Y-%m-%d_%H-%M')
LOGFILE="/var/log/affine_export.log"
mkdir -p "$EXPORT_DIR"
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Export gestartet" >> "$LOGFILE"
# Beispielhafter Export je nach Version kann der API-Pfad abweichen
curl -s http://localhost:3010/api/workspaces/export -o "$EXPORT_DIR/workspace_${DATE}.json"
# Archiv erstellen
tar -czf "$EXPORT_DIR/workspace_${DATE}.tar.gz" -C "$EXPORT_DIR" "workspace_${DATE}.json"
rm "$EXPORT_DIR/workspace_${DATE}.json"
# Alte Exporte löschen (älter als 30 Tage)
find "$EXPORT_DIR" -type f -name "workspace_*.tar.gz" -mtime +30 -print -delete >> "$LOGFILE" 2>&1
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Export abgeschlossen" >> "$LOGFILE"
```
Datei speichern (**STRG + O**, Enter) und schließen (**STRG + X**).
Dann ausführbar machen:
```bash
chmod +x /usr/local/bin/affine_export.sh
```
> [!NOTE]
> Die Beispiel-URL `http://localhost:3010/api/workspaces/export` kann je nach Version variieren.
> Prüfe sie in deiner Affine-Oberfläche unter **Settings → API → Export**.
### Automatische Ausführung einrichten
Öffne den Cron-Editor:
```bash
crontab -e
```
Füge den folgenden Eintrag hinzu:
```bash
15 4 * * * /usr/local/bin/affine_export.sh
```
> [!TIP]
> Dadurch erfolgt der Export täglich um **04:15 Uhr**, direkt nach der Datenbanksicherung.
> Beide Sicherungen laufen so automatisch hintereinander.
### Ergebnis prüfen
Nach dem ersten Lauf kannst du die Exporte prüfen:
```bash
ls -lh /mnt/hdd/affine_exports
```
Die Ausgabe sollte eine neue Archivdatei zeigen, z. B.:
```
workspace_2025-10-05_04-15.tar.gz
```
Das Protokoll siehst du mit:
```bash
tail -n 20 /var/log/affine_export.log
```
> [!TIP]
> Führe das Skript bei Bedarf manuell aus, um die Funktion sofort zu testen:
> ```bash
> /usr/local/bin/affine_export.sh
> ```
👉 *Screenshot geeignet: Terminal mit erfolgreichem JSON-Export und Archivdatei.*
### Sicherung verwenden
Alle erstellten Archive findest du im Ordner:
```
/mnt/hdd/affine_exports
```
Von dort kannst du sie bei Bedarf einfach auf deinen Computer herunterladen,
um sie lokal aufzubewahren oder in einer anderen Affine-Installation wieder zu importieren.
> [!TIP]
> Der einfachste Weg ist der Download über **SFTP** oder die Dateifreigabe deiner Wahl.
> Du musst keine zusätzlichen Programme oder Server einrichten die Archive sind normale Dateien.
### Wiederherstellung eines Workspace-Exports
Um einen gespeicherten Workspace wiederherzustellen:
1. Entpacke das gewünschte Archiv auf deinem Computer.
2. Öffne in Affine das Menü **Workspaces → Import Workspace**.
3. Wähle die entpackte JSON-Datei aus.
4. Bestätige mit **Importieren**.
> [!NOTE]
> Affine legt beim Import neue interne IDs an,
> sodass du alte und neue Versionen eines Workspaces parallel nutzen kannst.
> So lassen sich frühere Stände vergleichen, ohne aktuelle Daten zu überschreiben.
👉 *Screenshot geeignet: Affine-Importdialog mit ausgewählter JSON-Datei.*
## Automatischer Container-Healthcheck & Neustart
Damit dein Affine-System dauerhaft stabil bleibt, richten wir einen automatischen Gesundheitscheck (Healthcheck) für den Container ein.
Dieser prüft regelmäßig, ob alle Dienste laufen und die Weboberfläche erreichbar ist.
Falls ein Problem erkannt wird etwa ein abgestürzter Prozess oder ein blockierter Dienst startet der Container selbstständig neu.
> [!NOTE]
> Dieser Mechanismus ersetzt keine Backups, sondern stellt sicher, dass Affine auch nach längerer Laufzeit ohne manuelles Eingreifen zuverlässig verfügbar bleibt.
### Ziel
- Regelmäßige automatische Prüfung des Affine-Containers
- Automatischer Neustart bei Nichterreichbarkeit
- Protokollierung der Ergebnisse in einer Logdatei
- Keine Unterbrechungen bei längeren Betriebszeiten
### Healthcheck-Skript anlegen
Öffne im Terminal deines Proxmox-Hosts (nicht im Container!) den Editor:
```bash
nano /usr/local/bin/affine_healthcheck.sh
```
Füge folgenden Inhalt ein:
```bash
#!/bin/bash
#
# affine_healthcheck.sh
# Prüft den Status des Affine-Containers und startet ihn bei Bedarf neu
#
CTID=107 # Container-ID aus Proxmox
LOGFILE="/var/log/affine_healthcheck.log"
AFFINE_URL="http://192.168.1.70:3010" # interne Adresse des Affine-Containers
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Healthcheck gestartet" >> "$LOGFILE"
# HTTP-Test prüft, ob die Weboberfläche erreichbar ist
if curl -s --head "$AFFINE_URL" | grep -q "200 OK"; then
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Affine läuft normal" >> "$LOGFILE"
else
echo "[$(date +'%d.%m.%Y %H:%M:%S')] FEHLER: Affine nicht erreichbar Neustart wird ausgeführt" >> "$LOGFILE"
pct restart $CTID
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Container $CTID neu gestartet" >> "$LOGFILE"
fi
```
Datei speichern (**STRG + O**, Enter) und schließen (**STRG + X**).
Danach ausführbar machen:
```bash
chmod +x /usr/local/bin/affine_healthcheck.sh
```
> [!NOTE]
> Ersetze `CTID=107` durch die tatsächliche Container-ID deiner Affine-Installation.
> Die IP-Adresse (`192.168.1.70`) ist die interne Adresse des Containers aus Kapitel 7.
### Automatische Ausführung einrichten
Öffne den Cron-Editor auf dem Proxmox-Host:
```bash
crontab -e
```
Füge am Ende der Datei hinzu:
```bash
*/30 * * * * /usr/local/bin/affine_healthcheck.sh
```
> [!TIP]
> Dieser Eintrag prüft den Container alle **30 Minuten**.
> Du kannst den Intervall verkürzen, z. B. alle 10 Minuten mit `*/10 * * * *`.
### Funktion prüfen
Führe den Healthcheck manuell aus, um die Funktion zu testen:
```bash
/usr/local/bin/affine_healthcheck.sh
```
Wenn Affine erreichbar ist, erscheint im Log:
```
[05.10.2025 18:00:00] Affine läuft normal
```
Wenn die Oberfläche absichtlich gestoppt wurde (z. B. durch `pct stop 107`),
führt das Skript beim nächsten Lauf automatisch einen Neustart durch.
> [!NOTE]
> Der Neustart ist sehr schnell in der Regel weniger als 10 Sekunden.
> Das verhindert Ausfälle und sorgt dafür, dass dein Dashboard, Boards und Projekte jederzeit verfügbar sind.
### Logdatei prüfen
Die Ergebnisse findest du unter:
```
/var/log/affine_healthcheck.log
```
Mit diesem Befehl siehst du die letzten Einträge:
```bash
tail -n 20 /var/log/affine_healthcheck.log
```
> [!TIP]
> Du kannst das Log jederzeit löschen oder archivieren,
> indem du es mit `truncate -s 0 /var/log/affine_healthcheck.log` leerst.
👉 *Screenshot geeignet: Terminal mit erfolgreichem Healthcheck und Neustartmeldung.*
## Manuelles Update-Skript für Docker Compose
Affine wird in der Regel über Docker Compose betrieben.
Damit du die Kontrolle über alle Aktualisierungen behältst,
erstellen wir ein einfaches Skript, das den gesamten Stack in wenigen Sekunden aktualisiert.
Das erspart dir komplizierte Befehle und sorgt dafür, dass du jederzeit die neueste Version nutzen kannst.
> [!NOTE]
> Dieses Verfahren ersetzt automatische Updates bewusst.
> Du entscheidest selbst, wann ein Update durchgeführt wird,
> um deine laufenden Projekte nicht zu unterbrechen.
### Ziel
- Manuelles, aber vereinfachtes Update aller Container
- Sicherer Ablauf mit Backup und Log
- Vollständige Kontrolle über Zeitpunkt und Ausführung
### Update-Skript anlegen
Öffne im Terminal deines Affine-Containers den Editor:
```bash
nano /usr/local/bin/affine_update.sh
```
Füge folgenden Inhalt ein:
```bash
#!/bin/bash
#
# affine_update.sh
# Führt ein manuelles Update des Affine-Stacks über Docker Compose aus
#
STACK_DIR="/srv/affine"
LOGFILE="/var/log/affine_update.log"
DATE=$(date +'%Y-%m-%d_%H-%M')
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Update gestartet" >> "$LOGFILE"
cd "$STACK_DIR" || exit 1
# Kurzes Backup der aktuellen Compose-Datei
cp docker-compose.yml docker-compose-backup_${DATE}.yml
# Container aktualisieren
docker compose pull >> "$LOGFILE" 2>&1
docker compose up -d --remove-orphans >> "$LOGFILE" 2>&1
# Alte Compose-Backups löschen (älter als 30 Tage)
find "$STACK_DIR" -type f -name "docker-compose-backup_*.yml" -mtime +30 -delete
echo "[$(date +'%d.%m.%Y %H:%M:%S')] Update abgeschlossen" >> "$LOGFILE"
```
Datei speichern (**STRG + O**, Enter) und schließen (**STRG + X**).
Dann ausführbar machen:
```bash
chmod +x /usr/local/bin/affine_update.sh
```
> [!NOTE]
> Das Skript kann jederzeit ausgeführt werden, ohne laufende Workspaces zu beschädigen.
> Docker lädt nur neue Images herunter und startet die Container neu.
### Update ausführen
Rufe das Skript manuell auf:
```bash
/usr/local/bin/affine_update.sh
```
Während des Vorgangs werden alle Container neu gestartet und im Log protokolliert:
```bash
tail -n 20 /var/log/affine_update.log
```
> [!TIP]
> Führe ein Update nur dann durch, wenn keine größeren Arbeiten offen sind.
> So verhinderst du, dass ein Neustart laufende Änderungen unterbricht.
### Fehlerbehebung
Wenn beim Update eine Fehlermeldung auftritt, kannst du den letzten funktionierenden Stand wiederherstellen:
```bash
cp /srv/affine/docker-compose-backup_YYYY-MM-DD_HH-MM.yml /srv/affine/docker-compose.yml
docker compose up -d
```
> [!NOTE]
> Dadurch nutzt du wieder die vorherige Version des Compose-Stacks.
> Alle Workspaces und Daten bleiben dabei erhalten.
👉 *Screenshot geeignet: Terminal mit erfolgreichem Update-Lauf und Logausgabe.*
## Performance-Tuning für PostgreSQL & Redis
Damit Affine auch bei großen Workspaces und vielen Inhalten flüssig läuft,
optimieren wir zum Abschluss die Konfiguration von PostgreSQL und Redis.
Beide Systeme sind die Grundlage für schnelle Datenzugriffe, sauberes Caching und kurze Ladezeiten.
> [!NOTE]
> Diese Werte sind für Container mit **48 GB RAM** optimiert.
> Du kannst sie später anpassen, wenn dein System über mehr Speicher verfügt.
### Ziel
- Schnellere Datenbankabfragen
- Geringere Verzögerungen bei großen Workspaces
- Bessere Nutzung des Arbeitsspeichers
- Weniger Schreibzugriffe auf die Festplatte
### PostgreSQL optimieren
Öffne die Konfigurationsdatei im Container:
```bash
nano /etc/postgresql/16/main/postgresql.conf
```
Suche die folgenden Zeilen und ändere oder ergänze sie wie angegeben:
```ini
# Arbeitsspeicher
shared_buffers = 512MB
work_mem = 16MB
maintenance_work_mem = 128MB
# Caching & I/O
effective_cache_size = 2GB
random_page_cost = 1.1
seq_page_cost = 1.0
synchronous_commit = off
# Logging
log_min_duration_statement = 500
```
> [!TIP]
> Diese Werte reduzieren die Zugriffszeiten bei großen Tabellen und beschleunigen Schreibvorgänge.
> `synchronous_commit = off` spart Schreibzyklen und ist in Containern sicher, da das Dateisystem synchronisiert bleibt.
Speichern mit **STRG + O**, Enter, und schließen mit **STRG + X**.
Danach PostgreSQL neu starten:
```bash
systemctl restart postgresql
```
Zur Kontrolle:
```bash
systemctl status postgresql
```
👉 *Screenshot geeignet: Terminal mit erfolgreichem Neustart und Status „active (running)“.*
### Redis optimieren
Redis sorgt dafür, dass häufig verwendete Daten im Arbeitsspeicher zwischengespeichert werden.
Durch ein paar Anpassungen lässt sich die Performance weiter steigern.
Öffne die Konfigurationsdatei:
```bash
nano /etc/redis/redis.conf
```
Suche und passe folgende Werte an:
```ini
# Arbeitsspeicherlimit
maxmemory 256mb
maxmemory-policy allkeys-lru
# Speichernutzung
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
# Hintergrund-Speicherung
save 900 1
save 300 10
save 60 10000
```
> [!NOTE]
> Diese Einstellungen sorgen dafür, dass ungenutzte Schlüssel automatisch entfernt werden
> und Redis Speicher effizient freigibt, ohne den Hauptprozess zu blockieren.
Speichern (**STRG + O**, Enter, **STRG + X**)
und Redis neu starten:
```bash
systemctl restart redis-server
```
Überprüfen, ob Redis korrekt läuft:
```bash
redis-cli ping
```
Wenn `PONG` erscheint, funktioniert der Cache einwandfrei.
### Wirkung prüfen
1. Öffne deinen Affine-Workspace im Browser.
2. Lade eine größere Seite oder Tabelle.
3. Wiederhole den Vorgang nach dem Neustart
du wirst feststellen, dass die Ladezeit spürbar kürzer ist.
> [!TIP]
> Die größten Verbesserungen zeigen sich bei häufig geöffneten Workspaces,
> da Redis und PostgreSQL nun aktiv gecachte Daten wiederverwenden.
👉 *Screenshot geeignet: Affine-Dashboard mit schneller Ladezeit nach Neustart.*
Mit diesen Anpassungen ist dein Affine-System jetzt auf maximale Stabilität und Performance ausgelegt.
Alle Dienste Datenbank, Cache und Anwendung arbeiten effizient zusammen,
sodass du auch bei vielen Projekten, Aufgaben und Sponsorenübersichten
ein flüssiges, professionelles Arbeiten in deinem **Bratonien Creator Panel** behältst.
## Abschluss & Ergebnis
Mit diesem Premium-Kapitel hast du dein Affine-System auf ein professionelles Niveau gebracht.
Neben der Standardinstallation aus dem Hauptkapitel läuft Affine jetzt dauerhaft stabil, automatisch gesichert und mit optimaler Leistung.
Jeder Bereich von der Datenbank bis zur Benutzeroberfläche arbeitet harmonisch zusammen und erfordert keine manuelle Wartung mehr.
> [!NOTE]
> Alle Optimierungen greifen direkt in der bestehenden Installation.
> Du musst nichts neu installieren oder wiederholen.
> Alle Skripte arbeiten selbstständig und sind so aufgebaut, dass sie bei Updates unverändert bleiben.
### Zusammenfassung der Erweiterungen
| Bereich | Erweiterung | Ergebnis |
|----------|--------------|-----------|
| **Vorlagen-Paket (Bratonien Creator Panel)** | Fertiger Workspace mit allen Bereichen für Creator | Sofort einsatzbereite Struktur |
| **Automatische Datenbanksicherung** | Tägliches Backup inkl. Löschroutine | Schutz vor Datenverlust |
| **Mail-Benachrichtigung** | E-Mail bei Erfolg oder Fehler | Volle Kontrolle ohne manuelles Prüfen |
| **Workspace-Export & Archivierung** | JSON-Export mit Zeitstempel | Wiederherstellbare Workspaces |
| **Healthcheck & Neustart** | Prüfung und Selbstheilung des Containers | Dauerhafte Verfügbarkeit |
| **Manuelles Update-Skript** | Einfache Ausführung über Bash | Sicheres, kontrolliertes Updaten |
| **Performance-Tuning** | Optimierte Werte für PostgreSQL & Redis | Spürbar schnelleres Arbeiten |
> [!TIP]
> Alle Skripte findest du im Container unter `/usr/local/bin/`.
> Sie sind ausführbar und können bei Bedarf mit einem Texteditor angepasst werden.
### Empfohlene Routine
1. **Einmal pro Woche:** Logdateien prüfen
```bash
tail -n 20 /var/log/affine_backup.log
tail -n 20 /var/log/affine_export.log
```
2. **Einmal pro Monat:** Update-Skript starten
```bash
/usr/local/bin/affine_update.sh
```
3. **Nach größeren Änderungen:**
Export und Datenbanksicherung manuell ausführen, um den aktuellen Stand zu sichern.
> [!NOTE]
> Wenn du die Skripte regelmäßig verwendest, bleibt dein System dauerhaft stabil.
> Selbst bei einem kompletten Neustart des Containers stehen alle Daten und Workspaces sofort wieder zur Verfügung.
👉 *Screenshot geeignet: Übersicht des Affine-Dashboards mit aktivem Bratonien Creator Panel, Systemstatus „Alles aktuell“ und grünem Haken.*