Maschinenraum/cp.uugrn.org: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| (10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
= cp.uugrn.org = | |||
= | {| class="wikitable" | ||
! Bereich | |||
! Wert | |||
|- | |||
| Admin-Kontakt | |||
| sh[at]uugrn.org | |||
|- | |||
| Hostname | |||
| cp.uugrn.org | |||
|- | |||
| Aufgabe | |||
| Plattform für kollaborative und verschlüsselte Dokumente | |||
|- | |||
| Produktiv seit | |||
| 06.01.2025 | |||
|- | |||
| Hosting | |||
| Hetzner CX22, 2 CPU, 4 GB RAM, 40 GB SSD | |||
|- | |||
| Betriebssystem | |||
| Debian 13.6 (Trixie) | |||
|- | |||
| CryptPad | |||
| v2026.5.1 | |||
|- | |||
| nginx | |||
| 1.30.4 | |||
|- | |||
| Node.js | |||
| 24.18.1 | |||
|} | |||
== Beschreibung == | |||
CryptPad ermöglicht die gemeinsame Bearbeitung von Texten, Tabellen, Präsentationen, Kanban-Boards und weiteren Dokumenten. Die Inhalte werden verschlüsselt auf dem Server gespeichert. | |||
Instanz: | |||
* https://cp.uugrn.org/ | |||
Sandbox-Domain: | |||
* https://sandboxcp.uugrn.org/ | |||
Diagnose: | |||
* https://cp.uugrn.org/checkup/ | |||
=== Dokumentation und Unterstützung === | |||
* [https://docs.cryptpad.org/en/admin_guide/ Administrator Guide] | |||
* [https://docs.cryptpad.org/en/admin_guide/installation.html Installation] | |||
* [https://docs.cryptpad.org/en/admin_guide/maintenance.html Wartung] | |||
* [https://github.com/cryptpad/cryptpad/releases Release Notes] | |||
* [https://forum.cryptpad.org/ CryptPad Forum] | |||
== Betrieb == | |||
CryptPad läuft unter dem Benutzer cryptpad. | |||
Installationsverzeichnis: | |||
: /home/cryptpad/cryptpad | |||
=== Dienste === | |||
; CryptPad | |||
: systemctl status cryptpad | |||
: systemctl restart cryptpad | |||
; nginx | |||
: systemctl status nginx | |||
: nginx -t | |||
: systemctl reload nginx | |||
; SSH | |||
: systemctl status ssh | |||
; Firewall | |||
: systemctl status nftables | |||
: nft list ruleset | |||
; Fail2ban | |||
: systemctl status fail2ban | |||
: fail2ban-client status sshd | |||
; Fehlerhafte Dienste | |||
: systemctl --failed | |||
=== Logs und Diagnose === | |||
; CryptPad-Log | |||
: journalctl -u cryptpad -f | |||
; nginx-Log | |||
: journalctl -u nginx -b | |||
; Offene Ports | |||
: ss -lntup | |||
; Aktive TCP-Verbindungen | |||
: ss -ant | |||
; Häufigste IP-Adressen im nginx-Zugriffslog | |||
: awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head | |||
CryptPad kann zur Fehlersuche auch direkt gestartet werden. Zuvor muss der systemd-Dienst gestoppt werden. | |||
; Dienst stoppen | |||
: systemctl stop cryptpad | |||
; Als CryptPad-Benutzer | |||
: su - cryptpad | |||
: cd /home/cryptpad/cryptpad | |||
: npm start | |||
npm | |||
Danach den manuellen Prozess beenden und CryptPad wieder über systemd starten. | |||
: systemctl start cryptpad | |||
== SSH == | |||
Der direkte SSH-Zugang als root sowie die Passwortanmeldung sind deaktiviert. | |||
Administrativer Benutzer: | |||
: adminBenutzer | |||
Anmeldung: | |||
: ssh -4 -i ~/.ssh/ssh-rsa-private-4096-key adminBenutzer@cp.uugrn.org | |||
Anschließend: | |||
: sudo -i | |||
Wesentliche SSH-Härtung: | |||
* PermitRootLogin no | |||
* PasswordAuthentication no | |||
* KbdInteractiveAuthentication no | |||
* PubkeyAuthentication yes | |||
* AllowGroups sshusers | |||
* LoginGraceTime 30 | |||
* MaxAuthTries 3 | |||
* MaxStartups 10:30:30 | |||
* PerSourceMaxStartups 3 | |||
; Konfiguration prüfen | |||
: sshd -t | |||
; Effektive Konfiguration | |||
: sshd -T | |||
== Firewall und Fail2ban == | |||
Öffentlich erreichbar sind: | |||
{| class="wikitable" | |||
! Port | |||
! Dienst | |||
|- | |||
| 22/tcp | |||
| SSH | |||
|- | |||
| 80/tcp | |||
| HTTP | |||
|- | |||
| 443/tcp | |||
| HTTPS | |||
|} | |||
CryptPad selbst ist nur über Loopback erreichbar, unter anderem auf Port 3000 und 3003. | |||
nftables: | |||
* INPUT DROP | |||
* FORWARD DROP | |||
* OUTPUT ACCEPT | |||
Konfiguration: | |||
: /etc/nftables.conf | |||
Fail2ban schützt SSH zusätzlich. | |||
Konfiguration: | |||
: /etc/fail2ban/jail.d/sshd.local | |||
Einstellungen: | |||
* 4 Fehlversuche innerhalb von 10 Minuten | |||
* Sperrdauer 1 Stunde | |||
* Backend systemd | |||
* Sperren über nftables | |||
* usedns = no | |||
Normalerweise sind folgende nftables-Tabellen vorhanden: | |||
* table inet filter | |||
* table inet f2b-table | |||
Nach einem manuellen Neustart von nftables auch Fail2ban neu starten: | |||
: systemctl restart nftables | |||
: systemctl restart fail2ban | |||
== Updates == | |||
Debian-Sicherheitsupdates werden automatisch über unattended-upgrades installiert. | |||
Nicht automatisch aktualisiert werden: | |||
* normale Debian-Updates | |||
* Node.js / NodeSource | |||
* nginx | |||
* CryptPad | |||
Automatische Neustarts sind deaktiviert. | |||
; Updates prüfen | |||
: apt update | |||
: apt list --upgradable | |||
; Automatische Sicherheitsupdates testen | |||
: unattended-upgrade --dry-run | |||
; Neustartbedarf prüfen | |||
: test -f /var/run/reboot-required && cat /var/run/reboot-required | |||
== CryptPad aktualisieren == | |||
Vor einem Update: | |||
# Wartungsarbeiten über die üblichen UUGRN-Kanäle ankündigen. | |||
# [https://github.com/cryptpad/cryptpad/releases Release Notes] der Zielversion lesen. | |||
# Diagnoseseite prüfen. | |||
# Backup erstellen. | |||
# CryptPad stoppen. | |||
# Update als Benutzer cryptpad durchführen. | |||
# CryptPad starten und testen. | |||
=== Backup vor dem Update === | |||
: /root/sichercp | |||
===== | === Update === | ||
; CryptPad stoppen | |||
: systemctl stop cryptpad | |||
; Zum CryptPad-Benutzer wechseln | |||
: su - cryptpad | |||
: cd /home/cryptpad/cryptpad | |||
VERSION durch die gewünschte Version ersetzen. | |||
: git fetch --depth 1 origin tag VERSION | |||
: git checkout VERSION | |||
: npm ci | |||
: npm run install:components | |||
OnlyOffice bei Bedarf beziehungsweise entsprechend den Release Notes aktualisieren: | |||
: ./install-onlyoffice.sh | |||
Prüfen, ob sich die Beispielkonfiguration geändert hat: | |||
: diff -u config/config.example.js config/config.js | |||
Danach den CryptPad-Benutzer verlassen: | |||
: exit | |||
CryptPad starten: | |||
: systemctl start cryptpad | |||
: systemctl status cryptpad | |||
Logs prüfen: | |||
: journalctl -u cryptpad -n 100 --no-pager | |||
Anschließend prüfen: | |||
* https://cp.uugrn.org/checkup/ | |||
* Anmeldung | |||
* bestehende Pads | |||
* neues Pad | |||
* gemeinsames Bearbeiten | |||
* Datei-Upload | |||
* Dokument, Tabelle und Präsentation mit OnlyOffice | |||
== nginx aktualisieren == | |||
Vor einer manuellen nginx-Aktualisierung Konfiguration sichern: | |||
: cp -a /etc/nginx /etc/nginx.backup.$(date +%F-%H%M) | |||
Pakete aktualisieren: | |||
: apt update | |||
: apt upgrade | |||
Konfiguration prüfen: | |||
: nginx -t | |||
Bei erfolgreicher Prüfung neu laden: | |||
: systemctl reload nginx | |||
Kontrolle: | |||
: nginx -v | |||
: journalctl -u nginx -b --no-pager | |||
: certbot certificates | |||
: certbot renew --dry-run | |||
== Backup == | |||
Backup-Skript: | |||
: /root/sichercp | |||
Backup-Verzeichnis: | |||
: /root/backups/ | |||
Aufbewahrung: | |||
: 180 Tage | |||
Aktuelle Größe eines Backups: | |||
: ca. 133 MB | |||
=== Gesicherte CryptPad-Daten === | |||
* data/ | |||
* datastore/ | |||
* block/ | |||
* blob/ | |||
* config/config.js | |||
* customize/ | |||
* onlyoffice-conf/ | |||
* package.json | |||
* package-lock.json | |||
=== Zusätzlich gesichert === | |||
* nginx-Konfiguration | |||
* SSH-Konfiguration | |||
* nftables | |||
* Fail2ban | |||
* APT-Konfiguration | |||
* sudo-Konfiguration | |||
* systemd-Konfiguration | |||
* journald-Konfiguration | |||
* Paket- und Versionsinformationen | |||
* Netzwerk- und Routinginformationen | |||
=== Nicht gesichert === | |||
Reproduzierbare große Bestandteile werden nicht gesichert: | |||
* .git/ | |||
* node_modules/ | |||
* www/ | |||
* www/common/onlyoffice/dist/ | |||
OnlyOffice und die npm-Abhängigkeiten werden bei einer Neuinstallation erneut installiert. | |||
=== Backup starten === | |||
: /root/sichercp | |||
=== Backups anzeigen === | |||
: ls -lh /root/backups/ | |||
Die Backups liegen derzeit ausschließlich lokal auf dem Server. Ein externes Backup sollte ergänzt werden, sobald ein geeignetes Ziel zur Verfügung steht. | |||
== Restore == | |||
Ein Backup kann ohne Eingriff in das Produktivsystem testweise entpackt werden. | |||
; Neuestes Backup auswählen | |||
: BACKUP=$(ls -1t /root/backups/cp-backup-*.tar.gz | head -1) | |||
; Testverzeichnis erstellen | |||
: mkdir -p /root/restore-test | |||
; Backup entpacken | |||
: tar --acls --xattrs --numeric-owner -C /root/restore-test -xzf "$BACKUP" | |||
Nach der Kontrolle: | |||
: rm -rf /root/restore-test | |||
=== Notfall-Restore === | |||
Bei vollständigem Verlust des Servers: | |||
# Debian 13 installieren. | |||
# Netzwerk und SSH-Zugang einrichten. | |||
# Node.js 24 installieren. | |||
# nginx installieren. | |||
# CryptPad in der passenden Version installieren. | |||
# npm-Abhängigkeiten installieren. | |||
# OnlyOffice installieren. | |||
# CryptPad stoppen. | |||
# Daten aus dem Backup zurückspielen. | |||
# Besitzer cryptpad:cryptpad kontrollieren. | |||
# Serverkonfiguration zurückspielen. | |||
# systemd neu laden. | |||
# nginx, SSH, nftables und Fail2ban prüfen. | |||
# Dienste starten. | |||
# CryptPad vollständig testen. | |||
== Installation / Neuaufbau == | |||
Dieser Abschnitt dokumentiert den grundlegenden Aufbau des Servers. Bei einer Neuinstallation zusätzlich immer die aktuelle CryptPad-Dokumentation beachten. | |||
=== Voraussetzungen === | |||
Benötigte DNS-Namen: | |||
* cp.uugrn.org | |||
* sandboxcp.uugrn.org | |||
Beide Namen zeigen auf den CryptPad-Server. | |||
Benötigte Software: | |||
* Git | |||
* Node.js mit npm | |||
* nginx | |||
* Certbot | |||
=== Node.js installieren === | |||
Aktuell wird Node.js 24 aus dem NodeSource-Repository verwendet. | |||
: apt install curl ca-certificates gnupg | |||
: curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh | |||
: bash nodesource_setup.sh | |||
: apt install nodejs | |||
Prüfen: | |||
: node --version | |||
: npm --version | |||
=== CryptPad-Benutzer anlegen === | |||
: useradd -m cryptpad -s /bin/bash | |||
CryptPad läuft ausschließlich unter diesem Benutzer. | |||
=== CryptPad installieren === | |||
Zum Benutzer wechseln: | |||
: su - cryptpad | |||
Repository klonen: | |||
: git clone https://github.com/cryptpad/cryptpad.git cryptpad | |||
: cd cryptpad | |||
Gewünschte Release-Version auschecken: | |||
: git fetch --tags | |||
: git checkout VERSION | |||
Abhängigkeiten installieren: | |||
: npm ci | |||
: npm run install:components | |||
OnlyOffice installieren: | |||
: ./install-onlyoffice.sh | |||
Beispielkonfiguration übernehmen: | |||
: cp config/config.example.js config/config.js | |||
Konfiguration bearbeiten: | |||
: nano config/config.js | |||
Wichtige Domains: | |||
* httpUnsafeOrigin: 'https://cp.uugrn.org' | |||
* httpSafeOrigin: 'https://sandboxcp.uugrn.org' | |||
=== systemd-Dienst === | |||
CryptPad wird über folgende Unit gestartet: | |||
: /etc/systemd/system/cryptpad.service | |||
Nach Anlegen oder Ändern der Unit: | |||
: systemctl daemon-reload | |||
: systemctl enable --now cryptpad | |||
Prüfen: | |||
: systemctl status cryptpad | |||
Die aktuelle Unit enthält zusätzliche systemd-Härtung und sollte bei einem Neuaufbau aus dem Backup übernommen werden. | |||
== nginx installieren == | |||
nginx wird aus dem offiziellen nginx.org-Repository installiert. | |||
Voraussetzungen: | |||
: apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring | |||
Signaturschlüssel installieren: | |||
: curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null | |||
Fingerprint prüfen: | |||
: gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg | |||
Erwarteter Fingerprint: | |||
: 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 | |||
Repository einrichten: | |||
: echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/debian trixie nginx" | tee /etc/apt/sources.list.d/nginx.list | |||
nginx.org-Pakete bevorzugen: | |||
: echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx | |||
Installieren: | |||
: apt update | |||
: apt install nginx | |||
Aktivieren: | |||
: systemctl enable --now nginx | |||
Prüfen: | |||
: nginx -v | |||
: nginx -t | |||
: systemctl status nginx | |||
== TLS / Let's Encrypt == | |||
Certbot installieren: | |||
: apt install certbot python3-certbot-nginx | |||
Zertifikat für beide Domains anfordern: | |||
: certbot --nginx certonly -d cp.uugrn.org -d sandboxcp.uugrn.org | |||
Zertifikate liegen unter: | |||
* /etc/letsencrypt/live/cp.uugrn.org/fullchain.pem | |||
* /etc/letsencrypt/live/cp.uugrn.org/privkey.pem | |||
Certbot-Timer prüfen: | |||
: systemctl status certbot.timer | |||
Erneuerung testen: | |||
: certbot renew --dry-run | |||
== nginx für CryptPad konfigurieren == | |||
Die von CryptPad mitgelieferte Beispielkonfiguration kann als Ausgangspunkt verwendet werden: | |||
: wget https://raw.githubusercontent.com/cryptpad/cryptpad/main/docs/example.nginx.conf -O /etc/nginx/conf.d/cryptpad.conf | |||
Danach insbesondere anpassen: | |||
* Hauptdomain cp.uugrn.org | |||
* Sandbox-Domain sandboxcp.uugrn.org | |||
* Pfade der Let's-Encrypt-Zertifikate | |||
* interne CryptPad-Ports | |||
Vor jeder Aktivierung: | |||
: nginx -t | |||
Danach: | |||
: systemctl reload nginx | |||
Die aktuelle produktive nginx-Konfiguration befindet sich im Backup und sollte bei einem Wiederaufbau bevorzugt verwendet werden. | |||
== CryptPad-Anpassungen == | |||
Lokale Anpassungen gehören nach: | |||
: /home/cryptpad/cryptpad/customize/ | |||
Nicht direkt customize.dist oder Programmdateien verändern. | |||
Beispiel: | |||
: su - cryptpad | |||
: cd /home/cryptpad/cryptpad | |||
: cp customize.dist/application_config.js customize/application_config.js | |||
: nano customize/application_config.js | |||
Für die bisherige Instanz wurden unter anderem Einstellungen für den Gastzugriff verwendet: | |||
* AppConfig.disableAnonymousStore = true; | |||
* AppConfig.disableAnonymousPadCreation = false; | |||
Nach Änderungen: | |||
: systemctl restart cryptpad | |||
Danach die Funktion im Browser prüfen. | |||
== Aufräumjobs == | |||
CryptPad enthält Skripte zum Aufräumen inaktiver und archivierter Dokumente. | |||
Vorhandene Crontab prüfen: | |||
: crontab -u cryptpad -l | |||
In der ursprünglichen Installation wurden folgende Jobs verwendet: | |||
: 30 1 1,15 * * (cd /home/cryptpad/cryptpad; node scripts/evict-inactive.js > /dev/null) | |||
: 30 1 7,22 * * (cd /home/cryptpad/cryptpad; node scripts/evict-archived.js > /dev/null) | |||
Vor einer Neuinstallation prüfen, ob diese Jobs von der aktuell eingesetzten CryptPad-Version weiterhin empfohlen werden. | |||
== CryptPad-Administrator einrichten == | |||
Zunächst ein normales CryptPad-Benutzerkonto anlegen. | |||
In den Benutzereinstellungen den öffentlichen Schlüssel des Kontos kopieren. | |||
Konfiguration bearbeiten: | |||
: /home/cryptpad/cryptpad/config/config.js | |||
Den Schlüssel unter adminKeys eintragen, beispielsweise: | |||
: adminKeys: [ | |||
: "[cryptpad-user@cp.uugrn.org/ÖFFENTLICHER-SCHLÜSSEL]", | |||
: ], | |||
CryptPad anschließend neu starten: | |||
: systemctl restart cryptpad | |||
Administrationsoberfläche: | |||
* https://cp.uugrn.org/admin/ | |||
Dort können unter anderem Registrierung und Benutzerverwaltung konfiguriert werden. | |||
== Wichtige Pfade == | |||
{| class="wikitable" | |||
! Bereich | |||
! Pfad | |||
|- | |||
| CryptPad | |||
| /home/cryptpad/cryptpad | |||
|- | |||
| CryptPad-Konfiguration | |||
| /home/cryptpad/cryptpad/config/config.js | |||
|- | |||
| Anpassungen | |||
| /home/cryptpad/cryptpad/customize/ | |||
|- | |||
| nginx | |||
| /etc/nginx/ | |||
|- | |||
| SSH | |||
| /etc/ssh/ | |||
|- | |||
| Firewall | |||
| /etc/nftables.conf | |||
|- | |||
| Fail2ban | |||
| /etc/fail2ban/ | |||
|- | |||
| systemd-Unit | |||
| /etc/systemd/system/cryptpad.service | |||
|- | |||
| Backup-Skript | |||
| /root/sichercp | |||
|- | |||
| Backups | |||
| /root/backups/ | |||
|} | |||
== Regelmäßige Kontrolle == | |||
; Dienste | |||
: systemctl --failed | |||
; Ports | |||
: ss -lntup | |||
; Firewall | |||
: nft list ruleset | |||
; Fail2ban | |||
: fail2ban-client status sshd | |||
; Updates | |||
: apt list --upgradable | |||
; Speicherplatz | |||
: df -h | |||
; CryptPad-Daten | |||
: du -sh /home/cryptpad/cryptpad/data /home/cryptpad/cryptpad/datastore /home/cryptpad/cryptpad/block /home/cryptpad/cryptpad/blob | |||
; Backups | |||
: du -sh /root/backups | |||
; Warnungen | |||
: journalctl -p warning..alert --since today | |||
``` | |||
Aktuelle Version vom 2. August 2026, 11:16 Uhr
cp.uugrn.org[Bearbeiten]
| Bereich | Wert |
|---|---|
| Admin-Kontakt | sh[at]uugrn.org |
| Hostname | cp.uugrn.org |
| Aufgabe | Plattform für kollaborative und verschlüsselte Dokumente |
| Produktiv seit | 06.01.2025 |
| Hosting | Hetzner CX22, 2 CPU, 4 GB RAM, 40 GB SSD |
| Betriebssystem | Debian 13.6 (Trixie) |
| CryptPad | v2026.5.1 |
| nginx | 1.30.4 |
| Node.js | 24.18.1 |
Beschreibung[Bearbeiten]
CryptPad ermöglicht die gemeinsame Bearbeitung von Texten, Tabellen, Präsentationen, Kanban-Boards und weiteren Dokumenten. Die Inhalte werden verschlüsselt auf dem Server gespeichert.
Instanz:
Sandbox-Domain:
Diagnose:
Dokumentation und Unterstützung[Bearbeiten]
Betrieb[Bearbeiten]
CryptPad läuft unter dem Benutzer cryptpad.
Installationsverzeichnis:
- /home/cryptpad/cryptpad
Dienste[Bearbeiten]
- CryptPad
- systemctl status cryptpad
- systemctl restart cryptpad
- nginx
- systemctl status nginx
- nginx -t
- systemctl reload nginx
- SSH
- systemctl status ssh
- Firewall
- systemctl status nftables
- nft list ruleset
- Fail2ban
- systemctl status fail2ban
- fail2ban-client status sshd
- Fehlerhafte Dienste
- systemctl --failed
Logs und Diagnose[Bearbeiten]
- CryptPad-Log
- journalctl -u cryptpad -f
- nginx-Log
- journalctl -u nginx -b
- Offene Ports
- ss -lntup
- Aktive TCP-Verbindungen
- ss -ant
- Häufigste IP-Adressen im nginx-Zugriffslog
- awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
CryptPad kann zur Fehlersuche auch direkt gestartet werden. Zuvor muss der systemd-Dienst gestoppt werden.
- Dienst stoppen
- systemctl stop cryptpad
- Als CryptPad-Benutzer
- su - cryptpad
- cd /home/cryptpad/cryptpad
- npm start
Danach den manuellen Prozess beenden und CryptPad wieder über systemd starten.
- systemctl start cryptpad
SSH[Bearbeiten]
Der direkte SSH-Zugang als root sowie die Passwortanmeldung sind deaktiviert.
Administrativer Benutzer:
- adminBenutzer
Anmeldung:
- ssh -4 -i ~/.ssh/ssh-rsa-private-4096-key adminBenutzer@cp.uugrn.org
Anschließend:
- sudo -i
Wesentliche SSH-Härtung:
- PermitRootLogin no
- PasswordAuthentication no
- KbdInteractiveAuthentication no
- PubkeyAuthentication yes
- AllowGroups sshusers
- LoginGraceTime 30
- MaxAuthTries 3
- MaxStartups 10:30:30
- PerSourceMaxStartups 3
- Konfiguration prüfen
- sshd -t
- Effektive Konfiguration
- sshd -T
Firewall und Fail2ban[Bearbeiten]
Öffentlich erreichbar sind:
| Port | Dienst |
|---|---|
| 22/tcp | SSH |
| 80/tcp | HTTP |
| 443/tcp | HTTPS |
CryptPad selbst ist nur über Loopback erreichbar, unter anderem auf Port 3000 und 3003.
nftables:
- INPUT DROP
- FORWARD DROP
- OUTPUT ACCEPT
Konfiguration:
- /etc/nftables.conf
Fail2ban schützt SSH zusätzlich.
Konfiguration:
- /etc/fail2ban/jail.d/sshd.local
Einstellungen:
- 4 Fehlversuche innerhalb von 10 Minuten
- Sperrdauer 1 Stunde
- Backend systemd
- Sperren über nftables
- usedns = no
Normalerweise sind folgende nftables-Tabellen vorhanden:
- table inet filter
- table inet f2b-table
Nach einem manuellen Neustart von nftables auch Fail2ban neu starten:
- systemctl restart nftables
- systemctl restart fail2ban
Updates[Bearbeiten]
Debian-Sicherheitsupdates werden automatisch über unattended-upgrades installiert.
Nicht automatisch aktualisiert werden:
- normale Debian-Updates
- Node.js / NodeSource
- nginx
- CryptPad
Automatische Neustarts sind deaktiviert.
- Updates prüfen
- apt update
- apt list --upgradable
- Automatische Sicherheitsupdates testen
- unattended-upgrade --dry-run
- Neustartbedarf prüfen
- test -f /var/run/reboot-required && cat /var/run/reboot-required
CryptPad aktualisieren[Bearbeiten]
Vor einem Update:
- Wartungsarbeiten über die üblichen UUGRN-Kanäle ankündigen.
- Release Notes der Zielversion lesen.
- Diagnoseseite prüfen.
- Backup erstellen.
- CryptPad stoppen.
- Update als Benutzer cryptpad durchführen.
- CryptPad starten und testen.
Backup vor dem Update[Bearbeiten]
- /root/sichercp
Update[Bearbeiten]
- CryptPad stoppen
- systemctl stop cryptpad
- Zum CryptPad-Benutzer wechseln
- su - cryptpad
- cd /home/cryptpad/cryptpad
VERSION durch die gewünschte Version ersetzen.
- git fetch --depth 1 origin tag VERSION
- git checkout VERSION
- npm ci
- npm run install:components
OnlyOffice bei Bedarf beziehungsweise entsprechend den Release Notes aktualisieren:
- ./install-onlyoffice.sh
Prüfen, ob sich die Beispielkonfiguration geändert hat:
- diff -u config/config.example.js config/config.js
Danach den CryptPad-Benutzer verlassen:
- exit
CryptPad starten:
- systemctl start cryptpad
- systemctl status cryptpad
Logs prüfen:
- journalctl -u cryptpad -n 100 --no-pager
Anschließend prüfen:
- https://cp.uugrn.org/checkup/
- Anmeldung
- bestehende Pads
- neues Pad
- gemeinsames Bearbeiten
- Datei-Upload
- Dokument, Tabelle und Präsentation mit OnlyOffice
nginx aktualisieren[Bearbeiten]
Vor einer manuellen nginx-Aktualisierung Konfiguration sichern:
- cp -a /etc/nginx /etc/nginx.backup.$(date +%F-%H%M)
Pakete aktualisieren:
- apt update
- apt upgrade
Konfiguration prüfen:
- nginx -t
Bei erfolgreicher Prüfung neu laden:
- systemctl reload nginx
Kontrolle:
- nginx -v
- journalctl -u nginx -b --no-pager
- certbot certificates
- certbot renew --dry-run
Backup[Bearbeiten]
Backup-Skript:
- /root/sichercp
Backup-Verzeichnis:
- /root/backups/
Aufbewahrung:
- 180 Tage
Aktuelle Größe eines Backups:
- ca. 133 MB
Gesicherte CryptPad-Daten[Bearbeiten]
- data/
- datastore/
- block/
- blob/
- config/config.js
- customize/
- onlyoffice-conf/
- package.json
- package-lock.json
Zusätzlich gesichert[Bearbeiten]
- nginx-Konfiguration
- SSH-Konfiguration
- nftables
- Fail2ban
- APT-Konfiguration
- sudo-Konfiguration
- systemd-Konfiguration
- journald-Konfiguration
- Paket- und Versionsinformationen
- Netzwerk- und Routinginformationen
Nicht gesichert[Bearbeiten]
Reproduzierbare große Bestandteile werden nicht gesichert:
- .git/
- node_modules/
- www/
- www/common/onlyoffice/dist/
OnlyOffice und die npm-Abhängigkeiten werden bei einer Neuinstallation erneut installiert.
Backup starten[Bearbeiten]
- /root/sichercp
Backups anzeigen[Bearbeiten]
- ls -lh /root/backups/
Die Backups liegen derzeit ausschließlich lokal auf dem Server. Ein externes Backup sollte ergänzt werden, sobald ein geeignetes Ziel zur Verfügung steht.
Restore[Bearbeiten]
Ein Backup kann ohne Eingriff in das Produktivsystem testweise entpackt werden.
- Neuestes Backup auswählen
- BACKUP=$(ls -1t /root/backups/cp-backup-*.tar.gz | head -1)
- Testverzeichnis erstellen
- mkdir -p /root/restore-test
- Backup entpacken
- tar --acls --xattrs --numeric-owner -C /root/restore-test -xzf "$BACKUP"
Nach der Kontrolle:
- rm -rf /root/restore-test
Notfall-Restore[Bearbeiten]
Bei vollständigem Verlust des Servers:
- Debian 13 installieren.
- Netzwerk und SSH-Zugang einrichten.
- Node.js 24 installieren.
- nginx installieren.
- CryptPad in der passenden Version installieren.
- npm-Abhängigkeiten installieren.
- OnlyOffice installieren.
- CryptPad stoppen.
- Daten aus dem Backup zurückspielen.
- Besitzer cryptpad:cryptpad kontrollieren.
- Serverkonfiguration zurückspielen.
- systemd neu laden.
- nginx, SSH, nftables und Fail2ban prüfen.
- Dienste starten.
- CryptPad vollständig testen.
Installation / Neuaufbau[Bearbeiten]
Dieser Abschnitt dokumentiert den grundlegenden Aufbau des Servers. Bei einer Neuinstallation zusätzlich immer die aktuelle CryptPad-Dokumentation beachten.
Voraussetzungen[Bearbeiten]
Benötigte DNS-Namen:
- cp.uugrn.org
- sandboxcp.uugrn.org
Beide Namen zeigen auf den CryptPad-Server.
Benötigte Software:
- Git
- Node.js mit npm
- nginx
- Certbot
Node.js installieren[Bearbeiten]
Aktuell wird Node.js 24 aus dem NodeSource-Repository verwendet.
- apt install curl ca-certificates gnupg
- curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh
- bash nodesource_setup.sh
- apt install nodejs
Prüfen:
- node --version
- npm --version
CryptPad-Benutzer anlegen[Bearbeiten]
- useradd -m cryptpad -s /bin/bash
CryptPad läuft ausschließlich unter diesem Benutzer.
CryptPad installieren[Bearbeiten]
Zum Benutzer wechseln:
- su - cryptpad
Repository klonen:
- git clone https://github.com/cryptpad/cryptpad.git cryptpad
- cd cryptpad
Gewünschte Release-Version auschecken:
- git fetch --tags
- git checkout VERSION
Abhängigkeiten installieren:
- npm ci
- npm run install:components
OnlyOffice installieren:
- ./install-onlyoffice.sh
Beispielkonfiguration übernehmen:
- cp config/config.example.js config/config.js
Konfiguration bearbeiten:
- nano config/config.js
Wichtige Domains:
- httpUnsafeOrigin: 'https://cp.uugrn.org'
- httpSafeOrigin: 'https://sandboxcp.uugrn.org'
systemd-Dienst[Bearbeiten]
CryptPad wird über folgende Unit gestartet:
- /etc/systemd/system/cryptpad.service
Nach Anlegen oder Ändern der Unit:
- systemctl daemon-reload
- systemctl enable --now cryptpad
Prüfen:
- systemctl status cryptpad
Die aktuelle Unit enthält zusätzliche systemd-Härtung und sollte bei einem Neuaufbau aus dem Backup übernommen werden.
nginx installieren[Bearbeiten]
nginx wird aus dem offiziellen nginx.org-Repository installiert.
Voraussetzungen:
- apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
Signaturschlüssel installieren:
- curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Fingerprint prüfen:
- gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
Erwarteter Fingerprint:
- 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
Repository einrichten:
- echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/debian trixie nginx" | tee /etc/apt/sources.list.d/nginx.list
nginx.org-Pakete bevorzugen:
- echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
Installieren:
- apt update
- apt install nginx
Aktivieren:
- systemctl enable --now nginx
Prüfen:
- nginx -v
- nginx -t
- systemctl status nginx
TLS / Let's Encrypt[Bearbeiten]
Certbot installieren:
- apt install certbot python3-certbot-nginx
Zertifikat für beide Domains anfordern:
- certbot --nginx certonly -d cp.uugrn.org -d sandboxcp.uugrn.org
Zertifikate liegen unter:
- /etc/letsencrypt/live/cp.uugrn.org/fullchain.pem
- /etc/letsencrypt/live/cp.uugrn.org/privkey.pem
Certbot-Timer prüfen:
- systemctl status certbot.timer
Erneuerung testen:
- certbot renew --dry-run
nginx für CryptPad konfigurieren[Bearbeiten]
Die von CryptPad mitgelieferte Beispielkonfiguration kann als Ausgangspunkt verwendet werden:
- wget https://raw.githubusercontent.com/cryptpad/cryptpad/main/docs/example.nginx.conf -O /etc/nginx/conf.d/cryptpad.conf
Danach insbesondere anpassen:
- Hauptdomain cp.uugrn.org
- Sandbox-Domain sandboxcp.uugrn.org
- Pfade der Let's-Encrypt-Zertifikate
- interne CryptPad-Ports
Vor jeder Aktivierung:
- nginx -t
Danach:
- systemctl reload nginx
Die aktuelle produktive nginx-Konfiguration befindet sich im Backup und sollte bei einem Wiederaufbau bevorzugt verwendet werden.
CryptPad-Anpassungen[Bearbeiten]
Lokale Anpassungen gehören nach:
- /home/cryptpad/cryptpad/customize/
Nicht direkt customize.dist oder Programmdateien verändern.
Beispiel:
- su - cryptpad
- cd /home/cryptpad/cryptpad
- cp customize.dist/application_config.js customize/application_config.js
- nano customize/application_config.js
Für die bisherige Instanz wurden unter anderem Einstellungen für den Gastzugriff verwendet:
- AppConfig.disableAnonymousStore = true;
- AppConfig.disableAnonymousPadCreation = false;
Nach Änderungen:
- systemctl restart cryptpad
Danach die Funktion im Browser prüfen.
Aufräumjobs[Bearbeiten]
CryptPad enthält Skripte zum Aufräumen inaktiver und archivierter Dokumente.
Vorhandene Crontab prüfen:
- crontab -u cryptpad -l
In der ursprünglichen Installation wurden folgende Jobs verwendet:
- 30 1 1,15 * * (cd /home/cryptpad/cryptpad; node scripts/evict-inactive.js > /dev/null)
- 30 1 7,22 * * (cd /home/cryptpad/cryptpad; node scripts/evict-archived.js > /dev/null)
Vor einer Neuinstallation prüfen, ob diese Jobs von der aktuell eingesetzten CryptPad-Version weiterhin empfohlen werden.
CryptPad-Administrator einrichten[Bearbeiten]
Zunächst ein normales CryptPad-Benutzerkonto anlegen.
In den Benutzereinstellungen den öffentlichen Schlüssel des Kontos kopieren.
Konfiguration bearbeiten:
- /home/cryptpad/cryptpad/config/config.js
Den Schlüssel unter adminKeys eintragen, beispielsweise:
- adminKeys: [
- "[cryptpad-user@cp.uugrn.org/ÖFFENTLICHER-SCHLÜSSEL]",
- ],
CryptPad anschließend neu starten:
- systemctl restart cryptpad
Administrationsoberfläche:
Dort können unter anderem Registrierung und Benutzerverwaltung konfiguriert werden.
Wichtige Pfade[Bearbeiten]
| Bereich | Pfad |
|---|---|
| CryptPad | /home/cryptpad/cryptpad |
| CryptPad-Konfiguration | /home/cryptpad/cryptpad/config/config.js |
| Anpassungen | /home/cryptpad/cryptpad/customize/ |
| nginx | /etc/nginx/ |
| SSH | /etc/ssh/ |
| Firewall | /etc/nftables.conf |
| Fail2ban | /etc/fail2ban/ |
| systemd-Unit | /etc/systemd/system/cryptpad.service |
| Backup-Skript | /root/sichercp |
| Backups | /root/backups/ |
Regelmäßige Kontrolle[Bearbeiten]
- Dienste
- systemctl --failed
- Ports
- ss -lntup
- Firewall
- nft list ruleset
- Fail2ban
- fail2ban-client status sshd
- Updates
- apt list --upgradable
- Speicherplatz
- df -h
- CryptPad-Daten
- du -sh /home/cryptpad/cryptpad/data /home/cryptpad/cryptpad/datastore /home/cryptpad/cryptpad/block /home/cryptpad/cryptpad/blob
- Backups
- du -sh /root/backups
- Warnungen
- journalctl -p warning..alert --since today
```