Maschinenraum/cp.uugrn.org: Unterschied zwischen den Versionen

Aus UUGRN
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(11 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
;Admin Kontakt: sh[at]uugrn.org
= cp.uugrn.org =
;Hostname: cp.uugrn.org
;Aufgabe: Plattform für Echtzeit-Er-/Bearbeitung von Texten, Tabellen, Präsentationen, Kanban, Terminfindung…


==== Beschreibung ====
{| class="wikitable"
Ein CryptPad sind Inhalte, die gemeinsam und gleichzeitig (kollaborativ) erarbeitet werden können. Im Vergleich zu Etherpad sind die Inhalte verschlüsselt auf dem Server gespeichert. Die Software ermöglicht das Erstellen und Bearbeiten von Inhalten mit mehreren Personen gleichzeitig. Es gibt verschiedene Dokumenttypen.
! 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
|}


[https://gnulinux.ch/cryptpad-zusammen-an-dokumenten-arbeiten Anleitung an Dokumenten arbeiten]
== Beschreibung ==


===== Dokumentation und Unterstützung =====
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.


* [https://docs.cryptpad.org/en/admin_guide Adminguide], [https://docs.cryptpad.org/en/admin_guide/installation.html Installation], [https://docs.cryptpad.org/en/admin_guide/maintenance.html Wartung]
Instanz:
* [https://forum.cryptpad.org/ Cryptpad Forum]
* [https://matrix.to/#/#cryptpad-admins:matrix.xwiki.com Cryptpad Matrix Kanal]


==== CryptPad aktualisieren ====
* https://cp.uugrn.org/


Wartungsarbeiten über die Mailingliste, IRC und Matrix ankündigen.
Sandbox-Domain:


Prüfen, ob es eine Aktualisierung gibt: [https://github.com/cryptpad/cryptpad/releases Releasenotes] geben Hinweise zum Update von Version zu Version.
* https://sandboxcp.uugrn.org/


Was steht an: [https://github.com/cryptpad/cryptpad/milestones Plan für künfünftige Veröffentlichtungen]. [https://cryptpad.fr/kanban/#/2/kanban/view/PLM0C3tFWvYhd+EPzXrbT+NxB76Z5DtZhAA5W5hG9wo/ Kanban der öffentlichen Roadmap].
Diagnose:


Diagnoseseite prüfen: https://cp.uugrn.org/checkup/
* https://cp.uugrn.org/checkup/


Prüfen was auf dem Server gerade los ist:
=== Dokumentation und Unterstützung ===


Liste aller laufenden Prozesse azeigen
* [https://docs.cryptpad.org/en/admin_guide/ Administrator Guide]
<pre>
* [https://docs.cryptpad.org/en/admin_guide/installation.html Installation]
ps aux
* [https://docs.cryptpad.org/en/admin_guide/maintenance.html Wartung]
ps aux | grep nginx
* [https://github.com/cryptpad/cryptpad/releases Release Notes]
</pre>
* [https://forum.cryptpad.org/ CryptPad Forum]


Aktive Verbindungen und Sockets anzeigen
== Betrieb ==
<pre>
ss -ant
#nur hörende Verbindungen
ss -lt
# udp und tcp
ss -anut
</pre>


Logs anzeigen allgemein und ausgaben zu Cryptpad prüfen
CryptPad läuft unter dem Benutzer cryptpad.
<pre>
journalctl -f
journalctl -u cryptpad -f
</pre>


Aktive Verbindungen prüfen
Installationsverzeichnis:
<pre>
# Zugriffsprotokolldatei von NGINX
sudo tail -f /var/log/nginx/access.log


# Welche IPs sind aktiv?
: /home/cryptpad/cryptpad
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head


# Zeigt alle Prozesse, die gerade eine aktive Verbindung zum TCP-Port 3000 haben
=== Dienste ===
sudo lsof -i :3000 -i :3001 | grep ESTABLISHED
# alternativ
sudo lsof -i | egrep ':3000|:3001' | grep ESTABLISHED


# gibt es aktive Verbindungen auf den Ports 3000 und 3001
; CryptPad
ss -antp | egrep ':3000|:3001' | grep ESTABLISHED
: systemctl status cryptpad
</pre>
: systemctl restart cryptpad


Per ssh mit der Konsole des Servers bei Hetzner verbinden:
; nginx
<pre>
: systemctl status nginx
ssh  -4 -i ./.ssh/ssh-rsa-private-4096-key root@cp.uugrn.org
: nginx -t
</pre>
: systemctl reload nginx


Sicherung anlegen (als root im Ordner /root) und Aktualisierung Debian:
; SSH
<pre>
: systemctl status ssh
# Prüfung und Installation von Debian Updates
apt update
apt upgrade
# Gegebenenfalls Neustart des Servers einplanen.


#Server stoppen
; Firewall
sudo systemctl stop cryptpad
: systemctl status nftables
: nft list ruleset


#Sichern
; Fail2ban
tar czf ~/cryptpad-backup-$(date +%F).tar.gz /home/cryptpad/cryptpad
: systemctl status fail2ban
: fail2ban-client status sshd


#Server wieder starten oder gleich das Update nachziehen
; Fehlerhafte Dienste
sudo systemctl start cryptpad
: systemctl --failed
</pre>


---
=== Logs und Diagnose ===


Server als root stoppen
; CryptPad-Log
: journalctl -u cryptpad -f


sudo systemctl start cryptpad
; nginx-Log
: journalctl -u nginx -b


; Offene Ports
: ss -lntup


Als Benutzer cryptpad, im Ordner /home/cryptpad/cryptpad arbeiten:
; Aktive TCP-Verbindungen
: ss -ant


su cryptpad
; Häufigste IP-Adressen im nginx-Zugriffslog
: awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head


cd /home/cryptpad/cryptpad
CryptPad kann zur Fehlersuche auch direkt gestartet werden. Zuvor muss der systemd-Dienst gestoppt werden.


Installationshinweise bei den Releasenotes ansehen!
; Dienst stoppen
: systemctl stop cryptpad


<pre>
; Als CryptPad-Benutzer
# Beispiel Autumn release (2025.9.0)
: su - cryptpad
git fetch --depth 1 origin tag 2025.9.0
: cd /home/cryptpad/cryptpad
git checkout 2025.9.0
: npm start
npm ci
npm run install:components
#./install-onlyoffice.sh


#Prüfen, gibt es Unterschiede an der Standardkonfigurationsdatei, die in die eigene Konfiguration übernommen werden müssen?
Danach den manuellen Prozess beenden und CryptPad wieder über systemd starten.
diff config/config.example.js config/config.js
</pre>


als Benutzer root
: systemctl start cryptpad


<pre>
== SSH ==
# Server starten
sudo systemctl start cryptpad


# Nach Änderungen den Dienst neustarten
Der direkte SSH-Zugang als root sowie die Passwortanmeldung sind deaktiviert.
sudo systemctl restart cryptpad


# Status des Dienstes ansehen
Administrativer Benutzer:
sudo systemctl status cryptpad
</pre>


Diagnoseseite prüfen: https://cp.uugrn.org/checkup/
: adminBenutzer


CryptPad lässt sich auch mittels npm starten. Vorteil: es spuckt Informationen und ggf. Fehlermeldungen aus:
Anmeldung:


npm = Node Package Manager
: ssh -4 -i ~/.ssh/ssh-rsa-private-4096-key adminBenutzer@cp.uugrn.org


<pre>
Anschließend:
# Cryptpad Dienst starten und Logausgaben prüfen
cd /home/cryptpad/cryptpad
npm start
</pre>


==== Admin Log ====
: sudo -i
* Betriebssystem: Debian
* Webserver: NGINX
* Produktiv seit: 06.01.2025
* URL: https://cp.uugrn.org/


==== Install Log ====
Wesentliche SSH-Härtung:


OS: Debian (13)
* PermitRootLogin no
Hetzner cx22, 2 CPU, 40 GB SSD, 4 GB Ram
* PasswordAuthentication no
* KbdInteractiveAuthentication no
* PubkeyAuthentication yes
* AllowGroups sshusers
* LoginGraceTime 30
* MaxAuthTries 3
* MaxStartups 10:30:30
* PerSourceMaxStartups 3


Installierte Software
; Konfiguration prüfen
* cryptpad: v2025.9.0)
: sshd -t
* nginx (als reverse proxy)


Anleitung:
; Effektive Konfiguration
* [https://docs.cryptpad.org/en/admin_guide/installation.html]
: sshd -T
* [https://gnulinux.ch/cryptpad-zusammen-an-dokumenten-arbeiten]


Diagnose: https://cp.uugrn.org/checkup/
== Firewall und Fail2ban ==


===== Vorbereitungen =====
Öffentlich erreichbar sind:


<pre>
{| class="wikitable"
2 Domains werden benötigt die beide auf den Server zeigen
! Port
cp.uugrn.org sandboxcp.uugrn.org (für erweiterten Schutz gegen CSS)
! Dienst
|-
| 22/tcp
| SSH
|-
| 80/tcp
| HTTP
|-
| 443/tcp
| HTTPS
|}


apt install -y curl
CryptPad selbst ist nur über Loopback erreichbar, unter anderem auf Port 3000 und 3003.


curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
nftables:


bash nodesource_setup.sh
* INPUT DROP
* FORWARD DROP
* OUTPUT ACCEPT


apt install -y nodejs
Konfiguration:
</pre>


===== Benutzer anlegen =====
: /etc/nftables.conf


<pre>
Fail2ban schützt SSH zusätzlich.
useradd -m cryptpad -s /bin/bash
</pre>


CryptPad läuft unter dem Benutzer „cryptpad“.
Konfiguration:


Das Home-Verzeichnis ist /home/cryptpad/cryptpad.
: /etc/fail2ban/jail.d/sshd.local


===== CryptPad installieren =====
Einstellungen:


<pre>
* 4 Fehlversuche innerhalb von 10 Minuten
su - cryptpad
* Sperrdauer 1 Stunde
* Backend systemd
* Sperren über nftables
* usedns = no


git clone https://github.com/cryptpad/cryptpad.git cryptpad
Normalerweise sind folgende nftables-Tabellen vorhanden:


cd cryptpad
* table inet filter
* table inet f2b-table


npm ci
Nach einem manuellen Neustart von nftables auch Fail2ban neu starten:


npm run install:components
: systemctl restart nftables
: systemctl restart fail2ban


./install-onlyoffice.sh
== Updates ==


# Beispielkonfiguration an den richtigen Ort kopieren
Debian-Sicherheitsupdates werden automatisch über unattended-upgrades installiert.
cp config/config.example.js config/config.js


# Konfiguration anpassen
Nicht automatisch aktualisiert werden:
nano config/config.js


# httpUnsafeOrigin: 'https://cp.uugrn.org',
* normale Debian-Updates
# httpSafeOrigin: 'https://sandboxcp.uugrn.org',
* Node.js / NodeSource
* nginx
* CryptPad


# cryptpad als Service eintragen
Automatische Neustarts sind deaktiviert.
# als Root
wget https://raw.githubusercontent.com/cryptpad/cryptpad/main/docs/cryptpad.service -O /etc/systemd/system/cryptpad.service


# Dienst aktivieren
; Updates prüfen
systemctl enable --now cryptpad
: apt update
: apt list --upgradable


systemctl start cryptpad # Starten des Dienstes
; Automatische Sicherheitsupdates testen
systemctl status cryptpad # Info über den Dienst
: unattended-upgrade --dry-run
systemctl stop cryptpad # Stoppen des Dienstes
systemctl restart cryptpad # Neustarten des Dienstes
ss -ant # hier kann man schauen, ob am Port 3000 und 3001 Verbindungen akzeptiert werden
</pre>


===== NGINX installieren =====
; Neustartbedarf prüfen
<pre>
: test -f /var/run/reboot-required && cat /var/run/reboot-required
sudo apt install nginx


mkdir -p /etc/nginx
== CryptPad aktualisieren ==


openssl dhparam -out /etc/nginx/dhparam.pem 4096
Vor einem Update:
# Generierung dauert eine ganze Weile. Abwarten, bis beendet.
</pre>


===== Let's Encrypt installieren und Zertifikat generieren =====
# Wartungsarbeiten über die üblichen UUGRN-Kanäle ankündigen.
<pre>
# [https://github.com/cryptpad/cryptpad/releases Release Notes] der Zielversion lesen.
sudo apt install certbot python3-certbot-nginx
# Diagnoseseite prüfen.
sudo certbot --nginx certonly -d cp.uugrn.org -d sandboxcp.uugrn.org
# Backup erstellen.
sudo systemctl enable certbot.timer
# CryptPad stoppen.
# Update als Benutzer cryptpad durchführen.
# CryptPad starten und testen.


Certificate is saved at: /etc/letsencrypt/live/cp.uugrn.org/fullchain.pem
=== Backup vor dem Update ===
Key is saved at:        /etc/letsencrypt/live/cp.uugrn.org/privkey.pem
</pre>


<!--
: /root/sichercp
===== Letsencrypt Erneuerung einrichten =====
<pre>
$ cat /etc/cron.weekly/certbot.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
certbot renew
service nginx reload
</pre>
​-->


===== NGINX konfigurieren =====
=== Update ===
<pre>
wget https://raw.githubusercontent.com/cryptpad/cryptpad/main/docs/example.nginx.conf -O /etc/nginx/conf.d/cryptpad.conf


Anschließend die Datei bearbeiten.
; CryptPad stoppen
Domains eintragen und die Lets-Encrypt-Pfade.
: systemctl stop cryptpad
</pre>


Es gibt auch eine erweiterte Beispieldatei: https://github.com/cryptpad/cryptpad/blob/main/docs/example-advanced.nginx.conf
; Zum CryptPad-Benutzer wechseln
: su - cryptpad
: cd /home/cryptpad/cryptpad


<!--
VERSION durch die gewünschte Version ersetzen.
<pre>
server {


        listen      443 ssl;
: git fetch --depth 1 origin tag VERSION
        server_name  cp.uugrn.org;
: git checkout VERSION
: npm ci
: npm run install:components


        access_log  /var/log/nginx/cp.uugrn.org.access.log;
OnlyOffice bei Bedarf beziehungsweise entsprechend den Release Notes aktualisieren:
        error_log  /var/log/nginx/cp.uugrn.org.error.log;


        ssl_certificate /etc/letsencrypt/live/cp.uugrn.org/fullchain.pem;
: ./install-onlyoffice.sh
        ssl_certificate_key /etc/letsencrypt/live/cp.uugrn.org/privkey.pem;


        include /etc/letsencrypt/options-ssl-nginx.conf;
Prüfen, ob sich die Beispielkonfiguration geändert hat:
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
</pre>
-->


===== Anpassungen als CryptPad Benutzer =====
: diff -u config/config.example.js config/config.js
<pre>
su - cryptpad


cd ~/cryptpad
Danach den CryptPad-Benutzer verlassen:
mkdir customize
cp customize.dist/application_config.js customize/


# Zeilen aus der Datei www/common/application_config_internal.js kopieren und zutreffende in die application_config.js einfügen
: exit


nano customize/application_config.js
CryptPad starten:
</pre>


Ohne Anmeldung dürfen Pads und Dokumente erstellt werden. Sie werden nach 90 Tagen automatisch gelöscht. Es kann auf geteilte Dokumente zugegriffen werden.
: systemctl start cryptpad
<pre>
: systemctl status cryptpad
AppConfig.disableAnonymousStore = true;
AppConfig.disableAnonymousPadCreation = false;
</pre>


Nach einem Neustart von cryptpad und nginx sollte sich die Seite aufrufen lassen:
Logs prüfen:
https://cp.uugrn.org/


===== Crontab als CryptPad Benutzer einrichten =====
: journalctl -u cryptpad -n 100 --no-pager


Aufrufe zu node scripts/evict-inactive.js
Anschließend prüfen:


und node scripts/evict-archived.js
* https://cp.uugrn.org/checkup/
* Anmeldung
* bestehende Pads
* neues Pad
* gemeinsames Bearbeiten
* Datei-Upload
* Dokument, Tabelle und Präsentation mit OnlyOffice


Räumen alte Dokumente weg, die Benutzer ohne Konto angelegt haben und schon älter als 90 Tage sind und archivierte Dokumente.
== nginx aktualisieren ==


<pre>
Vor einer manuellen nginx-Aktualisierung Konfiguration sichern:
su - cryptpad


cd ~/cryptpad
: cp -a /etc/nginx /etc/nginx.backup.$(date +%F-%H%M)


crontab -e
Pakete aktualisieren:


zwei Jobs ergänzen:
: apt update
: apt upgrade


30 1 1,15 * * (cd cryptpad; node scripts/evict-inactive.js > /dev/null)
Konfiguration prüfen:


30 1 7,22 * * (cd cryptpad; node scripts/evict-archived.js > /dev/null)
: nginx -t


</pre>
Bei erfolgreicher Prüfung neu laden:


: systemctl reload nginx


Nun ein Benutzerkonto einrichten und in der Konfiguration als Administrator eintragen.
Kontrolle:


===== Benutzerkonto Administrator-Rechte geben =====
: nginx -v
: journalctl -u nginx -b --no-pager
: certbot certificates
: certbot renew --dry-run


1. öffentlichen Schlüssel kopieren. benutzereinstellungen.
== Backup ==
2. Datei bearbeiten /home/cryptpad/cryptpad/config/config.js.
3. Diese stelle finden und wie im Beispiel Benutzer hinzufügen:
<pre>
    adminKeys: [
        "[cryptpad-user1@my.awesome.website/YZgXQxKR0Rcb6r6CmxHPdAGLVludrAF2lEnkbx1vVOo=]",
    ],
</pre>
3. CryptPad Server neu starten.


Registrierung deaktivieren
Backup-Skript:
<pre>
https://cryptpad.mydomain.com/admin/#users
</pre>


Mehr https://docs.cryptpad.org/en/admin_guide/customization.html#restricting-guest-access
: /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:

  1. Wartungsarbeiten über die üblichen UUGRN-Kanäle ankündigen.
  2. Release Notes der Zielversion lesen.
  3. Diagnoseseite prüfen.
  4. Backup erstellen.
  5. CryptPad stoppen.
  6. Update als Benutzer cryptpad durchführen.
  7. 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:

  1. Debian 13 installieren.
  2. Netzwerk und SSH-Zugang einrichten.
  3. Node.js 24 installieren.
  4. nginx installieren.
  5. CryptPad in der passenden Version installieren.
  6. npm-Abhängigkeiten installieren.
  7. OnlyOffice installieren.
  8. CryptPad stoppen.
  9. Daten aus dem Backup zurückspielen.
  10. Besitzer cryptpad:cryptpad kontrollieren.
  11. Serverkonfiguration zurückspielen.
  12. systemd neu laden.
  13. nginx, SSH, nftables und Fail2ban prüfen.
  14. Dienste starten.
  15. 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:

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

```