<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hsh-milanihl</id>
	<title>Hostsharing Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hsh-milanihl"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Hsh-milanihl"/>
	<updated>2026-04-28T15:13:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7498</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7498"/>
		<updated>2026-01-27T14:30:00Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* In eine tenporäre Subshell wechseln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Container Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Integration in Hostsharing Managed Platform ==&lt;br /&gt;
&lt;br /&gt;
=== Subdomain einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir haben bereits die Hauptdomain bei Hostsharing gebucht.&lt;br /&gt;
&lt;br /&gt;
Nun soll unsere Anwendung auf dem Container Server auf einer Subdomain laufen.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen einen Caddy Container, um Letsencrypt bereitszustellen (siehe in den Beispielen unten).&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung müssen wir das Zonefile anpassen, um die Subdomain per A und AAAA Eintrag auf den Container Server zu verweisen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;dig&amp;lt;/code&amp;gt; ermitteln wir die ipv4 und ipv6 Adressen unseres Container Servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t A +short vm4xxx.hostsharing.net&lt;br /&gt;
dig -t AAAA +short vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung, legen wir ein Zonefile an. Siehe auch die Anleitung im Handbuch: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doms/meinedomain.de/etc/pri.meinedomain.de&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
{DEFAULT_ZONEFILE}&lt;br /&gt;
&lt;br /&gt;
meinesubdomain      IN A       83.223.xx.xxx&lt;br /&gt;
meinesubdomain      IN AAAA    2a01:xx:xxxx::xxxx:xxxx:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tunnel zur Managed Datenbank einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir lassen die Anwendung auf dem Container Server laufen. Dort kann natürlich auch die Datenbank laufen, in einem eigenen Container.&lt;br /&gt;
&lt;br /&gt;
Wir haben aber auch Datenbanken in der Managed Umgebung von Hostsharing, mit allen Vorteilen (regelmäßiges Backup, usw.).&lt;br /&gt;
&lt;br /&gt;
Wenn wir eine managed Datenbank aus der Managed Umgebung auf dem Container Server einbinden wollen, sind folgende Schritte notwendig:&lt;br /&gt;
&lt;br /&gt;
* TODO Es muss ein Tunnel eingerichtet werden, damit die Datenbank vom Container Server aus erreichbar ist.&lt;br /&gt;
* TODO: Anpassungen an Docker Compose. Beispiel&lt;br /&gt;
&lt;br /&gt;
== Docker fernsteuern ==&lt;br /&gt;
Es besteht die Möglichkeit, über SSH den Docker Socket von außen zu erreichen. Damit wird es möglich, über eine IDE wie z.B. Intellij IDEA die Docker Container zu starten und zu stoppen.&lt;br /&gt;
&lt;br /&gt;
Um das auszuprobieren, können diese Befehle ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock tallyman@vmxxxx.hostsharing.net&lt;br /&gt;
export DOCKER_HOST=unix://$(pwd)/docker.sock&lt;br /&gt;
docker ps -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sollten die aktuell laufenden Container gelistet werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud High Performance Backend mit Caddy ===&lt;br /&gt;
* Docker Compose: siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend&lt;br /&gt;
* Siehe auch dort die [https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend#readme README Datei], was für die Einrichtung erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
=== OnlyOffice Documentserver ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/onlyoffice-document_server&lt;br /&gt;
&lt;br /&gt;
== Backups in Volumes einpflegen ==&lt;br /&gt;
&lt;br /&gt;
Auf Anfrage stellen wir einen read-only Snapshot bereit, der unter anderem Docker-Volumes, Container und Compose-Dateien enthält. &lt;br /&gt;
&lt;br /&gt;
Da Docker nicht direkt mit den User- und Gruppen-IDs des tallyman-Users arbeitet, sondern interne Sub-User- und Sub-Group-IDs verwendet, können diese Daten nicht unmittelbar zurückkopiert werden. Für die Wiederherstellung ist daher ein kurzer Zwischenschritt erforderlich.&lt;br /&gt;
&lt;br /&gt;
Hinweis: selbstverständlich helfen wir auf Anfrage auch dabei, die Dateien wieder in das laufende System zu migrieren.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: das pgdata Verzeichnis eines PostgreSQL Containers tauschen ===&lt;br /&gt;
&lt;br /&gt;
==== Wo liegt das Volume auf dem Dateisystem? ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps -a # wie lautet der Containername?&lt;br /&gt;
docker inspect --format &#039;{{ range .Mounts }}{{ if eq .Type &amp;quot;volume&amp;quot; }}{{ .Source }}{{ &amp;quot;\n&amp;quot; }}{{ end }}{{ end }}&#039; postgres-1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In unserem Fall sehen wir den Pfad: &amp;lt;code&amp;gt;/home/tallyman/.local/share/docker/volumes/8c73a862eaf1fc3dee55a2f29b6f3d3dd68e3049da58a21a5f73010e7233190c/_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Den betroffenen Container abschalten ====&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel entscheiden wir uns dafür, die Container vollständig zu stoppen.&lt;br /&gt;
Der Grund dafür ist, dass es je nach Image nicht immer eindeutig ist, wie der darin laufende Prozess korrekt gestoppt und wieder gestartet werden sollte.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten wir das Backup also auch direkt in das Volume kopieren und im bestehenden Container eine Shell öffnen, um die Dateien an die richtige Stelle zu verschieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps -a # wie lautet der Containername?&lt;br /&gt;
docker stop app-1&lt;br /&gt;
docker stop postgres-1&lt;br /&gt;
&lt;br /&gt;
# oder über die Service-Namen aus der compose.yaml&lt;br /&gt;
docker compose stop app &lt;br /&gt;
docker compose stop postgres &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== In eine temporäre Subshell wechseln ====&lt;br /&gt;
Hier nutzen wir eine Abkürzung und lassen Docker einen temporären Container starten, der unseren Ordner als Volume einbindet.&lt;br /&gt;
So erhalten wir eine Shell im passenden Userid/Gruppenid-Kontext und können direkt mit den Dateien im Volume arbeiten, ohne den eigentlichen Service-Container starten, oder als root arbeiten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export VOL=&amp;quot;.local/share/docker/volumes&amp;quot;&lt;br /&gt;
docker run --rm -it -v &amp;quot;$VOL:/data&amp;quot; bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir wechseln nun in das oben definierte Volume. Das Beispiel geht davon aus, dass das bereitgestellte Backupverzeichnis &amp;quot;pgdata2&amp;quot; genannt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
cd data&lt;br /&gt;
mv pgdata pgdata.old&lt;br /&gt;
mv pgdata2 pgdata&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Falls wir zusätzliche Pakete brauchen, nutzt das – auf Alpine basierte – Bash image den Paketmanager `apk`. Beispiel: ncdu installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
~$ apk add ncdu&lt;br /&gt;
(1/1) Installing ncdu (1.22-r0)&lt;br /&gt;
Executing busybox-1.37.0-r30.trigger&lt;br /&gt;
OK: 8726 KiB in 20 packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Den Container wieder starten ====&lt;br /&gt;
&lt;br /&gt;
Wir verlassen den Container mittels &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; oder über die Tastenkombination &amp;lt;code&amp;gt;STRG+D&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker start postgres-1&lt;br /&gt;
docker start app-1&lt;br /&gt;
&lt;br /&gt;
# oder über die Service-Namen aus der compose.yaml&lt;br /&gt;
docker compose start app &lt;br /&gt;
docker compose start postgres &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: eine Subshell mit Hilfe eine Containerprozesses starten ===&lt;br /&gt;
Für Debugging kann es nützlich sein, direkt mit allen vorinstallierten Tools im Containerserver mit Daten der Volumes zu agieren. Hier sind zwei Wege um eine Subshell ohne extra(!) Container zu starten:&lt;br /&gt;
&lt;br /&gt;
==== Mit Hilfe eines beliebigen laufenden Containers: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker inspect --format &#039;{{.State.Pid}}&#039; app-1&lt;br /&gt;
nsenter -U -t 2586740 -- bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
Funktionierende subshell (mit nötigen Berechtigungen) mittels unshare oder nsenter&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7497</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7497"/>
		<updated>2026-01-27T14:29:28Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: restore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Container Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Integration in Hostsharing Managed Platform ==&lt;br /&gt;
&lt;br /&gt;
=== Subdomain einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir haben bereits die Hauptdomain bei Hostsharing gebucht.&lt;br /&gt;
&lt;br /&gt;
Nun soll unsere Anwendung auf dem Container Server auf einer Subdomain laufen.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen einen Caddy Container, um Letsencrypt bereitszustellen (siehe in den Beispielen unten).&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung müssen wir das Zonefile anpassen, um die Subdomain per A und AAAA Eintrag auf den Container Server zu verweisen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;dig&amp;lt;/code&amp;gt; ermitteln wir die ipv4 und ipv6 Adressen unseres Container Servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t A +short vm4xxx.hostsharing.net&lt;br /&gt;
dig -t AAAA +short vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung, legen wir ein Zonefile an. Siehe auch die Anleitung im Handbuch: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doms/meinedomain.de/etc/pri.meinedomain.de&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
{DEFAULT_ZONEFILE}&lt;br /&gt;
&lt;br /&gt;
meinesubdomain      IN A       83.223.xx.xxx&lt;br /&gt;
meinesubdomain      IN AAAA    2a01:xx:xxxx::xxxx:xxxx:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tunnel zur Managed Datenbank einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir lassen die Anwendung auf dem Container Server laufen. Dort kann natürlich auch die Datenbank laufen, in einem eigenen Container.&lt;br /&gt;
&lt;br /&gt;
Wir haben aber auch Datenbanken in der Managed Umgebung von Hostsharing, mit allen Vorteilen (regelmäßiges Backup, usw.).&lt;br /&gt;
&lt;br /&gt;
Wenn wir eine managed Datenbank aus der Managed Umgebung auf dem Container Server einbinden wollen, sind folgende Schritte notwendig:&lt;br /&gt;
&lt;br /&gt;
* TODO Es muss ein Tunnel eingerichtet werden, damit die Datenbank vom Container Server aus erreichbar ist.&lt;br /&gt;
* TODO: Anpassungen an Docker Compose. Beispiel&lt;br /&gt;
&lt;br /&gt;
== Docker fernsteuern ==&lt;br /&gt;
Es besteht die Möglichkeit, über SSH den Docker Socket von außen zu erreichen. Damit wird es möglich, über eine IDE wie z.B. Intellij IDEA die Docker Container zu starten und zu stoppen.&lt;br /&gt;
&lt;br /&gt;
Um das auszuprobieren, können diese Befehle ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock tallyman@vmxxxx.hostsharing.net&lt;br /&gt;
export DOCKER_HOST=unix://$(pwd)/docker.sock&lt;br /&gt;
docker ps -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sollten die aktuell laufenden Container gelistet werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud High Performance Backend mit Caddy ===&lt;br /&gt;
* Docker Compose: siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend&lt;br /&gt;
* Siehe auch dort die [https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend#readme README Datei], was für die Einrichtung erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
=== OnlyOffice Documentserver ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/onlyoffice-document_server&lt;br /&gt;
&lt;br /&gt;
== Backups in Volumes einpflegen ==&lt;br /&gt;
&lt;br /&gt;
Auf Anfrage stellen wir einen read-only Snapshot bereit, der unter anderem Docker-Volumes, Container und Compose-Dateien enthält. &lt;br /&gt;
&lt;br /&gt;
Da Docker nicht direkt mit den User- und Gruppen-IDs des tallyman-Users arbeitet, sondern interne Sub-User- und Sub-Group-IDs verwendet, können diese Daten nicht unmittelbar zurückkopiert werden. Für die Wiederherstellung ist daher ein kurzer Zwischenschritt erforderlich.&lt;br /&gt;
&lt;br /&gt;
Hinweis: selbstverständlich helfen wir auf Anfrage auch dabei, die Dateien wieder in das laufende System zu migrieren.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: das pgdata Verzeichnis eines PostgreSQL Containers tauschen ===&lt;br /&gt;
&lt;br /&gt;
==== Wo liegt das Volume auf dem Dateisystem? ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps -a # wie lautet der Containername?&lt;br /&gt;
docker inspect --format &#039;{{ range .Mounts }}{{ if eq .Type &amp;quot;volume&amp;quot; }}{{ .Source }}{{ &amp;quot;\n&amp;quot; }}{{ end }}{{ end }}&#039; postgres-1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In unserem Fall sehen wir den Pfad: &amp;lt;code&amp;gt;/home/tallyman/.local/share/docker/volumes/8c73a862eaf1fc3dee55a2f29b6f3d3dd68e3049da58a21a5f73010e7233190c/_data&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Den betroffenen Container abschalten ====&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel entscheiden wir uns dafür, die Container vollständig zu stoppen.&lt;br /&gt;
Der Grund dafür ist, dass es je nach Image nicht immer eindeutig ist, wie der darin laufende Prozess korrekt gestoppt und wieder gestartet werden sollte.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten wir das Backup also auch direkt in das Volume kopieren und im bestehenden Container eine Shell öffnen, um die Dateien an die richtige Stelle zu verschieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps -a # wie lautet der Containername?&lt;br /&gt;
docker stop app-1&lt;br /&gt;
docker stop postgres-1&lt;br /&gt;
&lt;br /&gt;
# oder über die Service-Namen aus der compose.yaml&lt;br /&gt;
docker compose stop app &lt;br /&gt;
docker compose stop postgres &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== In eine tenporäre Subshell wechseln ====&lt;br /&gt;
Hier nutzen wir eine Abkürzung und lassen Docker einen temporären Container starten, der unseren Ordner als Volume einbindet.&lt;br /&gt;
So erhalten wir eine Shell im passenden Userid/Gruppenid-Kontext und können direkt mit den Dateien im Volume arbeiten, ohne den eigentlichen Service-Container starten, oder als root arbeiten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export VOL=&amp;quot;.local/share/docker/volumes&amp;quot;&lt;br /&gt;
docker run --rm -it -v &amp;quot;$VOL:/data&amp;quot; bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir wechseln nun in das oben definierte Volume. Das Beispiel geht davon aus, dass das bereitgestellte Backupverzeichnis &amp;quot;pgdata2&amp;quot; genannt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
cd data&lt;br /&gt;
mv pgdata pgdata.old&lt;br /&gt;
mv pgdata2 pgdata&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Falls wir zusätzliche Pakete brauchen, nutzt das – auf Alpine basierte – Bash image den Paketmanager `apk`. Beispiel: ncdu installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
~$ apk add ncdu&lt;br /&gt;
(1/1) Installing ncdu (1.22-r0)&lt;br /&gt;
Executing busybox-1.37.0-r30.trigger&lt;br /&gt;
OK: 8726 KiB in 20 packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Den Container wieder starten ====&lt;br /&gt;
&lt;br /&gt;
Wir verlassen den Container mittels &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; oder über die Tastenkombination &amp;lt;code&amp;gt;STRG+D&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker start postgres-1&lt;br /&gt;
docker start app-1&lt;br /&gt;
&lt;br /&gt;
# oder über die Service-Namen aus der compose.yaml&lt;br /&gt;
docker compose start app &lt;br /&gt;
docker compose start postgres &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: eine Subshell mit Hilfe eine Containerprozesses starten ===&lt;br /&gt;
Für Debugging kann es nützlich sein, direkt mit allen vorinstallierten Tools im Containerserver mit Daten der Volumes zu agieren. Hier sind zwei Wege um eine Subshell ohne extra(!) Container zu starten:&lt;br /&gt;
&lt;br /&gt;
==== Mit Hilfe eines beliebigen laufenden Containers: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
docker ps&lt;br /&gt;
docker inspect --format &#039;{{.State.Pid}}&#039; app-1&lt;br /&gt;
nsenter -U -t 2586740 -- bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TODO ====&lt;br /&gt;
Funktionierende subshell (mit nötigen Berechtigungen) mittels unshare oder nsenter&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7421</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7421"/>
		<updated>2025-09-08T09:23:45Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Plugin-Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Keycloak [http://www.keycloak.org/] ist eine Open Source Lösung, die ein Single Sign On für verschiedene Anwendungen ermöglicht. Dabei ermöglicht es sowohl die Identitätsverwaltung als auch Zugriffsmanagement.&lt;br /&gt;
&lt;br /&gt;
Es kann die Benutzer entweder aus einem existierenden Verzeichnisdienst (LDAP, Active Directory) auslesen, oder die Gruppen und Benutzer auch selber verwalten.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
Keycloak ist in Java geschrieben. Bisher lief es in einem Wildfly Server, aber seit Version 17 (Februar 2022) benutzt es Quarkus, welches ein leichtgewichtiges Java Framework ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Keycloak automatisiert durchführt.&lt;br /&gt;
&lt;br /&gt;
Die Quellen für das Ansible Skript können hier eingesehen werden: [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/keycloak]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Was das Ansible Skript macht, lässt sich mit diesen Worten beschreiben:&lt;br /&gt;
&lt;br /&gt;
* Es wird ein Linux Benutzer eingerichtet.&lt;br /&gt;
* Es wird eine Postgresql Datenbank eingerichtet.&lt;br /&gt;
* Es wird eine Domain aufgeschaltet.&lt;br /&gt;
* Es wird Keycloak als Zip Datei heruntergeladen, z.B. [https://github.com/keycloak/keycloak/releases/download/17.0.0/keycloak-17.0.0.zip], und ins Verzeichnis $HOME/keycloak-17.0.0 entpackt.&lt;br /&gt;
* Dann werden ein paar Konfigurationen an der Datei &amp;lt;code&amp;gt;keycloak/conf/keycloak.conf&amp;lt;/code&amp;gt; vorgenommen, um die Postgresql Datenbank einzurichten, und um den Proxymodus auf edge zu setzen und den Hostname zu setzen.&lt;br /&gt;
* Nun wird die Keycloak Instanz initialisiert, mit dem Befehl: &amp;lt;code&amp;gt;keycloak/bin/kc.sh --cache=local --profile=prod build&amp;lt;/code&amp;gt;. Hierbei verhindert die Einstellung für den Cache, dass Keycloak versucht über das Netzwerk Verbindungen zu anderen Instanzen herzustellen.&lt;br /&gt;
* Es muss der Server einmal gestartet werden, während der Admin Benutzer mit Passwort in einer Umgebungsvariable gesetzt ist, damit der Benutzer eingerichtet wird.&lt;br /&gt;
* Es wird Monit konfiguriert, um den Keycloak Service zu starten, der auf einem internen Port lauscht.&lt;br /&gt;
* Es wird der Apache in der htaccess Datei konfiguriert, damit die aufgeschaltete Domain über Proxy auf den Keycloak Dienst verweist. Dabei ist wichtig, dass der Java Prozess mitbekommt, dass die Seite über https läuft. Dazu wird in der htaccess Datei der Wert X-Forwarded-Proto auf https gesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Keycloak mit Systemd ===&lt;br /&gt;
&lt;br /&gt;
Sofern &amp;lt;code&amp;gt;linger&amp;lt;/code&amp;gt; für den User schon verfügbar ist, kann auch Systemd verwendet werden. Zudem sollte im Vorfeld &amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt; ausgeführt werden um Zugriff auf die Befehle zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel einer Systemd Konfiguration in &amp;lt;code&amp;gt;.config/systemd/user/keycloak.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Keycloak&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=on-abort&lt;br /&gt;
WorkingDirectory=/home/pacs/xyz00/users/login/keycloak&lt;br /&gt;
Environment=PROXY_ADDRESS_FORWARDING=true&lt;br /&gt;
&lt;br /&gt;
# Für den ersten Start, um den Adminuser zu setzen&lt;br /&gt;
#Environment=KEYCLOAK_ADMIN=changeme&lt;br /&gt;
#Environment=KEYCLOAK_ADMIN_PASSWORD=changeme&lt;br /&gt;
&lt;br /&gt;
# Die Option cache=local kann auch an anderer Stelle gesetzt werden.&lt;br /&gt;
# Hauptsache sie taucht auf, da es sonst zu Performance-Problemen wie&lt;br /&gt;
# Timeouts kommen kann.&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/login/keycloak/latest/bin/kc.sh start --cache=local&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# Achtung: multiuser.target würde hier zu Problemen führen&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Beispiel einer Einrichtung ==&lt;br /&gt;
Diese Anleitung steht auch als [https://youtu.be/bmOp8epgxsM Video auf Youtube] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
* Auf https://keycloak.example.org/admin anmelden.&lt;br /&gt;
&lt;br /&gt;
=== Admin User einrichten ===&lt;br /&gt;
* Der auf der Kommandozeile angelegte Benutzer ist nur vorübergehend gültig.&lt;br /&gt;
* Bitte einen permanenten Admin User anlegen, mit den entsprechenden Rollen (role_admin und role_default-roles) ausstatten&lt;br /&gt;
* Login mit permanentem Admin durchführen&lt;br /&gt;
* Dann den temporären Benutzer löschen.&lt;br /&gt;
&lt;br /&gt;
=== Realm einrichten ===&lt;br /&gt;
* Es soll nicht mit der master Realm gearbeitet werden, sondern sollte eine weitere Realm eingerichtet werden, z.B. &amp;quot;MeineFirma&amp;quot;&lt;br /&gt;
* Diese neue Realm wird dann ausgewählt&lt;br /&gt;
&lt;br /&gt;
=== Benutzer einrichten ===&lt;br /&gt;
* Innerhalb der neuen Realm wird dann ein neuer Benutzer angelegt.&lt;br /&gt;
* Beim neuen Benutzer kann ausgewählt werden, dass die E-Mail bereits bestätigt ist.&lt;br /&gt;
* Nach dem Speichern des Benutzers kann man dann auch bei Credentials das Passwort setzen. Wenn es nur temporär ist, muss der Benutzer es bei der ersten Anmeldung ändern.&lt;br /&gt;
* Nun kann man sich als Administrator abmelden und sich als der Benutzer anmelden, auf https://keycloak.example.org/realms/MeineFirma/account/#/&lt;br /&gt;
** Achtung: in anderen Anleitungen heißen die URLs /auth/realms usw, aber auth scheint nicht mehr Teil der Standardeinrichtung zu sein.&lt;br /&gt;
* Als Benutzer kann man sein Passwort ändern.&lt;br /&gt;
* Wieder abmelden, und wieder als Administrator anmelden.&lt;br /&gt;
&lt;br /&gt;
=== Client einrichten ===&lt;br /&gt;
* Achtung: erst aus der Master Realm in die vorher angelegte Realm wechseln, z.B. &amp;quot;MeineFirma&amp;quot;&lt;br /&gt;
* Nun sollte ein Client hinzugefügt werden, also eine beliebige Anwendung, die mit Keycloak zusammenarbeiten soll&lt;br /&gt;
** Als Client-Protokoll wählt man &amp;quot;OpenID Connect&amp;quot;&lt;br /&gt;
** Die Client-ID kann so aussehen: my-nextcloud&lt;br /&gt;
** Anwählen: &#039;Client Authentication&#039;, um den OID Typ auf &#039;Confidential Access Type&#039; zu setzen.&lt;br /&gt;
** Anwählen: &#039;Standard Flow&#039;, &#039;Implicit Flow&#039; und &#039;Direct Access Grants&#039;&lt;br /&gt;
* Eine Root Url eingeben, z.B. https://nextcloud.example.org&lt;br /&gt;
* Eine Valid Redirect URI eingeben, z.B. https://nextcloud.example.org/*&lt;br /&gt;
* Gültige Web Origins eingeben, z.B. https://nextcloud.example.org&lt;br /&gt;
* Speichern&lt;br /&gt;
* Unter Roles eine neue Rolle mit Namen admin anlegen.&lt;br /&gt;
* Wieder unter den Client Nextcloud gehen, und bei &amp;quot;Client Scopes&amp;quot; klicke auf &amp;quot;my-nextcloud-dedicated&amp;quot;, und wähle dort &amp;quot;Add predefined Mapper&amp;quot;. Wähle &amp;quot;client roles&amp;quot;, und klicke auf &amp;quot;Add&amp;quot;. Dann diesen neuen Mapper &amp;quot;client roles&amp;quot; Bearbeiten, und Client ID auf &amp;quot;my-nextcloud&amp;quot; setzen, und &amp;quot;Token Claim Name&amp;quot; mit &amp;quot;roles&amp;quot; setzen, und &amp;quot;Add to userinfo&amp;quot; auf &amp;quot;ON&amp;quot; stellen. Dann Speichern.&lt;br /&gt;
* Dann zu nochmal zu Client Scopes (im Client) gehen, und auf &amp;quot;my-nextcloud-dedicated&amp;quot; klicken, und dort im Reiter &amp;quot;Scope&amp;quot; die Option &amp;quot;Full Scope Allowed&amp;quot; abschalten.&lt;br /&gt;
&lt;br /&gt;
* Dann unter Configure / Realm Settings, in General, bei Endpoints auf &amp;quot;OpenID Endpoint Configuration&amp;quot; klicken, dann wird eine Seite geöffnet, auf dieser URL: https://keycloak.example.org/realms/MeineFirma/.well-known/openid-configuration; diese Seite offen halten, wir brauchen daraus die Daten für die Nextcloud Einrichtung&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud einrichten (Einfach) ===&lt;br /&gt;
* Als Administrator anmelden, und bei den Apps die App [https://apps.nextcloud.com/apps/sociallogin &amp;quot;Social Login&amp;quot;] installieren.&lt;br /&gt;
* Dann bei Einstellungen, unter Verwaltung, Social Login, die gewünschten Einstellungen vornehmen.&lt;br /&gt;
* Es sollte ein Kreuz sein bei: Anlegen eines Kontos verhindern, wenn die E-Mail-Adresse bereits von einem anderen Konto verwendet wird.&lt;br /&gt;
* Es sollte ein Kreuz sein bei: Verhindern, dass sich Benutzer ohne gemappte Gruppe anmelden können.&lt;br /&gt;
* Speichern&lt;br /&gt;
* Dann bei &amp;quot;Benutzerdefinierte OpenID Connect Anbindung&amp;quot; auf das Plus klicken&lt;br /&gt;
* Nun die Daten aus der &amp;quot;OpenID Endpoint Configuration&amp;quot; (siehe oben) übernehmen: Authorize URL, Token URL, User info URL, Logout URL&lt;br /&gt;
* Client ID: nc (Name des Clients in Keycloak)&lt;br /&gt;
* Client Secret: hier kommt das Secret hinein, das in Keycloak im Client unter Credentials &amp;quot;Client Secret&amp;quot; zu finden ist. Das kann über die Zwischenablage kopiert werden.&lt;br /&gt;
* Scope: openid&lt;br /&gt;
* Speichern&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud einrichten (Fortgeschritten) ===&lt;br /&gt;
Die folgende App wird mit Rücksicht auf Keycloak entwickelt und hat daher eine &amp;lt;strong&amp;gt;bessere Kompatibilität&amp;lt;/strong&amp;gt; als das Beispiel oben. Allerdings gibt es hierfür keine Optionen in der Cloud, stattdessen wird die &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; direkt bearbeitet.&lt;br /&gt;
&lt;br /&gt;
==== Plugin-Installation ====&lt;br /&gt;
&lt;br /&gt;
# Als Administrator die App [https://github.com/pulsejet/nextcloud-oidc-login &amp;quot;Nextcloud OIDC Login&amp;quot;] installieren&lt;br /&gt;
# Die Nextcloud Konfigurationsdatei unter &amp;lt;code&amp;gt;pfad/zur/nextcloud/config/config.php&amp;lt;/code&amp;gt; öffnen und basierend auf dem Readme der App (Link aus Schritt #1) befüllen. Das könnte so aussehen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;oidc_login_client_id&#039; =&amp;gt; &#039;nextcloud&#039;,&lt;br /&gt;
&#039;oidc_login_client_secret&#039; =&amp;gt; &#039;bSIPDNUyTQpxmfOpXdwyoBP8nZDQZVuL&#039;, // Client Reiter &amp;quot;Credentials&amp;quot; in Keycloak&lt;br /&gt;
&#039;oidc_login_provider_url&#039; =&amp;gt; &#039;https://login.mydomain.de/realms/myrealm&#039;,&lt;br /&gt;
&#039;oidc_login_end_session_redirect&#039; =&amp;gt; true,&lt;br /&gt;
&#039;oidc_login_logout_url&#039; =&amp;gt; &#039;https://cloud.mydomain.de/index.php/apps/oidc_login/oidc&#039;,&lt;br /&gt;
&#039;oidc_login_auto_redirect&#039; =&amp;gt; true, // hiermit wird das Login-Formular übergangen um Leute weniger zu verwirren&lt;br /&gt;
&#039;oidc_login_redir_fallback&#039; =&amp;gt; false,&lt;br /&gt;
&#039;oidc_login_disable_registration&#039; =&amp;gt; false, // Nextcloud soll neue Keycloak Accounts akzeptieren&lt;br /&gt;
&#039;oidc_create_groups&#039; =&amp;gt; true,&lt;br /&gt;
&#039;oidc_login_attributes&#039; =&amp;gt; array(&lt;br /&gt;
&#039;id&#039; =&amp;gt; &#039;preferred_username&#039;,&lt;br /&gt;
&#039;mail&#039; =&amp;gt; &#039;email&#039;,&lt;br /&gt;
&#039;groups&#039; =&amp;gt; &#039;ownCloudGroups&#039;,&lt;br /&gt;
&#039;is_admin&#039; =&amp;gt; &#039;ownCloudAdmin&#039;,&lt;br /&gt;
),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== In Keycloak nochmal alles kontrollieren ====&lt;br /&gt;
# Client ID stimmt überein&lt;br /&gt;
# unter &amp;lt;code&amp;gt;Capability config&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;Client authentication&amp;lt;/code&amp;gt; aktiv (damit wir ua. unser Secret bekommen)&lt;br /&gt;
# &amp;lt;code&amp;gt;Valid redirect URIs&amp;lt;/code&amp;gt; erlaubt &amp;lt;/code&amp;gt;https://cloud.mydomain.de/*&amp;lt;/code&amp;gt; – oder eine konkretere Adresse. Das Plus übernimmt die Einstellung aus &amp;lt;code&amp;gt;Valid redirect URIs&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;Valid post logout redirect URIs&amp;lt;/code&amp;gt; erlaubt &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; oder &amp;lt;/code&amp;gt;https://cloud.mydomain.de/*&amp;lt;/code&amp;gt; – oder eine konkretere Adresse&lt;br /&gt;
# &amp;lt;code&amp;gt;Fine Grain OpenID Connect Configuration&amp;lt;/code&amp;gt; steht unter &amp;lt;code&amp;gt;ID Token Signature Algorithm&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;RS256&amp;lt;/code&amp;gt; (Achtung, hier verrutscht man schnell weil die Einträge sich ähneln)&lt;br /&gt;
&lt;br /&gt;
==== Gruppen Synchronisation über Rollen ermöglichen ====&lt;br /&gt;
Hierfür legen wir einen Mapper in &amp;lt;code&amp;gt;nextcloud&amp;lt;/code&amp;gt; Client an. Anschließend müssen die tatsächlichen Gruppen mit Roles verknüpft werden. Hintergrund ist, dass Roles eigentlich für Berechtigungsmanagement gedacht sind, und Gruppen eigentlich nur User gruppieren sollen.&lt;br /&gt;
# wir wechseln im Client &amp;lt;code&amp;gt;nextcloud&amp;lt;/code&amp;gt; auf den Reiter &amp;lt;code&amp;gt;Client scopes&amp;lt;/code&amp;gt;&lt;br /&gt;
# wir wählen &amp;lt;code&amp;gt;nextcloud-dedicated&amp;lt;/code&amp;gt;&lt;br /&gt;
# Add mapper -&amp;gt; by configuration&lt;br /&gt;
## Type: &amp;lt;code&amp;gt;User Client Role&amp;lt;/code&amp;gt;&lt;br /&gt;
## Name: &amp;lt;code&amp;gt;ownCloudGroups&amp;lt;/code&amp;gt;&lt;br /&gt;
## Client ID&lt;br /&gt;
### &amp;lt;strong&amp;gt;Option #1:&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; – es werden alle &amp;lt;code&amp;gt;Realm roles&amp;lt;/code&amp;gt; abgerufen. Das umfasst allerdings auch die Defaults wie &amp;lt;code&amp;gt;uma_authorization&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;offline_access&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;default-user-roles&amp;lt;/code&amp;gt; und ist nicht immer gewünscht.&lt;br /&gt;
### &amp;lt;strong&amp;gt;Option #2:&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;nextcloud&amp;lt;/code&amp;gt; hier können im Anschluss roles im Client angelegt und mit &amp;lt;code&amp;gt;Groups&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Realm roles&amp;lt;/code&amp;gt; verknüpft werden. &lt;br /&gt;
## Multivalued: &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;&lt;br /&gt;
## Token Claim Name: &amp;lt;code&amp;gt;ownCloudGroups&amp;lt;/code&amp;gt;&lt;br /&gt;
## Claim JSON Type: &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
## die folgenden drei Optionen: &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Gruppen Synchronisation in der Praxis ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Option #2:&amp;lt;/strong&amp;gt; Client ID &amp;lt;code&amp;gt;nextcloud&amp;lt;/code&amp;gt;&lt;br /&gt;
# wir wechseln im Client &amp;lt;code&amp;gt;nextcloud&amp;lt;/code&amp;gt; auf den Reiter &amp;lt;code&amp;gt;Roles&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create role&lt;br /&gt;
## Wunschname&lt;br /&gt;
# wir wechseln in &amp;lt;code&amp;gt;Groups&amp;lt;/code&amp;gt; (Sidebar)&lt;br /&gt;
# Create group&lt;br /&gt;
## Wunschname&lt;br /&gt;
# In der Gruppe wechseln wir auf den Reiter &amp;lt;code&amp;gt;Role mapping&amp;lt;/code&amp;gt;&lt;br /&gt;
## Assign role&lt;br /&gt;
## Im Dropdown welchseln wir auf den Filter &amp;lt;code&amp;gt;by clients&amp;lt;/code&amp;gt;&lt;br /&gt;
## Wir wählen die gewünschte Rolle&lt;br /&gt;
## Unten Links, button &amp;lt;code&amp;gt;Assign&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ab hier können wir die Gruppe normal zuweisen.&lt;br /&gt;
&lt;br /&gt;
=== Benutzer einrichten ===&lt;br /&gt;
* Einen Benutzer im Keycloak einrichten, in der Realm &amp;quot;MeineFirma&amp;quot;.&lt;br /&gt;
* Den Benutzer bearbeiten, und unter &amp;quot;Role Mappings&amp;quot;, &amp;quot;Assign Role&amp;quot;, &amp;quot;Filter by Clients&amp;quot;, wähle &amp;quot;my-nextcloud admin&amp;quot; und klicke auf &amp;quot;Assign&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Fehler beheben ==&lt;br /&gt;
&lt;br /&gt;
Problem: Gerade beim Experimentieren kommt schon mal die Meldung: &amp;quot;expected expression, got end of script&amp;quot;&lt;br /&gt;
* Lösung: Webseite aus der Firefox Chronik komplett löschen, oder in einem privaten Fenster öffnen, dann geht es wieder.&lt;br /&gt;
&lt;br /&gt;
Generell kann es zu verwirrenden Fehlermeldungen kommen, wenn man sich versucht in einer verknüpften Anwendung einzuloggen aber beispielsweise noch als Admin im Master-Realm eingeloggt ist.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
Um Fehler besser verstehen zu können, kann das Logging angeschaltet werden, siehe auch [https://www.keycloak.org/server/logging].&lt;br /&gt;
&lt;br /&gt;
Dazu müssen im Start Skript &amp;lt;code&amp;gt;bin/start-keycloak.sh&amp;lt;/code&amp;gt; folgende Parameter hinzugefügt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
--log-level=ERROR --log=file&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Also sieht es z.B. so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
./bin/kc.sh start --http-port [...] --proxy edge --log-level=ERROR --log=file &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nach dem Neustart von Keycloak gibt es dann die Datei &amp;lt;code&amp;gt;keycloak/data/log/keycloak.log&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[http://www.keycloak.org/ Webseite von Keycloak]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/keycloak Ansible Playbook für Hostsharing]&lt;br /&gt;
*[https://robferguson.org/blog/2019/12/24/getting-started-with-keycloak/ Getting started with Keycloak]&lt;br /&gt;
*[https://janikvonrotz.ch/2020/10/20/openid-connect-with-nextcloud-and-keycloak/ OpenID Connect with Nextcloud and Keycloak] von Janik Vonrotz, Oktober 2020&lt;br /&gt;
* [https://www.muehlencord.de/wordpress/2019/12/14/nextcloud-sso-using-keycloak/ Nextcloud SSO using Keycloak] von Jörns Blog, Dezember 2019&lt;br /&gt;
* [https://youtu.be/bmOp8epgxsM Erklärvideo auf Youtube] zum Einrichten von Keycloak und Nextcloud&lt;br /&gt;
* [https://apps.nextcloud.com/apps/sociallogin Nextcloud App Social Login]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7353</id>
		<title>Matrix Authentication Service</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7353"/>
		<updated>2025-05-12T13:59:02Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: diese Info-Seite erfordert einen Hostmaster mit Zugriff auf die [[Apache]]-Domain-Konfigurationsdatei, mit leichter Abänderung sollte die [[.htaccess]] allerdings genauso funktionieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MAS beginnt die alte Authentifizierung direkt über [[Synapse]] zu ersetzen. Schon heute fällt es langsam auf, wenn der Dienst fehlt – beispielsweise weil ElementX diesen für SSO benötigt oder weil sonst der Login via QR-Code nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Offizielle Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Die offizielle Dokumentation befindet sich unter [https://element-hq.github.io/matrix-authentication-service/ element-hq.github.io/matrix-authentication-service].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung im Userspace ==&lt;br /&gt;
&lt;br /&gt;
=== Verzeichnisstruktur (Vorschlag) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
├── bin&lt;br /&gt;
│   ├── mas&lt;br /&gt;
│   └── mas-cli -&amp;gt; /home/pacs/xyz00/users/mas/bin/mas/mas-cli # optional&lt;br /&gt;
├── doms&lt;br /&gt;
│   └── auth.matrix.domain.de&lt;br /&gt;
├── etc&lt;br /&gt;
│   └── config.yaml&lt;br /&gt;
├── readme.md&lt;br /&gt;
├── scripts&lt;br /&gt;
│   └── update.sh&lt;br /&gt;
└── var&lt;br /&gt;
    └── log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updatescript ===&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist auch schon zur Vorbereitung nützlich. Es basiert auf og. Wiki und holt sich die neueste Release und entpackt diese in bin/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ARCH=x86_64&lt;br /&gt;
OS=linux&lt;br /&gt;
VERSION=latest&lt;br /&gt;
&lt;br /&gt;
# URL to the right archive&lt;br /&gt;
URL=&amp;quot;https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -sL &amp;quot;$URL&amp;quot; | tar xzC $HOME/bin/mas&lt;br /&gt;
ln -s $HOME/bin/mas/mas-cli $HOME/bin/ # optional&lt;br /&gt;
&lt;br /&gt;
systemctl restart --user mas.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
In Sachen Konfiguration, können wir einfach den offiziellen Anweisung des Projekts folgen. Einzig die default Ports, können bei Hostsharing so nicht genutzt werden. Als Beispiel für den http web-listener könnte sich &amp;lt;code&amp;gt;32802&amp;lt;/code&amp;gt; anbieten, sofern dieser frei ist.&lt;br /&gt;
&lt;br /&gt;
=== Systemd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix Authentication Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
After=postgresql.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/bin/mas&lt;br /&gt;
ExecStart=%h/bin/mas/mas-cli server -c %h/etc/config.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# wenn alles bereit:&lt;br /&gt;
systemctl enable --now --user mas&lt;br /&gt;
# dies aktiviert den dienst für starten nach reboot und startet den dienst sofort (now)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QR Code Support in Synapse ==&lt;br /&gt;
&lt;br /&gt;
Leicht zu übersehen ist ein zu aktivierendes MSC in Synapse um QR-Code Login zu unterstützen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml&amp;gt;&lt;br /&gt;
experimental_features:&lt;br /&gt;
    msc4108_enabled: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Zum testen muss Keystorage für den User aktiv sein!&lt;br /&gt;
&lt;br /&gt;
== Apache ==&lt;br /&gt;
&lt;br /&gt;
Außerhalb der .htaccess (Hostmaster, FIXME), &#039;&#039;&#039;für die Domain des Synapse homeservers(!)&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# Wichtig, da sonst dieser Endpoint nicht funktioniert, und es zu verwirrenden Fehlern kommt.&lt;br /&gt;
SetEnvIf request_Uri &amp;quot;/_synapse/client/rendezvous&amp;quot; no-gzip&lt;br /&gt;
# FIXME: retry in .htaccess&lt;br /&gt;
ProxyPassMatch   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
ProxyPassReverse   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.htaccess für MAS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32802%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Migration ===&lt;br /&gt;
Laut Wiki benötigt MAS Zugriff auf die &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt;, es reicht aber einfach eine Datei mit den nötigsten Einstellungen bereitzulegen: Evtl der federation listener, Datenbank und falls vorhanden, der OIDC Provider.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel Keycloak ===&lt;br /&gt;
&lt;br /&gt;
Um die Provider-ID für Keycloak zu matchen, kann &amp;lt;code&amp;gt;upstream_oauth2.providers.synapse_idp_id&amp;lt;/code&amp;gt; genutzt werden. MAS unterstützt Benennungen wie in unserem Fall &amp;lt;code&amp;gt;oidc-keycloak&amp;lt;/code&amp;gt; nicht mehr, aber muss das für die Migration matchen.&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7352</id>
		<title>Matrix Authentication Service</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7352"/>
		<updated>2025-05-12T13:54:34Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Apache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: diese Info-Seite erfordert einen Hostmaster mit Zugriff auf die [[Apache]]-Domain-Konfigurationsdatei, mit leichter Abänderung sollte die [[.htaccess]] allerdings genauso funktionieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MAS beginnt die alte Authentifizierung direkt über [[Synapse]] zu ersetzen. Schon heute fällt es langsam auf, wenn der Dienst fehlt – beispielsweise weil ElementX diesen für SSO benötigt oder weil sonst der Login via QR-Code nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Offizielle Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Die offizielle Dokumentation befindet sich unter [https://element-hq.github.io/matrix-authentication-service/ element-hq.github.io/matrix-authentication-service].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung im Userspace ==&lt;br /&gt;
&lt;br /&gt;
=== Verzeichnisstruktur (Vorschlag) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
├── bin&lt;br /&gt;
│   ├── mas&lt;br /&gt;
│   └── mas-cli -&amp;gt; /home/pacs/xyz00/users/mas/bin/mas/mas-cli # optional&lt;br /&gt;
├── doms&lt;br /&gt;
│   └── auth.matrix.domain.de&lt;br /&gt;
├── etc&lt;br /&gt;
│   └── config.yaml&lt;br /&gt;
├── readme.md&lt;br /&gt;
├── scripts&lt;br /&gt;
│   └── update.sh&lt;br /&gt;
└── var&lt;br /&gt;
    └── log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updatescript ===&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist auch schon zur Vorbereitung nützlich. Es basiert auf og. Wiki und holt sich die neueste Release und entpackt diese in bin/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ARCH=x86_64&lt;br /&gt;
OS=linux&lt;br /&gt;
VERSION=latest&lt;br /&gt;
&lt;br /&gt;
# URL to the right archive&lt;br /&gt;
URL=&amp;quot;https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -sL &amp;quot;$URL&amp;quot; | tar xzC $HOME/bin/mas&lt;br /&gt;
ln -s $HOME/bin/mas/mas-cli $HOME/bin/ # optional&lt;br /&gt;
&lt;br /&gt;
systemctl restart --user mas.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
In Sachen Konfiguration, können wir einfach den offiziellen Anweisung des Projekts folgen. Einzig die default Ports, können bei Hostsharing so nicht genutzt werden. Als Beispiel für den http web-listener könnte sich &amp;lt;code&amp;gt;32802&amp;lt;/code&amp;gt; anbieten, sofern dieser frei ist.&lt;br /&gt;
&lt;br /&gt;
=== Systemd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix Authentication Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
After=postgresql.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/bin/mas&lt;br /&gt;
ExecStart=%h/bin/mas/mas-cli server -c %h/etc/config.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# wenn alles bereit:&lt;br /&gt;
systemctl enable --now --user mas&lt;br /&gt;
# dies aktiviert den dienst für starten nach reboot und startet den dienst sofort (now)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QR Code Support in Synapse ==&lt;br /&gt;
&lt;br /&gt;
Leicht zu übersehen ist ein zu aktivierendes MSC in Synapse um QR-Code Login zu unterstützen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml&amp;gt;&lt;br /&gt;
experimental_features:&lt;br /&gt;
    msc4108_enabled: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Zum testen muss Keystorage für den User aktiv sein!&lt;br /&gt;
&lt;br /&gt;
== Apache ==&lt;br /&gt;
&lt;br /&gt;
Außerhalb der .htaccess (Hostmaster, FIXME), &#039;&#039;&#039;für die Domain des Synapse homeservers(!)&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# Wichtig, da sonst dieser Endpoint nicht funktioniert, und es zu verwirrenden Fehlern kommt.&lt;br /&gt;
SetEnvIf request_Uri &amp;quot;/_synapse/client/rendezvous&amp;quot; no-gzip&lt;br /&gt;
# FIXME: retry in .htaccess&lt;br /&gt;
ProxyPassMatch   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
ProxyPassReverse   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.htaccess für MAS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32802%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7351</id>
		<title>Matrix Authentication Service</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7351"/>
		<updated>2025-05-12T13:54:02Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Apache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: diese Info-Seite erfordert einen Hostmaster mit Zugriff auf die [[Apache]]-Domain-Konfigurationsdatei, mit leichter Abänderung sollte die [[.htaccess]] allerdings genauso funktionieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MAS beginnt die alte Authentifizierung direkt über [[Synapse]] zu ersetzen. Schon heute fällt es langsam auf, wenn der Dienst fehlt – beispielsweise weil ElementX diesen für SSO benötigt oder weil sonst der Login via QR-Code nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Offizielle Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Die offizielle Dokumentation befindet sich unter [https://element-hq.github.io/matrix-authentication-service/ element-hq.github.io/matrix-authentication-service].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung im Userspace ==&lt;br /&gt;
&lt;br /&gt;
=== Verzeichnisstruktur (Vorschlag) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
├── bin&lt;br /&gt;
│   ├── mas&lt;br /&gt;
│   └── mas-cli -&amp;gt; /home/pacs/xyz00/users/mas/bin/mas/mas-cli # optional&lt;br /&gt;
├── doms&lt;br /&gt;
│   └── auth.matrix.domain.de&lt;br /&gt;
├── etc&lt;br /&gt;
│   └── config.yaml&lt;br /&gt;
├── readme.md&lt;br /&gt;
├── scripts&lt;br /&gt;
│   └── update.sh&lt;br /&gt;
└── var&lt;br /&gt;
    └── log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updatescript ===&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist auch schon zur Vorbereitung nützlich. Es basiert auf og. Wiki und holt sich die neueste Release und entpackt diese in bin/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ARCH=x86_64&lt;br /&gt;
OS=linux&lt;br /&gt;
VERSION=latest&lt;br /&gt;
&lt;br /&gt;
# URL to the right archive&lt;br /&gt;
URL=&amp;quot;https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -sL &amp;quot;$URL&amp;quot; | tar xzC $HOME/bin/mas&lt;br /&gt;
ln -s $HOME/bin/mas/mas-cli $HOME/bin/ # optional&lt;br /&gt;
&lt;br /&gt;
systemctl restart --user mas.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
In Sachen Konfiguration, können wir einfach den offiziellen Anweisung des Projekts folgen. Einzig die default Ports, können bei Hostsharing so nicht genutzt werden. Als Beispiel für den http web-listener könnte sich &amp;lt;code&amp;gt;32802&amp;lt;/code&amp;gt; anbieten, sofern dieser frei ist.&lt;br /&gt;
&lt;br /&gt;
=== Systemd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix Authentication Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
After=postgresql.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/bin/mas&lt;br /&gt;
ExecStart=%h/bin/mas/mas-cli server -c %h/etc/config.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# wenn alles bereit:&lt;br /&gt;
systemctl enable --now --user mas&lt;br /&gt;
# dies aktiviert den dienst für starten nach reboot und startet den dienst sofort (now)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QR Code Support in Synapse ==&lt;br /&gt;
&lt;br /&gt;
Leicht zu übersehen ist ein zu aktivierendes MSC in Synapse um QR-Code Login zu unterstützen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml&amp;gt;&lt;br /&gt;
experimental_features:&lt;br /&gt;
    msc4108_enabled: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Zum testen muss Keystorage für den User aktiv sein!&lt;br /&gt;
&lt;br /&gt;
== Apache ==&lt;br /&gt;
&lt;br /&gt;
Außerhalb der .htaccess (Hostmaster, FIXME), &#039;&#039;&#039;für die Domain des Synapse homeservers(!)&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# Wichtig, da sonst dieser Endpoint nicht funktioniert, und es zu verwirrenden Fehlern kommt.&lt;br /&gt;
SetEnvIf request_Uri &amp;quot;/_synapse/client/rendezvous&amp;quot; no-gzip&lt;br /&gt;
# FIXME: retry in .htaccess&lt;br /&gt;
ProxyPassMatch   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
ProxyPassReverse   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.htaccess&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32802%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7350</id>
		<title>Matrix Authentication Service</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7350"/>
		<updated>2025-05-12T13:52:57Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Systemd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: diese Info-Seite erfordert einen Hostmaster mit Zugriff auf die [[Apache]]-Domain-Konfigurationsdatei, mit leichter Abänderung sollte die [[.htaccess]] allerdings genauso funktionieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MAS beginnt die alte Authentifizierung direkt über [[Synapse]] zu ersetzen. Schon heute fällt es langsam auf, wenn der Dienst fehlt – beispielsweise weil ElementX diesen für SSO benötigt oder weil sonst der Login via QR-Code nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Offizielle Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Die offizielle Dokumentation befindet sich unter [https://element-hq.github.io/matrix-authentication-service/ element-hq.github.io/matrix-authentication-service].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung im Userspace ==&lt;br /&gt;
&lt;br /&gt;
=== Verzeichnisstruktur (Vorschlag) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
├── bin&lt;br /&gt;
│   ├── mas&lt;br /&gt;
│   └── mas-cli -&amp;gt; /home/pacs/xyz00/users/mas/bin/mas/mas-cli # optional&lt;br /&gt;
├── doms&lt;br /&gt;
│   └── auth.matrix.domain.de&lt;br /&gt;
├── etc&lt;br /&gt;
│   └── config.yaml&lt;br /&gt;
├── readme.md&lt;br /&gt;
├── scripts&lt;br /&gt;
│   └── update.sh&lt;br /&gt;
└── var&lt;br /&gt;
    └── log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updatescript ===&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist auch schon zur Vorbereitung nützlich. Es basiert auf og. Wiki und holt sich die neueste Release und entpackt diese in bin/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ARCH=x86_64&lt;br /&gt;
OS=linux&lt;br /&gt;
VERSION=latest&lt;br /&gt;
&lt;br /&gt;
# URL to the right archive&lt;br /&gt;
URL=&amp;quot;https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -sL &amp;quot;$URL&amp;quot; | tar xzC $HOME/bin/mas&lt;br /&gt;
ln -s $HOME/bin/mas/mas-cli $HOME/bin/ # optional&lt;br /&gt;
&lt;br /&gt;
systemctl restart --user mas.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
In Sachen Konfiguration, können wir einfach den offiziellen Anweisung des Projekts folgen. Einzig die default Ports, können bei Hostsharing so nicht genutzt werden. Als Beispiel für den http web-listener könnte sich &amp;lt;code&amp;gt;32802&amp;lt;/code&amp;gt; anbieten, sofern dieser frei ist.&lt;br /&gt;
&lt;br /&gt;
=== Systemd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix Authentication Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
After=postgresql.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/bin/mas&lt;br /&gt;
ExecStart=%h/bin/mas/mas-cli server -c %h/etc/config.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# wenn alles bereit:&lt;br /&gt;
systemctl enable --now --user mas&lt;br /&gt;
# dies aktiviert den dienst für starten nach reboot und startet den dienst sofort (now)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QR Code Support in Synapse ==&lt;br /&gt;
&lt;br /&gt;
Leicht zu übersehen ist ein zu aktivierendes MSC in Synapse um QR-Code Login zu unterstützen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml&amp;gt;&lt;br /&gt;
experimental_features:&lt;br /&gt;
    msc4108_enabled: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Zum testen muss Keystorage für den User aktiv sein!&lt;br /&gt;
&lt;br /&gt;
== Apache ==&lt;br /&gt;
&lt;br /&gt;
Außerhalb der .htaccess (Hostmaster, FIXME)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# Wichtig, da sonst dieser Endpoint nicht funktioniert, und es zu verwirrenden Fehlern kommt.&lt;br /&gt;
SetEnvIf request_Uri &amp;quot;/_synapse/client/rendezvous&amp;quot; no-gzip&lt;br /&gt;
# FIXME: retry in .htaccess&lt;br /&gt;
ProxyPassMatch   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
ProxyPassReverse   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.htaccess&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32802%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7349</id>
		<title>Matrix Authentication Service</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Authentication_Service&amp;diff=7349"/>
		<updated>2025-05-12T13:50:24Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: initital commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: diese Info-Seite erfordert einen Hostmaster mit Zugriff auf die [[Apache]]-Domain-Konfigurationsdatei, mit leichter Abänderung sollte die [[.htaccess]] allerdings genauso funktionieren.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MAS beginnt die alte Authentifizierung direkt über [[Synapse]] zu ersetzen. Schon heute fällt es langsam auf, wenn der Dienst fehlt – beispielsweise weil ElementX diesen für SSO benötigt oder weil sonst der Login via QR-Code nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Offizielle Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Die offizielle Dokumentation befindet sich unter [https://element-hq.github.io/matrix-authentication-service/ element-hq.github.io/matrix-authentication-service].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung im Userspace ==&lt;br /&gt;
&lt;br /&gt;
=== Verzeichnisstruktur (Vorschlag) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
├── bin&lt;br /&gt;
│   ├── mas&lt;br /&gt;
│   └── mas-cli -&amp;gt; /home/pacs/xyz00/users/mas/bin/mas/mas-cli # optional&lt;br /&gt;
├── doms&lt;br /&gt;
│   └── auth.matrix.domain.de&lt;br /&gt;
├── etc&lt;br /&gt;
│   └── config.yaml&lt;br /&gt;
├── readme.md&lt;br /&gt;
├── scripts&lt;br /&gt;
│   └── update.sh&lt;br /&gt;
└── var&lt;br /&gt;
    └── log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updatescript ===&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist auch schon zur Vorbereitung nützlich. Es basiert auf og. Wiki und holt sich die neueste Release und entpackt diese in bin/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ARCH=x86_64&lt;br /&gt;
OS=linux&lt;br /&gt;
VERSION=latest&lt;br /&gt;
&lt;br /&gt;
# URL to the right archive&lt;br /&gt;
URL=&amp;quot;https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -sL &amp;quot;$URL&amp;quot; | tar xzC $HOME/bin/mas&lt;br /&gt;
ln -s $HOME/bin/mas/mas-cli $HOME/bin/ # optional&lt;br /&gt;
&lt;br /&gt;
systemctl restart --user mas.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
In Sachen Konfiguration, können wir einfach den offiziellen Anweisung des Projekts folgen. Einzig die default Ports, können bei Hostsharing so nicht genutzt werden. Als Beispiel für den http web-listener könnte sich &amp;lt;code&amp;gt;32802&amp;lt;/code&amp;gt; anbieten, sofern dieser frei ist.&lt;br /&gt;
&lt;br /&gt;
=== Systemd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix Authentication Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
After=postgresql.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/bin/mas&lt;br /&gt;
ExecStart=%h/bin/mas/mas-cli server -c %h/etc/config.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== QR Code Support in Synapse ==&lt;br /&gt;
&lt;br /&gt;
Leicht zu übersehen ist ein zu aktivierendes MSC in Synapse um QR-Code Login zu unterstützen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml&amp;gt;&lt;br /&gt;
experimental_features:&lt;br /&gt;
    msc4108_enabled: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Zum testen muss Keystorage für den User aktiv sein!&lt;br /&gt;
&lt;br /&gt;
== Apache ==&lt;br /&gt;
&lt;br /&gt;
Außerhalb der .htaccess (Hostmaster, FIXME)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# Wichtig, da sonst dieser Endpoint nicht funktioniert, und es zu verwirrenden Fehlern kommt.&lt;br /&gt;
SetEnvIf request_Uri &amp;quot;/_synapse/client/rendezvous&amp;quot; no-gzip&lt;br /&gt;
# FIXME: retry in .htaccess&lt;br /&gt;
ProxyPassMatch   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
ProxyPassReverse   &amp;quot;^/(_matrix/client/[^/]+/(login|logout|refresh).*)&amp;quot; &amp;quot;http://127.0.0.1:32802/$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.htaccess&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32802%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7181</id>
		<title>TLS Zertifikat mit LEGO</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7181"/>
		<updated>2024-12-09T14:28:51Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* regelmäßige Verlängerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TLS Zertifikat mit LEGO =&lt;br /&gt;
&lt;br /&gt;
Für den zentralen Apache Webserver werden bei Hostsharing automatisch TLS Zertifikate über den Dienst &amp;quot;Lets Encrypt&amp;quot; erzeugt und verlängert. Das wird über die Domain-Option &amp;quot;letsencrypt&amp;quot; gesteuert.&lt;br /&gt;
&lt;br /&gt;
Teilweise will man aber eigene Serverdienste betreiben, die nicht über HTTP hinter dem Apache-Proxy erreichbar sind. Beispiele dafür sind ein eigener XMPP Server oder ein Mumble Server. Für diese Server können die Nutzer:innen der Hostsharing Plattform sehr leicht TLS Zertifikate erzeugen, indem sie den zentral installierten LEGO-Bot nutzen.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Domain vorhanden sein, auf die das Zertifikat ausgestellt werden soll und die im Webspace über HTTP erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Ich nutze hier den Service-User &amp;quot;xyz00-mumble&amp;quot; als Beispiel. Bei diesem User sei die Domain &amp;quot;mumble.hs-example.de&amp;quot; aufgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Dann lösche ich bei der Domain die HTTP-Weiterleitungen und die www-Subdomain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
rm -rf ~/doms/mumble.hs-example.de/subs/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/subs-ssl/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs/.htaccess \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs-ssl/.htaccess &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das erste Zertifikat wird mit dem folgenden Befehl erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
/usr/bin/lego -d mumble.hs-example.de -a \&lt;br /&gt;
        --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
        --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
        --http run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei der erfolgreichen Ausführung diese Befehls wurde ein verstecktes Verzeichnis &amp;quot;.lego&amp;quot; angelegt. In diesem Verzeichnis befinden sich die Daten zum neu angelegten Letsencrypt-Account und das Zertifikat mit dem zugehörigen private key.&lt;br /&gt;
&lt;br /&gt;
Die Daten des Zertifikates kann man wie folgt auslesen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
openssl x509 -in .lego/certificates/mumble.hs-example.de.crt -noout -text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regelmäßige Verlängerung ==&lt;br /&gt;
&lt;br /&gt;
Für die automatische Verlängerung des Zertifikats können wir einen Cronjob aufsetzen, der zum Beispiel täglich oder wöchentlich läuft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ cat bin/lego-renew &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOME=/home/pacs/xyz00/users/mumble&lt;br /&gt;
/usr/bin/lego -d mumble.hs-example.de  -a \&lt;br /&gt;
  --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
  --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
  --http renew&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausführung des Skriptes wird über einen systemd timer gesteuert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.service&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=renew lego certificate&lt;br /&gt;
  &lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=php8.2 /home/pacs/xyz00/users/mumble/bin/lego-renew&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.timer&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for lego certificate&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=Thu 4:34&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user enable lego_certificate.timer&lt;br /&gt;
systemctl --user start lego_certificate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7180</id>
		<title>TLS Zertifikat mit LEGO</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7180"/>
		<updated>2024-12-09T14:27:10Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Einrichtung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TLS Zertifikat mit LEGO =&lt;br /&gt;
&lt;br /&gt;
Für den zentralen Apache Webserver werden bei Hostsharing automatisch TLS Zertifikate über den Dienst &amp;quot;Lets Encrypt&amp;quot; erzeugt und verlängert. Das wird über die Domain-Option &amp;quot;letsencrypt&amp;quot; gesteuert.&lt;br /&gt;
&lt;br /&gt;
Teilweise will man aber eigene Serverdienste betreiben, die nicht über HTTP hinter dem Apache-Proxy erreichbar sind. Beispiele dafür sind ein eigener XMPP Server oder ein Mumble Server. Für diese Server können die Nutzer:innen der Hostsharing Plattform sehr leicht TLS Zertifikate erzeugen, indem sie den zentral installierten LEGO-Bot nutzen.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Domain vorhanden sein, auf die das Zertifikat ausgestellt werden soll und die im Webspace über HTTP erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Ich nutze hier den Service-User &amp;quot;xyz00-mumble&amp;quot; als Beispiel. Bei diesem User sei die Domain &amp;quot;mumble.hs-example.de&amp;quot; aufgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Dann lösche ich bei der Domain die HTTP-Weiterleitungen und die www-Subdomain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
rm -rf ~/doms/mumble.hs-example.de/subs/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/subs-ssl/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs/.htaccess \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs-ssl/.htaccess &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das erste Zertifikat wird mit dem folgenden Befehl erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
/usr/bin/lego -d mumble.hs-example.de -a \&lt;br /&gt;
        --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
        --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
        --http run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei der erfolgreichen Ausführung diese Befehls wurde ein verstecktes Verzeichnis &amp;quot;.lego&amp;quot; angelegt. In diesem Verzeichnis befinden sich die Daten zum neu angelegten Letsencrypt-Account und das Zertifikat mit dem zugehörigen private key.&lt;br /&gt;
&lt;br /&gt;
Die Daten des Zertifikates kann man wie folgt auslesen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
openssl x509 -in .lego/certificates/mumble.hs-example.de.crt -noout -text&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regelmäßige Verlängerung ==&lt;br /&gt;
&lt;br /&gt;
Für die automatische Verlängerung des Zertifikats können wir einen Cronjob aufsetzen, der zum Beispiel täglich oder wöchentlich läuft:&lt;br /&gt;
&lt;br /&gt;
  $ cat bin/lego-renew &lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/mumble&lt;br /&gt;
  /usr/bin/lego -d mumble.hs-example.de  -a \&lt;br /&gt;
    --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
    --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
    --http renew&lt;br /&gt;
&lt;br /&gt;
Die Ausführung des Skriptes wird über einen systemd timer gesteuert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.service&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  [Unit]&lt;br /&gt;
  Description=renew lego certificate&lt;br /&gt;
    &lt;br /&gt;
  [Service]&lt;br /&gt;
  Type=oneshot&lt;br /&gt;
  ExecStart=php8.2 /home/pacs/xyz00/users/mumble/bin/lego-renew&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.timer&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  [Unit]&lt;br /&gt;
  Description=timer for lego certificate&lt;br /&gt;
  &lt;br /&gt;
  [Timer]&lt;br /&gt;
  OnCalendar=Thu 4:34&lt;br /&gt;
  Persistent=True&lt;br /&gt;
  &lt;br /&gt;
  [Install]&lt;br /&gt;
  WantedBy=timers.target&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&lt;br /&gt;
  $ systemctl --user enable lego_certificate.timer&lt;br /&gt;
  $ systemctl --user start lego_certificate.timer&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7179</id>
		<title>TLS Zertifikat mit LEGO</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7179"/>
		<updated>2024-12-09T14:26:43Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Einrichtung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= TLS Zertifikat mit LEGO =&lt;br /&gt;
&lt;br /&gt;
Für den zentralen Apache Webserver werden bei Hostsharing automatisch TLS Zertifikate über den Dienst &amp;quot;Lets Encrypt&amp;quot; erzeugt und verlängert. Das wird über die Domain-Option &amp;quot;letsencrypt&amp;quot; gesteuert.&lt;br /&gt;
&lt;br /&gt;
Teilweise will man aber eigene Serverdienste betreiben, die nicht über HTTP hinter dem Apache-Proxy erreichbar sind. Beispiele dafür sind ein eigener XMPP Server oder ein Mumble Server. Für diese Server können die Nutzer:innen der Hostsharing Plattform sehr leicht TLS Zertifikate erzeugen, indem sie den zentral installierten LEGO-Bot nutzen.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Domain vorhanden sein, auf die das Zertifikat ausgestellt werden soll und die im Webspace über HTTP erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Ich nutze hier den Service-User &amp;quot;xyz00-mumble&amp;quot; als Beispiel. Bei diesem User sei die Domain &amp;quot;mumble.hs-example.de&amp;quot; aufgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Dann lösche ich bei der Domain die HTTP-Weiterleitungen und die www-Subdomain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
rm -rf ~/doms/mumble.hs-example.de/subs/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/subs-ssl/www \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs/.htaccess \&lt;br /&gt;
         ~/doms/mumble.hs-example.de/htdocs-ssl/.htaccess &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das erste Zertifikat wird mit dem folgenden Befehl erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
/usr/bin/lego -d mumble.hs-example.de -a \&lt;br /&gt;
        --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
        --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
        --http run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Bei der erfolgreichen Ausführung diese Befehls wurde ein verstecktes Verzeichnis &amp;quot;.lego&amp;quot; angelegt. In diesem Verzeichnis befinden sich die Daten zum neu angelegten Letsencrypt-Account und das Zertifikat mit dem zugehörigen private key.&lt;br /&gt;
&lt;br /&gt;
Die Daten des Zertifikates kann man wie folgt auslesen:&lt;br /&gt;
&lt;br /&gt;
  openssl x509 -in .lego/certificates/mumble.hs-example.de.crt -noout -text&lt;br /&gt;
&lt;br /&gt;
== regelmäßige Verlängerung ==&lt;br /&gt;
&lt;br /&gt;
Für die automatische Verlängerung des Zertifikats können wir einen Cronjob aufsetzen, der zum Beispiel täglich oder wöchentlich läuft:&lt;br /&gt;
&lt;br /&gt;
  $ cat bin/lego-renew &lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/mumble&lt;br /&gt;
  /usr/bin/lego -d mumble.hs-example.de  -a \&lt;br /&gt;
    --email webmaster@mumble.hs-example.de -k ec256 \&lt;br /&gt;
    --http.webroot $HOME/doms/mumble.hs-example.de/htdocs \&lt;br /&gt;
    --http renew&lt;br /&gt;
&lt;br /&gt;
Die Ausführung des Skriptes wird über einen systemd timer gesteuert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.service&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  [Unit]&lt;br /&gt;
  Description=renew lego certificate&lt;br /&gt;
    &lt;br /&gt;
  [Service]&lt;br /&gt;
  Type=oneshot&lt;br /&gt;
  ExecStart=php8.2 /home/pacs/xyz00/users/mumble/bin/lego-renew&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/lego_certificate.timer&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  [Unit]&lt;br /&gt;
  Description=timer for lego certificate&lt;br /&gt;
  &lt;br /&gt;
  [Timer]&lt;br /&gt;
  OnCalendar=Thu 4:34&lt;br /&gt;
  Persistent=True&lt;br /&gt;
  &lt;br /&gt;
  [Install]&lt;br /&gt;
  WantedBy=timers.target&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&lt;br /&gt;
  $ systemctl --user enable lego_certificate.timer&lt;br /&gt;
  $ systemctl --user start lego_certificate.timer&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mastodon_bei_Hostsharing&amp;diff=7178</id>
		<title>Mastodon bei Hostsharing</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mastodon_bei_Hostsharing&amp;diff=7178"/>
		<updated>2024-12-09T14:22:05Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Einrichten des Apache VHost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mastodon ist ein verteilter Microblogging Dienst, der das ActivityPub-Protokoll verwendet. &lt;br /&gt;
&lt;br /&gt;
Wenn man nur wenige Nutzer oder gar nur für sich selbst einen Einstiegspunkt ins &amp;quot;Fediverse&amp;quot; schaffen will, kann sich auch die Ressourcen-schonende Alternative [[Pleroma]] anbieten.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt, wie man Mastodon auf der Managed Hosting Plattform von Hostsharing installieren kann. &lt;br /&gt;
&lt;br /&gt;
Hostsharing selbst nutzt die Hosting Plattform und betreibt zwei Mastodon Instanzen:&lt;br /&gt;
* https://geno.social&lt;br /&gt;
* https://hostsharing.coop&lt;br /&gt;
&lt;br /&gt;
Der Autor dieser Seite betreibt:&lt;br /&gt;
* https://krefeld.life&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|Für Managed Server|Ein funktionierender Mastodon-Server erfordert mehrere laufende Server-Dienste. Für den Betrieb ist ein Managed Server sinnvoll.}}&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin wird angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-mastodon&#039;&#039;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-mastodon&#039;&#039; als Domain-Administrator, zum Beispiel &#039;&#039;beispiel.social&#039;&#039;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_mastuser&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_mastdb&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_mastuser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendete IP-Ports der Server-Dienste:&lt;br /&gt;
# Redis: localhost:32002&lt;br /&gt;
# Mastodon-Web: localhost:32003&lt;br /&gt;
# Mastodon-Streaming: localhost:32004&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Redis Server ==&lt;br /&gt;
&lt;br /&gt;
Anlegen einer Datei &#039;&#039;/home/pacs/xyz00/users/mastodon/redis/etc/redis.conf&#039;&#039; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
daemonize yes&lt;br /&gt;
pidfile /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid&lt;br /&gt;
requirepass &amp;lt;hierhin-gehoert-ein-redis-passwort&amp;gt;&lt;br /&gt;
port 32002&lt;br /&gt;
tcp-backlog 128&lt;br /&gt;
bind 127.0.0.1&lt;br /&gt;
timeout 300&lt;br /&gt;
loglevel notice&lt;br /&gt;
logfile /home/pacs/xyz00/users/mastodon/redis/var/redis.log&lt;br /&gt;
databases 16&lt;br /&gt;
save 900 1&lt;br /&gt;
save 300 10&lt;br /&gt;
save 60 10000&lt;br /&gt;
slave-serve-stale-data yes&lt;br /&gt;
appendonly no&lt;br /&gt;
dbfilename dump.rdb&lt;br /&gt;
dir /home/pacs/xyz00/users/mastodon/redis/var&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation von NodeJS ==&lt;br /&gt;
&lt;br /&gt;
Als User &#039;xyz00-mastodon&#039;&#039;: Installation von &#039;&#039;nvm&#039;&#039; und &#039;&#039;nodejs&#039;&#039; (Version 20) nach der Anleitung [[NodeJS]]&lt;br /&gt;
&lt;br /&gt;
Installation von &#039;&#039;yarn&#039;&#039; mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g yarn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation von Ruby ==&lt;br /&gt;
&lt;br /&gt;
Als User &#039;&#039;xyz00-mastodon&#039;&#039;:  Installation von Ruby mit &#039;&#039;rbenv&#039;&#039; mit folgenden Befehlen:&lt;br /&gt;
&lt;br /&gt;
Zunächst &#039;&#039;rbenv&#039;&#039; and &#039;&#039;ruby-build&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/rbenv/rbenv.git ~/.rbenv&lt;br /&gt;
cd ~/.rbenv &amp;amp;&amp;amp; src/configure &amp;amp;&amp;amp; make -C src&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.rbenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
echo &#039;eval &amp;quot;$(rbenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
starte neue Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
exec bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Überprüfe rbenv-Installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
type rbenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installiere ruby-build als rbenv-Plugin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann die benötigte Ruby-Version installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rbenv install 3.2.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation der Mastodon Software ==&lt;br /&gt;
&lt;br /&gt;
Weiterhin Als User &#039;&#039;xyz00-mastodon&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
git clone https://github.com/tootsuite/mastodon.git live&lt;br /&gt;
cd ~/live&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die stabile Version auschecken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout $(git tag -l | grep -v &#039;rc[0-9]*$&#039; | sort -V | tail -n 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ruby Pakete installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gem install bundler&lt;br /&gt;
bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Node.js Pakete installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
yarn install --pure-lockfile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Mastodon Software ==&lt;br /&gt;
&lt;br /&gt;
Anlegen einer Datei &#039;&#039;/home/pacs/xyz00/users/mastodon/live/.env.production&#039;&#039; mit dem folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
REDIS_HOST=localhost&lt;br /&gt;
REDIS_PORT=32002&lt;br /&gt;
REDIS_PASSWORD=&amp;lt;hierhin-gehoert-ein-redis-passwort&amp;gt;&lt;br /&gt;
DB_HOST=localhost&lt;br /&gt;
DB_USER=xyz00_mastuser&lt;br /&gt;
DB_NAME=xyz00_mastdb&lt;br /&gt;
DB_PASS=meinPasswort&lt;br /&gt;
DB_PORT=5432&lt;br /&gt;
LOCAL_DOMAIN=beispiel.social&lt;br /&gt;
SECRET_KEY_BASE=12ab..&lt;br /&gt;
OTP_SECRET=34ef..&lt;br /&gt;
VAPID_PRIVATE_KEY=ABCD..&lt;br /&gt;
VAPID_PUBLIC_KEY=EFGH..&lt;br /&gt;
DEFAULT_LOCALE=de&lt;br /&gt;
SMTP_SERVER=localhost&lt;br /&gt;
SMTP_PORT=25&lt;br /&gt;
SMTP_FROM_ADDRESS=notifications@beispiel.social&lt;br /&gt;
SMTP_AUTH_METHOD=none&lt;br /&gt;
SMTP_OPENSSL_VERIFY_MODE=none&lt;br /&gt;
STREAMING_CLUSTER_NUM=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
RAILS_ENV=production bundle exec rake secret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Werte für VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY erzeugt das Kommando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Initialisieren der Datenbank:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export SAFETY_ASSURED=1&lt;br /&gt;
RAILS_ENV=production bundle exec rails db:schema:load&lt;br /&gt;
RAILS_ENV=production bundle exec rails db:seed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugen der Web-Resourcen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
yarn set version classic&lt;br /&gt;
RAILS_ENV=production bundle exec rails assets:precompile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Starten der Dienste  ==&lt;br /&gt;
&lt;br /&gt;
Zum Start aller notwendigen Dienste wird in dieser Anleitung &#039;&#039;systemctl&#039;&#039; benutzt.&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/redis.service&amp;lt;/code&amp;gt; kann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis User Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/var/redis&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/puma.service&amp;lt;/code&amp;gt; kann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mastodon Web Service Puma&lt;br /&gt;
After=redis.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/live&lt;br /&gt;
Environment=&amp;quot;RAILS_ENV=production&amp;quot;&lt;br /&gt;
ExecStart=%h/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:32003&lt;br /&gt;
StandardError=append:%h/var/log/puma.log&lt;br /&gt;
StandardOutput=append:%h/var/log/puma.log&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/sidekiq.service&amp;lt;/code&amp;gt; kann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mastodon Sidekiq Service&lt;br /&gt;
After=redis.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/live&lt;br /&gt;
Environment=&amp;quot;RAILS_ENV=production&amp;quot;&lt;br /&gt;
Environment=&amp;quot;DB_POOL=5&amp;quot;&lt;br /&gt;
ExecStart=%h/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q scheduler&lt;br /&gt;
StandardError=append:%h/var/log/sidekiq.log&lt;br /&gt;
StandardOutput=append:%h/var/log/sidekiq.log&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/streaming.service&amp;lt;/code&amp;gt; kann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mastodon Streaming Service&lt;br /&gt;
After=redis.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/live&lt;br /&gt;
Environment=&amp;quot;NVM_DIR=%h/.nvm&amp;quot;&lt;br /&gt;
Environment=&amp;quot;NVM_BIN=%h/.nvm/versions/node/v20.14.0/bin&amp;quot;&lt;br /&gt;
Environment=&amp;quot;NODE_ENV=production&amp;quot;&lt;br /&gt;
Environment=&amp;quot;PORT=32004&amp;quot;&lt;br /&gt;
Environment=&amp;quot;BIND=127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ExecStart=%h/.nvm/versions/node/v20.14.0/bin/node streaming/index.js&lt;br /&gt;
StandardError=append:%h/var/log/streaming.log&lt;br /&gt;
StandardOutput=append:%h/var/log/streaming.log&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dienste werden dann aktiviert und gestartet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
systemctl --user enable redis --now&lt;br /&gt;
systemctl --user enable puma --now&lt;br /&gt;
systemctl --user enable streaming --now&lt;br /&gt;
systemctl --user enable sidekiq --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichten des Apache VHost ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd ~/doms/beispiel.social&lt;br /&gt;
rm -rf htdocs-ssl subs/www subs-ssl/www&lt;br /&gt;
ln -s ~/live/public htdocs-ssl&lt;br /&gt;
touch htdocs-ssl/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die &#039;&#039;htdocs-ssl/.htaccess&#039;&#039; mit dem Editor der Wahl öffnen und &lt;br /&gt;
folgende Konfiguration einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/api/v1/streaming    [NC]&lt;br /&gt;
RewriteRule .* ws://localhost:32004%{REQUEST_URI}  [proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32003%{REQUEST_URI} [proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Systemd Timer ==&lt;br /&gt;
&lt;br /&gt;
Mit einem systemd Timer werden alte Ressourcen aufgeräumt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/mastodon_cleanup.env&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
HOME=/home/pacs/xyz00/users/mastodon&lt;br /&gt;
MAILTO=mastodon@beispiel.social&lt;br /&gt;
RAILS_ENV=production&lt;br /&gt;
NUM_DAYS=31&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/mastodon_cleanup.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail from remote server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/home/pacs/xyz00/users/mastodon/.config/systemd/user/mastodon_cleanup.env&lt;br /&gt;
WoringDirectory=/home/pacs/xyz00/users/mastodon/live&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/mastodon/live/bin/tootctl media remove&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/mastodon_cleanup.timer&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail every five minutes&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=4:18&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable mastodon_cleanup.timer&lt;br /&gt;
$ systemctl --user start mastodon_cleanupl.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
In der installierten Version gibt es noch keine Volltextsuche. Es kann lediglich nach Nutzerkennungen und Hastags gesucht werden. Für die Volltextsuche kann optional Elasticsearch installiert werden.&lt;br /&gt;
&lt;br /&gt;
* [[Elasticsearch]] bei Hostsharing&lt;br /&gt;
* https://docs.joinmastodon.org/admin/optional/elasticsearch/&lt;br /&gt;
&lt;br /&gt;
== Instanz einrichten ==&lt;br /&gt;
Nach der Installation kann man sich auf https://beispiel.social einen Benutzer einrichten.&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
RAILS_ENV=production bin/tootctl accounts create \&lt;br /&gt;
  alice \&lt;br /&gt;
  --email alice@example.com \&lt;br /&gt;
  --confirmed \&lt;br /&gt;
  --role Admin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Einrichtung sollte vorgenommen werden, z.B. eine Beschreibung der Instanz hinterlegen, siehe https://docs.joinmastodon.org/admin/setup/&lt;br /&gt;
&lt;br /&gt;
== Mastodon Updates ==&lt;br /&gt;
&lt;br /&gt;
siehe:&lt;br /&gt;
* https://github.com/tootsuite/mastodon/releases&lt;br /&gt;
&lt;br /&gt;
(hier für das Update auf die Mastodon Version v4.2.9 mit Ruby 3.2.3)&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/.rbenv&lt;br /&gt;
git pull&lt;br /&gt;
cd ~/.rbenv/plugins/ruby-build&lt;br /&gt;
git pull&lt;br /&gt;
cd&lt;br /&gt;
rbenv install -l&lt;br /&gt;
rbenv install 3.2.3&lt;br /&gt;
rbenv global 3.2.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mastodon ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/mastodon/live&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout v4.2.9&lt;br /&gt;
gem update --system&lt;br /&gt;
bundle install&lt;br /&gt;
yarn install&lt;br /&gt;
RAILS_ENV=production bundle exec rails db:migrate&lt;br /&gt;
yarn set version classic&lt;br /&gt;
RAILS_ENV=production bundle exec rails assets:precompile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart Mastodon!&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://joinmastodon.org/ Offizielle Webseite von Mastodon]&lt;br /&gt;
* im Archiv: https://github.com/mastodon/documentation/blob/archive/Running-Mastodon/Production-guide.md&lt;br /&gt;
* aktuell: https://docs.joinmastodon.org/admin/install/&lt;br /&gt;
* https://krinetzki.de/2017/04/installation-von-mastodon-auf-debian-8-jessie/&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mastodon Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Fediverse]]&lt;br /&gt;
[[Kategorie:Activitypub]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7177</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7177"/>
		<updated>2024-12-09T14:18:54Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Volltextsuche */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss für Redis als eigener Serverdienst RAM gebucht werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;Arbeitsspeicher für eigene Serverdienste&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit systemd-Timern werden die Logdateien täglich rotiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate log files&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=php8.2 /home/pacs/xyz00/users/cloud/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:1&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable logrotate.timer&lt;br /&gt;
$ systemctl --user start logrotate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren Timer für die regelmäßigen Hintergrundaufgaben von Nextcloud lässt sie sich noch etwas beschleunigen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/nextcloud_background.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=php8.2 /home/pacs/xyz00/users/cloud/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/nextcloud_background.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable nextcloud_background.timer&lt;br /&gt;
$ systemctl --user start nextcloud_background.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* eine zusätzliche (Sub)domain im gleichen User ist nötig. Andernfalls muss die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.example.com/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen (letzteres kann bei Updates überschrieben werden!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;php occ notify_push:setup https://push.cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;br /&gt;
[[Kategorie:Nextcloud]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7176</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7176"/>
		<updated>2024-12-09T14:17:48Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Vorbereitungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss für Redis als eigener Serverdienst RAM gebucht werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;Arbeitsspeicher für eigene Serverdienste&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit systemd-Timern werden die Logdateien täglich rotiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate log files&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=php8.2 /home/pacs/xyz00/users/cloud/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:1&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable logrotate.timer&lt;br /&gt;
$ systemctl --user start logrotate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren Timer für die regelmäßigen Hintergrundaufgaben von Nextcloud lässt sie sich noch etwas beschleunigen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/nextcloud_background.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=php8.2 /home/pacs/xyz00/users/cloud/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/nextcloud_background.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable nextcloud_background.timer&lt;br /&gt;
$ systemctl --user start nextcloud_background.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* eine zusätzliche (Sub)domain im gleichen User ist nötig. Andernfalls muss die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.example.com/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen (letzteres kann bei Updates überschrieben werden!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;php occ notify_push:setup https://push.cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;br /&gt;
[[Kategorie:Nextcloud]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7044</id>
		<title>Matrix Synapse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7044"/>
		<updated>2024-11-18T18:28:57Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Sliding Sync Proxy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Matrix Server &#039;&#039;Synapse&#039;&#039;, der sogenannte &#039;Homeserver&#039;, ist aktuell die einzige vollständige serverseitige Implementierung des Matrix-Protokolls.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|Work in Progress|Leider funktioniert die Server-zu-Server-Kommunikation von Synapse hinter dem Apache-Proxy mit den genannten Rewrite-Rules nicht. Bitten Sie dazu den Service, Ihren Apache VHost individuell für den Matrix Server anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
Synapse wird bei Hostsharing als &#039;&#039;eigener Daemon&#039;&#039; betrieben. Der Betrieb ist im Shared Hosting anmelde- und kostenpflichtig. Daher empfehlen wir für den Betrieb einen &#039;&#039;Managed Server&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt, wie man den Matrix-Homeserver Synapse auf der Managed Hosting Plattform von Hostsharing installieren kann. Dabei sind die User-IDs nach dem Schema @user:beispiel.de aufgebaut, der Homeserver an sich ist unter matrix.beispiel.de erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-matrix&#039;&#039;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-matrix&#039;&#039; als Domain-Administrator, zum Beispiel &#039;&#039;matrix.beispiel.de&#039;&#039;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_matrixuser&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_matrixdb&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_matrixuser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendeter IP-Port für den Server-Dienst:&lt;br /&gt;
# Synapse: localhost:32801&lt;br /&gt;
&lt;br /&gt;
== Installation von Synapse ==&lt;br /&gt;
&lt;br /&gt;
Installationsanleitung basierend auf https://matrix-org.github.io/synapse/latest/setup/installation.html#installing-as-a-python-module-from-pypi&lt;br /&gt;
&lt;br /&gt;
Auf Debian Buster muss ein neueres Python, z.B. Python 3.9 installiert werden, siehe [https://wiki.hostsharing.net/index.php?title=Eigenes_Python_installieren#Installation_mit_pyenv Eigenes Python mit pyenv installieren].&lt;br /&gt;
&lt;br /&gt;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv mit Python 3.9 erstellen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/synapse&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv install --python 3.9.18&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse und Postgres-Dependencies installieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv shell&lt;br /&gt;
pipenv install matrix-synapse[postgres]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Initiale Konfiguration mit richtigem server-name &amp;quot;beispiel.de&amp;quot; generieren, außerdem im laufenden Betrieb keine Statistiken an Matrix.org senden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv run python -m synapse.app.homeserver --server-name beispiel.de --config-path homeserver.yaml --generate-config --report-stats=no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration von Synapse ==&lt;br /&gt;
&lt;br /&gt;
In die initial generierte Konfiguration muss noch die Port- und Datenbank-Konfiguration eingetragen werden:&lt;br /&gt;
&lt;br /&gt;
Port: Innerhalb der listener-section den Port 8008 auf 32801 (wie initial definiert) ändern, alles andere beibehalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
- port: 32801&lt;br /&gt;
    tls: false&lt;br /&gt;
    bind_addresses: [&#039;::1&#039;, &#039;127.0.0.1&#039;]&lt;br /&gt;
    type: http&lt;br /&gt;
    x_forwarded: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Postgres-Datenbank:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
database:&lt;br /&gt;
    # The database engine name&lt;br /&gt;
    name: &amp;quot;psycopg2&amp;quot;&lt;br /&gt;
    # Arguments to pass to the engine&lt;br /&gt;
    args:&lt;br /&gt;
    host: &amp;quot;localhost&amp;quot;&lt;br /&gt;
    database: &amp;quot;xyz00_matrixdb&amp;quot;&lt;br /&gt;
    user: &amp;quot;xyz00_matrixuser&amp;quot;&lt;br /&gt;
    password: &amp;quot;meinPasswort&amp;quot;&lt;br /&gt;
    cp_min: 5&lt;br /&gt;
    cp_max: 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Starten der Dienste  ==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;Synapse&#039;&#039;-Dienst wird hier als Service-Unit im SystemD des Users eingetragen.&lt;br /&gt;
&lt;br /&gt;
Lege dazu die folgende Datei an: &#039;&#039;~/.config/systemd/user/synapse.service&#039;&#039; mit dem Inhalt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Synapse&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/synapse&lt;br /&gt;
Environment=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2&lt;br /&gt;
ExecStart=pipenv run python -m synapse.app.homeserver --config-path=%h/synapse/homeserver.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Aufruf der folgenden Kommandos wird der Dienst aktiviert und gestartet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; lines&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable synapse.service&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Einrichten des Apache VHost ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;~/doms/matrix.beispiel.de/.htaccess&#039;&#039; mit dem Editor der Wahl öffnen und &lt;br /&gt;
folgende Konfiguration einfügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32801%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Well-Known unter beispiel.de ==&lt;br /&gt;
&lt;br /&gt;
Damit die User-Accounts das Format @user:beispiel.de haben, der Server aber unter matrix.beispiel.de erreichbar ist, müssen noch folgende zwei Dateien unter der Domain beispiel.de abgelegt werden:&lt;br /&gt;
&lt;br /&gt;
https://beispiel.de/.well-known/matrix/server&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;m.server&amp;quot;: &amp;quot;matrix.beispiel.de:443&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://beispiel.de/.well-known/matrix/client&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;m.homeserver&amp;quot;: {&lt;br /&gt;
        &amp;quot;base_url&amp;quot;: &amp;quot;https://matrix.beispiel.de&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;m.identity_server&amp;quot;: {&lt;br /&gt;
        &amp;quot;base_url&amp;quot;: &amp;quot;https://vector.im&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die muss noch der CORS-Header Access-Control-Allow-Origin &amp;quot;*&amp;quot; gesetzt werden, damit die Datei aus beliebigem Riot-Web im Browser abrufbar ist. Dazu in den Ordner .well-known/matrix/ folgende .htaccess anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
  Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation dazu findet man unter https://matrix.org/docs/spec/server_server/r0.1.2#get-well-known-matrix-server und https://matrix.org/docs/spec/client_server/r0.5.0#get-well-known-matrix-client&lt;br /&gt;
&lt;br /&gt;
== Update von Synapse ==&lt;br /&gt;
&lt;br /&gt;
mit pipenv:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
source .venv/bin/activate || pipenv shell&lt;br /&gt;
pipenv install update&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder falls Synapse mit pip verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
source venv/bin/activate&lt;br /&gt;
pip freeze &amp;gt; requirements.txt&lt;br /&gt;
sed -i &amp;quot;s/==.*//g&amp;quot; requirements.txt&lt;br /&gt;
pip install -r requirements.txt --upgrade&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falls Monit verwendet wird statt systemctl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit stop synapse&lt;br /&gt;
#... updaten ...&lt;br /&gt;
monit start synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Föderation für den Synapse Server aktiviert ist, kann mit dem [https://federationtester.matrix.org/ Matrix Federation Tester] die eigene Instanz auf die laufende Version geprüft werden. Als Server nicht matrix.example.org eingeben, sondern den öffentlichen Namen, wo auch die Benutzernamen drauf laufen, z.B. example.org&lt;br /&gt;
&lt;br /&gt;
Ansonsten ist die laufende Version auch über die URL https://matrix.example.org/_synapse/admin/v1/server_version zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== Element-Web ==&lt;br /&gt;
&lt;br /&gt;
Element-Web ist aus Server-Seite eine rein statische html+javascript-Kombination, daher:&lt;br /&gt;
&lt;br /&gt;
* Account und Domain anlegen (separat von der Synapse-Domain)&lt;br /&gt;
* [https://github.com/element-hq/element-web/releases/latest aktuelles element-web release] .tgz herunterladen&lt;br /&gt;
* Symlink von htdocs-ssl auf entpacktes element-web-Verzeichnis&lt;br /&gt;
* config.sample.json in config.json kopieren und Matrix-Homeserver-Einträge anpassen&lt;br /&gt;
* Piwik aus config.json entfernen&lt;br /&gt;
&lt;br /&gt;
== SAML mit Synapse ==&lt;br /&gt;
&lt;br /&gt;
Synapse unterstützt mit Version 1.1.0 SAML. Dazu wie folgt vorgehen:&lt;br /&gt;
&lt;br /&gt;
Das Paket xmlsec1 muss installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ xmlsec1  --version&lt;br /&gt;
xmlsec1 1.2.23 (openssl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Python-Paket pysaml2 installieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv shell&lt;br /&gt;
pipenv install pysaml2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der homeserver.yaml die SAML-Direktiven einkommentieren, hier mit dem Beispiel eines SAML IdP unter https://login.beispiel.de/simplesaml/saml2/idp/metadata.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# Once SAML support is enabled, a metadata file will be exposed at&lt;br /&gt;
# https://&amp;lt;server&amp;gt;:&amp;lt;port&amp;gt;/_matrix/saml2/metadata.xml, which you may be able to &lt;br /&gt;
# use to configure your SAML IdP with. Alternatively, you can manually configure&lt;br /&gt;
# the IdP to use an ACS location of&lt;br /&gt;
# https://&amp;lt;server&amp;gt;:&amp;lt;port&amp;gt;/_matrix/saml2/authn_response.&lt;br /&gt;
#&lt;br /&gt;
saml2_config:&lt;br /&gt;
    sp_config:&lt;br /&gt;
        # point this to the IdP&#039;s metadata. You can use either a local file or&lt;br /&gt;
        # (preferably) a URL.&lt;br /&gt;
        metadata:&lt;br /&gt;
        #local: [&amp;quot;saml2/idp.xml&amp;quot;]&lt;br /&gt;
        remote:&lt;br /&gt;
            - url: https://login.beispiel.de/simplesaml/saml2/idp/metadata.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wichtig ist außerdem, dass die public_baseurl in der homeserver.yaml gesetzt ist, damit Synapse weiß, wie es erreichbar ist und dies in seine SP-Metadaten einbauen kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
public_baseurl: https://matrix.beispiel.de/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Service-Provider-Konfiguration als XML bekommt man von Synapse dann wie schon in der homeserver.yaml als Kommentar beschrieben, unter https://matrix.beispiel.de/_matrix/saml2/metadata.xml&lt;br /&gt;
&lt;br /&gt;
Diese dann in den SAML-IdP-importieren und dann sollte der Single-Sign-On via SAML funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Federation Sender Worker für Synapse ==&lt;br /&gt;
&lt;br /&gt;
Zur Parallelisierung bietet Synapse das Konzept &amp;quot;Worker&amp;quot; an, die spezifische Aufgaben übernehmen, damit der Hauptprozess diese nicht durchführen muss.&lt;br /&gt;
&lt;br /&gt;
Details dazu: https://github.com/matrix-org/synapse/blob/master/docs/workers.md&lt;br /&gt;
&lt;br /&gt;
Ein einfach einzurichtender Worker, der auch viel Last abfedert, ist der Federation Sender Worker, da das Verschicken des Federation-Traffics 10-50% der Serverlast ausmacht.&lt;br /&gt;
&lt;br /&gt;
In der homeserver.yaml die Worker-Konfiguration aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
## Worker ##&lt;br /&gt;
worker_app: synapse.app.homeserver&lt;br /&gt;
daemonize: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und dazugehörige Listener (Abschnitt listener:) aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# The TCP replication port&lt;br /&gt;
- port: 32892&lt;br /&gt;
  bind_address: &#039;127.0.0.1&#039;&lt;br /&gt;
  type: replication&lt;br /&gt;
# The HTTP replication port&lt;br /&gt;
- port: 32893&lt;br /&gt;
  bind_address: &#039;127.0.0.1&#039;&lt;br /&gt;
  type: http&lt;br /&gt;
  resources:&lt;br /&gt;
   - names: [replication]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen, die Worker machen sollen, in der homeserver.yaml deaktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# disable federation sending here, use worker for it&lt;br /&gt;
send_federation: False&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann Verzeichnis synapse/workers anlegen, darin federation_sender.yaml:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
worker_app: synapse.app.federation_sender&lt;br /&gt;
&lt;br /&gt;
# The replication listener on the synapse to talk to.&lt;br /&gt;
worker_replication_host: 127.0.0.1&lt;br /&gt;
worker_replication_port: 32892&lt;br /&gt;
worker_replication_http_port: 32893&lt;br /&gt;
&lt;br /&gt;
worker_daemonize: True&lt;br /&gt;
worker_pid_file: /home/pacs/xyz00/users/matrix/synapse/federation_sender.pid&lt;br /&gt;
worker_log_config: /home/pacs/xyz00/users/matrix/synapse/federation_sender.log.config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
.monitrc um worker erweitern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process federation_sender with pidfile /home/pacs/xyz00/users/matrix/synapse/federation_sender.pid&lt;br /&gt;
    start program &amp;quot;/bin/bash -c &#039;export VIRTUAL_ENV=$HOME/synapse/env &amp;amp;&amp;amp; export PATH=$VIRTUAL_ENV/bin:$PATH &amp;amp;&amp;amp; cd $HOME/synapse &amp;amp;&amp;amp; synctl -w workers/federation_sender.yaml start&#039;&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat $HOME/synapse/federation_sender.pid )&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Monit neu laden und synapse und federation_sender neustarten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit reload&lt;br /&gt;
monit restart all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach Updates ebenfalls immer Hauptprozess und alle Worker neustarten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit restart all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sliding Sync Proxy ==&lt;br /&gt;
Zum Zeitpunkt dieser Anleitung werden aktiv neue Element Anwendungen (Element X) und ein neues Syncverfahren entwickelt um Matrix performanter und weniger ressourcenhungrig zu machen. Bei stärkerer Matrix Nutzung können die neuen Anwendungen besonders mobil schon eine große Entlastung sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Ende 2024 wurden grundlegende Funktionen direkt in Synapse implementiert. Der Proxy wird nicht länger weiterentwickelt und sollte deinstalliert werden (nicht vergessen die .well-known zurück zu ändern).&amp;lt;/strong&amp;gt; Auch der 3rdparty Server [[Conduit]] bringt nativ Support für Sliding Sync.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* https://matrix.org/docs/projects/server/synapse &lt;br /&gt;
* https://github.com/element-hq/synapse&lt;br /&gt;
* https://github.com/element-hq/synapse/blob/master/INSTALL.md&lt;br /&gt;
* https://github.com/matrix-org/sliding-sync&lt;br /&gt;
* https://matrix.org/docs/spec/&lt;br /&gt;
* https://www.hostsharing.net/loesungen/matrix/&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/synapse&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/element&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=6977</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=6977"/>
		<updated>2024-10-14T10:41:40Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]][[Kategorie:E-Mail]]&lt;br /&gt;
= DomainKeys Identified Mail (DKIM) =&lt;br /&gt;
&lt;br /&gt;
DKIM ist ein Verfahren, dass die Authentizität einer E-Mail sicherstellen kann. Dazu wird die E-Mail auf dem sendenden System mit einer elektronischen Signatur in den unsichtbaren Headerzeilen der E-Mail versehen. Es kommt ein asymmetrisches Schlüsselverfahren zum Einsatz. Der sendende Server verwendet seinen privaten Schlüssel, um die Signatur zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Der öffentliche Schlüssel wird im DNS der E-Mail-Domain veröffentlicht, so dass Empfänger die Authentizität der Signatur prüfen können.&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Hostsharing aktivieren ==&lt;br /&gt;
&lt;br /&gt;
Die Nutzer der Hostsharing-Plattform können E-Mails, die sie über die Hostsharing-Server versenden, mit einer DKIM Signatur versehen lassen. Dazu sind zwei Voraussetzungen notwendig:&lt;br /&gt;
&lt;br /&gt;
# Die Veröffentlichung des öffentlichen Domainkey im DNS der eigenen E-Mail-Domain.&lt;br /&gt;
# Das Setzen der Domain-Option &amp;quot;Domain Key – DKIM&amp;quot; mit Hilfe von HSAdmin.&lt;br /&gt;
&lt;br /&gt;
=== Domainkey im DNS ===&lt;br /&gt;
&lt;br /&gt;
==== Wenn ein individuell angepasstes Zonefile existiert ====&lt;br /&gt;
&lt;br /&gt;
Wenn das Zonefile individuell angepasst wurde, muss es entweder den Platzhalter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{DEFAULT_ZONEFILE}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder den Platzhalter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{DKIM_RR}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enthalten.&lt;br /&gt;
&lt;br /&gt;
Wenn das nicht der Fall ist, muss eine der beiden Zeilen ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Wenn das Zonefile nicht verändert wurde ====&lt;br /&gt;
&lt;br /&gt;
Wenn kein Zonefile im etc-Verzeichnis der Domain vorhanden ist, bedeutet dies, dass das Default-Zonefile mit der Zeile &amp;quot;&amp;lt;code&amp;gt;{DEFAULT_ZONEFILE}&amp;lt;/code&amp;gt;&amp;quot; genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Die Veröffentlichung ddes Domainkeys ist dann mit einem einfachen &amp;quot;touch&amp;quot;-Befehl möglich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch doms/hs-example.de/etc/pri.hs-example.de &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraufhin erstellt das System automatisch einen Domain-Key und veröffentlicht ihn.&lt;br /&gt;
Etwa drei Minuten nach dem &amp;quot;touch&amp;quot; liefert der Befehl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t TXT +short default._domainkey.hs-example.de @dns1.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(&amp;quot;hs-example.de&amp;quot; durch die eigene Domain ersetzen) &lt;br /&gt;
&lt;br /&gt;
einen Schlüssel in der Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
v=DKIM1; h=sha256; k=rsa; s=email; &amp;quot; &amp;quot;p=MIIBIjAN [...]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Domainoption DKIM ===&lt;br /&gt;
&lt;br /&gt;
Über die Domainoption &amp;quot;Domain Key – DKIM&amp;quot; wird gesteuert, dass der SMTP-Server, auf dem der Webspace mit der Domain liegt, die ausgehenden E-Mail mit einer DKIM-Signatur ausstattet.&lt;br /&gt;
&lt;br /&gt;
Zum Anpassen der Domainoptionen wählt man in HSAdmin links den Punkt &amp;quot;Web-Paket&amp;quot; und im rechten Bereich im Menü die Auswahl &amp;quot;Domain&amp;quot;. Bei Domains, die ab 3. September 2021 eingerichtet wurden, ist die Domainoption per Voreinstellung gesetzt,&lt;br /&gt;
&lt;br /&gt;
[[Datei:dkim-domain.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:dkim-option.png]]&lt;br /&gt;
&lt;br /&gt;
== DKIM deaktivieren ==&lt;br /&gt;
&lt;br /&gt;
Das Abstellen der DKIM-Option in folgender Reihenfolge wird funktionieren:&lt;br /&gt;
&lt;br /&gt;
# Die Domainoption deaktivieren&lt;br /&gt;
# Abwarten bis alle mit der Option (und damit mit einer Signatur) versendeten E-Mail zugestellt sind&lt;br /&gt;
# Den Domainkey im DNS entfernen&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Google ==&lt;br /&gt;
&lt;br /&gt;
Die Server von &#039;&#039;gmail&#039;&#039; sind so eingestellt, dass E-Mails von Domains ohne DKIM oder SPF nicht zugestellt werden. Die Empfängerseite wird nicht informiert. An die Absenderseite geht eine Fehlermeldung in der Art:&lt;br /&gt;
&amp;lt;Blockquote&amp;gt;... host gmail-smtp-in.l.google.com[2a00:1450:4010:c0f::1a] said: 550-5.7.26 Your email has been blocked because the sender is unauthenticated. 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM. 550-5.7.26  550-5.7.26  Authentication results: 550-5.7.26  DKIM = did not pass 550-5.7.26 ...&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Dieser Google-Support-Artikel: [https://support.google.com/a/answer/81126 Richtlinien für E-Mail-Absender] (abgerufen am 26. Mai 2024) soll das erläutern.&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreicher Umstellung findet sich im Header einer E-Mail in Googles Posteingang Text in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;Authentication-Results: mx.google.com;&lt;br /&gt;
dkim=pass ...&lt;br /&gt;
spf=pass ...&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://de.wikipedia.org/wiki/DomainKeys DKIM Artikel der Wikipedia]&lt;br /&gt;
* [https://www.hostsharing.net/doc/managed-operations-platform/zonefile/ Hostsharing-Dokumentation zur Anpassung des Zonefile]&lt;br /&gt;
* [https://www.hostsharing.net/doc/managed-operations-platform/domain/#kap-domain-optionen Hostsharing-Dokumentation Domain-Optionen]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=LLDAP&amp;diff=6976</id>
		<title>LLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=LLDAP&amp;diff=6976"/>
		<updated>2024-10-14T10:38:24Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LDAP Kontoverwaltung mit LLDAP ==&lt;br /&gt;
&lt;br /&gt;
LLDAP ist ein LDAP Server, der in der Programmiersprache Rust implementiert ist. LLDAP verwendet eine relationale Datenbank zum Speichern der Accounts und Gruppen. LLDAP läßt sich als eigener Daemon betreiben. Er bringt ein einfaches Webfrontend für die Verwaltung der Konten und Gruppen und eine Funktion zum Passwort-Rücksetzen mit.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden im ersten Schritt ein Service-User, eine Domain und ein PostgreSQL-User mit PostgreSQL-Datenbank angelegt. Der Service-User heißt im folgenden &amp;quot;&#039;&#039;xyz00-lldap&#039;&#039;&amp;quot;, die Domain &amp;quot;&#039;&#039;account.hs-example.de&#039;&#039;&amp;quot;, PostgreSQL-User und -Datenbank heißen beide &amp;quot;&#039;&#039;xyz00_lldap&#039;&#039;&amp;quot;. Das PostgreSQL-Passwort sei &amp;quot;&#039;&#039;pg_password_99&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Download und entpacken ===&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version von LLDAP ist v0.5.0.&lt;br /&gt;
&lt;br /&gt;
Ich melde mich als User &amp;quot;&#039;&#039;xyz00-lldap&#039;&#039;&amp;quot; und lade das Binärpaket mit wget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://github.com/lldap/lldap/releases/download/v0.5.0/amd64-lldap.tar.gz&lt;br /&gt;
tar xzf amd64-lldap.tar.gz&lt;br /&gt;
mv amd64-lldap lldap &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration erfolgt über eine Datei &amp;quot;&#039;&#039;lldap_config.toml&#039;&#039;&amp;quot; im Verzeichnis &amp;quot;&#039;&#039;~/lldap&#039;&#039;&amp;quot;. die Datei erstelle ich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/lldap&lt;br /&gt;
touch lldap_config.toml&lt;br /&gt;
vim lldap_config.toml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
der Inhalt nach dem Bearbeiten ist zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
verbose=true&lt;br /&gt;
ldap_host = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
ldap_port = 33891&lt;br /&gt;
http_host = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
http_port= 33881&lt;br /&gt;
http_url = &amp;quot;https://account.hs-example.de&amp;quot;&lt;br /&gt;
jwt_secret = &amp;quot;generierte-zufallszeichenkett-als-secret&amp;quot;&lt;br /&gt;
ldap_base_dn = &amp;quot;dc=hs-example,dc=de&amp;quot;&lt;br /&gt;
ldap_user_dn = &amp;quot;admin&amp;quot;&lt;br /&gt;
ldap_user_email = &amp;quot;webmaster@hs-example.de&amp;quot;&lt;br /&gt;
ldap_user_pass = &amp;quot;ldap-admin-password-generieren&amp;quot;&lt;br /&gt;
force_ldap_user_pass_reset = false&lt;br /&gt;
database_url = &amp;quot;postgres://xyz00_lldap:pg_password_99@localhost/xyz00_lldap&amp;quot;&lt;br /&gt;
key_seed = &amp;quot;generierte-zufallszeichenkette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[smtp_options]&lt;br /&gt;
enable_password_reset = true&lt;br /&gt;
server = &amp;quot;localhost&amp;quot;&lt;br /&gt;
port = 4025&lt;br /&gt;
smtp_encryption = &amp;quot;NONE&amp;quot;&lt;br /&gt;
from=&amp;quot;LLDAP Admin &amp;lt;webmaster@hs-example.de&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[ldaps_options]&lt;br /&gt;
enabled = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollten folgende Einstellungen angepasst werden:&lt;br /&gt;
* die Ports für LDAP und HTTP&lt;br /&gt;
* Die Domain &amp;quot;&#039;&#039;hs-example.de&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;account.hs-example.de&#039;&#039;&amp;quot;&lt;br /&gt;
* Der Account-Präfix &amp;quot;&#039;&#039;xyz00&#039;&#039;&amp;quot;&lt;br /&gt;
* Die Passworte und Secret-Zeichenketten&lt;br /&gt;
* &amp;quot;&#039;&#039;verbose&#039;&#039;&amp;quot; soltle auf &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot; geändert werden, wenn alles läuft.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen der Datenbank-Tabellen erfolgt und ein ersten Start des Servers erfolgt mit den Befehlen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/lldap&lt;br /&gt;
./lldap create_schema&lt;br /&gt;
./lldap run&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Proxy-Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf das Admin-Frontend über den Browser konfiguriere ich die Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/account.hs-example.de&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/lldap/app htdocs-ssl&lt;br /&gt;
touch htdocs-ssl/.htaccess&lt;br /&gt;
vim htdocs-ssl/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:33881%{REQUEST_URI} [proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Port 33881 wie in der Konfig-Datei anpassen!&lt;br /&gt;
&lt;br /&gt;
=== LLDAP als Service einrichten ===&lt;br /&gt;
&lt;br /&gt;
LLDAP soll als Service unter Kontrolle von SystemD laufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
mkdir var&lt;br /&gt;
vim .config/systemd/user/lldap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=LLDAP Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/lldap&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=%h/lldap/lldap run&lt;br /&gt;
StandardOutput=file:%h/var/lldap.log&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktivieren und Starten des Dienstes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable lldap.service&lt;br /&gt;
systemctl --user start lldap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn alles gut gegangen ist, kann mann sich als &amp;quot;&#039;&#039;admin&#039;&#039;&amp;quot; mit dem Passwort aus der Zeile &amp;quot;&#039;&#039;ldap_user_pass&#039;&#039;&amp;quot; unter https://account.hs-exampel.de anmelden.&lt;br /&gt;
&lt;br /&gt;
=== weitere Verbesserungen ===&lt;br /&gt;
&lt;br /&gt;
Bisher ging es darum, schnell einen LDAP-Dienst aufzusetzen. Leider lädt die fertig kompilierte Distribution, die wir hier benutzt haben, ihre Fonts, das CSS und JavaScript aus CDN-Netzwerken und von Google Servern. Das wollte ihr vermutlich nicht. Ich habe dazu den folgenden Issue im Github-Tracker gefunden: https://github.com/lldap/lldap/issues/93 Wenn ich richtig verstehe, kann man selbst eine Distribution erstellen, die die entsprechenden Ressourcen lokal hostet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/lldap/lldap Github Projekt LLDAP]&lt;br /&gt;
* [https://github.com/lldap/lldap/tree/main?tab=readme-ov-file#client-configuration Client-Konfigurationsbeispiele]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=6936</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=6936"/>
		<updated>2024-08-30T13:26:18Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Textkasten|gelb|Für Managed Server|Ein funktionierender Discourse-Server erfordert mehrere laufende Server-Dienste. Für den Betrieb ist ein Managed Server sinnvoll.}}&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|rot|Support von der Discourse-Community|Die Discourse-Entwickler haben sich entschieden, nur eine mehr oder weniger genormte Installationsmethode (via docker) zu unterstützen. Dies ist so auf der hostsharing-Architektur aufgrund mehrerer Bedenken und Überlegungen nicht möglich. Die Community ist durchaus hilfreich, geht aber davon aus, dass quasi alle Nutzer* eine &amp;quot;supported&amp;quot;e Installation durchgeführt haben. Wenn man in entsprechenden Kanälen nach Hilfe fragt, sollte man unbedingt erwähnen, dass man discourse selber anhand dieser hier lesbaren Anleitung installiert hat, um bereits entsprechenden Kommentaren und Nachfragen vorzugreifen.}}&lt;br /&gt;
&lt;br /&gt;
== Über ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel wird die Installation von discourse, Version 2.1.0 (September 2018) beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin wird angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-discourse&#039;&#039;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-discourse&#039; als Domain-Administrator, zum Beispiel &#039;&#039;beispiel.discussion&#039;&#039;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_discourseuser&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_discoursedb&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_discourseuser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendete IP-Ports der Server-Dienste:&lt;br /&gt;
# Redis: localhost:32002&lt;br /&gt;
# Discourse-Web: localhost:13000&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der PostgreSQL Datenbank ==&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|PostgreSQL Extensions|Die PostgreSQL-Datenbank braucht die extensions &amp;lt;code&amp;gt;hstore&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_trgm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;unaccent&amp;lt;/code&amp;gt;. Diese müssen vom hostsharing-support installiert werden.}}&lt;br /&gt;
&lt;br /&gt;
Ansonsten liefe die Erstellung der Datenbank so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql line&amp;gt;&lt;br /&gt;
# su - postgres -c psql&lt;br /&gt;
CREATE DATABASE discourse;&lt;br /&gt;
CREATE USER discourse;&lt;br /&gt;
ALTER USER discourse WITH ENCRYPTED PASSWORD &#039;password&#039;;&lt;br /&gt;
ALTER DATABASE discourse OWNER TO discourse;&lt;br /&gt;
\connect discourse&lt;br /&gt;
CREATE EXTENSION hstore;&lt;br /&gt;
CREATE EXTENSION pg_trgm;&lt;br /&gt;
CREATE EXTENSION unaccent;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechende Funktionalität (von den extensions abgesehen) ist auch über den HSAdmin verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Redis Server ==&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|Firewall/Redis Port|Leider unterstützt discourse nicht die Kommunikation mit Redis über Unix-Sockets. Dementsprechend muss der für Redis konfigurierte Port von dem hostsharing-Support in der Firewall freigegeben werden.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir redis/etc redis/lib redis/log redis/run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen einer Datei &#039;&#039;/home/pacs/xyz00/users/discourse/redis/etc/redis.conf&#039;&#039; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
daemonize no&lt;br /&gt;
pidfile /home/pacs/xyz00/users/discourse/redis/run/redis-server.pid&lt;br /&gt;
port 32002&lt;br /&gt;
tcp-backlog 128&lt;br /&gt;
bind 127.0.0.1&lt;br /&gt;
timeout 300&lt;br /&gt;
loglevel notice&lt;br /&gt;
logfile /home/pacs/xyz00/users/discourse/redis/log/redis.log&lt;br /&gt;
databases 16&lt;br /&gt;
save 900 1&lt;br /&gt;
save 300 10&lt;br /&gt;
save 60 10000&lt;br /&gt;
slave-serve-stale-data yes&lt;br /&gt;
appendonly no&lt;br /&gt;
dbfilename dump.rdb&lt;br /&gt;
dir /home/pacs/xyz00/users/discourse/redis/lib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für Discourse 3.x gilt: &amp;quot;Discourse requires Redis 6.2.0 or up&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Für Debian Buster und Bullseye ist daher das Installieren eines neueren Binaries erforderlich. Bei Debian Bookwork ist bereits Redis 7.0 enthalten (siehe https://packages.debian.org/search?keywords=redis-server).&lt;br /&gt;
&lt;br /&gt;
Hier steht ein entsprechendes Binary für Debian Buster zur Verfügung, das mit dem Public Key von Timotheus geprüft werden kann:&lt;br /&gt;
&lt;br /&gt;
* https://download.solidcharity.com/tarballs/tpokorra/hostsharing/redis-server-6.2.12-debian-buster.tar.gz&lt;br /&gt;
* Prüfsignatur: https://download.solidcharity.com/tarballs/tpokorra/hostsharing/redis-server-6.2.12-debian-buster.tar.gz.sig&lt;br /&gt;
&lt;br /&gt;
Prüfen der Signatur:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
gpg --verify redis-server-6.2.12-debian-buster.tar.gz.sig redis-server-6.2.12-debian-buster.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Binary muss nach &amp;lt;code&amp;gt;$HOME/bin&amp;lt;/code&amp;gt; verschoben werden, und entsprechend beim Starten des Dienstes eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
== Installation von Ruby ==&lt;br /&gt;
&lt;br /&gt;
Als User &#039;&#039;xyz00-discourse&#039;&#039;:  Installation von Ruby mit &#039;&#039;rbenv&#039;&#039; mit folgenden Befehlen:&lt;br /&gt;
&lt;br /&gt;
Zunächst &#039;&#039;rbenv&#039;&#039; and &#039;&#039;ruby-build&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
git clone https://github.com/rbenv/rbenv.git ~/.rbenv&lt;br /&gt;
cd ~/.rbenv &amp;amp;&amp;amp; src/configure &amp;amp;&amp;amp; make -C src&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.rbenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
echo &#039;eval &amp;quot;$(rbenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
starte neue Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
exec bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Überprüfe rbenv-Installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
type rbenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installiere ruby-build als rbenv-Plugin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann die benötigte Ruby-Version installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rbenv install 2.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation von Discourse selber ==&lt;br /&gt;
&lt;br /&gt;
Weiterhin Als User &#039;&#039;xyz00-discourse&#039;&#039;:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
git clone https://github.com/discourse/discourse.git discourse&lt;br /&gt;
cd ~/discourse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die stabile Version auschecken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git checkout stable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ruby Pakete installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
gem install bundler&lt;br /&gt;
bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration der Discourse Software ==&lt;br /&gt;
&lt;br /&gt;
Anlegen einer Datei &#039;&#039;/home/pacs/xyz00/users/discourse/discourse/config/discourse.conf&#039;&#039; anhand der Beispiel-Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/discourse&lt;br /&gt;
cp config/discourse_defaults.conf config/discourse.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anpassen folgender Inhalte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
db_host = 127.0.0.1&lt;br /&gt;
db_port = 5432&lt;br /&gt;
#db_backup_port = 5432 #(auskommentieren)&lt;br /&gt;
db_name = xyz00_discoursedb&lt;br /&gt;
db_username = xyz00_discourseuser&lt;br /&gt;
db_password = &amp;quot;&amp;quot; #db password&lt;br /&gt;
hostname = &amp;quot;discourse.xyz00&amp;quot; # hostname&lt;br /&gt;
smtp_address = localhost&lt;br /&gt;
smtp_enable_start_tls = false&lt;br /&gt;
smtp_openssl_verify_mode = &#039;none&#039;&lt;br /&gt;
developer_emails = # your email-address&lt;br /&gt;
redis_host = 127.0.0.1&lt;br /&gt;
redis_port = 32002&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===TODO: Secrets setzen! ===&lt;br /&gt;
Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
RAILS_ENV=production bundle exec rake secret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sidekiq für Hintergrund-Aufgaben konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;config/sidekiq.conf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtig: development auf production ändern.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Dienst werden z.B. die E-Mails zur Aktivierung oder zum Passwort Reset verschickt.&lt;br /&gt;
&lt;br /&gt;
=== Problem mit Content Security Policy ===&lt;br /&gt;
&lt;br /&gt;
Um ein Problem mit Content Security Policy zu lösen, weil manche Dateien über http nachgeladen werden, muss in der Datei &amp;lt;code&amp;gt;config/site_settings.yml&amp;lt;/code&amp;gt; der Default Wert für force_https auf True gesetzt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
force_https:&lt;br /&gt;
    default: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Problem beim Aufsetzen der Datenbank vermeiden ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;→ Notiz Mai 2024:&#039;&#039;&#039; dies scheint aktuell nicht aufzutreten. &lt;br /&gt;
&lt;br /&gt;
Aus irgendeinem Grund wird beim Initialisieren der Datenbank versucht, den TYPE hotlinked_media_status zweimal in der Datenbank anzulegen. Der Grund ist nicht ersichtlich.&lt;br /&gt;
&lt;br /&gt;
Es kann folgende Änderung an der Datei &amp;lt;code&amp;gt;db/migrate/20220428094026_create_post_hotlinked_media.rb&amp;lt;/code&amp;gt; vorgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
reversible do |dir|&lt;br /&gt;
  dir.up { execute &amp;lt;&amp;lt;~SQL }&lt;br /&gt;
      DO $$ BEGIN CREATE TYPE hotlinked_media_status AS ENUM(&#039;downloaded&#039;, &#039;too_large&#039;, &#039;download_failed&#039;, &#039;upload_create_failed&#039;); EXCEPTION WHEN duplicate_object THEN null; END $$;&lt;br /&gt;
    SQL&lt;br /&gt;
  dir.down { execute &amp;lt;&amp;lt;~SQL }&lt;br /&gt;
      DROP TYPE hotlinked_media_status&lt;br /&gt;
    SQL&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Initialisieren der Datenbank ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
export SAFETY_ASSURED=1&lt;br /&gt;
# In Version 2.0.4 funktioniert db:migrate noch, ansonsten db:schema:load und seed nutzen!&lt;br /&gt;
# In Version 3.0.3 funktioniert db:migrate auch noch, db:schema:load ging nicht weil die Datei structure.sql fehlte&lt;br /&gt;
#RAILS_ENV=production bundle exec rails db:schema:load&lt;br /&gt;
#RAILS_ENV=production bundle exec rails db:seed&lt;br /&gt;
RAILS_ENV=production bundle exec rails db:migrate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren der Assets ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
RAILS_ENV=production bundle exec rails assets:precompile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Web-Servers (am Beispiel Puma)  ===&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;config/puma.conf&#039;&#039; anpassen (hier nur Änderungen angezeigt):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
APP_ROOT = &#039;/home/pacs/xyz00/users/discourse/discourse&#039;&lt;br /&gt;
daemonize false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Starten der Dienste  ==&lt;br /&gt;
&lt;br /&gt;
Zum Start aller notwendigen Dienste sollte systemd benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Dateien müssen nach &amp;lt;code&amp;gt;.config/systemd/user/&amp;lt;/code&amp;gt; kopiert werden (überlange Zeilen werden hier im Wiki umgebrochen)&lt;br /&gt;
&lt;br /&gt;
redis.service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis User Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/var/redis&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=%h/bin/redis-server %h/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sidekiq.service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Discourse Sidekiq Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/discourse&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
Environment=&amp;quot;RAILS_ENV=production&amp;quot;&lt;br /&gt;
Environment=&amp;quot;DB_POOL=8&amp;quot;&lt;br /&gt;
Environment=&amp;quot;MALLOC_ARENA_MAX=2&amp;quot;&lt;br /&gt;
ExecStart=%h/.rbenv/shims/bundle exec sidekiq -C %h/discourse/config/sidekiq.yml&lt;br /&gt;
StandardOutput=file:%h/var/log/sidekiq.out.log&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
After=redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
discourse.service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Discourse Web Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/discourse&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
Environment=&amp;quot;RAILS_ENV=production&amp;quot;&lt;br /&gt;
Environment=&amp;quot;WEB_CONCURRENCY=2&amp;quot;&lt;br /&gt;
Environment=&amp;quot;MAX_THREADS=5&amp;quot;&lt;br /&gt;
Environment=&amp;quot;MALLOC_ARENA_MAX=2&amp;quot;&lt;br /&gt;
ExecStart=%h/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:13000&lt;br /&gt;
StandardOutput=file:%h/var/log/puma.out.log&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
After=redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichten des Apache VHost ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/beispiel.discuss&lt;br /&gt;
rm -rf htdocs-ssl subs/www subs-ssl/www&lt;br /&gt;
ln -s ~/live/public htdocs-ssl&lt;br /&gt;
touch htdocs-ssl/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die &#039;&#039;htdocs-ssl/.htaccess&#039;&#039; (durch das gelinkte Verzeichnis entspricht das dem Pfad /home/pacs/xyz00/users/discourse/discourse/public/.htaccess ) mit dem Editor der Wahl öffnen und folgende Konfiguration einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
  &lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://127.0.0.1:13000%{REQUEST_URI} [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wartung ==&lt;br /&gt;
=== Backup ===&lt;br /&gt;
&lt;br /&gt;
Discourse macht selbstätig backups und legt diese unter &#039;public/backups&#039; ab. Enthalten ist ein Datenbank-Dump und die hochgeladenen Dateien.&lt;br /&gt;
&lt;br /&gt;
Im Admin-Bereich lassen sich backups auch manuell antreten.&lt;br /&gt;
&lt;br /&gt;
=== Admin Benutzer einladen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal brauchen wir einen neuen Admin Benutzer, den wir von der Kommandozeile aus einladen möchten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd /discourse&lt;br /&gt;
RAILS_ENV=production rake admin:invite[admin@example.org]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Import aus mbox Archiven ===&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel ein Mailman2 Archiv zu importieren, wo die Nachrichten als .mbox Datei vorliegen, sind folgende Schritte nötig:&lt;br /&gt;
&lt;br /&gt;
Vorbereitungen an Discourse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source .profile&lt;br /&gt;
cd discourse&lt;br /&gt;
bundle config set frozen false&lt;br /&gt;
IMPORT=1 bundle install&lt;br /&gt;
bundle config set frozen true&lt;br /&gt;
nano script/import_scripts/mbox/settings.yml&lt;br /&gt;
#  dort ändern:&lt;br /&gt;
#    data_dir: /home/pacs/xyz00/users/discourse/list-archiv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hochladen der Mailinglisten-Archive:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/list-archiv&lt;br /&gt;
# dort muss es Unterordner mit dem Namen der gewünschten Kategorie geben,&lt;br /&gt;
# und die mbox Datei muss auch diesen Namen haben, z.B.:&lt;br /&gt;
# ~/list-archiv/beispiel/beispiel.mbox&lt;br /&gt;
# ~/list-archiv/example/example.mbox&lt;br /&gt;
# um die Beiträge in den entsprechenden Kategorien beispiel und example einzufügen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durchführen des Imports:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source .profile&lt;br /&gt;
cd discourse&lt;br /&gt;
RAILS_ENV=production IMPORT=1 bundle exec rails runner \&lt;br /&gt;
    script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Export ===&lt;br /&gt;
* Wenn ein Forum beendet wird, möchte man evtl. eine Sicherung als statische HTML Seiten. &lt;br /&gt;
** Das wird hier diskutiert: https://meta.discourse.org/t/how-do-i-export-the-complete-forum-as-static-html-pages/71007/3&lt;br /&gt;
* Um ein Forum von Discourse zu Flarum umzuziehen, hat Timotheus ein Skript geschrieben.&lt;br /&gt;
** Das Migrations-Skript: https://github.com/SolidCharity/discourse_to_flarum&lt;br /&gt;
** siehe auch https://discuss.flarum.org/d/4930-discourse-to-flarum-migration-support/29&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
Discourse wird über update via mail informieren (dies kann man m.W. abschalten).&lt;br /&gt;
&lt;br /&gt;
Achtung: bei größeren Updates auch immer Änderungen an der Datei site_settings.yml (https://github.com/discourse/discourse/blob/main/config/site_settings.yml) beachten!&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 3.0.3 auf 3.0.5 ====&lt;br /&gt;
&lt;br /&gt;
# Im Web-Backend unter Administration-&amp;gt;Backups-&amp;gt; Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)&lt;br /&gt;
# Backup&lt;br /&gt;
# Die lokalen Änderungen sichern:&lt;br /&gt;
# cd discourse&lt;br /&gt;
# git diff v3.0.3 &amp;gt; diff-3.0.3.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.0.5 v3.0.5&lt;br /&gt;
# evtl. Änderungen aus diff-3.0.3.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.0.3.txt&lt;br /&gt;
# git commit -a -m &amp;quot;spezifische Änderungen für diese Instanz&amp;quot; --no-verify&lt;br /&gt;
# Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse/blob/stable/.ruby-version.sample)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.2.1&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.2.1&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle&lt;br /&gt;
# yarn install&lt;br /&gt;
# RAILS_ENV=production bundle exec rake db:migrate&lt;br /&gt;
# RAILS_ENV=production bundle exec rake assets:precompile&lt;br /&gt;
# Services neu starten&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user restart puma&lt;br /&gt;
systemctl --user restart sidekiq&lt;br /&gt;
systemctl --user restart redis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Zuletzt: Read-Only Modus wieder deaktivieren&lt;br /&gt;
&lt;br /&gt;
=== Debugging ===&lt;br /&gt;
&lt;br /&gt;
Es können folgende Einstellungen in der Datei config/environments/production.rb vorgenommen werden. Danach den Puma Dienst neustarten. Fehlermeldungen und Stacktraces werden dann im Browser ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
config.log_level = :debug&lt;br /&gt;
config.action_dispatch.show_exceptions = :all&lt;br /&gt;
config.action_dispatch.debug_exception_log_level = :error&lt;br /&gt;
&lt;br /&gt;
# Full error reports are enabled and caching is turned off&lt;br /&gt;
config.consider_all_requests_local = true&lt;br /&gt;
config.action_controller.perform_caching = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erforderliche Anpassungen ===&lt;br /&gt;
Weil wir bei Debian Bookworm noch mit ImageMagick 6.9 arbeiten, muss dieser [https://github.com/discourse/discourse/commit/17aa831337e352dfd875f1b4ddc4492bd0835119 Patch] rückgängig gemacht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
wget https://github.com/discourse/discourse/commit/17aa831337e352dfd875f1b4ddc4492bd0835119.patch -O ~/imagemagick.patch&lt;br /&gt;
patch -p1 --reverse &amp;lt; ~/imagemagick.patch&lt;br /&gt;
git commit -a -m &amp;quot;revert imagemagick patch&amp;quot;  --no-verify&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ToDos ==&lt;br /&gt;
&lt;br /&gt;
* Ein Patch, um Discourse auch via Unix-Socket mit Redis sprechen lassen zu können dürfte relativ einfach sein (es wird ein Wrapper um das redis-gem genutzt).&lt;br /&gt;
* Konfiguration von discourse, um mit postgresql via Unix-Socket zu kommunizieren (DISCOURSE_DB_SOCKET environment variable)&lt;br /&gt;
* Performance-tuning an diversen Stellen, anhand der discourse_docker-Vorgaben (https://github.com/discourse/discourse_docker), z.B.&lt;br /&gt;
** thpoff (huge page settings)&lt;br /&gt;
** unicorn (hat eine wesentlich ausgefeiltere Konfigurations-Vorlage, wahrscheinlich bereits ordentlich optimiert)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* https://help.skysilk.com/support/solutions/articles/9000120927-how-to-install-discourse-without-docker-using-skysilk-vps-&lt;br /&gt;
* https://github.com/discourse/discourse_docker&lt;br /&gt;
* https://github.com/discourse/discourse&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/discourse&lt;br /&gt;
&lt;br /&gt;
== Historie ==&lt;br /&gt;
&lt;br /&gt;
* 2018, 14 . September: Initiale Fassung&lt;br /&gt;
* 2019, Januar: Update-Informationen ergänzt&lt;br /&gt;
* 2022, Juni: systemd Dienste, Discourse 3.0&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:RubyOnRails]]&lt;br /&gt;
[[Kategorie:Webforen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CiviCRM_installieren&amp;diff=6928</id>
		<title>CiviCRM installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CiviCRM_installieren&amp;diff=6928"/>
		<updated>2024-08-27T13:24:24Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* ausblenden des Login-Formulars */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[https://civicrm.org/de CiviCRM] ist eine Verwaltungssoftware für Non-Profit-Organisationen, Verbände, Stiftungen, Vereine usw.&lt;br /&gt;
&lt;br /&gt;
CRM steht für Customer-Relationship-Management bzw. Constituent-Relationship-Management, also das Verwalten der Beziehung zu Spendern, Freiwilligen, Unterstützern, Newsletterabonnenten usw.&lt;br /&gt;
&lt;br /&gt;
CiviCRM ist in PHP geschrieben. Es ist keine eigenständige Anwendung, und muss daher entweder auf Wordpress, Drupal oder Joomla installiert werden. Von den Entwicklern wird Drupal empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Drupal und CiviCRM automatisiert durchführt.&lt;br /&gt;
&lt;br /&gt;
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/civicrm&lt;br /&gt;
&lt;br /&gt;
Es wird zuerst Drupal 9 eingerichtet, und dann die deutsche Version von CiviCRM 5.62 (oder neuer) installiert.&lt;br /&gt;
&lt;br /&gt;
== Installation mit Ansible ==&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte sind auf dem lokalen Rechner auszuführen, um CiviCRM mit Hilfe des Ansible Skripts in den eigenen Hostsharing Benutzer zu installieren:&lt;br /&gt;
&lt;br /&gt;
Klonen des Repositories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
git clone https://github.com/tpokorra/Hostsharing-Ansible-CiviCRM-Drupal.git&lt;br /&gt;
git clone https://codeberg.org/tpokorra/hs.ansible.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss die Datei inventory-drupal-sample.yml kopiert werden, und entsprechend angepasst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd hs.ansible&lt;br /&gt;
cp playbooks/civicrm/inventory-drupal-sample.yml inventories/my.civicrm.yml&lt;br /&gt;
vi inventories/my.civicrm.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der my.civicrm.yml müssen die entsprechenden Werte eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Eine Fehlerquelle sind zu lange Namen für user, denn dann kommt die Datenbankverwaltung von hsadmin aus dem Tritt. Bei einem Namen mit 13 Zeichen treten zumindest Fehler auf...&lt;br /&gt;
&lt;br /&gt;
Es wird vorausgesetzt, dass auf dem lokalen Rechner Ansible installiert ist.&lt;br /&gt;
&lt;br /&gt;
Dann kann die Installation vom lokalen Rechner aus gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
ansible-playbook -i inventories/my.civicrm.yml init.yml&lt;br /&gt;
ansible-playbook -i inventories/my.civicrm.yml playbooks/civicrm/install.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Nach der Installation kann die Seite hier erreicht werden: https://civicrm.example.org&lt;br /&gt;
&lt;br /&gt;
Bitte mit dem Benutzer und dem Passwort anmelden, die in der Datei my.inventory angegeben wurden.&lt;br /&gt;
&lt;br /&gt;
Dann zu CiviCRM gehen, und unter Administration / Verwaltungskonsole auf Systemstatus klicken. Dort wird man auf weitere Dinge hingewiesen, die noch eingerichtet werden müssen, z.B. das Standard-Postfach und die Daten der eigenen Organisation.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Civicrm einrichtung.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Keycloak OpenID für Drupal ===&lt;br /&gt;
&lt;br /&gt;
Mit Keycloak erfolgreich getestet wurde das Plugin &amp;quot;Keycloak OpenID Connect&amp;quot; (abhängig von &amp;quot;OpenID Connect&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== Ausblenden des Login-Formulars ====&lt;br /&gt;
&lt;br /&gt;
Wer primär SSO einsetzt, möchte zur Vereinfachung der Userexperience in der Regel auf das native Loginfeld verzichten. Dies kann unter &amp;lt;strong&amp;gt;OpenID buttons display in user login form&amp;lt;/strong&amp;gt; in &amp;lt;code&amp;gt;/admin/config/services/openid-connect&amp;lt;/code&amp;gt; bestimmt werden. Hierzu &amp;quot;Ersetzen&amp;quot; anwählen. &lt;br /&gt;
&lt;br /&gt;
Für den Administrator Zugang kann dies mittels &amp;lt;code&amp;gt;?showcore=true&amp;lt;/code&amp;gt; am Ende der Login-URI umgangen werden. So sind eventuelle CSS-Hacks zum verstecken der Form nicht mehr notwendig.&lt;br /&gt;
&lt;br /&gt;
== Updates ==&lt;br /&gt;
&lt;br /&gt;
Updates werden hier beschrieben:&lt;br /&gt;
* für Drupal: https://www.drupal.org/docs/updating-drupal/updating-drupal-core-via-composer&lt;br /&gt;
* für CiviCRM: https://docs.civicrm.org/sysadmin/en/latest/upgrade/drupal8/&lt;br /&gt;
&lt;br /&gt;
Es gibt auch ein Playbook im Ansible Verzeichnis. Dieses sollte aber nur als Anleitung genommen werden.&lt;br /&gt;
https://github.com/tpokorra/Hostsharing-Ansible-CiviCRM/blob/main/playbook-update.yml&lt;br /&gt;
&lt;br /&gt;
Updates sollten immer erst auf einem Testsystem durchgeführt werden. Vor der Durchführung eines Updates auf dem Produktivsystem sollte ein Backup erstellt werden, das im Fall eines Problems wiederhergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://civicrm.org/ Englische Webseite des CiviCRM Projekts]&lt;br /&gt;
*[https://sfe-ev.org/ Software für Engagierte e.V.: CiviCRM Support in Deutschland]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/civicrm Ansible Playbook für Hostsharing (Drupal bzw. WordPress)]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CRM]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CiviCRM_installieren&amp;diff=6927</id>
		<title>CiviCRM installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CiviCRM_installieren&amp;diff=6927"/>
		<updated>2024-08-27T13:24:09Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: keycloak openid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[https://civicrm.org/de CiviCRM] ist eine Verwaltungssoftware für Non-Profit-Organisationen, Verbände, Stiftungen, Vereine usw.&lt;br /&gt;
&lt;br /&gt;
CRM steht für Customer-Relationship-Management bzw. Constituent-Relationship-Management, also das Verwalten der Beziehung zu Spendern, Freiwilligen, Unterstützern, Newsletterabonnenten usw.&lt;br /&gt;
&lt;br /&gt;
CiviCRM ist in PHP geschrieben. Es ist keine eigenständige Anwendung, und muss daher entweder auf Wordpress, Drupal oder Joomla installiert werden. Von den Entwicklern wird Drupal empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Drupal und CiviCRM automatisiert durchführt.&lt;br /&gt;
&lt;br /&gt;
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/civicrm&lt;br /&gt;
&lt;br /&gt;
Es wird zuerst Drupal 9 eingerichtet, und dann die deutsche Version von CiviCRM 5.62 (oder neuer) installiert.&lt;br /&gt;
&lt;br /&gt;
== Installation mit Ansible ==&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte sind auf dem lokalen Rechner auszuführen, um CiviCRM mit Hilfe des Ansible Skripts in den eigenen Hostsharing Benutzer zu installieren:&lt;br /&gt;
&lt;br /&gt;
Klonen des Repositories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
git clone https://github.com/tpokorra/Hostsharing-Ansible-CiviCRM-Drupal.git&lt;br /&gt;
git clone https://codeberg.org/tpokorra/hs.ansible.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss die Datei inventory-drupal-sample.yml kopiert werden, und entsprechend angepasst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd hs.ansible&lt;br /&gt;
cp playbooks/civicrm/inventory-drupal-sample.yml inventories/my.civicrm.yml&lt;br /&gt;
vi inventories/my.civicrm.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der my.civicrm.yml müssen die entsprechenden Werte eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Eine Fehlerquelle sind zu lange Namen für user, denn dann kommt die Datenbankverwaltung von hsadmin aus dem Tritt. Bei einem Namen mit 13 Zeichen treten zumindest Fehler auf...&lt;br /&gt;
&lt;br /&gt;
Es wird vorausgesetzt, dass auf dem lokalen Rechner Ansible installiert ist.&lt;br /&gt;
&lt;br /&gt;
Dann kann die Installation vom lokalen Rechner aus gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
ansible-playbook -i inventories/my.civicrm.yml init.yml&lt;br /&gt;
ansible-playbook -i inventories/my.civicrm.yml playbooks/civicrm/install.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Nach der Installation kann die Seite hier erreicht werden: https://civicrm.example.org&lt;br /&gt;
&lt;br /&gt;
Bitte mit dem Benutzer und dem Passwort anmelden, die in der Datei my.inventory angegeben wurden.&lt;br /&gt;
&lt;br /&gt;
Dann zu CiviCRM gehen, und unter Administration / Verwaltungskonsole auf Systemstatus klicken. Dort wird man auf weitere Dinge hingewiesen, die noch eingerichtet werden müssen, z.B. das Standard-Postfach und die Daten der eigenen Organisation.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Civicrm einrichtung.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Keycloak OpenID für Drupal ===&lt;br /&gt;
&lt;br /&gt;
Mit Keycloak erfolgreich getestet wurde das Plugin &amp;quot;Keycloak OpenID Connect&amp;quot; (abhängig von &amp;quot;OpenID Connect&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== ausblenden des Login-Formulars ====&lt;br /&gt;
&lt;br /&gt;
Wer primär SSO einsetzt, möchte zur Vereinfachung der Userexperience in der Regel auf das native Loginfeld verzichten. Dies kann unter &amp;lt;strong&amp;gt;OpenID buttons display in user login form&amp;lt;/strong&amp;gt; in &amp;lt;code&amp;gt;/admin/config/services/openid-connect&amp;lt;/code&amp;gt; bestimmt werden. Hierzu &amp;quot;Ersetzen&amp;quot; anwählen. &lt;br /&gt;
&lt;br /&gt;
Für den Administrator Zugang kann dies mittels &amp;lt;code&amp;gt;?showcore=true&amp;lt;/code&amp;gt; am Ende der Login-URI umgangen werden. So sind eventuelle CSS-Hacks zum verstecken der Form nicht mehr notwendig.&lt;br /&gt;
&lt;br /&gt;
== Updates ==&lt;br /&gt;
&lt;br /&gt;
Updates werden hier beschrieben:&lt;br /&gt;
* für Drupal: https://www.drupal.org/docs/updating-drupal/updating-drupal-core-via-composer&lt;br /&gt;
* für CiviCRM: https://docs.civicrm.org/sysadmin/en/latest/upgrade/drupal8/&lt;br /&gt;
&lt;br /&gt;
Es gibt auch ein Playbook im Ansible Verzeichnis. Dieses sollte aber nur als Anleitung genommen werden.&lt;br /&gt;
https://github.com/tpokorra/Hostsharing-Ansible-CiviCRM/blob/main/playbook-update.yml&lt;br /&gt;
&lt;br /&gt;
Updates sollten immer erst auf einem Testsystem durchgeführt werden. Vor der Durchführung eines Updates auf dem Produktivsystem sollte ein Backup erstellt werden, das im Fall eines Problems wiederhergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://civicrm.org/ Englische Webseite des CiviCRM Projekts]&lt;br /&gt;
*[https://sfe-ev.org/ Software für Engagierte e.V.: CiviCRM Support in Deutschland]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/civicrm Ansible Playbook für Hostsharing (Drupal bzw. WordPress)]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CRM]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6920</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6920"/>
		<updated>2024-08-22T09:38:49Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Abhängigkeiten und Einschränkungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* eine zusätzliche (Sub)domain im gleichen User ist nötig. Andernfalls muss die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.example.com/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen (letzteres kann bei Updates überschrieben werden!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;php occ notify_push:setup https://push.cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6919</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6919"/>
		<updated>2024-08-21T11:14:28Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.example.com/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen (letzteres kann bei Updates überschrieben werden!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;php occ notify_push:setup https://push.cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6918</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6918"/>
		<updated>2024-08-21T11:13:24Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.beispiel.de/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen (letzteres kann bei Updates überschrieben werden!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6917</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6917"/>
		<updated>2024-08-21T11:12:23Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun gehen wir in &amp;lt;code&amp;gt;doms/push.cloud.beispiel.de/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; und ersetzen den Inhalt (bevorzugt), oder wir ergänzen die .htaccess der Nextcloud im unteren Teil um die folgenden Zeilen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
# bei eigener (sub)domain ist /push/ nicht erforderlich, aber wer weiß, eventuell ist das mit robuster&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6906</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6906"/>
		<updated>2024-08-14T11:38:02Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: notify_push&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
=== Redis Cache ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud Push ===&lt;br /&gt;
&lt;br /&gt;
Um Vorgänge wie Sync und Benachrichtigungen bei sehr großen Nextcloud Installationen zu beschleunigen, kann der &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; Dienst hinzuinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
==== Abhängigkeiten und Einschränkungen ====&lt;br /&gt;
* &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; muss Zugriff auf den gleichen Redis-Cache wie die Nextcloud haben &lt;br /&gt;
** aufgrund von eingeschränktem Passwort Support sollte ein Redis Socket mit sicheren Berechtigungseinstellungen als Alternative zum Redis Port mit Passwort konfiguriert werden.&lt;br /&gt;
* optimaler Weise holt sich &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; benötigte informationen aus der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; der bestehenden Nextcloud-Installation&lt;br /&gt;
* die bestehende &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; muss aus o.g. Gründen modifiziert werden, dies könnte bei Nextcloud-Updates verloren gehen(!)&lt;br /&gt;
* Bestimmte Portbereiche sind bei Hostsharing eingeschränkt, es empfiehlt sich, direkt beispielsweise Port &amp;lt;code&amp;gt;37867&amp;lt;/code&amp;gt; zu nehmen. &amp;lt;strong&amp;gt;aus diesem Grund ist das automatische Setup durch das Plugin bei Hostsharing nicht möglich!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Siehe auch: https://github.com/nextcloud/notify_push#manual-setup &lt;br /&gt;
&lt;br /&gt;
1. Installieren der Nextcloud-App &amp;lt;code&amp;gt;notify_push&amp;lt;/code&amp;gt; – (nach Push suchen, &amp;quot;Client Push&amp;quot; wählen)&amp;lt;br&amp;gt;&lt;br /&gt;
2. falls noch nicht erstellt: &amp;lt;code&amp;gt;mkdir -p ~/.config/systemd/user&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
3. mit Lieblingseditor die Datei &amp;lt;code&amp;gt;~/.config/systemd/user/notify_push.service&amp;lt;/code&amp;gt; anlegen:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description = Push daemon for Nextcloud clients&lt;br /&gt;
Documentation = https://github.com/nextcloud/notify_push&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Change if you already have something running on this port&lt;br /&gt;
Environment = PORT=37867&lt;br /&gt;
# We don&#039;t want to bind to 0.0.0.0, hence the --bind&lt;br /&gt;
ExecStart = /home/pacs/xyz00/users/cloud/bin/notify_push --bind 127.0.0.1 /home/pacs/xyz00/users/cloud/nextcloud/config/config.php&lt;br /&gt;
Type=notify&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
4. das Verzeichnis &amp;lt;code&amp;gt;~/bin&amp;lt;/code&amp;gt; anlegen und die aktuellste binary herunterladen und ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;release=`curl -L https://api.github.com/repos/nextcloud/notify_push/releases/latest -s | jq -r &#039;.tag_name&#039;` &amp;amp;&amp;amp; wget --show-progress -qO ~/bin/notify_push https://github.com/nextcloud/notify_push/releases/download/$release/notify_push-x86_64-unknown-linux-musl &amp;amp;&amp;amp; chmod +x ~/bin/notify_push&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. es könnte die folgende Umgebungsvariable zum Bedienen von systemd notwendig werden:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
6. den neuen systemd-Dienst automatisch bei Systemstart, sowie jetzt sofort starten:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;systemctl enable --now --user notify_push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
7. nun ergänzen wir um unteren Teil der &amp;lt;code&amp;gt;~/nextcloud/.htaccess&amp;lt;/code&amp;gt; die folgenden Zeilen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push/ws    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:37867/ws  [proxy]&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/push    [NC]&lt;br /&gt;
RewriteRule .* http://127.0.0.1:37867%{REQUEST_URI}  [proxy]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
8. abschließend im Nextcloud Ordner die Konfiguration des Plugins anstoßen: &amp;lt;code&amp;gt;php occ notify_push:setup https://cloud.example.com/push&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
9. es ist möglich, das die erkannte IP-Adresse des Hives noch nicht vertraut ist. In diesem Fall wird der obige Befehl scheitern und es muss jene aus der Fehlermeldung des Setups unter &amp;lt;code&amp;gt;trusted_proxies&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;config.php&amp;lt;/code&amp;gt; ergänzt werden. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird im Repo außerdem ein Testclient bereitgestellt, der sich testweise mit dem Push-Dienst verbindet&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=6903</id>
		<title>Matrix Synapse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=6903"/>
		<updated>2024-08-12T10:24:03Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Matrix Server &#039;&#039;Synapse&#039;&#039;, der sogenannte &#039;Homeserver&#039;, ist aktuell die einzige vollständige serverseitige Implementierung des Matrix-Protokolls.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|Work in Progress|Leider funktioniert die Server-zu-Server-Kommunikation von Synapse hinter dem Apache-Proxy mit den genannten Rewrite-Rules nicht. Bitten Sie dazu den Service, Ihren Apache VHost individuell für den Matrix Server anzupassen.}}&lt;br /&gt;
&lt;br /&gt;
Synapse wird bei Hostsharing als &#039;&#039;eigener Daemon&#039;&#039; betrieben. Der Betrieb ist im Shared Hosting anmelde- und kostenpflichtig. Daher empfehlen wir für den Betrieb einen &#039;&#039;Managed Server&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt, wie man den Matrix-Homeserver Synapse auf der Managed Hosting Plattform von Hostsharing installieren kann. Dabei sind die User-IDs nach dem Schema @user:beispiel.de aufgebaut, der Homeserver an sich ist unter matrix.beispiel.de erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-matrix&#039;&#039;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-matrix&#039;&#039; als Domain-Administrator, zum Beispiel &#039;&#039;matrix.beispiel.de&#039;&#039;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_matrixuser&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_matrixdb&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_matrixuser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Verwendeter IP-Port für den Server-Dienst:&lt;br /&gt;
# Synapse: localhost:32801&lt;br /&gt;
&lt;br /&gt;
== Installation von Synapse ==&lt;br /&gt;
&lt;br /&gt;
Installationsanleitung basierend auf https://matrix-org.github.io/synapse/latest/setup/installation.html#installing-as-a-python-module-from-pypi&lt;br /&gt;
&lt;br /&gt;
Auf Debian Buster muss ein neueres Python, z.B. Python 3.9 installiert werden, siehe [https://wiki.hostsharing.net/index.php?title=Eigenes_Python_installieren#Installation_mit_pyenv Eigenes Python mit pyenv installieren].&lt;br /&gt;
&lt;br /&gt;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv mit Python 3.9 erstellen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/synapse&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv install --python 3.9.18&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse und Postgres-Dependencies installieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv shell&lt;br /&gt;
pipenv install matrix-synapse[postgres]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Initiale Konfiguration mit richtigem server-name &amp;quot;beispiel.de&amp;quot; generieren, außerdem im laufenden Betrieb keine Statistiken an Matrix.org senden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv run python -m synapse.app.homeserver --server-name beispiel.de --config-path homeserver.yaml --generate-config --report-stats=no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration von Synapse ==&lt;br /&gt;
&lt;br /&gt;
In die initial generierte Konfiguration muss noch die Port- und Datenbank-Konfiguration eingetragen werden:&lt;br /&gt;
&lt;br /&gt;
Port: Innerhalb der listener-section den Port 8008 auf 32801 (wie initial definiert) ändern, alles andere beibehalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
- port: 32801&lt;br /&gt;
    tls: false&lt;br /&gt;
    bind_addresses: [&#039;::1&#039;, &#039;127.0.0.1&#039;]&lt;br /&gt;
    type: http&lt;br /&gt;
    x_forwarded: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Postgres-Datenbank:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
database:&lt;br /&gt;
    # The database engine name&lt;br /&gt;
    name: &amp;quot;psycopg2&amp;quot;&lt;br /&gt;
    # Arguments to pass to the engine&lt;br /&gt;
    args:&lt;br /&gt;
    host: &amp;quot;localhost&amp;quot;&lt;br /&gt;
    database: &amp;quot;xyz00_matrixdb&amp;quot;&lt;br /&gt;
    user: &amp;quot;xyz00_matrixuser&amp;quot;&lt;br /&gt;
    password: &amp;quot;meinPasswort&amp;quot;&lt;br /&gt;
    cp_min: 5&lt;br /&gt;
    cp_max: 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Starten der Dienste  ==&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;Synapse&#039;&#039;-Dienst wird hier als Service-Unit im SystemD des Users eingetragen.&lt;br /&gt;
&lt;br /&gt;
Lege dazu die folgende Datei an: &#039;&#039;~/.config/systemd/user/synapse.service&#039;&#039; mit dem Inhalt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Synapse&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/synapse&lt;br /&gt;
Environment=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2&lt;br /&gt;
ExecStart=pipenv run python -m synapse.app.homeserver --config-path=%h/synapse/homeserver.yaml&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch Aufruf der folgenden Kommandos wird der Dienst aktiviert und gestartet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; lines&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable synapse.service&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Einrichten des Apache VHost ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;~/doms/matrix.beispiel.de/.htaccess&#039;&#039; mit dem Editor der Wahl öffnen und &lt;br /&gt;
folgende Konfiguration einfügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32801%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Well-Known unter beispiel.de ==&lt;br /&gt;
&lt;br /&gt;
Damit die User-Accounts das Format @user:beispiel.de haben, der Server aber unter matrix.beispiel.de erreichbar ist, müssen noch folgende zwei Dateien unter der Domain beispiel.de abgelegt werden:&lt;br /&gt;
&lt;br /&gt;
https://beispiel.de/.well-known/matrix/server&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;m.server&amp;quot;: &amp;quot;matrix.beispiel.de:443&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://beispiel.de/.well-known/matrix/client&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;m.homeserver&amp;quot;: {&lt;br /&gt;
        &amp;quot;base_url&amp;quot;: &amp;quot;https://matrix.beispiel.de&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;m.identity_server&amp;quot;: {&lt;br /&gt;
        &amp;quot;base_url&amp;quot;: &amp;quot;https://vector.im&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die muss noch der CORS-Header Access-Control-Allow-Origin &amp;quot;*&amp;quot; gesetzt werden, damit die Datei aus beliebigem Riot-Web im Browser abrufbar ist. Dazu in den Ordner .well-known/matrix/ folgende .htaccess anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
  Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation dazu findet man unter https://matrix.org/docs/spec/server_server/r0.1.2#get-well-known-matrix-server und https://matrix.org/docs/spec/client_server/r0.5.0#get-well-known-matrix-client&lt;br /&gt;
&lt;br /&gt;
== Update von Synapse ==&lt;br /&gt;
&lt;br /&gt;
mit pipenv:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
source .venv/bin/activate || pipenv shell&lt;br /&gt;
pipenv install update&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder falls Synapse mit pip verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
source venv/bin/activate&lt;br /&gt;
pip freeze &amp;gt; requirements.txt&lt;br /&gt;
sed -i &amp;quot;s/==.*//g&amp;quot; requirements.txt&lt;br /&gt;
pip install -r requirements.txt --upgrade&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Falls Monit verwendet wird statt systemctl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit stop synapse&lt;br /&gt;
#... updaten ...&lt;br /&gt;
monit start synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Föderation für den Synapse Server aktiviert ist, kann mit dem [https://federationtester.matrix.org/ Matrix Federation Tester] die eigene Instanz auf die laufende Version geprüft werden. Als Server nicht matrix.example.org eingeben, sondern den öffentlichen Namen, wo auch die Benutzernamen drauf laufen, z.B. example.org&lt;br /&gt;
&lt;br /&gt;
Ansonsten ist die laufende Version auch über die URL https://matrix.example.org/_synapse/admin/v1/server_version zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== Element-Web ==&lt;br /&gt;
&lt;br /&gt;
Element-Web ist aus Server-Seite eine rein statische html+javascript-Kombination, daher:&lt;br /&gt;
&lt;br /&gt;
* Account und Domain anlegen (separat von der Synapse-Domain)&lt;br /&gt;
* [https://github.com/element-hq/element-web/releases/latest aktuelles element-web release] .tgz herunterladen&lt;br /&gt;
* Symlink von htdocs-ssl auf entpacktes element-web-Verzeichnis&lt;br /&gt;
* config.sample.json in config.json kopieren und Matrix-Homeserver-Einträge anpassen&lt;br /&gt;
* Piwik aus config.json entfernen&lt;br /&gt;
&lt;br /&gt;
== SAML mit Synapse ==&lt;br /&gt;
&lt;br /&gt;
Synapse unterstützt mit Version 1.1.0 SAML. Dazu wie folgt vorgehen:&lt;br /&gt;
&lt;br /&gt;
Das Paket xmlsec1 muss installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ xmlsec1  --version&lt;br /&gt;
xmlsec1 1.2.23 (openssl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Python-Paket pysaml2 installieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv shell&lt;br /&gt;
pipenv install pysaml2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der homeserver.yaml die SAML-Direktiven einkommentieren, hier mit dem Beispiel eines SAML IdP unter https://login.beispiel.de/simplesaml/saml2/idp/metadata.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# Once SAML support is enabled, a metadata file will be exposed at&lt;br /&gt;
# https://&amp;lt;server&amp;gt;:&amp;lt;port&amp;gt;/_matrix/saml2/metadata.xml, which you may be able to &lt;br /&gt;
# use to configure your SAML IdP with. Alternatively, you can manually configure&lt;br /&gt;
# the IdP to use an ACS location of&lt;br /&gt;
# https://&amp;lt;server&amp;gt;:&amp;lt;port&amp;gt;/_matrix/saml2/authn_response.&lt;br /&gt;
#&lt;br /&gt;
saml2_config:&lt;br /&gt;
    sp_config:&lt;br /&gt;
        # point this to the IdP&#039;s metadata. You can use either a local file or&lt;br /&gt;
        # (preferably) a URL.&lt;br /&gt;
        metadata:&lt;br /&gt;
        #local: [&amp;quot;saml2/idp.xml&amp;quot;]&lt;br /&gt;
        remote:&lt;br /&gt;
            - url: https://login.beispiel.de/simplesaml/saml2/idp/metadata.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wichtig ist außerdem, dass die public_baseurl in der homeserver.yaml gesetzt ist, damit Synapse weiß, wie es erreichbar ist und dies in seine SP-Metadaten einbauen kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
public_baseurl: https://matrix.beispiel.de/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Service-Provider-Konfiguration als XML bekommt man von Synapse dann wie schon in der homeserver.yaml als Kommentar beschrieben, unter https://matrix.beispiel.de/_matrix/saml2/metadata.xml&lt;br /&gt;
&lt;br /&gt;
Diese dann in den SAML-IdP-importieren und dann sollte der Single-Sign-On via SAML funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Federation Sender Worker für Synapse ==&lt;br /&gt;
&lt;br /&gt;
Zur Parallelisierung bietet Synapse das Konzept &amp;quot;Worker&amp;quot; an, die spezifische Aufgaben übernehmen, damit der Hauptprozess diese nicht durchführen muss.&lt;br /&gt;
&lt;br /&gt;
Details dazu: https://github.com/matrix-org/synapse/blob/master/docs/workers.md&lt;br /&gt;
&lt;br /&gt;
Ein einfach einzurichtender Worker, der auch viel Last abfedert, ist der Federation Sender Worker, da das Verschicken des Federation-Traffics 10-50% der Serverlast ausmacht.&lt;br /&gt;
&lt;br /&gt;
In der homeserver.yaml die Worker-Konfiguration aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
## Worker ##&lt;br /&gt;
worker_app: synapse.app.homeserver&lt;br /&gt;
daemonize: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und dazugehörige Listener (Abschnitt listener:) aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# The TCP replication port&lt;br /&gt;
- port: 32892&lt;br /&gt;
  bind_address: &#039;127.0.0.1&#039;&lt;br /&gt;
  type: replication&lt;br /&gt;
# The HTTP replication port&lt;br /&gt;
- port: 32893&lt;br /&gt;
  bind_address: &#039;127.0.0.1&#039;&lt;br /&gt;
  type: http&lt;br /&gt;
  resources:&lt;br /&gt;
   - names: [replication]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen, die Worker machen sollen, in der homeserver.yaml deaktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
# disable federation sending here, use worker for it&lt;br /&gt;
send_federation: False&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann Verzeichnis synapse/workers anlegen, darin federation_sender.yaml:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
worker_app: synapse.app.federation_sender&lt;br /&gt;
&lt;br /&gt;
# The replication listener on the synapse to talk to.&lt;br /&gt;
worker_replication_host: 127.0.0.1&lt;br /&gt;
worker_replication_port: 32892&lt;br /&gt;
worker_replication_http_port: 32893&lt;br /&gt;
&lt;br /&gt;
worker_daemonize: True&lt;br /&gt;
worker_pid_file: /home/pacs/xyz00/users/matrix/synapse/federation_sender.pid&lt;br /&gt;
worker_log_config: /home/pacs/xyz00/users/matrix/synapse/federation_sender.log.config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
.monitrc um worker erweitern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process federation_sender with pidfile /home/pacs/xyz00/users/matrix/synapse/federation_sender.pid&lt;br /&gt;
    start program &amp;quot;/bin/bash -c &#039;export VIRTUAL_ENV=$HOME/synapse/env &amp;amp;&amp;amp; export PATH=$VIRTUAL_ENV/bin:$PATH &amp;amp;&amp;amp; cd $HOME/synapse &amp;amp;&amp;amp; synctl -w workers/federation_sender.yaml start&#039;&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat $HOME/synapse/federation_sender.pid )&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Monit neu laden und synapse und federation_sender neustarten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit reload&lt;br /&gt;
monit restart all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach Updates ebenfalls immer Hauptprozess und alle Worker neustarten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
monit restart all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sliding Sync Proxy ==&lt;br /&gt;
Zum Zeitpunkt dieser Anleitung werden aktiv neue Element Anwendungen (Element X) und ein neues Syncverfahren entwickelt um Matrix performater und weniger ressourcenhungrig zu machen. Unterstützung hierfür findet sich noch(!) nicht nativ in Synapse, sondern wird mit einem dedizierten kleinen Proxy umgesetzt. Bei stärkerer Matrix Nutzung können die neuen Anwendungen besonders mobil schon eine große Entlastung sein – es sind allerdings noch nicht alle Matrix-Funktionen fertig eingebaut.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Best practice ist auch hier wieder ein eigener User, sowie eigene Domain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Wir brauchen:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* eine PostgreSQL Datenbank&lt;br /&gt;
* einen freien internen http Port&lt;br /&gt;
* eine aktuelle sliding-sync Binary – [https://github.com/matrix-org/sliding-sync/releases diese kann hier bezogen werden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Verzeichnisstruktur&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Es wird die folgende Struktur vorgeschlagen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user config bin scripts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Binary laden:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Mit den folgenden Befehlen kann die aktuelle Release erkannt, und von dieser das Binary heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
export release=`curl -L https://api.github.com/repos/matrix-org/sliding-sync/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
wget --show-progress -q -O $HOME/bin/syncv3 https://github.com/matrix-org/sliding-sync/releases/download/$release/syncv3_linux_amd64&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sollte sich die Datei als &amp;lt;code&amp;gt;./bin/syncv3&amp;lt;/code&amp;gt; wiederfinden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Wir legen eine Environment-Datei an. In diesem Beispiel: &amp;lt;code&amp;gt;config/config.env&amp;lt;/code&amp;gt;. Dies sind die wichtigsten Einstellungen – bitte vor ausprobieren anpassen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
SYNCV3_SECRET=$(cat $HOME/.secret)&lt;br /&gt;
SYNCV3_SERVER=https://matrix.meinedomain.de&lt;br /&gt;
SYNCV3_DB=&amp;quot;user=xyz00_syncv3 dbname=xyz00_syncv3 sslmode=disable host=localhost password=sicherespasswort&amp;quot;&lt;br /&gt;
SYNCV3_BINDADDR=0.0.0.0:32804&lt;br /&gt;
SYNCV3_LOG_LEVEL=warn&lt;br /&gt;
# Prometheus&lt;br /&gt;
# SYNCV3_PROM=0.0.0.0:8882&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlt noch das Secret, das wir oben aus einer Datei lesen lassen wollen. Das Secret darf nicht gelöscht werden. Andernfalls muss die Datenbank zurückgesetzt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo -n &amp;quot;$(openssl rand -hex 32)&amp;quot; &amp;gt; $HOME/.secret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== .htaccess anpassen ===&lt;br /&gt;
Ähnlich wie für Synapse oben, scheint das Folgende direkt zu funktionieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* http://localhost:32804%{REQUEST_URI} [NE,proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starten ===&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;~/.config/systemd/user/syncv3.service&amp;lt;/code&amp;gt; schreiben wir den folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; lines&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Matrix SyncV3 Proxy&lt;br /&gt;
After=postgresql.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h&lt;br /&gt;
EnvironmentFile=%h/config/config.env&lt;br /&gt;
ExecStart=%h/bin/syncv3&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sicherheitshalber jetzt noch einmal &amp;lt;code&amp;gt;export XDG_RUNTIME_DIR=/run/user/$UID&amp;lt;/code&amp;gt; damit wir systemd auch steuern können und dann: &amp;lt;code&amp;gt;systemctl enable --user --now syncv3&amp;lt;/code&amp;gt;. Logs können beispielsweise mittels &amp;lt;code&amp;gt;journalctl --user -xefu syncv3&amp;lt;/code&amp;gt; betrachtet werden.&lt;br /&gt;
&lt;br /&gt;
=== Auffindbar machen ===&lt;br /&gt;
Moderne Anwendungen wie Element X erwarten automatisch zu erkennen, ob syncv3 Support vorhanden ist. Hierfür müssen wir die well-known für die Hauptdomain des Matrixservers ergänzen. Also den &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt; des Synapse servers.&lt;br /&gt;
&lt;br /&gt;
Konkret muss &amp;lt;code&amp;gt;/.well-known/matrix/client&amp;lt;/code&amp;gt; auf das Folgende erweitert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;org.matrix.msc3575.proxy&amp;quot;: {&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;https://syncv3.meinedomain.de&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* https://matrix.org/docs/projects/server/synapse &lt;br /&gt;
* https://github.com/element-hq/synapse&lt;br /&gt;
* https://github.com/element-hq/synapse/blob/master/INSTALL.md&lt;br /&gt;
* https://github.com/matrix-org/sliding-sync&lt;br /&gt;
* https://matrix.org/docs/spec/&lt;br /&gt;
* https://www.hostsharing.net/loesungen/matrix/&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/synapse&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/element&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6902</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=6902"/>
		<updated>2024-08-12T10:11:16Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-27.1.2.zip&lt;br /&gt;
unzip nextcloud-27.1.2.zip &lt;br /&gt;
rm nextcloud-27.1.2.zip&lt;br /&gt;
mkdir data tmp&lt;br /&gt;
chmod 700 data tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;$HOME/doms/cloud.example.org/fastcgi-ssl/&amp;quot; eine Datei &amp;quot;php.ini&amp;quot; anlegen mit folgendem Inhalt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
memory_limit=512M&lt;br /&gt;
session.save_path=/home/pacs/xyz00/users/cloud/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann mit einem Editor diese Datei bearbeiten: In der zweiten Zeile den korrekten Pfad des vorher angelegten tmp-Verzeichnisses eintragen.&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://cloud.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
Auf der ersten Seite sind anzugeben:&lt;br /&gt;
&lt;br /&gt;
* Login und Passwort für den Administrator definieren&lt;br /&gt;
* PostgreSQL als Datenbanksystem&lt;br /&gt;
* PostgreSQL-User und Passwort aus dem ersten Schritt oben&lt;br /&gt;
* Name der PostgreSQL-Datenbank aus dem ersten Schritt&lt;br /&gt;
* &amp;quot;localhost&amp;quot; als Datenbankserver (Nextcloud 23.0.2 empfiehlt hier die Angabe des Ports, diesen also lt. [[PostgreSQL]] angeben)&lt;br /&gt;
* Das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/data/&amp;quot; als Daten-Verzeichnis (bitte beachten: das im Eingabefeld voreingestellte verweist auf das Verzeichnis &amp;quot;/home/pacs/xyz00/users/cloud/&#039;&#039;&#039;nextcloud&#039;&#039;&#039;/data/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Die Felder für die Datenbank sind auf dem Startscreen hinter einem unscheinbaren Link versteckt. Um man das Formular für die Datenbank-Daten zu gelangen, muss man auf den Link klicken. Anschließend kann man die gewünschte Datenbank auswählen und die entsprechenden Daten eintragen. &#039;&#039;&#039;Das sollte geschehen, bevor man die Installation abschließt!&#039;&#039;&#039; Tut man dies nicht, wird Nextcloud mit SQLite installiert. Eine Änderung der Datenbank soll zwar laut Dokumentation auch später noch möglich sein, ging aber bei einem Test schief.&lt;br /&gt;
&lt;br /&gt;
In der Konfigurationsdatei der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) lassen sich weitere Voreinstellungen treffen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;maintenance_window_start&#039; =&amp;gt; 1,    // Wartungsfenster ab 1:00 Uhr&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar,files&#039;,   // bei Start wird der Kalender gezeigt&lt;br /&gt;
&#039;default_phone_region&#039; =&amp;gt; &#039;DE&#039;,     // Format Telefonnummern&lt;br /&gt;
&#039;default_language&#039; =&amp;gt; &#039;de&#039;,         // Sprache deutsch&lt;br /&gt;
&#039;force_language&#039; =&amp;gt; &#039;de&#039;,&lt;br /&gt;
&#039;default_locale&#039; =&amp;gt; &#039;de_DE&#039;,        // Locale (Formatierung Zeitangaben etc.) &lt;br /&gt;
&#039;force_locale&#039; =&amp;gt; &#039;de_DE&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@example.com&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== Virenscanner ==&lt;br /&gt;
&lt;br /&gt;
Einige Nutzer wollen die Dateien in Ihrer Nextcloud regelmäßig auf Viren überprüfen. Auf unseren Servern steht dafür der OpenSource-Virenscanner &amp;quot;ClamAV&amp;quot; zur Verfügung. Wenn dieser Scanner benutzt wird, dann sollten die Einstellungen so gewählt sein, dass der ClamAV-Daemon über eine Socket Verbindung angesprochen wird. Die Einstellungen sind im Screenshot dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Nextcloud-ClamAV-Einstellungen.png||nextcloud einstellungen für die virenscanner-app]]&lt;br /&gt;
&lt;br /&gt;
== Volltextsuche ==&lt;br /&gt;
&lt;br /&gt;
Über die Dokumente einer Nextcloud kann ein Volltextindex erstellt werden. Die Volltextsuche ermöglicht über den Index eine Suche über beliebige Begriffe, die in Dokumenten vorkommen.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist der Betrieb eines Elasticsearch Servers. Der Betrieb im Managed Webspace erfodert die Buchung von zwei &amp;quot;Serverdiensten&amp;quot;. Nutzer eines Managed Server müssen mit einem spürbaren Mehrbedarf an Hauptspeicher rechnen.&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Elasticsearch existiert eine eigene Wikiseite: [[Elasticsearch]].&lt;br /&gt;
&lt;br /&gt;
In der Nextcloud sind folgende &#039;&#039;Apps&#039;&#039; zu installieren:&lt;br /&gt;
* Full Text Search&lt;br /&gt;
* Full Text Search - Elasticsearch Platform&lt;br /&gt;
* Full Text Search - Files&lt;br /&gt;
&lt;br /&gt;
nach der Installation der drei Apps steht in den Einstellungen ein neuer Menüpunkt &amp;quot;Volltextsuche&amp;quot; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Hier ist einzustellen:&lt;br /&gt;
* Suchplattform: Elasticsearch&lt;br /&gt;
* Adresse des Servlets: http://elastic:das-erzeugt-passwort@127.0.0.1:39200&lt;br /&gt;
* Index: frei-gewaehlter-name-idx&lt;br /&gt;
* Analyzer tokenizer: standard&lt;br /&gt;
&lt;br /&gt;
Die anderen Einstellung nach den eigenen Vorstellungen vornehmen.&lt;br /&gt;
&lt;br /&gt;
Der initiale Aufbau des Suchindex erfolgt über ein &amp;quot;occ&amp;quot;-Kommando auf der Shell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:index --output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/updater&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten außerdem ein paar Routine-Aufräumarbeiten durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So können die Apps noch alle aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ app:update --all -n --no-ansi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für weitere Informationen kann auf die offizielle Doku ab Ziffer 2. zurückgegriffen werden.&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html#using-the-command-line-based-updater https://docs.nextcloud.com]&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein kurzes Video, das die Anmeldung über die Kommandozeile mit Putty erklärt und die Aktualisierung von Nextcloud auf der Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
* [https://tube.solidcharity.net/w/0cf5ee97-ba7c-41df-a56f-8d1fea842ab0 Nextcloud auf der Kommandozeile aktualisieren]&lt;br /&gt;
&lt;br /&gt;
== Wartungsmodus per Shell ein- oder ausschalten ==&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus angeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann der Wartungsmodus wieder ausgeschaltet werden, d.h. die Nextcloud ist dann wieder in Betrieb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Webfrontend-Updater Probleme / Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Datenbank: Indizes | Primärschlüssel | Konvertierungen ===&lt;br /&gt;
&lt;br /&gt;
Aufgetreten nach erfolgtem Versionsupdate Nextcloud 19 auf Nextcloud 20&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Update lädt automatisch die Seite: &#039;&#039;&#039;Sicherheits- und Einrichtungswarnungen&#039;&#039;&#039; auf dieser wird angemerkt, dass manuelle Schritte für die Datenbank durchzuführen sind. Dies betrifft Indizes, Primärschlüssel und Konvertierungen. &lt;br /&gt;
&lt;br /&gt;
Per Shell in der directory /nextcloud folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-columns --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices --no-interaction&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier dem durch Nextcloud angegebenen Kommando ein &#039;&#039;&#039;php&#039;&#039;&#039; voranzustellen.&lt;br /&gt;
&lt;br /&gt;
== Update per Skript ==&lt;br /&gt;
&lt;br /&gt;
Es ist möglich die regelmäßigen Updates weitgehend zu automatisieren. Ein Skript wäre etwa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
  echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
  cd $HOME/nextcloud;&lt;br /&gt;
  php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
  php occ maintenance:mode --on&lt;br /&gt;
  php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
  php occ db:add-missing-columns --no-interaction&lt;br /&gt;
  php occ db:add-missing-indices --no-interaction&lt;br /&gt;
  php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
  php occ app:update --all&lt;br /&gt;
  php occ maintenance:mode --off&lt;br /&gt;
else &lt;br /&gt;
  echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update: bei old-stable Version bleiben ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise fragt jede Nextcloud Instanz zentral ab, welches Update zur Verfügung steht, abhängig vom Release Channel. Dabei wird aber relativ schnell auf die nächste Version gewechselt, also z.B. von Nextcloud 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Einschränkende Bemerkungen =&lt;br /&gt;
== Nextcloud Sync Client ==&lt;br /&gt;
&lt;br /&gt;
Der Nextcloud Sync Client erfüllt eine Funktion ähnlich wie Dropbox, und synchronisiert ganze Ordnerstrukturen. &lt;br /&gt;
&lt;br /&gt;
Gerade wenn man mit mehreren Menschen in einer Nextcloud arbeitet, ist diese Funktion mit Vorsicht zu benutzen.&lt;br /&gt;
&lt;br /&gt;
* Änderungen an der Ordnerstruktur sollten nicht lokal, sondern im Webbrowser vorgenommen werden.&lt;br /&gt;
* Wenn die Gefahr besteht, dass mehrere Menschen gleichzeitig eine Datei bearbeiten, sollte die Datei nicht lokal, sondern im Webbrowser bearbeitet werden.&lt;br /&gt;
* Aus Sicht des Datenschutzes und der Daten-Minimierung sollte überlegt werden, ob die Daten wirklich auf jeden Laptop und Rechner synchronisiert werden sollen, oder ob es reicht, ausschließlich über den Webbrowser auf die Daten zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://docs.nextcloud.com/ Nextcloud Dokumentation]&lt;br /&gt;
* [https://apps.nextcloud.com/ Nextcloud Erweiterungen (&amp;quot;Apps&amp;quot;)]&lt;br /&gt;
* [https://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=HS-Mailrouting&amp;diff=6873</id>
		<title>HS-Mailrouting</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=HS-Mailrouting&amp;diff=6873"/>
		<updated>2024-07-23T11:44:31Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundsätze ==&lt;br /&gt;
&lt;br /&gt;
* Nur der Hive (xyz00.hostsharing.net) des Benutzers nimmt Mails per SMTP-Auth an (Postausgangsserver).&lt;br /&gt;
* Nur der Hive (xyz00.hostsharing.net) des Benutzers bietet eingegangene Mails per POP3 oder IMAP an (Posteingangsserver).&lt;br /&gt;
* Alle Mails von extern an Domains, die bei Hostsharing gehostet sind, erreichen Hostsharing über mailin{1,2,3}.&lt;br /&gt;
* Alle Mails nach extern verlassen Hostsharing über mailout{1,2,3}.&lt;br /&gt;
&lt;br /&gt;
* Interne Mails gehen über mailout{1,2,3} nach mailin{1,2,3}.&lt;br /&gt;
&lt;br /&gt;
== Ausgehende Mails ==&lt;br /&gt;
&lt;br /&gt;
Mails, die lokal erzeugt werden (Kommandozeile, Anwendung) auf einem&lt;br /&gt;
HS-Server, werden an [[mailout]]{1,2,3}.hostsharing.net weitergeleitet. Von&lt;br /&gt;
dort werden sie weiter zugestellt.&lt;br /&gt;
&lt;br /&gt;
Entsprechendes gilt für Mails, die per SMTP-Auth auf den Hives&lt;br /&gt;
eingeliefert werden:&lt;br /&gt;
&lt;br /&gt;
* (Benutzer =&amp;gt;) Hive =&amp;gt; mailout{1,2,3} =&amp;gt; extern&lt;br /&gt;
&lt;br /&gt;
== Eingehende Mails ==&lt;br /&gt;
&lt;br /&gt;
Mails, die von extern für einen Empfänger bei Hostsharing eingeliefert&lt;br /&gt;
werden, werden von [[mailin]]{1,2,3}.hostsharing.net entgegen genommen, an&lt;br /&gt;
den [[Hive]] des Empfängers weitergeleitet und dort zugestellt.&lt;br /&gt;
&lt;br /&gt;
Auf dem Hive können die Mails weitergeleitet, verarbeitet oder abgelegt&lt;br /&gt;
und per POP3 oder IMAP abgeholt werden.&lt;br /&gt;
&lt;br /&gt;
* extern =&amp;gt; mailin{1,2,3} =&amp;gt; Hive (=&amp;gt; Benutzer)&lt;br /&gt;
&lt;br /&gt;
(Sonderfall: Ist keine E-Mail-Adresse für die Empänger-Domain konfiguriert, aber ein MX mit höherer Priorität (10) als&lt;br /&gt;
{1,2,3}.hostsharing.net durch ein eigenes [[Verwalten der Zonendaten|Zonefile]] für die Domain spezifiziert, so wird die E-Mail&lt;br /&gt;
an den Mailserver mit höherer Priorität weitergeleitet. Dies bietet interessante Gestaltungsmöglichkeiten für Betreiber eigener Mailserver.)&lt;br /&gt;
&lt;br /&gt;
* extern =&amp;gt; externer Mailserver&lt;br /&gt;
* extern =&amp;gt; mailin{1,2,3} =&amp;gt; externer Mailserver (BackupMX-Funktion)&lt;br /&gt;
&lt;br /&gt;
== Mail Relay mit eigenen Mailservern ==&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration des Mailservers muss der Hostname des Webpakets (xyz00.hostsharing.net im Falle des Pakets xyz00) eingetragen werden. Ferner ist sicherzustellen, dass der einliefernde Mailserver keinen MX Lookup für diesen Hostnamen vornimmt.&lt;br /&gt;
&lt;br /&gt;
Ist dies nicht gewährleistet, so wird der eigene Mailserver versuchen, ausgehende E-Mails für externe Domains an unsere Maileingangsserver zu übergeben, welche diese mit &amp;quot;Relay access denied&amp;quot; abweisen werden.&lt;br /&gt;
&lt;br /&gt;
Siehe: https://lists.hostsharing.net/archiv/global-announce/2012-October/000566.html&lt;br /&gt;
&lt;br /&gt;
=== Beispiel mit Postfix ===&lt;br /&gt;
Hat man einen eigenen funktionierenden Postfix-Mailserver laufen, kann man Mails über seinen Hostsharing-Account versenden. Elemente der Konfiguration sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cfg line&amp;gt;&lt;br /&gt;
# /etc/postfix/main.cf&lt;br /&gt;
relayhost = [xyz00.hostsharing.net]:465&lt;br /&gt;
smtp_sasl_password_maps = hash:/etc/postfix/saslpass&lt;br /&gt;
smtp_sasl_auth_enable = yes&lt;br /&gt;
smtp_tls_security_level = encrypt&lt;br /&gt;
smtp_sasl_security_options = noanonymous&lt;br /&gt;
smtp_tls_wrappermode = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
# /etc/postfix/saslpass&lt;br /&gt;
[xyz00.hostsharing.net]:465 xyz00:MeinGeheimesPasswort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Hostname in &#039;&#039;&#039;beiden&#039;&#039;&#039; Dateien in eckigen Klammern, entsprechend o.g. MX-Themas.)&lt;br /&gt;
&lt;br /&gt;
Nach Änderung/Erstellung folgendes ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
postmap /etc/postfix/saslpass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Postfix Konfiguration neu laden (entsprechend, wenn nicht systemd):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemctl reload postfix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tipps:&lt;br /&gt;
* Alphanumerisches Passwort verwenden. (Just sayin&#039;...)&lt;br /&gt;
* Tests mehrfach durchführen und sehen ob Fehlermeldung gleich bleibt. (Verbindungsabbrüche passieren.) &lt;br /&gt;
&lt;br /&gt;
Nicht vergessen den SPF-Record zu setzen und die TTL abzuwarten... ;) z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
v=spf1 include:spf.hostsharing.net -all &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6872</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6872"/>
		<updated>2024-07-23T10:16:02Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Mehrere Mailinglisten betreiben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für &amp;quot;Mailing List Management Made Joyful&amp;quot;, ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese veilleicht auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Eine leistungsfähigere Alternative zu mlmmj könnte [[Mailman_3_installieren|Mailman 3]] sein.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen  ==&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert. (Wer die Software selbst kompilieren möchte kann aktuellen Source-Code bei [https://codeberg.org/mlmmj/mlmmj|codeberg.org] finden.)&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung heißt das Paket &#039;&#039;xyz00&#039;&#039; und der für Mailinglisten eingesetzte User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll &#039;&#039;discuss@example.org&#039;&#039; sein. Den lokalen Teil dieser Adresse, &#039;&#039;discuss&#039;&#039;, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: &#039;&#039;mlmmj&#039;&#039; wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. &#039;&#039;discuss+help@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain &#039;&#039;example.org&#039;&#039; muss dazu bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; [[aufgeschaltet]] sein. (&amp;quot;Aufgeschaltet&amp;quot; bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser &#039;&#039;xyz00&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Im Shell kann ich dann durch den Befehl &#039;&#039;hsscript -i&#039;&#039; das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h03:~$ hsscript -i&lt;br /&gt;
Password: *************&lt;br /&gt;
xyz00@hsadmin&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039; werden User und E-Mail-Adresse angelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter &amp;quot;target&amp;quot; wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.&lt;br /&gt;
&lt;br /&gt;
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript &#039;&#039;mlmmj-make-ml&#039;&#039; fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
The Domain for the List? [] : example.org&lt;br /&gt;
The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
For the list texts you can choose between the following languages or&lt;br /&gt;
give an absolute path to a directory containing the texts.&lt;br /&gt;
Available languages:&lt;br /&gt;
cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
The path to texts for the list? [en] : de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skript &#039;&#039;mlmmj-make-ml&#039;&#039; legt daraufhin unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Ja, &#039;&#039;receive&#039;&#039; schreibt sich mit &#039;&#039;-ei-&#039;&#039;, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*&lt;br /&gt;
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive&lt;br /&gt;
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -&amp;gt; mlmmj-receive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm &#039;&#039;mlmmj-recieve&#039;&#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
[[Cron|crontab]] wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h03:~$ crontab -e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
MAILTO=webmaster@example.org&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
== weitere Optionen  ==&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Listen-Owner weitere Abonnements bestätigen muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Massenversand, z.B. bei Newslettern, nutzen Sie bitte möglichst den dedizierten Postausgangsserver für den Massenversand. Dadurch tragen Sie dazu bei, die Reputation unserer regulären Ausgangsserver aufrechtzuerhalten.&lt;br /&gt;
&lt;br /&gt;
Um dies zu tun, setzen Sie den SMTP-Port entsprechend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;4025&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
=== Achtung: DKIM ===&lt;br /&gt;
&lt;br /&gt;
Mlmmj gibt die Möglichkeit, mit &#039;&#039;&#039;delheaders&#039;&#039;&#039; und &#039;&#039;&#039;customheaders&#039;&#039;&#039; die Header der durchgeleiteten Mail umfangreich zu ändern. Allerdings tragen Mails heute häufig kryptografische Signaturen der sendenden Mailserver. Eine DKIM-Signatur sichert damit in der Regel die Integrität des Body der Mail sowie der Header &#039;&#039;Subject:&#039;&#039;, &#039;&#039;From:&#039;&#039;, &#039;&#039;To:&#039;&#039;, &#039;&#039;Date:&#039;&#039;, &#039;&#039;From&#039;&#039;, und oft auch &#039;&#039;Reply-To:&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Wird zum Beispiel mit einem Prefix das Subject geändert oder ein Footer angehängt, macht dies die DKIM-Signatur ungültig. Das ist für viele Mailprovider ein Grund die Nachricht abzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Zur Konfiguration im Browser ==&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte.  Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ (noch besser: Download des aktuellen Debian-Pakets von [https://packages.debian.org/bookworm/all/mlmmj-php-web-admin/download debian.org]: da sind einige veraltete PHP-Ausdrücke schon herausgepatcht) und diese in einem temporären Verzeichnis entpacken (mit tar oder dpkg-deb).&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot;, oder beim .deb-Paket unter &amp;quot;usr/share/mlmmj-...&amp;quot;, findet sich die PHP-Admin-Anwendung. Also ...&lt;br /&gt;
&lt;br /&gt;
* den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen;&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben;&lt;br /&gt;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Require valid-user&lt;br /&gt;
AuthType Basic&lt;br /&gt;
AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
* Ein Passwort angeben.&lt;br /&gt;
&lt;br /&gt;
Nun enthält diese PHP-Anwendung, wenn man sie nicht dem Debian-Paket entnommen hat, leider noch eine Zeile, die schon seit PHP 7 nicht mehr lauffähig ist. Also muß man noch&lt;br /&gt;
&lt;br /&gt;
* in &amp;lt;tt&amp;gt;.../htdocs-ssl/index.php&amp;lt;/tt&amp;gt; folgende Änderung vornehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=diff line&amp;gt;&lt;br /&gt;
@@ -38,4 +38,5 @@&lt;br /&gt;
 # use scandir to have alphabetical order &lt;br /&gt;
 foreach (scandir($topdir) as $file) {&lt;br /&gt;
-    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+# ereg obsolete!! Vormals:    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+    if (!preg_match(&#039;/^\./&#039;,$file))&lt;br /&gt;
     {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und das Ergebnis auf https://lists.example.org anschauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
|/usr/bin/procmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
VERBOSE=yes&lt;br /&gt;
LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
DEFAULT&lt;br /&gt;
 &lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
:0&lt;br /&gt;
{ EXITCODE 67 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte dafür sorgen, dass das Verzeichnis &#039;&#039;/home/pacs/xyz00/users/list/var&#039;&#039; existiert.&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
===Groß- und Kleinschreibung===&lt;br /&gt;
&lt;br /&gt;
Achtung, mit der Groß- und Kleinschreibung von Listennamen gibt es bei dieser Procmail-Lösung eine kleine Tücke. Procmail übernimmt in die Variable $MATCH genau die in der X-Original-To-Headerzeile vorgefundene Schreibweise, und diese kann denkbarerweise &amp;quot;Listen-Name&amp;quot; oder &amp;quot;listen-name&amp;quot; oder &amp;quot;Listen-name&amp;quot; sein. &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen &amp;lt;tt&amp;gt;${HOME}/mlmmj/listen-name&amp;lt;/tt&amp;gt; vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
&lt;br /&gt;
Eine teilweise Lösung besteht darin, den Listennamen in dem &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt;-Aufruf in der &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!&lt;br /&gt;
&lt;br /&gt;
(Man kann auch in &amp;lt;tt&amp;gt;${HOME}/mlmmj/&amp;lt;/tt&amp;gt; durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output&amp;gt;&lt;br /&gt;
xyz00-list@h02:~$ ls -lA mlmmj/&lt;br /&gt;
total 8&lt;br /&gt;
-rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess&lt;br /&gt;
lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -&amp;gt; Mitglieder&lt;br /&gt;
drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
&lt;br /&gt;
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge &amp;lt;tt&amp;gt;,,&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;.) Dann ist &amp;lt;tt&amp;gt;$(echo ${MATCH} | tr [:upper:] [:lower:])&amp;lt;/tt&amp;gt; gleichbedeutend mit &amp;lt;tt&amp;gt;${MATCH,,}&amp;lt;/tt&amp;gt;. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
SHELLMETAS=&amp;amp;|&amp;lt;&amp;gt;~;?*[{&lt;br /&gt;
HOMEDIR= ...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Tücke ist, daß procmail den in SHELL angegebenen Shell nur dann verwendet, wenn die Befehlszeile eines der in SHELLMETAS angegebenen Zeichen enthält. Und das &#039;|&#039; am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;, das den Einsatz von Bash auslöst.&lt;br /&gt;
&lt;br /&gt;
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* [https://web.archive.org/web/20221228110514/https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ (via web.archive.org)] Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash&lt;br /&gt;
* Ein Self-Service zum Subscriben/Unsubscriben lässt sich in Form von Mail-to-Links in Webseiten einbinden. Beispiele gibt es bei Hostsharing für die öffentlichen &amp;quot;public&amp;quot;-Mailinglisten: https://www.hostsharing.net/lists/public-discussion/ . Alternativ auf https://github.com/hblasum/mlmmj-php-web-simplified ein Webfrontend mit dem sich Benutzerinnen und Benutzer selbst ein-/austragen können (Vereinfachung von mlmmj-php-web von Christoph Thiel).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6871</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6871"/>
		<updated>2024-07-23T10:13:06Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* weitere Optionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für &amp;quot;Mailing List Management Made Joyful&amp;quot;, ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese veilleicht auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Eine leistungsfähigere Alternative zu mlmmj könnte [[Mailman_3_installieren|Mailman 3]] sein.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen  ==&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert. (Wer die Software selbst kompilieren möchte kann aktuellen Source-Code bei [https://codeberg.org/mlmmj/mlmmj|codeberg.org] finden.)&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung heißt das Paket &#039;&#039;xyz00&#039;&#039; und der für Mailinglisten eingesetzte User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll &#039;&#039;discuss@example.org&#039;&#039; sein. Den lokalen Teil dieser Adresse, &#039;&#039;discuss&#039;&#039;, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: &#039;&#039;mlmmj&#039;&#039; wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. &#039;&#039;discuss+help@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain &#039;&#039;example.org&#039;&#039; muss dazu bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; [[aufgeschaltet]] sein. (&amp;quot;Aufgeschaltet&amp;quot; bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser &#039;&#039;xyz00&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Im Shell kann ich dann durch den Befehl &#039;&#039;hsscript -i&#039;&#039; das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h03:~$ hsscript -i&lt;br /&gt;
Password: *************&lt;br /&gt;
xyz00@hsadmin&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039; werden User und E-Mail-Adresse angelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter &amp;quot;target&amp;quot; wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.&lt;br /&gt;
&lt;br /&gt;
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript &#039;&#039;mlmmj-make-ml&#039;&#039; fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
The Domain for the List? [] : example.org&lt;br /&gt;
The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
For the list texts you can choose between the following languages or&lt;br /&gt;
give an absolute path to a directory containing the texts.&lt;br /&gt;
Available languages:&lt;br /&gt;
cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
The path to texts for the list? [en] : de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skript &#039;&#039;mlmmj-make-ml&#039;&#039; legt daraufhin unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Ja, &#039;&#039;receive&#039;&#039; schreibt sich mit &#039;&#039;-ei-&#039;&#039;, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*&lt;br /&gt;
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive&lt;br /&gt;
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -&amp;gt; mlmmj-receive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm &#039;&#039;mlmmj-recieve&#039;&#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
[[Cron|crontab]] wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h03:~$ crontab -e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
MAILTO=webmaster@example.org&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
== weitere Optionen  ==&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Listen-Owner weitere Abonnements bestätigen muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Massenversand, z.B. bei Newslettern, nutzen Sie bitte möglichst den dedizierten Postausgangsserver für den Massenversand. Dadurch tragen Sie dazu bei, die Reputation unserer regulären Ausgangsserver aufrechtzuerhalten.&lt;br /&gt;
&lt;br /&gt;
Um dies zu tun, setzen Sie den SMTP-Port entsprechend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;4025&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
=== Achtung: DKIM ===&lt;br /&gt;
&lt;br /&gt;
Mlmmj gibt die Möglichkeit, mit &#039;&#039;&#039;delheaders&#039;&#039;&#039; und &#039;&#039;&#039;customheaders&#039;&#039;&#039; die Header der durchgeleiteten Mail umfangreich zu ändern. Allerdings tragen Mails heute häufig kryptografische Signaturen der sendenden Mailserver. Eine DKIM-Signatur sichert damit in der Regel die Integrität des Body der Mail sowie der Header &#039;&#039;Subject:&#039;&#039;, &#039;&#039;From:&#039;&#039;, &#039;&#039;To:&#039;&#039;, &#039;&#039;Date:&#039;&#039;, &#039;&#039;From&#039;&#039;, und oft auch &#039;&#039;Reply-To:&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Wird zum Beispiel mit einem Prefix das Subject geändert oder ein Footer angehängt, macht dies die DKIM-Signatur ungültig. Das ist für viele Mailprovider ein Grund die Nachricht abzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Zur Konfiguration im Browser ==&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte.  Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ (noch besser: Download des aktuellen Debian-Pakets von [https://packages.debian.org/bookworm/all/mlmmj-php-web-admin/download debian.org]: da sind einige veraltete PHP-Ausdrücke schon herausgepatcht) und diese in einem temporären Verzeichnis entpacken (mit tar oder dpkg-deb).&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot;, oder beim .deb-Paket unter &amp;quot;usr/share/mlmmj-...&amp;quot;, findet sich die PHP-Admin-Anwendung. Also ...&lt;br /&gt;
&lt;br /&gt;
* den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen;&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben;&lt;br /&gt;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Require valid-user&lt;br /&gt;
AuthType Basic&lt;br /&gt;
AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
* Ein Passwort angeben.&lt;br /&gt;
&lt;br /&gt;
Nun enthält diese PHP-Anwendung, wenn man sie nicht dem Debian-Paket entnommen hat, leider noch eine Zeile, die schon seit PHP 7 nicht mehr lauffähig ist. Also muß man noch&lt;br /&gt;
&lt;br /&gt;
* in &amp;lt;tt&amp;gt;.../htdocs-ssl/index.php&amp;lt;/tt&amp;gt; folgende Änderung vornehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=diff line&amp;gt;&lt;br /&gt;
@@ -38,4 +38,5 @@&lt;br /&gt;
 # use scandir to have alphabetical order &lt;br /&gt;
 foreach (scandir($topdir) as $file) {&lt;br /&gt;
-    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+# ereg obsolete!! Vormals:    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+    if (!preg_match(&#039;/^\./&#039;,$file))&lt;br /&gt;
     {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und das Ergebnis auf https://lists.example.org anschauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 |/usr/bin/procmail&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/sh&lt;br /&gt;
 HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
 PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 VERBOSE=yes&lt;br /&gt;
 LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
 DEFAULT&lt;br /&gt;
 &lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
 :0&lt;br /&gt;
 { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
Bitte dafür sorgen, dass das Verzeichnis &#039;&#039;/home/pacs/xyz00/users/list/var&#039;&#039; existiert.&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
===Groß- und Kleinschreibung===&lt;br /&gt;
&lt;br /&gt;
Achtung, mit der Groß- und Kleinschreibung von Listennamen gibt es bei dieser Procmail-Lösung eine kleine Tücke. Procmail übernimmt in die Variable $MATCH genau die in der X-Original-To-Headerzeile vorgefundene Schreibweise, und diese kann denkbarerweise &amp;quot;Listen-Name&amp;quot; oder &amp;quot;listen-name&amp;quot; oder &amp;quot;Listen-name&amp;quot; sein. &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen &amp;lt;tt&amp;gt;${HOME}/mlmmj/listen-name&amp;lt;/tt&amp;gt; vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
&lt;br /&gt;
Eine teilweise Lösung besteht darin, den Listennamen in dem &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt;-Aufruf in der &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/&lt;br /&gt;
&lt;br /&gt;
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!&lt;br /&gt;
&lt;br /&gt;
(Man kann auch in &amp;lt;tt&amp;gt;${HOME}/mlmmj/&amp;lt;/tt&amp;gt; durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h02:~$ ls -lA mlmmj/&lt;br /&gt;
  total 8&lt;br /&gt;
  -rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess&lt;br /&gt;
  lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -&amp;gt; Mitglieder&lt;br /&gt;
  drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
&lt;br /&gt;
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge &amp;lt;tt&amp;gt;,,&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;.) Dann ist &amp;lt;tt&amp;gt;$(echo ${MATCH} | tr [:upper:] [:lower:])&amp;lt;/tt&amp;gt; gleichbedeutend mit &amp;lt;tt&amp;gt;${MATCH,,}&amp;lt;/tt&amp;gt;. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/bash&lt;br /&gt;
 SHELLMETAS=&amp;amp;|&amp;lt;&amp;gt;~;?*[{&lt;br /&gt;
 HOMEDIR= ...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/&lt;br /&gt;
 &lt;br /&gt;
Die Tücke ist, daß procmail den in SHELL angegebenen Shell nur dann verwendet, wenn die Befehlszeile eines der in SHELLMETAS angegebenen Zeichen enthält. Und das &#039;|&#039; am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;, das den Einsatz von Bash auslöst.&lt;br /&gt;
&lt;br /&gt;
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* [https://web.archive.org/web/20221228110514/https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ (via web.archive.org)] Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash&lt;br /&gt;
* Ein Self-Service zum Subscriben/Unsubscriben lässt sich in Form von Mail-to-Links in Webseiten einbinden. Beispiele gibt es bei Hostsharing für die öffentlichen &amp;quot;public&amp;quot;-Mailinglisten: https://www.hostsharing.net/lists/public-discussion/ . Alternativ auf https://github.com/hblasum/mlmmj-php-web-simplified ein Webfrontend mit dem sich Benutzerinnen und Benutzer selbst ein-/austragen können (Vereinfachung von mlmmj-php-web von Christoph Thiel).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Vorlage:Kerndoku&amp;diff=6868</id>
		<title>Vorlage:Kerndoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Vorlage:Kerndoku&amp;diff=6868"/>
		<updated>2024-07-15T11:48:14Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Verwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Diese Vorlage dient dazu einen Verweis auf eine Seite in der Kerndoku zu setzen.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Um einen Hinweis auf die Kerndoku zu setzen, gib einfach am Anfang der Seite folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;{{Kerndoku|Link|Optionaler Text}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch erscheint folgender Hinweis:&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen|Dieses Thema in der technischen Dokumentation ([https://doc.hostsharing.net/ Kerndoku])| {{{1}}}&lt;br /&gt;
{{{2|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Kategorie:Textkasten]]&lt;br /&gt;
[[Kategorie:Vorlage]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Textgestaltung&amp;diff=6867</id>
		<title>Textgestaltung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Textgestaltung&amp;diff=6867"/>
		<updated>2024-07-15T11:44:25Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite erklärt, wie du in Wiki-Syntax Überschriften, Listen und Absätze erzeugst und Textstellen formatierst. Durch Überschriften wird ein automatisches Inhaltsverzeichnis erzeugt. Hier ist die Hilfe für [[Hilfe:Tabellen|Tabellen]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Wie es dargestellt wird&lt;br /&gt;
!Was du schreibst&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Kursiv&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;fett&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;kursiv und fett&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&#039;&#039;Kursiv&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;fett&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;kursiv und fett&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;(Das sind mehrere Apostrophe [ganz genau genommen Zeichen für Fuß, keine Anführungszeichen und auch keine Akzente - drück Shift+#.)&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Du kannst Wörter &amp;lt;strike&amp;gt;durchstreichen&amp;lt;/strike&amp;gt; oder auch so&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;durchstreichen&amp;lt;/s&amp;gt; und &amp;lt;u&amp;gt;unterstreichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
|  style=&amp;quot;background:#EEEEEE;&amp;quot; | &lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;Du kannst Wörter &amp;lt;strike&amp;gt;durchstreichen&amp;lt;/strike&amp;gt; oder auch so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;durchstreichen&amp;lt;/s&amp;gt; und &amp;lt;u&amp;gt;unterstreichen&amp;lt;/u&amp;gt;.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
== Neuer Abschnitt ==&lt;br /&gt;
=== Unterabschnitt ===&lt;br /&gt;
==== Unter-Unterabschnitt ====&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=markdown line&amp;gt;&lt;br /&gt;
== Neuer Abschnitt ==&lt;br /&gt;
=== Unterabschnitt ===&lt;br /&gt;
==== Unter-Unterabschnitt ====&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ein einzelner Zeilenumbruch wird ignoriert.&lt;br /&gt;
&lt;br /&gt;
Aber durch eine leere Zeile wird ein neuer Absatz erzeugt.&lt;br /&gt;
&lt;br /&gt;
Ein Zeilenumbruch wird durch&amp;lt;br/&amp;gt;erzwungen. &#039;&#039;Dies sollte jedoch vermieden werden.&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;Ein einzelner Zeilenumbruch&lt;br /&gt;
wird ignoriert.&lt;br /&gt;
&lt;br /&gt;
Aber durch eine leere Zeile wird ein neuer&lt;br /&gt;
Absatz erzeugt.&lt;br /&gt;
&lt;br /&gt;
Ein Zeilenumbruch wird durch&amp;lt;br/&amp;gt;erzwungen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Listen sind praktisch:&lt;br /&gt;
** sie sorgen für Struktur&lt;br /&gt;
** sie sehen sauber aus&lt;br /&gt;
*** Man kann sie schachteln&lt;br /&gt;
* Das Listenzeichen (der Stern)&amp;lt;br/&amp;gt;muss das &lt;br /&gt;
erste Zeichen der Zeile sein.&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
* Listen sind praktisch:&lt;br /&gt;
** sie sorgen für Struktur&lt;br /&gt;
** sie sehen sauber aus&lt;br /&gt;
*** Man kann sie schachteln&lt;br /&gt;
* Das Listenzeichen (der Stern)&amp;lt;br/&amp;gt;muss das &lt;br /&gt;
erste Zeichen der Zeile sein.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
# Nummerierte Listen sind auch gut&lt;br /&gt;
## Genau so übersichtlich&lt;br /&gt;
## und einfach zu erzeugen&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=markdown line&amp;gt;&lt;br /&gt;
# Nummerierte Listen sind auch gut&lt;br /&gt;
## Genau so übersichtlich&lt;br /&gt;
## und einfach zu erzeugen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
; Definitionsliste : Liste von Definitionen&lt;br /&gt;
; Begriff : Definition des Begriffs&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
; Definitionsliste : Liste von Definitionen&lt;br /&gt;
; Begriff : Definition des Begriffs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
:Zeilen können&lt;br /&gt;
::eingerückt werden&lt;br /&gt;
:::sogar mehrfach&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
:Zeilen können&lt;br /&gt;
::eingerückt werden&lt;br /&gt;
:::sogar mehrfach&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Man kann Listen &lt;br /&gt;
*: und Einrückungen&lt;br /&gt;
*:: sogar mischen&lt;br /&gt;
*# und verschachteln&lt;br /&gt;
*#* so wie hier&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
* Man kann Listen&lt;br /&gt;
*: und Einrückungen&lt;br /&gt;
*:: sogar mischen&lt;br /&gt;
*# und verschachteln&lt;br /&gt;
*#* so wie hier&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 Wenn eine Zeile mit einem Leerzeichen beginnt,&lt;br /&gt;
&lt;br /&gt;
  wird sie genau so formatiert&lt;br /&gt;
    wie sie geschrieben wurde.&lt;br /&gt;
  Dabei wird ein Zeichensatz mit fester&lt;br /&gt;
  Zeichenbreite verwendet. Die&lt;br /&gt;
          Zeilen werden nicht umgebrochen.&lt;br /&gt;
 Das ist nützlich um:&lt;br /&gt;
  * vorformatierten Text einzufügen&lt;br /&gt;
  * Programmcode oder Algorithmen anzuzeigen&lt;br /&gt;
  * Diagramme mit Zeichen zu gestalten&lt;br /&gt;
  * einfache Tabellen zu erzeugen&lt;br /&gt;
&lt;br /&gt;
 VORSICHT: Wenn du die Zeilen zu lang machst,&lt;br /&gt;
 erzeugst du dadurch eine sehr breite Seite,&lt;br /&gt;
 die dadurch schlecht zu lesen ist.&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
 Wenn eine Zeile mit einem Leerzeichen beginnt,&lt;br /&gt;
  wird sie genau so formatiert&lt;br /&gt;
    wie sie geschrieben wurde.&lt;br /&gt;
  Dabei wird ein Zeichensatz mit fester&lt;br /&gt;
  Zeichenbreite verwendet. Die&lt;br /&gt;
          Zeilen werden nicht umgebrochen.&lt;br /&gt;
 Das ist nützlich um:&lt;br /&gt;
  * vorformatierten Text einzufügen&lt;br /&gt;
  * Programmcode oder Algorithmen anzuzeigen&lt;br /&gt;
  * Diagramme mit Zeichen zu gestalten&lt;br /&gt;
  * einfache Tabellen zu erzeugen&lt;br /&gt;
&lt;br /&gt;
 VORSICHT: Wenn du die Zeilen zu lang machst,&lt;br /&gt;
 erzeugst du dadurch eine sehr breite Seite,&lt;br /&gt;
 die dadurch schlecht zu lesen ist.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;Zentrierter Text.&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;Zentrierter Text.&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;Rechtsbündiger Text.&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;Rechtsbündiger Text.&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Eine waagrechte Linie: Text davor&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
und danach.&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;Eine waagrechte Linie: Text davor&lt;br /&gt;
----&lt;br /&gt;
und danach.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Etwas Text und ein &amp;lt;!-- unsichtbarer Kommentar --&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;Etwas Text und ein &amp;lt;!-- unsichtbarer Kommentar --&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[Wiki-Syntax]] die nicht [[Beachtung|beachtet]] wird&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#EEEEEE;&amp;quot; | &amp;lt;syntaxhighlight lang=html line&amp;gt;&amp;amp;lt;nowiki&amp;amp;gt;[[Wiki-Syntax]] die nicht&lt;br /&gt;
[[Beachtung|beachtet]] wird&amp;amp;lt;/nowiki&amp;amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=AWStats_installieren&amp;diff=6866</id>
		<title>AWStats installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=AWStats_installieren&amp;diff=6866"/>
		<updated>2024-07-15T11:37:55Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== AWStats ==&lt;br /&gt;
&lt;br /&gt;
AWStats ist ein Tool zur graphischen Auswertung von Logfiles.&lt;br /&gt;
&lt;br /&gt;
mehr Infos unter http://www.awstats.org/&lt;br /&gt;
&lt;br /&gt;
=== Vorarbeiten ===&lt;br /&gt;
&lt;br /&gt;
Als Paketadmin die Logfiles per Eintrag in die config.ini auf die entsprechende Domain verteilen (http_log_directory = domain)&lt;br /&gt;
&lt;br /&gt;
siehe [[Logging#Konfigurationsm.C3.B6glichkeiten|Traffic logs]].&lt;br /&gt;
&lt;br /&gt;
In HSAdmin (https://admin.hostsharing.net) wird eine Domain mit dem Namen stats.example.com angelegt und bei &amp;quot;Apache-Scripting-Optionen&amp;quot; wird die Option &amp;quot;CGI-Funktion&amp;quot; aktiviert.&lt;br /&gt;
&lt;br /&gt;
=== Download und Entpacken ===&lt;br /&gt;
&lt;br /&gt;
Login als Domainadmin, in unserem Fall heißt dieser xyz00-doms. Auf http://www.awstats.org/#DOWNLOAD findet sich die aktuelle Version. In unserem Beispiel verwenden wir die Version 7.9 und laden sie direkt mit wget ins Home-Verzeichnis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-doms:~$ wget http://prdownloads.sourceforge.net/awstats/awstats-7.9.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Datei entpacken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-doms:~$ tar -xvzf awstats-7.9.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die entpackten Ordner verteilen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/stats.example.com&lt;br /&gt;
mv ~/awstats-7.9/wwwroot/cgi-bin/ cgi-ssl/awstats&lt;br /&gt;
mv ~/awstats-7.9/wwwroot/icon htdocs-ssl&lt;br /&gt;
mv ~/awstats-7.9/wwwroot/js htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Rest kann wieder gelöscht werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm ~/awstats-7.9.tar.gz&lt;br /&gt;
rm -rf ~/awstats-7.9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Verzeichnis anlegen, in das awstats seine Daten schreiben kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/aw_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Config-Datei anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/stats.example.com/cgi-ssl/awstats&lt;br /&gt;
cp awstats.model.conf awstats.example.com.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Config-Datei zum Editieren öffnen, z.b. mit nano:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
nano awstats.example.com.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgende Einträge sind anzupassen:&lt;br /&gt;
&lt;br /&gt;
* LogFile=&amp;quot;gzip -cd /home/doms/example.com/var/web-example.com-%YYYY-0%MM-0%DD-0*|&amp;quot;&lt;br /&gt;
** oder wenn die Webseite über www läuft:&lt;br /&gt;
** LogFile=&amp;quot;gzip -cd /home/doms/example.com/var/web-www.example.com-%YYYY-0%MM-0%DD-0*|&amp;quot;&lt;br /&gt;
* SiteDomain=&amp;quot;example.com&amp;quot;&lt;br /&gt;
** oder wenn die Webseite über www läuft: SiteDomain=&amp;quot;www.example.com&amp;quot;&lt;br /&gt;
* HostAliases=&amp;quot;localhost 127.0.0.1 REGEX[example\.com$]&amp;quot;&lt;br /&gt;
* DirData=&amp;quot;/home/pacs/xyz00/aw_data/&amp;quot;&lt;br /&gt;
* DirCgi=&amp;quot;/cgi-bin/awstats&amp;quot;&lt;br /&gt;
* Lang=&amp;quot;de&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten weiteren Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
* Um über den Browser eine Jahressortierung zu ermöglichen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
AllowFullYearView=3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Um Client-Informationen über Javascript auszulesen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
o MiscTrackerUrl=&amp;quot;/js/awstats_misc_tracker.js&amp;quot;&lt;br /&gt;
o ShowScreenSizeStats=1&lt;br /&gt;
o ShowMiscStats=anjdfrqwp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Hinweis: dazu muss die Startseite (index.html) innerhalb des body-tags um folgenden Eintrag ergänzt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;script language=javascript src=&amp;quot;/js/awstats_misc_tracker.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;img src=&amp;quot;/js/awstats_misc_tracker.js?nojs=y&amp;quot; height=0 width=0 border=0 style=&amp;quot;display: none&amp;quot;&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterführende Informationen zu den Einträgen in der Config-Datei sind hier zu finden: http://awstats.sourceforge.net/docs/awstats_config.html&lt;br /&gt;
&lt;br /&gt;
Config-Datei unter cgi-ssl/awstats/awstats.example.com.conf abspeichern.&lt;br /&gt;
&lt;br /&gt;
=== Rechtevergabe ===&lt;br /&gt;
&lt;br /&gt;
Folgende Rechte müssen wir noch setzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
Prüfen:&lt;br /&gt;
cd doms/example.com&lt;br /&gt;
chmod 755 cgi-ssl/awstats/lang&lt;br /&gt;
chmod 755 cgi-ssl/awstats/lib&lt;br /&gt;
chmod 755 cgi-ssl/awstats/plugins&lt;br /&gt;
chmod 755 cgi-ssl/awstats/awstats.pl&lt;br /&gt;
chmod 755 cgi-ssl/awstats/awredir.pl &lt;br /&gt;
&lt;br /&gt;
Ändern:&lt;br /&gt;
chmod 644 cgi-ssl/awstats/awstats.example.com.conf&lt;br /&gt;
chmod 777 ~/aw_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Massen-Import der Tage vor Inbetriebnahme von awstats ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/tmp&lt;br /&gt;
cd ~/tmp&lt;br /&gt;
cp ~/var/web-www.example.org-* .&lt;br /&gt;
for f in web*; do gunzip $f; done&lt;br /&gt;
for f in *.log; do export domain=example.org; $HOME/doms/example.com/cgi-ssl/awstats/awstats.pl -config=$domain -update -LogFile=$f; done&lt;br /&gt;
rm -Rf ~/tmp/*.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Seite einrichten ===&lt;br /&gt;
&lt;br /&gt;
Die folgende index.html Datei ermöglicht einen einfachen Zugriff auf die AWStats Oberfläche:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
nano ~/doms/stats.example.org/htdocs-ssl/index.html&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;AWStats&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&#039;/awstats/awstats.pl?config=example.com&#039;&amp;gt;example.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&#039;/awstats/awstats.pl?config=example2.com&#039;&amp;gt;example2.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im gleichen Verzeichnis sollte noch eine htaccess Datei liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
nano ~/doms/stats.example.com/htdocs-ssl/.htaccess &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex index.html&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^awstats/(.*) https://stats.example.com/cgi-bin/awstats/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Statistik Seite mit Passwort schützen ===&lt;br /&gt;
&lt;br /&gt;
Dann sollte die Seite noch mit einem Passwort geschützt werden: siehe die Erklärung auf [[.htaccess#Passwortschutz_für_Dateien|.htaccess Passwortschutz für Dateien]]&lt;br /&gt;
&lt;br /&gt;
=== Cronjob für zukünftige automatische Ausführung einrichten ===&lt;br /&gt;
&lt;br /&gt;
Skript anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
nano ~/bin/awstats.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diesen Inhalt einfügen, ggfs. mehrere Domains einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
function processWebLogs&lt;br /&gt;
{&lt;br /&gt;
   domain=$1&lt;br /&gt;
   $HOME/doms/stats.example.com/cgi-ssl/awstats/awstats.pl -config=$domain -update&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
processWebLogs example.com&lt;br /&gt;
# processWebLogs example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann das Skript ausführbar machen und den cronjob anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
chmod a+x ~/bin/awstats.sh&lt;br /&gt;
crontab -e&lt;br /&gt;
&lt;br /&gt;
# Folgende Zeile einfügen:&lt;br /&gt;
&lt;br /&gt;
33 3 * * *  $HOME/bin/awstats.sh &amp;gt;&amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es muss eine Zeit nach 2 Uhr Nachts genommen werden, weil gegen 1:45 Uhr die Log Dateien rotiert werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere WebStatistik Tools bei HS ==&lt;br /&gt;
&lt;br /&gt;
* [[AWStats_installieren|AWStat]]&lt;br /&gt;
* [[Goaccess]]&lt;br /&gt;
* [[Matomo Installieren|Matomo]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:WebStatistik]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Visitors&amp;diff=6865</id>
		<title>Visitors</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Visitors&amp;diff=6865"/>
		<updated>2024-07-15T11:21:55Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Visitors ==&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|rot|Achtung:|Das Programm Visitors ist nicht mehr installiert und wird nicht mehr gepflegt.}}&lt;br /&gt;
&lt;br /&gt;
Das Programm (Vs. 0.7) ist bei uns Zentral installiert.&lt;br /&gt;
* http://www.hping.org/visitors/&lt;br /&gt;
&lt;br /&gt;
=== Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Der Aufruf von visitors erfolgt über die Kommandozeile bzw per [[cron]].&lt;br /&gt;
Hauptvorteil ist, dass es auch mit den voreingestellten Logfiles problemlos &lt;br /&gt;
funktioniert, z.B. mit dem Kommando (im Domain Directory)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
zcat ~/var/web-www.example.com*log.gz | visitors -A -m 50 - &amp;gt; visitors.htm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Doku ===&lt;br /&gt;
siehe dazu unter:&lt;br /&gt;
* http://www.hping.org/visitors/doc.html&lt;br /&gt;
&lt;br /&gt;
=== Muster Report ===&lt;br /&gt;
* http://www.hping.org/visitors/report.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weitere WebStatistik Tools bei HS ==&lt;br /&gt;
&lt;br /&gt;
* [[AWStats_installieren|AWStat]]&lt;br /&gt;
* [[Goaccess]]&lt;br /&gt;
* [[Piwik Installieren|Piwik]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Veraltet]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Vorlage:Textkasten&amp;diff=6864</id>
		<title>Vorlage:Textkasten</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Vorlage:Textkasten&amp;diff=6864"/>
		<updated>2024-07-15T11:02:20Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;{{Textkastenstil-{{{1}}}}}&amp;quot;&amp;gt;&amp;lt;p style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{2|}}}&amp;lt;/p&amp;gt;{{{3}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;{{Textkasten|Farbe|Überschrift|Text}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gültige Werte für den Parameter Farbe sind: blau, gruen, gelb, rot.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;{{Textkasten|gruen|Ein Beispiel|Dies ist ein Beispiel für die Verwendung der Vorlage.}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ergibt:&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen|Ein Beispiel|Dies ist ein Beispiel für die Verwendung der Vorlage.}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Vorlage]]&lt;br /&gt;
[[Kategorie:Textkasten]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Redmine_FastCGI_installieren&amp;diff=6863</id>
		<title>Redmine FastCGI installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Redmine_FastCGI_installieren&amp;diff=6863"/>
		<updated>2024-07-15T10:47:08Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|veraltet|Wir empfehlen die Installation von Redmine mit Passenger: [[Redmine_im_Webspace]].}}&lt;br /&gt;
&lt;br /&gt;
== Redmine mit FastCGI installieren ==&lt;br /&gt;
&lt;br /&gt;
[http://redmine.org Redmine] ist ein Werkzeug zur Projektverwaltung - in erster Linie für Software-Entwicklungs-Projekte geeignet.&lt;br /&gt;
&lt;br /&gt;
Redmine ist in [http://www.ruby-lang.org/de/ Ruby] mit dem Framework [http://rubyonrails.org/ Ruby on Rails] programmiert. Es steht unter der [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html|GNU General Public License v2] (GPL).&lt;br /&gt;
&lt;br /&gt;
Hier soll es als Beispiel dienen, wie man auf der [http://www.hostsharing.net Hostsharing]-Infrastruktur Rails-Anwendungen betrieben kann.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen ===&lt;br /&gt;
&lt;br /&gt;
Download der aktuellen Redmine Version von [http://rubyforge.org/frs/?group_id=1850 RubyForge] (zur Zeit Version 1.4.1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
tar xfz /path/to/redmine-1.4.1-tgz&lt;br /&gt;
cd ~/redmine-1.4.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Auflösen der Abhängigkeiten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
export GEM_PATH=$( gem env gempath )&lt;br /&gt;
export GEM_HOME=$HOME/.gem/ruby/1.8&lt;br /&gt;
export RAILS_ENV=production&lt;br /&gt;
gem install bundler&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
==== Datenbank ====&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;hsadmin&#039;&#039; habe ich den Postgres-User &#039;xyz00_redmine&#039; (Passwort sei &#039;geheim&#039;) und die Datenbank &#039;xyz00_redmine&#039; angelegt.&lt;br /&gt;
&lt;br /&gt;
Die Datenbank konfigurieren ich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/redmine-1.4.1/config/&lt;br /&gt;
vi database.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
production:&lt;br /&gt;
    adapter: postgresql&lt;br /&gt;
    database: xyz00_redmine&lt;br /&gt;
    host: localhost&lt;br /&gt;
    username: xyz00_redmine&lt;br /&gt;
    password: geheim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== E-Mail, Dateiablage ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/redmine-1.4.1/config/&lt;br /&gt;
vi configuration.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Inhalte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    email_delivery:&lt;br /&gt;
        delivery_method: :smtp&lt;br /&gt;
        smtp_settings:&lt;br /&gt;
        address: localhost&lt;br /&gt;
        port: 25&lt;br /&gt;
        domain: example.org&lt;br /&gt;
    attachments_storage_path: /home/pacs/xyz00/users/redmine/attach&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Laden von Abhängigkeiten, Datenbankschema ===&lt;br /&gt;
&lt;br /&gt;
Folgende Kommandos ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/redmine-1.4.1&lt;br /&gt;
~/.gem/ruby/1.8/bin/bundle install --without development test&lt;br /&gt;
~/.gem/ruby/1.8/bin/bundle exec rake generate_session_store&lt;br /&gt;
~/.gem/ruby/1.8/bin/bundle exec rake db:migrate&lt;br /&gt;
~/.gem/ruby/1.8/bin/bundle exec rake redmine:load_default_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript fragt einer Sprache für die Inhalte der Datenbank: je nach Wunsche &#039;de&#039; oder &#039;en&#039; wählen.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von FastCGI ===&lt;br /&gt;
&lt;br /&gt;
Datei ~/doms/redmine.example.org/htdocs/.htaccess&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^$ index.html [QSA]&lt;br /&gt;
RewriteRule ^([^.]+)$ $1.html [QSA]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f [OR]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} dispatch.fcgi$&lt;br /&gt;
RewriteRule ^(.*)$ /fastcgi-bin/dispatch.fcgi [QSA,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei ~/doms/redmine.example.org/fastcgi/dispatch.fcgi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot; line&amp;gt;&lt;br /&gt;
#!/usr/bin/env ruby&lt;br /&gt;
require &amp;quot;/home/pacs/xyz00/users/meinuser/redmine-1.4.1/config/environment&amp;quot; &lt;br /&gt;
require &#039;fcgi_handler&#039;&lt;br /&gt;
RailsFCGIHandler.process!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FastCGI-Skript ausführbar machen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
chmod 755 ~/doms/redmine.example.org/fastcgi/dispatch.fcgi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Anfang von ~/redmine-1.4.1/config/environment.rb füge ich ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot; line&amp;gt;&lt;br /&gt;
ENV[&#039;RAILS_ENV&#039;] ||= &#039;production&#039;&lt;br /&gt;
ENV[&#039;GEM_PATH&#039;] ||= &#039;/home/pacs/xyz00/users/meinuser/.gem/ruby/1.8:/var/lib/gems/1.8&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Inhalte von ~/doms/redmine.example.org/public/ als webroot sichtbar machen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# Vorhandene Dateien sichern. (Alternativ in ~/redmine-1.4.1/public kopieren)&lt;br /&gt;
mv ~/doms/redmine.example.org/htdocs ~/doms/redmine.example.org/htdocs.old&lt;br /&gt;
ln -s ~/redmine-1.4.1/public ~/doms/redmine.example.org/htdocs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von SSL ===&lt;br /&gt;
&lt;br /&gt;
Die Verzeichnisse ~/doms/redmine.example.org/fastcgi-ssl/ und ~/doms/redmine.example.org/htdocs-ssl/ werden analog zu bzw. anstelle von fastcgi und htdocs gefüllt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Veraltet]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Redmine_in_Tomcat_installieren&amp;diff=6862</id>
		<title>Redmine in Tomcat installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Redmine_in_Tomcat_installieren&amp;diff=6862"/>
		<updated>2024-07-15T10:33:33Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Textkasten|gelb|veraltet|Wir empfehlen die Installation von Redmine mit Passenger: [[Redmine_im_Webspace]]. &amp;quot;Ruby on Rails&amp;quot;-Anwendungen sind Stand heute nicht mit JRuby lauffähig.}}&lt;br /&gt;
&lt;br /&gt;
== Redmine im Tomcat installieren ==&lt;br /&gt;
&lt;br /&gt;
[http://redmine.org Redmine] ist ein Werkzeug zur Projektverwaltung - in erster Linie für Software-Entwicklungs-Projekte geeignet.&lt;br /&gt;
&lt;br /&gt;
Redmine ist in [http://www.ruby-lang.org/de/ Ruby] mit dem Framework [http://rubyonrails.org/ Ruby on Rails] programmiert. Es steht unter der [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html|GNU General Public License v2] (GPL).&lt;br /&gt;
&lt;br /&gt;
Hier soll es als Beispiel dienen, wie man auf der [http://www.hostsharing.net Hostsharing]-Infrastruktur mit der Tomcat-Option Rails-Anwendungen betrieben kann.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen ===&lt;br /&gt;
&lt;br /&gt;
Ich brauche:&lt;br /&gt;
# die aktuelle Redmine Version von [http://www.redmine.org/projects/redmine/wiki/Download redmine.org] (zur Zeit Version 2.5.1)&lt;br /&gt;
# die aktuelle JRuby Version von [http://www.jruby.org/download jruby.org] (aktuell Version 1.7.11)&lt;br /&gt;
&lt;br /&gt;
=== Download und Entpacken ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir tmp&lt;br /&gt;
cd tmp&lt;br /&gt;
wget http://jruby.org.s3.amazonaws.com/downloads/1.7.11/jruby-bin-1.7.11.tar.gz&lt;br /&gt;
wget http://www.redmine.org/releases/redmine-2.5.1.tar.gz&lt;br /&gt;
tar xzf jruby-bin-1.7.11.tar.gz&lt;br /&gt;
tar xzf redmine-2.5.1.tar.gz  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datenbank anlegen und konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
Die Datenbank wird mit HSAdmin angelegt.&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile könnte das so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_dbadmin&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_redmine&#039;,user:&#039;xyz00_dbadmin&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird die Datenbank in Redmine konfiguriert, indem die &amp;quot;Datei config/database.yml&amp;quot; in der entpackten&lt;br /&gt;
Redmine-Software angelegt. Inhalt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
production:&lt;br /&gt;
    adapter: mysql&lt;br /&gt;
    database: xyz00_redmine&lt;br /&gt;
    host: localhost&lt;br /&gt;
    username: xyz00_dbadmin&lt;br /&gt;
    password: &amp;quot;geheim&amp;quot;&lt;br /&gt;
    encoding: utf8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bauen der Anwendung ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd $HOME/tmp/redmine-2.5.1&lt;br /&gt;
export PATH=$HOME/tmp/jruby-1.7.11/bin:$PATH&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Kontrolle (sollte das gem im bin-Verzeichnis der JRuby-Installation liefern):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
which gem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann werden mit &amp;quot;bundler&amp;quot; die Abhängigkeiten aufgelöst und die Datenbank initialisiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
gem install bundler&lt;br /&gt;
bundle install --without development test&lt;br /&gt;
rake generate_secret_token&lt;br /&gt;
RAILS_ENV=production rake db:migrate&lt;br /&gt;
RAILS_ENV=production REDMINE_LANG=de rake redmine:load_default_data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss bauen wir eine Web-Applikation für den Tomcat Server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
gem install warbler&lt;br /&gt;
warble war&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation im Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: Installierter Tomcat-Webserver&lt;br /&gt;
&lt;br /&gt;
Die war-Datei nach Wunsch umbennen (z.B. &amp;quot;redmine.war&amp;quot; oder auch &amp;quot;ROOT.war&amp;quot;) und ins webapps-Verzeichnis des Tomcat kopieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Veraltet]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Analog_installieren&amp;diff=6861</id>
		<title>Analog installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Analog_installieren&amp;diff=6861"/>
		<updated>2024-07-15T10:25:32Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analog ==&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|rot|Achtung:|Das Programm Analog ist nicht mehr installiert und wird nicht mehr gepflegt.}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
&lt;br /&gt;
Analog ist ein Tool zur Analyse von logfiles. Damit lässt sich der Traffic auf den Sites genau darstellen. Das kann auch automatisch gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Analog ist bei Hostsharing zentral installiert.&lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist es, analog im Verzeichnis des Domain-Users auszuführen, also als Domain-User einloggen. Vorher muss man aber sicherstellen, dass die Logfiles auch dort abgelegt werden. Normalerweise landen diese nämlich im Paket-Verzeichnis. Wie man die Ablegung steuert, ist [[logging]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
Am besten, man lässt die logfiles in das Verzeichnis doms/example.com/var fließen.&lt;br /&gt;
&lt;br /&gt;
Es macht Sinn, für die Statistiken ein eigenes Verzeichnis anzulegen, das auch per http erreichbar ist, also z.B. http://www.example.com/statistik. Also erstellen wir ein neues Verzeichnis:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir doms/example.com/subs/www/statistik&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und gleich noch eines für die images:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir doms/example.com/subs/www/statistik/images&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In das images-Verzeichnis kopieren wir gleich die nötigen Bilder, die schon bei uns liegen, nämlich in /usr/share/doc/analog/docs/:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cp /usr/share/doc/analog/docs/*.gif doms/example.com/subs/www/statistik/images&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Als nächstes muss man eine config-Datei für Analog erstellen. Genaueres dazu ist auf www.analog.cx nachzulesen. Eine Beispielconfig gibt es hier. Nachstehend die wichtigsten Anpassungen.&lt;br /&gt;
&lt;br /&gt;
* Hier wird angegeben, wo die Logfiles liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;LOGFILE /home/doms/example.com/var/web-*.example.com-*.log.gz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Hier landet die Auswertung (ist also unter www.example.com/statistik/index.htm abrufbar):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;OUTFILE /home/doms/example.com/subs/www/statistik/index.htm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Das wird als Titelzeile angezeigt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;HOSTNAME &amp;quot;example.com&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Hier liegen die images:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;IMAGEDIR images/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Man speichert die Datei am besten im etc-Verzeichnis des Domain-Users, z.B. als analog.cfg.&lt;br /&gt;
&lt;br /&gt;
=== Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Der Aufruf von analog erfolgt über die Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/bin/analog -G +g./analog.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-G weist analog an, nicht die Standardconfig zu verwenden, und +g weist eine eigene config-Datei zu - in diesem Fall unsere analog.cfg. Fehler oder Warnungen landen in errors.txt.&lt;br /&gt;
&lt;br /&gt;
Interessant wird analog aber erst dann, wenn man die logfiles automatisch auswertet. Das funktioniert mit einem cronjob.&lt;br /&gt;
&lt;br /&gt;
Mit dem Eintrag im crontab 0 3 * * * /usr/bin/analog -G +g./analog.cfg wird jeden Tag um 3.00 Uhr eine neue Statistik gebastelt.&lt;br /&gt;
&lt;br /&gt;
Noch schöner ist es, die Zeitsteuerung mit unserem [[Eventhandler]] zu lösen. Damit kann man nämlich festlegen, dass die Auswertung direkt nach dem Verschieben oder Erzeugen der Logfiles erfolgt.&lt;br /&gt;
&lt;br /&gt;
Diese ist dann unter www.example.com/statistik/index.htm zu erreichen.&lt;br /&gt;
&lt;br /&gt;
=== Caching ===&lt;br /&gt;
&lt;br /&gt;
Mit dem Caching können Logfileanalysen in einem cachefile gespeichert und in spätere Analysen einbezogen werden. So ist es z.B. möglich, alte Logfiles auf dem Server zu löschen, um Platz zu sparen.&lt;br /&gt;
&lt;br /&gt;
Aber Vorsicht: Man muss aufpassen, dass im cachefile alle gewünschten Informationen landen. Eine Rekonstruktion zusätzlicher, nicht geschriebener Daten ist nicht mehr möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Es müssen alle INCLUDE und EXCLUDE Kommandos gesetzt sein, auch FROM und TO. Auch alle ALIASEs und LOGTIMEOFFSETs müssen beim Schreiben des cachefiles wie gewünscht gesetzt werden.&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
Das cachefile wird mit der Option CACHEOUTFILE definiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
CACHEOUTFILE cache20060720.ch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sollte die Datei bereits vorhanden sein, wird kein cachefile erzeugt, um ein Überschreiben zu vermeiden. Es empfiehlt sich also, das Datum im Namen der Datei anzugeben.&lt;br /&gt;
&lt;br /&gt;
Hat man das cachefile geschrieben und enthält es alle gewünschten Informationen, kann man es in eine nachfolgende Analyse einfließen lassen. Das geschieht mit der Option CACHEFILE. Wildcards und Kommas sind möglich:&lt;br /&gt;
&lt;br /&gt;
CACHEFILE cache20060720.ch,cache2.ch,cache*.ch&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
&lt;br /&gt;
Da häufig Fehler und Missverständnisse auftreten, was die Benutzung von Caching angeht, hier ein möglicher Ablauf:&lt;br /&gt;
&lt;br /&gt;
* Von den bisherigen Logfiles (LOGFILE) erstellen wir gleichzeitig ein cachefile (mit CACHEOUTFILE) und einen Report (mit OUTFILE).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
LOGFILE /home/doms/example.com/var/web-*.example.com-*.log.gz&lt;br /&gt;
CACHEOUTFILE cache20060720.ch&lt;br /&gt;
OUTFILE /home/doms/example.com/subs/www/statistik/index.htm&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Das cachefile sollten wir testen. Wir erstellen einfach einen neuen Report, in dem wir nur das cachefile analysieren und nicht mehr die alten Logfiles (also kein LOGFILE). &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
CACHEFILE cache20060720.ch&lt;br /&gt;
OUTFILE /home/doms/example.com/subs/www/statistik/index2.htm&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Die beiden erstellten Reportdateien können nun verglichen werden und sollten übereinstimmen.&lt;br /&gt;
* Nun können die Logfiles gelöscht oder (noch besser) lokal gespeichert und damit Platz auf dem Server geschaffen werden. &lt;br /&gt;
&lt;br /&gt;
Im folgenden analysieren wir das cachefile und zusätzlich alle neu einfließenden Logfiles, bis wir den Vorgang wiederholen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
LOGFILE /home/doms/example.com/var/web-*.example.com-*.log.gz&lt;br /&gt;
CACHEFILE cache20060720.ch&lt;br /&gt;
OUTFILE /home/doms/example.com/subs/www/statistik/index.htm&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Man kann das Verfahren natürlich prinzipiell automatisieren, z.B. mit cronjobs. Aber es empfiehlt sich immer die Kontrolle der generierten cachefiles.&lt;br /&gt;
&lt;br /&gt;
== Weitere WebStatistik Tools bei HS ==&lt;br /&gt;
&lt;br /&gt;
* [[AWStats_installieren|AWStat]]&lt;br /&gt;
* [[Goaccess]]&lt;br /&gt;
* [[Piwik Installieren|Piwik]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Veraltet]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=6860</id>
		<title>Redis</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=6860"/>
		<updated>2024-07-15T10:15:50Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Redis installieren ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Redis&#039;&#039;&#039; ist ein einfacher Datenspeicher für Schlüssel-Wert-Paare. Datensätze werden jeweils unter einem Schlüssel abgelegt. Die Daten werden jeweils im Hauptspeicher gehalten und nur zu konfigurierbaren Zeitpunkten auf die Festplatte gesichert. &lt;br /&gt;
&lt;br /&gt;
Redis-Datenbanken werden häufig zur Speicherung von Warteschlangen benutzt. In Redis werden Aufträge gespeichert, die asynchron von Hintergrundprogrammen abgearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert. Für die Nutzung muss lediglich eine Konfigurationsdatei angelegt werden und ein Hitergrundprogramm gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird für den User &#039;&#039;xyz00-service&#039;&#039; ein Redis-Dienst eingerichtet.&lt;br /&gt;
Der User &#039;&#039;xyz00-service&#039;&#039; ist in HSAdmin mit &#039;&#039;/bin/bash&#039;&#039; als Shell eingerichtet.&lt;br /&gt;
&lt;br /&gt;
Nach dem Login als &#039;&#039;xyz00-service&#039;&#039; lege ich Verzeichnisse &#039;&#039;~/redis/etc&#039;&#039; und &#039;&#039;~/redis/var&#039;&#039; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p redis/{etc,var}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im etc-Verzeichnis wird die Konfigurationsdatei &#039;&#039;redis.conf&#039;&#039; für den Redis-Dienst abgelegt.&lt;br /&gt;
&lt;br /&gt;
Eine Beispiel-Konfiguration ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
requirepass &amp;lt;generiertes-passwort&amp;gt;&lt;br /&gt;
bind 127.0.0.1&lt;br /&gt;
port 33033&lt;br /&gt;
tcp-backlog 128&lt;br /&gt;
timeout 300&lt;br /&gt;
loglevel notice&lt;br /&gt;
logfile /home/pacs/xyz00/users/service/redis/var/redis.log&lt;br /&gt;
databases 16&lt;br /&gt;
save 900 1&lt;br /&gt;
save 300 10&lt;br /&gt;
save 60 10000&lt;br /&gt;
slave-serve-stale-data yes&lt;br /&gt;
appendonly no&lt;br /&gt;
dbfilename dump.rdb&lt;br /&gt;
dir /home/pacs/xyz00/users/service/redis/var/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Redis-Dienst ist über die Server-lokale Netzwerk-Adresse 127.0.0.1 erreichbar und mit einem Passwort geschützt. Der Port &#039;&#039;33033&#039;&#039; für die Netzwerk-Schnittstelle muss ggf. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Dienst wird gestartet mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-service@h00:~/redis$ /usr/bin/redis-server etc/redis.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Ctrl-C kann der Dienst wieder gestoppt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann der zugriff auf Redis über einen Unixsocket erfolgen. Dann entfällt die Zeile &#039;bind 127.0.0.1&#039; in der Konfiguration, der port wird auf 0 gesetzt. Stattdessen wir ein Unixsocket konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
unixsocket /home/pacs/xyz00/users/service/redis/var/redis-server.sock&lt;br /&gt;
unixsocketperm 700&lt;br /&gt;
port 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(der Unixsocket benötigt in der Konfiguration den vollständigen absoluten Pfad zum Socket im Dateisystem!)&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung als Server-Dienst ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Redis&#039;&#039;&#039; soll über den Systemdienst &#039;&#039;&#039;SystemD&#039;&#039;&#039; automatisch im Hintergrund gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dazu wird im Verzeichnis &#039;&#039;~/.config/systemd/user&#039;&#039; eine Datei &#039;&#039;redis.service&#039;&#039; mit dem folgenden Inhalt angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/redis&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei wird mit den folgenden Shell-Kommandos geladen und aktiviert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable --now redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit den Kommandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user status &lt;br /&gt;
systemctl --user status redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann der Status des Dienstes ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://redis.io/ Internetseite des Redis Projekts]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SystemD]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=6859</id>
		<title>Redis</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=6859"/>
		<updated>2024-07-15T10:14:45Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Redis installieren ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Redis&#039;&#039;&#039; ist ein einfacher Datenspeicher für Schlüssel-Wert-Paare. Datensätze werden jeweils unter einem Schlüssel abgelegt. Die Daten werden jeweils im Hauptspeicher gehalten und nur zu konfigurierbaren Zeitpunkten auf die Festplatte gesichert. &lt;br /&gt;
&lt;br /&gt;
Redis-Datenbanken werden häufig zur Speicherung von Warteschlangen benutzt. In Redis werden Aufträge gespeichert, die asynchron von Hintergrundprogrammen abgearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert. Für die Nutzung muss lediglich eine Konfigurationsdatei angelegt werden und ein Hitergrundprogramm gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden wird für den User &#039;&#039;xyz00-service&#039;&#039; ein Redis-Dienst eingerichtet.&lt;br /&gt;
Der User &#039;&#039;xyz00-service&#039;&#039; ist in HSAdmin mit &#039;&#039;/bin/bash&#039;&#039; als Shell eingerichtet.&lt;br /&gt;
&lt;br /&gt;
Nach dem Login als &#039;&#039;xyz00-service&#039;&#039; lege ich Verzeichnisse &#039;&#039;~/redis/etc&#039;&#039; und &#039;&#039;~/redis/var&#039;&#039; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p redis/{etc,var}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im etc-Verzeichnis wird die Konfigurationsdatei &#039;&#039;redis.conf&#039;&#039; für den Redis-Dienst abgelegt.&lt;br /&gt;
&lt;br /&gt;
Eine Beispiel-Konfiguration ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
requirepass &amp;lt;generiertes-passwort&amp;gt;&lt;br /&gt;
bind 127.0.0.1&lt;br /&gt;
port 33033&lt;br /&gt;
tcp-backlog 128&lt;br /&gt;
timeout 300&lt;br /&gt;
loglevel notice&lt;br /&gt;
logfile /home/pacs/xyz00/users/service/redis/var/redis.log&lt;br /&gt;
databases 16&lt;br /&gt;
save 900 1&lt;br /&gt;
save 300 10&lt;br /&gt;
save 60 10000&lt;br /&gt;
slave-serve-stale-data yes&lt;br /&gt;
appendonly no&lt;br /&gt;
dbfilename dump.rdb&lt;br /&gt;
dir /home/pacs/xyz00/users/service/redis/var/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Redis-Dienst ist über die Server-lokale Netzwerk-Adresse 127.0.0.1 erreichbar und mit einem Passwort geschützt. Der Port &#039;&#039;33033&#039;&#039; für die Netzwerk-Schnittstelle muss ggf. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Dienst wird gestartet mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-service@h00:~/redis$ /usr/bin/redis-server etc/redis.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Ctrl-C kann der Dienst wieder gestoppt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann der zugriff auf Redis über einen Unixsocket erfolgen. Dann entfällt die Zeile &#039;bind 127.0.0.1&#039; in der Konfiguration, der port wird auf 0 gesetzt. Stattdessen wir ein Unixsocket konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
unixsocket /home/pacs/xyz00/users/service/redis/var/redis-server.sock&lt;br /&gt;
unixsocketperm 700&lt;br /&gt;
port 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(der Unixsocket benötigt in der Konfiguration den vollständigen absoluten Pfad zum Socket im Dateisystem!)&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung als Server-Dienst ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Redis&#039;&#039;&#039; soll über den Systemdienst &#039;&#039;&#039;SystemD&#039;&#039;&#039; automatisch im Hintergrund gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dazu wird im Verzeichnis &#039;&#039;~/.config/systemd/user&#039;&#039; eine Datei &#039;&#039;redis.service&#039;&#039; mit dem folgenden Inhalt angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/redis&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei wird mit den folgenden Shell-Kommandos geladen und aktiviert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable redis.service&lt;br /&gt;
systemctl --user start redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit den Kommandos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user status &lt;br /&gt;
systemctl --user status redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann der Status des Dienstes ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://redis.io/ Internetseite des Redis Projekts]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SystemD]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=RubyRBEnv&amp;diff=6858</id>
		<title>RubyRBEnv</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=RubyRBEnv&amp;diff=6858"/>
		<updated>2024-07-11T13:05:15Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eigene Ruby Installation ==&lt;br /&gt;
&lt;br /&gt;
Oft ist die vorinstallierte Version der Programmiersprache Ruby (die in Debian enthaltene Version) zu alt für die eingesetze Software.&lt;br /&gt;
&lt;br /&gt;
Hier eine kurze Anleitung, mit der man eine eigene Ruby-Umgebung für einen User einrichten kann.&lt;br /&gt;
&lt;br /&gt;
=== Installation von rbenv ===&lt;br /&gt;
&lt;br /&gt;
Konfiguration für einen User mit &amp;quot;/bin/bash&amp;quot; als Shell. Die Umgebungsvariablen werden in &amp;quot;.bash_profile&amp;quot; hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.rbenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bash_profile&lt;br /&gt;
echo &#039;eval &amp;quot;$(rbenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bash_profile&lt;br /&gt;
source ~/.bash_profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Befehl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
type rbenv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte eine Ausgabe erzeugen, die beginnt: &amp;quot;rbenv is a function&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Installation von ruby-build ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von ruby ===&lt;br /&gt;
&lt;br /&gt;
Mit dem Kommando &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rbenv install --list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
erhält man eine Liste der aktuell untersützten Ruby-Versionen&lt;br /&gt;
&lt;br /&gt;
Installation mit (hier Version 3.1.3):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rbenv install 3.1.3&lt;br /&gt;
rbenv global 3.1.3&lt;br /&gt;
gem install bundler&lt;br /&gt;
rbenv rehash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Befehl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ruby -v&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
liefert die Ausgabe &amp;quot;ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Minimale Web Applikation mit Passenger ==&lt;br /&gt;
&lt;br /&gt;
Zur Integration der eigenen Ruby-Installation in den Apache erfolgt über das  Apache-Modul &amp;quot;Passenger&amp;quot;.&lt;br /&gt;
Vor der Nutzung dieses Moduls bitte unbedingt die 	&lt;br /&gt;
[[Phusion Passenger|Hinweise zur Nutzung beachten]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für eine minimale Beispielanwendung legen wir eine Datei &#039;&#039;config.ru&#039;&#039; mit folgenden Inhalt an&lt;br /&gt;
(&amp;quot;ru&amp;quot;  kurz für &amp;quot;rackup&amp;quot;): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
# config.ru&lt;br /&gt;
&lt;br /&gt;
class App&lt;br /&gt;
    def call(env)&lt;br /&gt;
      headers = { &#039;Content-Type&#039; =&amp;gt; &#039;text/html&#039; }&lt;br /&gt;
      response = [&#039;Greetings from Rack!!&#039;]&lt;br /&gt;
      [200, headers, response]&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
run App.new&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sinatra Web Applikation mit Passenger ==&lt;br /&gt;
&lt;br /&gt;
Um eine Beispielanwendung zu installieren, orientieren wir uns an https://github.com/phusion/passenger-ruby-sinatra-demo/tree/end_result&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/home/pacs/xyz00/users/example/doms/example.com/app-ssl/&amp;quot; legen wir folgende Dateien und Verzeichnisse an:&lt;br /&gt;
&lt;br /&gt;
Gemfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
source &#039;https://rubygems.org/&#039;&lt;br /&gt;
&lt;br /&gt;
gem &#039;sinatra&#039;&lt;br /&gt;
gem &#039;tilt&#039;&lt;br /&gt;
gem &#039;base64&#039;, &#039;0.1.1&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.rb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
require &#039;sinatra/base&#039;&lt;br /&gt;
require &#039;tilt/erb&#039;&lt;br /&gt;
&lt;br /&gt;
class ExampleApp &amp;lt; Sinatra::Base&lt;br /&gt;
  get &#039;/&#039; do&lt;br /&gt;
    erb :index&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
config.ru:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
require File.absolute_path(&amp;quot;app.rb&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
run ExampleApp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
views/index.erb:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Hello&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello world!&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;% if defined?(PhusionPassenger) %&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Congratulations, you are running this app in Passenger!&amp;lt;br/&amp;gt;&lt;br /&gt;
         You are running Ruby Version: &amp;lt;%= RUBY_VERSION %&amp;gt;&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;% else %&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;You are not running this app in Passenger.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/home/pacs/xyz00/users/example/doms/example.com/app-ssl/&amp;quot; führen wir aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
bundle config --local path vendor/bundle&lt;br /&gt;
bundle install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* https://www.writesoftwarewell.com/definitive-guide-to-rack/&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Toast_paketmanager&amp;diff=6857</id>
		<title>Toast paketmanager</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Toast_paketmanager&amp;diff=6857"/>
		<updated>2024-07-11T12:59:35Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Toast Paketmanager =&lt;br /&gt;
&lt;br /&gt;
Toast ist eine große Hilfe, wenn eine Software benötigt wird, die bei Hostsharing nicht installiert wird. Das kann vorkommen,&lt;br /&gt;
wenn es die richtige Version nicht in der stabilen Debian-Distribution gibt oder wenn andere Gründe gegen eine zentrale Installation sprechen.&lt;br /&gt;
&lt;br /&gt;
[http://toastball.net/toast/ Toast] ist ein einfacher Paket-Manager, der in der Lage ist Source-Tar-Balls herunterzuladen und im Home-Verzeichnis des Users zu installieren.&lt;br /&gt;
&lt;br /&gt;
Die Installation von Toast ist denkbar einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O- http://toastball.net/toast/toast | perl -x - arm toast&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Zeile gehört in die Datei &amp;quot;.profile&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
eval $($HOME/.toast/armed/bin/toast env)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine man-Page findet sich unter [http://toastball.net/toast/man http://toastball.net/toast/man]&lt;br /&gt;
&lt;br /&gt;
== PHP7 gefällig? ==&lt;br /&gt;
&lt;br /&gt;
Mit Toast kein Problem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
toast arm http://de1.php.net/distributions/php-7.1.2.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren des PHP-Stub für Fast-CGI siehe [[Eigene_PHP_Version]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Piwik_mit_Plone_verwenden&amp;diff=6856</id>
		<title>Piwik mit Plone verwenden</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Piwik_mit_Plone_verwenden&amp;diff=6856"/>
		<updated>2024-07-11T12:33:49Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das CMS [[Plone]] ist für die Verwendung mit JavaScript-Zählscripten vorbereitet. Hierfür existiert im Properties-Tool bei den site_properties das Feld &amp;quot;webstats_js&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das Verfahren für [[Piwik]] und Plone funktioniert grundsätzlich wie beschrieben; für weitere Webanwendungen ist es nicht Bestandteil dieser Dokumentation, dürfte sich aber ganz ähnlich verwenden lassen.&lt;br /&gt;
&lt;br /&gt;
== Programmatisch: propertiestool.xml ==&lt;br /&gt;
&lt;br /&gt;
In einem policy-Produkt ist die propertiestool.xml-Datei wie folgt zu ändern. Sollte Code für Google Analytics hier eingetragen sein bitte den Paketadmin benachrichtigen; hier besteht eine Unverträglichkeit.&lt;br /&gt;
&lt;br /&gt;
Pfad: &amp;lt;code&amp;gt;/plone40_buildout/src/name.webpolicy/name/webpolicy/profiles/default/propertiestool.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;object name=&amp;quot;portal_properties&amp;quot; meta_type=&amp;quot;Plone Properties Tool&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;object name=&amp;quot;site_properties&amp;quot; meta_type=&amp;quot;Plone Property Sheet&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;title&amp;quot;&amp;gt;Site wide properties&amp;lt;/property&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;property name=&amp;quot;webstats_js&amp;quot;&lt;br /&gt;
       type=&amp;quot;text&amp;quot;&amp;gt;&amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;amp;gt;&lt;br /&gt;
        var pkBaseURL = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot;https://www.mydomain.de/piwik/&amp;quot; : &amp;quot;http://www.mydomain.de/piwik/&amp;quot;);&lt;br /&gt;
        document.write(unescape(&amp;quot;%3Cscript src=&#039;&amp;quot; + pkBaseURL + &amp;quot;piwik.js&#039; type=&#039;text/javascript&#039;%3E%3C/script%3E&amp;quot;));&lt;br /&gt;
        &amp;amp;lt;/script&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;amp;gt;&lt;br /&gt;
        try {&lt;br /&gt;
        var piwikTracker = Piwik.getTracker(pkBaseURL + &amp;quot;piwik.php&amp;quot;, 1);&lt;br /&gt;
        piwikTracker.trackPageView();&lt;br /&gt;
        piwikTracker.enableLinkTracking();&lt;br /&gt;
        } catch( err ) {}&lt;br /&gt;
        &amp;amp;lt;/script&amp;amp;gt;&amp;amp;lt;noscript&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;img src=&amp;quot;http://www.mydomain.de/piwik/piwik.php?idsite=1&amp;quot; style=&amp;quot;border:0&amp;quot; alt=&amp;quot;&amp;quot; /&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/noscript&amp;amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;/object&amp;gt;&lt;br /&gt;
&amp;lt;/object&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil innerhalb von &amp;lt;code&amp;gt;&amp;lt;property name=&amp;quot;webstats_js&amp;quot; type=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/code&amp;gt; bis &amp;lt;code&amp;gt;&amp;lt;/property&amp;gt;&amp;lt;/code&amp;gt; muss escaped werden; einfaches Kopieren und Einfügen wird nicht wie erwartet funktionieren. D.h. für die Verwendung in der &amp;lt;code&amp;gt;propertiestool.xml&amp;lt;/code&amp;gt; sind folgende Ersetzungen vorzunehmen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; durch Entität &amp;quot;less-than&amp;quot; ersetzen (&amp;amp; lt ;)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; durch Entität &amp;quot;greater-than&amp;quot; ersetzen (&amp;amp; gt ;)&lt;br /&gt;
&lt;br /&gt;
== ZMI ==&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration über das ZMI ist möglich, aber mangels Nachhaltigkeit bei der Wartung nicht empfohlen. Hier braucht keine Ersetzung/kein Escaping vorgenommen zu werden. &lt;br /&gt;
&lt;br /&gt;
Sollte Code für Google Analytics hier eingetragen sein bitte vor einer Änderung den Paketadmin benachrichtigen; hier besteht eine Unverträglichkeit.&lt;br /&gt;
&lt;br /&gt;
== Opt-out Cookie ==&lt;br /&gt;
&lt;br /&gt;
Um datenschutzfreundlich zu bleiben soll den Benutzern der Webseite, die getrackt wird, die Möglichkeit gegeben werden einen &amp;quot;Opt-out Cookie&amp;quot; zu setzen. Am einfachsten ist es, hier die mit der [[Piwik Installieren|Piwik-Installation]] mitgelieferte Funktion zu verwenden. Sie wird über einen IFrame eingebunden, in Plone ist das möglich mit dem Produkt &amp;lt;code&amp;gt;[http://pypi.python.org/pypi/Products.windowZ/1.3b2 Products.windowZ]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An der Installation sind folgende Änderungen durchzuführen, wenn [http://www.buildout.org Buildout] und die extension &amp;quot;mr.developer&amp;quot; verwendet wird:&lt;br /&gt;
&lt;br /&gt;
=== buildout.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[buildout]&lt;br /&gt;
...&lt;br /&gt;
extensions =&lt;br /&gt;
    mr.developer&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
auto-checkout =&lt;br /&gt;
    Products.windowZ&lt;br /&gt;
&lt;br /&gt;
[instance]&lt;br /&gt;
...&lt;br /&gt;
eggs =&lt;br /&gt;
    Products.windowZ&lt;br /&gt;
&lt;br /&gt;
[sources]&lt;br /&gt;
Products.windowZ = svn http://svn.plone.org/svn/collective/Products.windowZ/trunk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für Plone 4 soll dabei die Version aus dem Collective verwendet werden, da &#039;&#039;Interfaces&#039;&#039; in Products.windowZ &amp;gt; 1.3 nicht zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
=== Plone ===&lt;br /&gt;
&lt;br /&gt;
Das Produkt Products.windowZ fügt einen neuen Content-Type zu Plone hinzu. &lt;br /&gt;
&lt;br /&gt;
* Login auf der Plone-Site&lt;br /&gt;
* &amp;quot;Window&amp;quot; hinzufügen &lt;br /&gt;
* Im Feld URL die Adresse des spezifischen IFrame angeben: &amp;lt;code&amp;gt;http://www.mydomain.de/piwik/index.php?module=CoreAdminHome&amp;amp;action=optOut&amp;amp;language=de&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das erscheinende Formular enthält einigen erklärenden Text und eine Checkbox. Das Cookie wird je nach Zustand dynamisch gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
Sie können sich hier entscheiden, ob in Ihrem Browser ein eindeutiger Webanalyse-Cookie abgelegt werden darf, um dem Betreiber der Webseite die Erfassung und Analyse verschiedener statistischer Daten zu ermöglichen. &lt;br /&gt;
Wenn Sie sich dagegen entscheiden möchten, klicken Sie den folgenden Link, um den Piwik-Deaktivierungs-Cookie in Ihrem Browser abzulegen.&lt;br /&gt;
Ihr Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfasst. Klicken Sie hier damit ihr Besuch nicht mehr erfasst wird.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist die Checkbox ausgeschaltet ist der Text dieser:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
Deaktivierung vollständig! Ihre Besuche auf dieser Webseite werden von der Webanalyse nicht mehr erfasst.&lt;br /&gt;
Bitte beachten Sie, dass auch der Piwik-Deaktivierungs-Cookie dieser Webseite gelöscht wird, wenn Sie die in Ihrem Browser abgelegten Cookies bereinigen. Außerdem müssen Sie, wenn Sie einen anderen Computer oder einen anderen Webbrowser verwenden, die Deaktivierungsprozedur nochmals absolvieren.&lt;br /&gt;
Ihr Besuch dieser Webseite wird aktuell von der Piwik Webanalyse nicht erfasst. Klicken Sie hier um ihren Besuch wieder erfassen zu lassen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Piwik]]&lt;br /&gt;
[[Kategorie:Plone]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6855</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6855"/>
		<updated>2024-07-10T13:24:20Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: /* Einrichtung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für &amp;quot;Mailing List Management Made Joyful&amp;quot;, ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese veilleicht auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Eine leistungsfähigere Alternative zu mlmmj könnte [[Mailman_3_installieren|Mailman 3]] sein.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen  ==&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert. (Wer die Software selbst kompilieren möchte kann aktuellen Source-Code bei [https://codeberg.org/mlmmj/mlmmj|codeberg.org] finden.)&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung heißt das Paket &#039;&#039;xyz00&#039;&#039; und der für Mailinglisten eingesetzte User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll &#039;&#039;discuss@example.org&#039;&#039; sein. Den lokalen Teil dieser Adresse, &#039;&#039;discuss&#039;&#039;, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: &#039;&#039;mlmmj&#039;&#039; wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. &#039;&#039;discuss+help@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain &#039;&#039;example.org&#039;&#039; muss dazu bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; [[aufgeschaltet]] sein. (&amp;quot;Aufgeschaltet&amp;quot; bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser &#039;&#039;xyz00&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Im Shell kann ich dann durch den Befehl &#039;&#039;hsscript -i&#039;&#039; das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h03:~$ hsscript -i&lt;br /&gt;
Password: *************&lt;br /&gt;
xyz00@hsadmin&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039; werden User und E-Mail-Adresse angelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter &amp;quot;target&amp;quot; wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.&lt;br /&gt;
&lt;br /&gt;
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript &#039;&#039;mlmmj-make-ml&#039;&#039; fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
The Domain for the List? [] : example.org&lt;br /&gt;
The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
For the list texts you can choose between the following languages or&lt;br /&gt;
give an absolute path to a directory containing the texts.&lt;br /&gt;
Available languages:&lt;br /&gt;
cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
The path to texts for the list? [en] : de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skript &#039;&#039;mlmmj-make-ml&#039;&#039; legt daraufhin unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Ja, &#039;&#039;receive&#039;&#039; schreibt sich mit &#039;&#039;-ei-&#039;&#039;, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*&lt;br /&gt;
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive&lt;br /&gt;
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -&amp;gt; mlmmj-receive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm &#039;&#039;mlmmj-recieve&#039;&#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
[[Cron|crontab]] wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h03:~$ crontab -e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
MAILTO=webmaster@example.org&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
== weitere Optionen  ==&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&lt;br /&gt;
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&lt;br /&gt;
Damit der Listen-Owner weitere Abonnements bestätigen muss:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
  echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
=== Achtung: DKIM ===&lt;br /&gt;
&lt;br /&gt;
Mlmmj gibt die Möglichkeit, mit &#039;&#039;&#039;delheaders&#039;&#039;&#039; und &#039;&#039;&#039;customheaders&#039;&#039;&#039; die Header der durchgeleiteten Mail umfangreich zu ändern. Allerdings tragen Mails heute häufig kryptografische Signaturen der sendenden Mailserver. Eine DKIM-Signatur sichert damit in der Regel die Integrität des Body der Mail sowie der Header &#039;&#039;Subject:&#039;&#039;, &#039;&#039;From:&#039;&#039;, &#039;&#039;To:&#039;&#039;, &#039;&#039;Date:&#039;&#039;, &#039;&#039;From&#039;&#039;, und oft auch &#039;&#039;Reply-To:&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Wird zum Beispiel mit einem Prefix das Subject geändert oder ein Footer angehängt, macht dies die DKIM-Signatur ungültig. Das ist für viele Mailprovider ein Grund die Nachricht abzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Zur Konfiguration im Browser ==&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte.  Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ (noch besser: Download des aktuellen Debian-Pakets von [https://packages.debian.org/bookworm/all/mlmmj-php-web-admin/download debian.org]: da sind einige veraltete PHP-Ausdrücke schon herausgepatcht) und diese in einem temporären Verzeichnis entpacken (mit tar oder dpkg-deb).&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot;, oder beim .deb-Paket unter &amp;quot;usr/share/mlmmj-...&amp;quot;, findet sich die PHP-Admin-Anwendung. Also ...&lt;br /&gt;
&lt;br /&gt;
* den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen;&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben;&lt;br /&gt;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Require valid-user&lt;br /&gt;
AuthType Basic&lt;br /&gt;
AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
* Ein Passwort angeben.&lt;br /&gt;
&lt;br /&gt;
Nun enthält diese PHP-Anwendung, wenn man sie nicht dem Debian-Paket entnommen hat, leider noch eine Zeile, die schon seit PHP 7 nicht mehr lauffähig ist. Also muß man noch&lt;br /&gt;
&lt;br /&gt;
* in &amp;lt;tt&amp;gt;.../htdocs-ssl/index.php&amp;lt;/tt&amp;gt; folgende Änderung vornehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=diff line&amp;gt;&lt;br /&gt;
@@ -38,4 +38,5 @@&lt;br /&gt;
 # use scandir to have alphabetical order &lt;br /&gt;
 foreach (scandir($topdir) as $file) {&lt;br /&gt;
-    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+# ereg obsolete!! Vormals:    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+    if (!preg_match(&#039;/^\./&#039;,$file))&lt;br /&gt;
     {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und das Ergebnis auf https://lists.example.org anschauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 |/usr/bin/procmail&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/sh&lt;br /&gt;
 HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
 PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 VERBOSE=yes&lt;br /&gt;
 LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
 DEFAULT&lt;br /&gt;
 &lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
 :0&lt;br /&gt;
 { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
Bitte dafür sorgen, dass das Verzeichnis &#039;&#039;/home/pacs/xyz00/users/list/var&#039;&#039; existiert.&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
===Groß- und Kleinschreibung===&lt;br /&gt;
&lt;br /&gt;
Achtung, mit der Groß- und Kleinschreibung von Listennamen gibt es bei dieser Procmail-Lösung eine kleine Tücke. Procmail übernimmt in die Variable $MATCH genau die in der X-Original-To-Headerzeile vorgefundene Schreibweise, und diese kann denkbarerweise &amp;quot;Listen-Name&amp;quot; oder &amp;quot;listen-name&amp;quot; oder &amp;quot;Listen-name&amp;quot; sein. &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen &amp;lt;tt&amp;gt;${HOME}/mlmmj/listen-name&amp;lt;/tt&amp;gt; vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
&lt;br /&gt;
Eine teilweise Lösung besteht darin, den Listennamen in dem &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt;-Aufruf in der &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/&lt;br /&gt;
&lt;br /&gt;
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!&lt;br /&gt;
&lt;br /&gt;
(Man kann auch in &amp;lt;tt&amp;gt;${HOME}/mlmmj/&amp;lt;/tt&amp;gt; durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h02:~$ ls -lA mlmmj/&lt;br /&gt;
  total 8&lt;br /&gt;
  -rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess&lt;br /&gt;
  lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -&amp;gt; Mitglieder&lt;br /&gt;
  drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
&lt;br /&gt;
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge &amp;lt;tt&amp;gt;,,&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;.) Dann ist &amp;lt;tt&amp;gt;$(echo ${MATCH} | tr [:upper:] [:lower:])&amp;lt;/tt&amp;gt; gleichbedeutend mit &amp;lt;tt&amp;gt;${MATCH,,}&amp;lt;/tt&amp;gt;. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/bash&lt;br /&gt;
 SHELLMETAS=&amp;amp;|&amp;lt;&amp;gt;~;?*[{&lt;br /&gt;
 HOMEDIR= ...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/&lt;br /&gt;
 &lt;br /&gt;
Die Tücke ist, daß procmail den in SHELL angegebenen Shell nur dann verwendet, wenn die Befehlszeile eines der in SHELLMETAS angegebenen Zeichen enthält. Und das &#039;|&#039; am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;, das den Einsatz von Bash auslöst.&lt;br /&gt;
&lt;br /&gt;
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* [https://web.archive.org/web/20221228110514/https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ (via web.archive.org)] Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash&lt;br /&gt;
* Ein Self-Service zum Subscriben/Unsubscriben lässt sich in Form von Mail-to-Links in Webseiten einbinden. Beispiele gibt es bei Hostsharing für die öffentlichen &amp;quot;public&amp;quot;-Mailinglisten: https://www.hostsharing.net/lists/public-discussion/ . Alternativ auf https://github.com/hblasum/mlmmj-php-web-simplified ein Webfrontend mit dem sich Benutzerinnen und Benutzer selbst ein-/austragen können (Vereinfachung von mlmmj-php-web von Christoph Thiel).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6854</id>
		<title>Tabellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6854"/>
		<updated>2024-07-10T13:21:13Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Shortcut|WP:TAB, WP:TBL}}&lt;br /&gt;
{{Wikipedia-Hilfe}}&lt;br /&gt;
Wikipedia bietet eine eigene Syntax, um &#039;&#039;&#039;Tabellen&#039;&#039;&#039; darzustellen. Diese Syntax ist zwar an das verbreitete [[Hypertext Markup Language|HTML]] angelehnt, erleichtert jedoch durch eine vereinfachte Schreibweise die Arbeit an komplizierteren Tabellen wesentlich. Diese Seite bietet eine Kurzübersicht, wie du Tabellen erstellst, eine ausführliche Darstellung findet sich auf &#039;&#039;&#039;[[Hilfe:Tabellen-Referenz]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um die Zellen einer Tabelle zu formatieren, lassen sich sowohl für die Tabelle als Ganzes als auch für einzelne Zellen HTML-Attribute angeben. Insbesondere kann das &amp;lt;tt&amp;gt;style&amp;lt;/tt&amp;gt;-Attribut verwendet werden, wodurch sich beliebige [[Cascading Style Sheets|CSS]]-Formatierungen realisieren lassen. Zwar lassen sich auch einzelne Zeilen einer Tabelle formatieren, möchte man jedoch ein Attribut an eine bestimmte Spalte vergeben, so muss dies zellenweise geschehen.&lt;br /&gt;
&lt;br /&gt;
== Wann Tabellen einsetzen? ==&lt;br /&gt;
&#039;&#039;&#039;Tabellen&#039;&#039;&#039; sind ein gutes Mittel, um gleichartige Informationen übersichtlich zu gestalten. Sie helfen die Beziehungen zwischen Tabellenzellen und ihren Zeilen und Spalten zu verstehen (siehe [[Semantik|semantische Beziehungen]]). Insbesondere als sortierbare Tabellen bieten sie einen schnellen Überblick beispielsweise über Jahreszahlen, Namen oder Orte.&lt;br /&gt;
:&#039;&#039;Siehe Hauptartikel [[Wikipedia:Tabellen]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Andererseits sind Tabellen komplizierter als normaler Text. Deshalb sollten sie nur dort eingesetzt werden, wo sie tatsächlich für bessere Übersicht sorgen. Überlege immer, ob du die Informationen nicht besser in einer einfachen Liste unterbringen kannst (siehe [[Hilfe:Textgestaltung|Textgestaltung]] und [[Hilfe:Listen|Listen]]).&lt;br /&gt;
&lt;br /&gt;
Tabellen sollte man nicht als „grafisches Gestaltungsmittel“ einsetzen.&lt;br /&gt;
&lt;br /&gt;
== CSS-Klassen für Tabellen ==&lt;br /&gt;
Um Tabellen sowohl in ihren Inhalten als auch bereits im Kopfbereich weitestgehend frei von Elementen zu halten, die die Darstellungsweise betreffen, wurden für das global wirksame CSS einige Klassen entwickelt, die es erlauben, wichtige Stile mit wenigen anschaulichen Anweisungen festzulegen.&lt;br /&gt;
&lt;br /&gt;
=== wikitable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf lässt sich eine schwach grau getönte Tabelle mit sichtbaren, wenngleich dezenten Zellgrenzen erstellen. Zwischen Zellinhalt und Rand wird etwas &amp;quot;Luft&amp;quot; gelassen. Die Standardtabelle ist rahmenlos und hat weißen Hintergrund, was für Layout-Zwecke teilweise erwünscht ist, sich jedoch in bestimmten Fällen zu schlecht vom Text absetzt.&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;prettytable&amp;lt;/code&amp;gt; mit einem ganz ähnlichem Anspruch sollte nicht mehr verwendet werden, um die Kohärenz der Stilmittel zwischen den verschiedenen Wikipedias zu fördern. Sie wird ausschließlich in der deutschen Wikipedia verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sortable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;sortable&amp;quot;&amp;lt;/code&amp;gt; werden Spalten sortierbar gemacht. Das heißt, wenn [[JavaScript]] für die Wikipedia aktiviert ist, können Tabellen durch Klick auf das entsprechende Symbol in einem Spaltenkopf nach dieser Spalte auf- und absteigend sortiert werden. Die mitunter unsortierte Ausgangs-Darstellung erhält man durch Neuladen der Seite. Einzelne Spalten, für die eine Sortierung als unsinnig angesehen wird, können mittels der spaltenweisen Angabe von &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; markiert werden, so werden die Sortierfunktion und -symbol unterdrückt. Mit der gleichen Angabe können auch einzelne Tabellen&#039;&#039;zeilen&#039;&#039; von der Sortierung ausgenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;siehe auch:&#039;&#039; [[:meta:Help:Sorting|MediaWiki Handbook - Sorting]]&lt;br /&gt;
&lt;br /&gt;
=== toptextcells ===&lt;br /&gt;
Durch &amp;lt;code&amp;gt;class=&amp;quot;toptextcells&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf kann das Standardverhalten, dass Texte in Zellen vertikal zentriert dargestellt werden, dahingehend abgeändert werden, dass die Texte immer oben beginnen und der Abstand jeweils nach unten variiert. In Fällen stark unterschiedlicher Auffüllung führt dies zu einer größeren Übersicht, die obere Textzeile bildet mit der oberen Begrenzung zusammen eine Flucht. Die Alternative zu dieser Klasse wäre die Einfügung von style-Anweisungen pro Tabellenzeile.&lt;br /&gt;
&lt;br /&gt;
=== Kombinationen ===&lt;br /&gt;
Die genannten drei Klassen lassen sich kombinieren. Hierbei sollte Augenmaß gewahrt werden, nicht jede Eigenschaft ist immer passend. Sortierbare Wikitables (&amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt;) werden sich häufig anbieten. Oben ausgerichtete Texte in Zellen werden häufig mit Wikitable kombiniert werden. &lt;br /&gt;
&lt;br /&gt;
Auch Kombinationen aller drei Stile sind denkbar, wenn in Tabellen umfangreiche Erläuterungen enthalten sind, diese sollten dann als &amp;lt;code&amp;gt;unsortable&amp;lt;/code&amp;gt; markiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit der class=&amp;quot;wikitable&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Am 23. Februar 2008 wurde die „[[Vorlage:Prettytable]]“ als „veraltet“ [{{fullurl:Spezial:Logbuch|type=delete&amp;amp;page=Vorlage:Prettytable&amp;amp;year=2008&amp;amp;month=2}} gelöscht] und somit endgültig von der [[Cascading Style Sheets|CSS]]-&amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; ersetzt (zu finden in [[MediaWiki:Common.css]]). Daneben existiert auch die &amp;lt;code&amp;gt;class=&amp;quot;prettytable&amp;quot;&amp;lt;/code&amp;gt;, diese sollte aber nicht mehr verwendet werden, da die deutschsprachige Wikipedia die einzige ist, welche diese Klasse verwendet. Im Zuge der Internationalisierung und für den Export ist es hilfreich, wenn sie nicht mehr verwendet wird.&amp;lt;ref&amp;gt;Eine Umstellung auf &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; sollte bei der Bearbeitung eines Artikels erfolgen, Bearbeitungen die nur diese Umstellung beinhalten sowie Botläufe, sind zu unterlassen. Weitere Informationen gibt es dazu unter [[Wikipedia Diskussion:Bots/Archiv 2008#Klasse &amp;quot;wikitable&amp;quot;]] und [[MediaWiki Diskussion:Common.css#Klasse &amp;quot;wikitable&amp;quot;]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Umstellung ist in mancherlei Hinsicht nicht nur ein Segen. So kann mit &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; beispielsweise das [http://de.selfhtml.org/html/referenz/attribute.htm#table &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;&#039;&#039;&#039;cellpadding&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;] (die „Zellen-Polsterung“) anscheinend &#039;&#039;nicht mehr in einem Rutsch&#039;&#039; für die ganze Tabelle verändert/definiert werden&amp;lt;sup&amp;gt;&amp;amp;#91;[[Wikipedia:Fragen zur Wikipedia/Archiv/2008/Woche 25#Falsch angewandtes cellpadding?|WP:FZW-Archiv:&amp;amp;nbsp;Juni&amp;amp;nbsp;2008]]&amp;amp;#93;&amp;lt;/sup&amp;gt;. Wo deshalb „unbedingt“ nötig, kann statt &amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;{| class=&amp;quot;wikitable&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doch noch eine Entsprechung der „[[Vorlage:Prettytable]]“ verwendet werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;border=&amp;quot;1&amp;quot; &amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;cellpadding=&amp;quot;20&amp;quot;&amp;lt;/span&amp;gt; style=&amp;quot;margin:1em 1em 1em 0; background:#f9f9f9; border:1px #AAA solid; border-collapse:collapse; empty-cells:show;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Tipp: Mit der Eigenschaft &amp;lt;code&amp;gt;text-indent&amp;lt;/code&amp;gt; und einem Wert so um die 4px bekommt man einen ganz vernünftigen Abstand zum linken Rand hin. Wenn das hinter der Klasse &amp;quot;wikitable sortable&amp;quot; oder &amp;quot;wikitable&amp;quot; notiert wird, bezieht sich diese Zuweisung auf alle Zellen. So könnte die erste Zeile einer Tabelle aussehen: &amp;lt;code&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-indent:4px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfache Tabelle ==&lt;br /&gt;
Eine einfache Beispieltabelle aus dem Artikel [[Bayern-Landshut#Liste der Herzöge von Bayern-Landshut|Bayern-Landshut]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !!  Regierungszeit                       !!  Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]    || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die obige Tabelle wird durch den folgenden Quelltext erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !! Regierungszeit                                !! Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]              || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;{|&amp;lt;/code&amp;gt; beginnen eine Tabelle, während &amp;lt;code&amp;gt;|}&amp;lt;/code&amp;gt; sie abschließen. Beide Tags müssen an einem Zeilenanfang stehen.&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; veranlasst, dass die ganze Tabelle nach den Vorgaben der Klasse &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; formatiert wird. Diese sieht unter anderem Trennlinien zwischen den Zellen sowie zusätzlichen Platz zwischen Zelleninhalt und Zellenrand (das sogenannte &#039;&#039;cellpadding&#039;&#039;) vor.&lt;br /&gt;
* Zeilen, die mit einem Ausrufezeichen (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) beginnen, definieren Kopfzeilen von Tabellen. Der Text in einer Zelle einer solchen Zeile wird zentriert und fettgedruckt. Gewöhnliche Tabellenzeilen beginnen dagegen mit einem senkrechten Trennstrich (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Das Tag &amp;lt;code&amp;gt;|-&amp;lt;/code&amp;gt; beginnt eine neue Tabellenzeile, falls es im Quelltext an einem Zeilenanfang steht.&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; trennen nebeneinanderliegende Tabellenzellen.&lt;br /&gt;
* Die Zeichenfolge &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; anstatt eines Leerzeichens verhindert einen Zeilenumbruch zwischen den beiden Wörtern, die das Leerzeichen trennt.&lt;br /&gt;
* Die Jahreszahlen werden durch &amp;lt;code&amp;gt;&amp;amp;lt;tt&amp;gt;&amp;lt;/code&amp;gt; mit fester Zeichenbreite dargestellt, um sicherzugehen, dass sie am Bindestrich ausgerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Soll die Tabelle rechtsbündig zum Text ausgerichtet werden, lässt sich dies durch die zusätzliche Klasse &amp;lt;code&amp;gt;float-right&amp;lt;/code&amp;gt; im Attribut erreichen: &amp;lt;code&amp;gt;class=&amp;quot;wikitable float-right&amp;quot;&amp;lt;/code&amp;gt;. Zentrierung der Tabelle erreicht man durch die zusätzliche Klasse &amp;lt;code&amp;gt;centered&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;class=&amp;quot;wikitable centered&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Sortierbare Tabelle ==&lt;br /&gt;
Sortierbare Tabellen ermöglichen verschiedene und vom Leser wählbare Sichtweisen auf eine Sache:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese sortierbare Tabelle wird durch folgenden Code erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Namen ===&lt;br /&gt;
Nach der Namenskonvention steht in Wikipedia zuerst der Vorname, gefolgt vom Nachnamen.&amp;lt;br /&amp;gt;Die [[Vorlage:SortKeyName]] sorgt dafür, dass die Tabellenspalten hier dennoch nach dem Nachnamen sortiert werden:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei komplizierteren Namen, beispielsweise mit zwei Vornamen oder mit Sonderzeichen im Namen funktioniert [[Vorlage:SortKey]]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Liste der Abgeordneten zum Kärntner Landtag (29. Gesetzgebungsperiode)|Abgeordnete im Kärntner Landtag]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahlen und Geldbeträge ===&lt;br /&gt;
Zahlen und Geld-Währungen werden so rechtsbündig und sortierbar dargestellt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rechtsbündige Zahlen werden nur dann korrekt sortiert, wenn die Anzahl der Nachkommastellen bei allen Einträgen einer Spalte gleich sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; [[Vorlage:Dts]] für Datumsangaben, [[Vorlage:Nts]] und [[Vorlage:0]] für Zahlen&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenstellige Zahlen ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Nummer !! Ort &lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
|-&lt;br /&gt;
| 03301 || [[Oranienburg]]&lt;br /&gt;
|-&lt;br /&gt;
| 03302 || [[Hennigsdorf]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Vorwahl 03 (Deutschland)|Telefon-Vorwahl 03 (Deutschland)]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare verschiedenstellige Zahlen mit Dezimaltrennzeichen ===&lt;br /&gt;
Damit bei verschiedenstelligen Zahlen in einer Spalte das Komma immer übereinander dargestellt wird gibt es zwei Möglichkeiten. Beide sind sortierbar. Lösung a) ist angenehmer zu lesen also für Wikipedia geeigneter. Lösung b) ist einfacher zu schreiben und für Zahlen mit immer gleicher Zahl von Nachkommastellen, Währungen beispielsweise, genauso gut geeignet:&lt;br /&gt;
&lt;br /&gt;
a) Verwendung von [[Vorlage:0]] für alle führenden Nullen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b) rechtsbündiger Zellenformatierung unter Verwendung der gleichen Anzahl an Nachkommastellen, wobei die zur Ausrichtung künstlich aufgefüllten Nachkommastellen per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; versteckt werden können, ein zu versteckendes Komma ist per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0|,}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; erzielbar:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahl mit Währungs- oder %-Symbol ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}1 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}3 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Sortierbare Tabelle mit einer nicht-sortierbaren Zeile ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
=== Tabellenüberschriften, Trennstriche ===&lt;br /&gt;
Das folgende Beispiel zeigt, wie man eine Tabellenüberschrift erzeugt, sowie eine Möglichkeit, wie sich Trennstriche zwischen bestimmten Zellen realisieren lassen:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext dieser Beispieltabelle sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeile, die mit &amp;lt;code&amp;gt;|+&amp;lt;/code&amp;gt; beginnt, bezeichnet den Titel der Tabelle.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;border-top: 1pt&amp;lt;/code&amp;gt; weist der Zelle einen oberen Rand mit definierter Breite zu. Weitere Befehle sind: &amp;lt;code&amp;gt;border-left, border-right&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;border-bottom&amp;lt;/code&amp;gt; für einen Rand links, rechts oder unten. &amp;lt;code&amp;gt;border: 1pt&amp;lt;/code&amp;gt; setzt alle vier Ränder.&lt;br /&gt;
&lt;br /&gt;
=== Zellfärbung, Spaltenbreite, Textausrichtung ===&lt;br /&gt;
Dieses Beispiel erläutert, wie man sortierbare Tabellen erstellt, wie man Zellen färbt, den Zelleninhalt rechts ausrichtet und die Spaltenbreite einstellt. Es lehnt sich an die [[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Liste der römischen Kaiser]] an:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext hierfür sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortable&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt; erlaubt die Sortierung der Tabelle nach wählbaren Spalten.&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; können einzelne Spalten von der Sortierbarkeit ausgenommen werden.&lt;br /&gt;
* Mit den Vorlagen [[:Vorlage:Dts]], [[:Vorlage:Nts]] und [[:Vorlage:SortKey]] lässt sich die Sortierreihenfolge einzelner Tabelleneinträge beeinflussen&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;width=&amp;quot;15%&amp;quot;&amp;lt;/code&amp;gt; weist einer Spalte 15 % der Gesamtbreite der Tabelle als Breite zu.&lt;br /&gt;
* Die Ausrichtung von Text rechtsbündig in einer Zelle erreicht man durch die [[Cascading Style Sheets|CSS]]-Anweisung &amp;lt;code&amp;gt;style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Nebeneinanderliegende Zellen kann man sowohl durch das &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;-Zeichen trennen, als auch durch einen Zeilenumbruch gefolgt von einem einfachen &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;-Zeichen.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;|- class=&amp;quot;hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; weist der darauffolgenden Zeile eine Hintergrundfarbe zu. In Artikeln sollen die entsprechenden Standardfarben verwendet werden (siehe [[Hilfe:Farben#Farben verwenden|Farben verwenden]] in der [[Hilfe:Farben|Hilfe zu Farben]]). Außerhalb des Artikelnamensraumes können Farben außer durch ihren englischen Namen auch als Hexadezimalzahl aus sechs Ziffern eingegeben werden, wobei die ersten zwei Ziffern für den Rotanteil von bis zu 256 stehen, die nächsten zwei für den Grünanteil und die letzten zwei für den Blauanteil, das heißt, dass &amp;lt;code&amp;gt;#ff0000&amp;lt;/code&amp;gt; die Farbe Rot bedeutet, &amp;lt;code&amp;gt;#00ff00&amp;lt;/code&amp;gt; steht für Grün und &amp;lt;code&amp;gt;#0000ff&amp;lt;/code&amp;gt; steht für Blau. Durch eine Mischung erhält man beispielsweise Violett: &amp;lt;code&amp;gt;#ff00ff&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Leerzellen können durch einen einfachen Abstand erzeugt werden. Diese Zellen werden aber beim Sortieren an den Anfang gestellt, Leerzellen mit &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; stehen am Ende.&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortbottom&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; führt dazu, dass die Zeile von der Sortierung ausgenommen wird und damit stets als Fußzeile der Tabelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=== Geschachtelte Tabellen ===&lt;br /&gt;
Tabellen können geschachtelt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan + rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot; | A&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| eine Spalte&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|-&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabellen nebeneinander ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gleich breite Tabellen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Listen in Tabellen, Bilder in Tabellen ===&lt;br /&gt;
Tabellen können Tabellen, Bilder und Wiki-Syntax-Formatierung enthalten:&lt;br /&gt;
&lt;br /&gt;
{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieser Text erzeugt die rechte Tabelle, wenn man ihn in einen Artikel eingibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
→ &#039;&#039;Siehe: [[Wikipedia:Taxoboxen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Bei [[meta:Main Page|MetaWiki]] befindet sich ein [[meta:Help:Table|englischer Artikel]], der die Gestaltung mit Tabellen etwas ausführlicher behandelt.&lt;br /&gt;
* Außerdem gibt es bei [[meta:Main Page|MetaWiki]] einen [[meta:Help:Sorting|englischen Artikel]], der die Sortierung von Tabellen im Detail behandelt.&lt;br /&gt;
* Im Abschnitt [[Wikipedia:Wie gute Artikel aussehen#Tabellen|Tabellen]] in [[Wikipedia:Wie gute Artikel aussehen|Wie gute Artikel aussehen]] wird auf die Bedeutung von Vorlagen zur Vereinheitlichung hingewiesen.&lt;br /&gt;
* Der Abschnitt [[Hilfe:Bilder#Ausrichten im Text|Ausrichten im Text]] in der [[Hilfe:Bilder|Hilfe für Bilder]] über die Positionierung von Bildern in Tabellen&lt;br /&gt;
* In [[Hilfe:Tabellen-Referenz]] sind die einzelnen Möglichkeiten nochmals mit Beispielen aufgeführt.&lt;br /&gt;
* Beispiele: [[:Kategorie:Vorlage:Tabelle]] – Tabellen, die auf mehreren Seiten als Vorlage eingebunden werden&lt;br /&gt;
&lt;br /&gt;
== Hilfen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:PeerBr/WPro|WPro]]&#039;&#039;&#039; (Server zur Zeit nicht erreichbar) ist ein Wikipedia-Editor für den [[Windows Internet Explorer|Internet Explorer]] 6.0, der Tabellen per Knopfdruck einfügen und formatieren kann.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/EXCEL-Tabellenumwandlung|EXCEL-Tabellenumwandlung]]&#039;&#039;&#039; konvertiert den ausgewählten Tabellenbereich aus MS Excel direkt ins Wiki-Tabellenformat. Die wichtigsten Formatierungen wie Fett/Kursiv, Zellenhöhe und -breite, Schriftgröße, Farbinformation aus MS Excel bleiben erhalten.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/Excel2Wiki|Excel2Wiki]]&#039;&#039;&#039; Berücksichtigt verbundene Zellen, dazu auch ein Programm zur Umwandlung der Spalten in Zeilen und umgekehrt und ein Programm zur Zeilenumkehr, d.&amp;amp;nbsp;h. die letzte Zeile wird zur ersten usw.&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:Duesentrieb/csv2wp|csv2wp]]&#039;&#039;&#039; ist ein Werkzeug zum Umwandeln von [[CSV (Dateiformat)|CSV-Datei]]en in Wiki-Tabellenformat. Damit lassen sich z.&amp;amp;nbsp;B. Tabellen aus [[Microsoft Excel]] importieren.&lt;br /&gt;
* Ab [[OpenOffice.org|OpenOffice]] 2.3 kann man Writer-Dokumente ins [http://de.openoffice.org/presse/pressemitteilung_20070917.html Mediawiki-Format] exportieren.&lt;br /&gt;
* [[OpenOffice.org|OpenOffice]]-Tabellen können mit [[Wikipedia:Textverarbeitung/OOoCalc2Wiki|Calc2Wiki]] konvertiert werden. Eine Alternative (mit der ein oder anderen Erweiterung) ist [[Benutzer:Erodeist/Calc2WikiTable|Calc2WikiTable]].&lt;br /&gt;
* [http://www.cnic.org/html2mediawiki.html Umwandlung von HTML-Tabellen in Wiki-Tabellen]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6853</id>
		<title>Tabellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6853"/>
		<updated>2024-07-10T13:20:36Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Shortcut|WP:TAB, WP:TBL}}&lt;br /&gt;
{{Wikipedia-Hilfe}}&lt;br /&gt;
Wikipedia bietet eine eigene Syntax, um &#039;&#039;&#039;Tabellen&#039;&#039;&#039; darzustellen. Diese Syntax ist zwar an das verbreitete [[Hypertext Markup Language|HTML]] angelehnt, erleichtert jedoch durch eine vereinfachte Schreibweise die Arbeit an komplizierteren Tabellen wesentlich. Diese Seite bietet eine Kurzübersicht, wie du Tabellen erstellst, eine ausführliche Darstellung findet sich auf &#039;&#039;&#039;[[Hilfe:Tabellen-Referenz]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um die Zellen einer Tabelle zu formatieren, lassen sich sowohl für die Tabelle als Ganzes als auch für einzelne Zellen HTML-Attribute angeben. Insbesondere kann das &amp;lt;tt&amp;gt;style&amp;lt;/tt&amp;gt;-Attribut verwendet werden, wodurch sich beliebige [[Cascading Style Sheets|CSS]]-Formatierungen realisieren lassen. Zwar lassen sich auch einzelne Zeilen einer Tabelle formatieren, möchte man jedoch ein Attribut an eine bestimmte Spalte vergeben, so muss dies zellenweise geschehen.&lt;br /&gt;
&lt;br /&gt;
== Wann Tabellen einsetzen? ==&lt;br /&gt;
&#039;&#039;&#039;Tabellen&#039;&#039;&#039; sind ein gutes Mittel, um gleichartige Informationen übersichtlich zu gestalten. Sie helfen die Beziehungen zwischen Tabellenzellen und ihren Zeilen und Spalten zu verstehen (siehe [[Semantik|semantische Beziehungen]]). Insbesondere als sortierbare Tabellen bieten sie einen schnellen Überblick beispielsweise über Jahreszahlen, Namen oder Orte.&lt;br /&gt;
:&#039;&#039;Siehe Hauptartikel [[Wikipedia:Tabellen]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Andererseits sind Tabellen komplizierter als normaler Text. Deshalb sollten sie nur dort eingesetzt werden, wo sie tatsächlich für bessere Übersicht sorgen. Überlege immer, ob du die Informationen nicht besser in einer einfachen Liste unterbringen kannst (siehe [[Hilfe:Textgestaltung|Textgestaltung]] und [[Hilfe:Listen|Listen]]).&lt;br /&gt;
&lt;br /&gt;
Tabellen sollte man nicht als „grafisches Gestaltungsmittel“ einsetzen.&lt;br /&gt;
&lt;br /&gt;
== CSS-Klassen für Tabellen ==&lt;br /&gt;
Um Tabellen sowohl in ihren Inhalten als auch bereits im Kopfbereich weitestgehend frei von Elementen zu halten, die die Darstellungsweise betreffen, wurden für das global wirksame CSS einige Klassen entwickelt, die es erlauben, wichtige Stile mit wenigen anschaulichen Anweisungen festzulegen.&lt;br /&gt;
&lt;br /&gt;
=== wikitable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf lässt sich eine schwach grau getönte Tabelle mit sichtbaren, wenngleich dezenten Zellgrenzen erstellen. Zwischen Zellinhalt und Rand wird etwas &amp;quot;Luft&amp;quot; gelassen. Die Standardtabelle ist rahmenlos und hat weißen Hintergrund, was für Layout-Zwecke teilweise erwünscht ist, sich jedoch in bestimmten Fällen zu schlecht vom Text absetzt.&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;prettytable&amp;lt;/code&amp;gt; mit einem ganz ähnlichem Anspruch sollte nicht mehr verwendet werden, um die Kohärenz der Stilmittel zwischen den verschiedenen Wikipedias zu fördern. Sie wird ausschließlich in der deutschen Wikipedia verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sortable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;sortable&amp;quot;&amp;lt;/code&amp;gt; werden Spalten sortierbar gemacht. Das heißt, wenn [[JavaScript]] für die Wikipedia aktiviert ist, können Tabellen durch Klick auf das entsprechende Symbol in einem Spaltenkopf nach dieser Spalte auf- und absteigend sortiert werden. Die mitunter unsortierte Ausgangs-Darstellung erhält man durch Neuladen der Seite. Einzelne Spalten, für die eine Sortierung als unsinnig angesehen wird, können mittels der spaltenweisen Angabe von &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; markiert werden, so werden die Sortierfunktion und -symbol unterdrückt. Mit der gleichen Angabe können auch einzelne Tabellen&#039;&#039;zeilen&#039;&#039; von der Sortierung ausgenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;siehe auch:&#039;&#039; [[:meta:Help:Sorting|MediaWiki Handbook - Sorting]]&lt;br /&gt;
&lt;br /&gt;
=== toptextcells ===&lt;br /&gt;
Durch &amp;lt;code&amp;gt;class=&amp;quot;toptextcells&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf kann das Standardverhalten, dass Texte in Zellen vertikal zentriert dargestellt werden, dahingehend abgeändert werden, dass die Texte immer oben beginnen und der Abstand jeweils nach unten variiert. In Fällen stark unterschiedlicher Auffüllung führt dies zu einer größeren Übersicht, die obere Textzeile bildet mit der oberen Begrenzung zusammen eine Flucht. Die Alternative zu dieser Klasse wäre die Einfügung von style-Anweisungen pro Tabellenzeile.&lt;br /&gt;
&lt;br /&gt;
=== Kombinationen ===&lt;br /&gt;
Die genannten drei Klassen lassen sich kombinieren. Hierbei sollte Augenmaß gewahrt werden, nicht jede Eigenschaft ist immer passend. Sortierbare Wikitables (&amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt;) werden sich häufig anbieten. Oben ausgerichtete Texte in Zellen werden häufig mit Wikitable kombiniert werden. &lt;br /&gt;
&lt;br /&gt;
Auch Kombinationen aller drei Stile sind denkbar, wenn in Tabellen umfangreiche Erläuterungen enthalten sind, diese sollten dann als &amp;lt;code&amp;gt;unsortable&amp;lt;/code&amp;gt; markiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit der class=&amp;quot;wikitable&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Am 23. Februar 2008 wurde die „[[Vorlage:Prettytable]]“ als „veraltet“ [{{fullurl:Spezial:Logbuch|type=delete&amp;amp;page=Vorlage:Prettytable&amp;amp;year=2008&amp;amp;month=2}} gelöscht] und somit endgültig von der [[Cascading Style Sheets|CSS]]-&amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; ersetzt (zu finden in [[MediaWiki:Common.css]]). Daneben existiert auch die &amp;lt;code&amp;gt;class=&amp;quot;prettytable&amp;quot;&amp;lt;/code&amp;gt;, diese sollte aber nicht mehr verwendet werden, da die deutschsprachige Wikipedia die einzige ist, welche diese Klasse verwendet. Im Zuge der Internationalisierung und für den Export ist es hilfreich, wenn sie nicht mehr verwendet wird.&amp;lt;ref&amp;gt;Eine Umstellung auf &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; sollte bei der Bearbeitung eines Artikels erfolgen, Bearbeitungen die nur diese Umstellung beinhalten sowie Botläufe, sind zu unterlassen. Weitere Informationen gibt es dazu unter [[Wikipedia Diskussion:Bots/Archiv 2008#Klasse &amp;quot;wikitable&amp;quot;]] und [[MediaWiki Diskussion:Common.css#Klasse &amp;quot;wikitable&amp;quot;]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Umstellung ist in mancherlei Hinsicht nicht nur ein Segen. So kann mit &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; beispielsweise das [http://de.selfhtml.org/html/referenz/attribute.htm#table &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;&#039;&#039;&#039;cellpadding&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;] (die „Zellen-Polsterung“) anscheinend &#039;&#039;nicht mehr in einem Rutsch&#039;&#039; für die ganze Tabelle verändert/definiert werden&amp;lt;sup&amp;gt;&amp;amp;#91;[[Wikipedia:Fragen zur Wikipedia/Archiv/2008/Woche 25#Falsch angewandtes cellpadding?|WP:FZW-Archiv:&amp;amp;nbsp;Juni&amp;amp;nbsp;2008]]&amp;amp;#93;&amp;lt;/sup&amp;gt;. Wo deshalb „unbedingt“ nötig, kann statt &amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;{| class=&amp;quot;wikitable&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doch noch eine Entsprechung der „[[Vorlage:Prettytable]]“ verwendet werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;border=&amp;quot;1&amp;quot; &amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;cellpadding=&amp;quot;20&amp;quot;&amp;lt;/span&amp;gt; style=&amp;quot;margin:1em 1em 1em 0; background:#f9f9f9; border:1px #AAA solid; border-collapse:collapse; empty-cells:show;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Tipp: Mit der Eigenschaft &amp;lt;code&amp;gt;text-indent&amp;lt;/code&amp;gt; und einem Wert so um die 4px bekommt man einen ganz vernünftigen Abstand zum linken Rand hin. Wenn das hinter der Klasse &amp;quot;wikitable sortable&amp;quot; oder &amp;quot;wikitable&amp;quot; notiert wird, bezieht sich diese Zuweisung auf alle Zellen. So könnte die erste Zeile einer Tabelle aussehen: &amp;lt;code&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-indent:4px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfache Tabelle ==&lt;br /&gt;
Eine einfache Beispieltabelle aus dem Artikel [[Bayern-Landshut#Liste der Herzöge von Bayern-Landshut|Bayern-Landshut]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !!  Regierungszeit                       !!  Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]    || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die obige Tabelle wird durch den folgenden Quelltext erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !! Regierungszeit                                !! Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]              || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;{|&amp;lt;/code&amp;gt; beginnen eine Tabelle, während &amp;lt;code&amp;gt;|}&amp;lt;/code&amp;gt; sie abschließen. Beide Tags müssen an einem Zeilenanfang stehen.&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; veranlasst, dass die ganze Tabelle nach den Vorgaben der Klasse &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; formatiert wird. Diese sieht unter anderem Trennlinien zwischen den Zellen sowie zusätzlichen Platz zwischen Zelleninhalt und Zellenrand (das sogenannte &#039;&#039;cellpadding&#039;&#039;) vor.&lt;br /&gt;
* Zeilen, die mit einem Ausrufezeichen (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) beginnen, definieren Kopfzeilen von Tabellen. Der Text in einer Zelle einer solchen Zeile wird zentriert und fettgedruckt. Gewöhnliche Tabellenzeilen beginnen dagegen mit einem senkrechten Trennstrich (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Das Tag &amp;lt;code&amp;gt;|-&amp;lt;/code&amp;gt; beginnt eine neue Tabellenzeile, falls es im Quelltext an einem Zeilenanfang steht.&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; trennen nebeneinanderliegende Tabellenzellen.&lt;br /&gt;
* Die Zeichenfolge &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; anstatt eines Leerzeichens verhindert einen Zeilenumbruch zwischen den beiden Wörtern, die das Leerzeichen trennt.&lt;br /&gt;
* Die Jahreszahlen werden durch &amp;lt;code&amp;gt;&amp;amp;lt;tt&amp;gt;&amp;lt;/code&amp;gt; mit fester Zeichenbreite dargestellt, um sicherzugehen, dass sie am Bindestrich ausgerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Soll die Tabelle rechtsbündig zum Text ausgerichtet werden, lässt sich dies durch die zusätzliche Klasse &amp;lt;code&amp;gt;float-right&amp;lt;/code&amp;gt; im Attribut erreichen: &amp;lt;code&amp;gt;class=&amp;quot;wikitable float-right&amp;quot;&amp;lt;/code&amp;gt;. Zentrierung der Tabelle erreicht man durch die zusätzliche Klasse &amp;lt;code&amp;gt;centered&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;class=&amp;quot;wikitable centered&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Sortierbare Tabelle ==&lt;br /&gt;
Sortierbare Tabellen ermöglichen verschiedene und vom Leser wählbare Sichtweisen auf eine Sache:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese sortierbare Tabelle wird durch folgenden Code erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Namen ===&lt;br /&gt;
Nach der Namenskonvention steht in Wikipedia zuerst der Vorname, gefolgt vom Nachnamen.&amp;lt;br /&amp;gt;Die [[Vorlage:SortKeyName]] sorgt dafür, dass die Tabellenspalten hier dennoch nach dem Nachnamen sortiert werden:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei komplizierteren Namen, beispielsweise mit zwei Vornamen oder mit Sonderzeichen im Namen funktioniert [[Vorlage:SortKey]]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Liste der Abgeordneten zum Kärntner Landtag (29. Gesetzgebungsperiode)|Abgeordnete im Kärntner Landtag]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahlen und Geldbeträge ===&lt;br /&gt;
Zahlen und Geld-Währungen werden so rechtsbündig und sortierbar dargestellt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rechtsbündige Zahlen werden nur dann korrekt sortiert, wenn die Anzahl der Nachkommastellen bei allen Einträgen einer Spalte gleich sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; [[Vorlage:Dts]] für Datumsangaben, [[Vorlage:Nts]] und [[Vorlage:0]] für Zahlen&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenstellige Zahlen ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Nummer !! Ort &lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
|-&lt;br /&gt;
| 03301 || [[Oranienburg]]&lt;br /&gt;
|-&lt;br /&gt;
| 03302 || [[Hennigsdorf]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Vorwahl 03 (Deutschland)|Telefon-Vorwahl 03 (Deutschland)]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare verschiedenstellige Zahlen mit Dezimaltrennzeichen ===&lt;br /&gt;
Damit bei verschiedenstelligen Zahlen in einer Spalte das Komma immer übereinander dargestellt wird gibt es zwei Möglichkeiten. Beide sind sortierbar. Lösung a) ist angenehmer zu lesen also für Wikipedia geeigneter. Lösung b) ist einfacher zu schreiben und für Zahlen mit immer gleicher Zahl von Nachkommastellen, Währungen beispielsweise, genauso gut geeignet:&lt;br /&gt;
&lt;br /&gt;
a) Verwendung von [[Vorlage:0]] für alle führenden Nullen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b) rechtsbündiger Zellenformatierung unter Verwendung der gleichen Anzahl an Nachkommastellen, wobei die zur Ausrichtung künstlich aufgefüllten Nachkommastellen per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; versteckt werden können, ein zu versteckendes Komma ist per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0|,}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; erzielbar:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahl mit Währungs- oder %-Symbol ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}1 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}3 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Sortierbare Tabelle mit einer nicht-sortierbaren Zeile ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
=== Tabellenüberschriften, Trennstriche ===&lt;br /&gt;
Das folgende Beispiel zeigt, wie man eine Tabellenüberschrift erzeugt, sowie eine Möglichkeit, wie sich Trennstriche zwischen bestimmten Zellen realisieren lassen:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext dieser Beispieltabelle sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeile, die mit &amp;lt;code&amp;gt;|+&amp;lt;/code&amp;gt; beginnt, bezeichnet den Titel der Tabelle.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;border-top: 1pt&amp;lt;/code&amp;gt; weist der Zelle einen oberen Rand mit definierter Breite zu. Weitere Befehle sind: &amp;lt;code&amp;gt;border-left, border-right&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;border-bottom&amp;lt;/code&amp;gt; für einen Rand links, rechts oder unten. &amp;lt;code&amp;gt;border: 1pt&amp;lt;/code&amp;gt; setzt alle vier Ränder.&lt;br /&gt;
&lt;br /&gt;
=== Zellfärbung, Spaltenbreite, Textausrichtung ===&lt;br /&gt;
Dieses Beispiel erläutert, wie man sortierbare Tabellen erstellt, wie man Zellen färbt, den Zelleninhalt rechts ausrichtet und die Spaltenbreite einstellt. Es lehnt sich an die [[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Liste der römischen Kaiser]] an:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext hierfür sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortable&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt; erlaubt die Sortierung der Tabelle nach wählbaren Spalten.&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; können einzelne Spalten von der Sortierbarkeit ausgenommen werden.&lt;br /&gt;
* Mit den Vorlagen [[:Vorlage:Dts]], [[:Vorlage:Nts]] und [[:Vorlage:SortKey]] lässt sich die Sortierreihenfolge einzelner Tabelleneinträge beeinflussen&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;width=&amp;quot;15%&amp;quot;&amp;lt;/code&amp;gt; weist einer Spalte 15 % der Gesamtbreite der Tabelle als Breite zu.&lt;br /&gt;
* Die Ausrichtung von Text rechtsbündig in einer Zelle erreicht man durch die [[Cascading Style Sheets|CSS]]-Anweisung &amp;lt;code&amp;gt;style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Nebeneinanderliegende Zellen kann man sowohl durch das &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;-Zeichen trennen, als auch durch einen Zeilenumbruch gefolgt von einem einfachen &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;-Zeichen.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;|- class=&amp;quot;hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; weist der darauffolgenden Zeile eine Hintergrundfarbe zu. In Artikeln sollen die entsprechenden Standardfarben verwendet werden (siehe [[Hilfe:Farben#Farben verwenden|Farben verwenden]] in der [[Hilfe:Farben|Hilfe zu Farben]]). Außerhalb des Artikelnamensraumes können Farben außer durch ihren englischen Namen auch als Hexadezimalzahl aus sechs Ziffern eingegeben werden, wobei die ersten zwei Ziffern für den Rotanteil von bis zu 256 stehen, die nächsten zwei für den Grünanteil und die letzten zwei für den Blauanteil, das heißt, dass &amp;lt;code&amp;gt;#ff0000&amp;lt;/code&amp;gt; die Farbe Rot bedeutet, &amp;lt;code&amp;gt;#00ff00&amp;lt;/code&amp;gt; steht für Grün und &amp;lt;code&amp;gt;#0000ff&amp;lt;/code&amp;gt; steht für Blau. Durch eine Mischung erhält man beispielsweise Violett: &amp;lt;code&amp;gt;#ff00ff&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Leerzellen können durch einen einfachen Abstand erzeugt werden. Diese Zellen werden aber beim Sortieren an den Anfang gestellt, Leerzellen mit &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; stehen am Ende.&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortbottom&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; führt dazu, dass die Zeile von der Sortierung ausgenommen wird und damit stets als Fußzeile der Tabelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=== Geschachtelte Tabellen ===&lt;br /&gt;
Tabellen können geschachtelt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan + rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot; | A&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| eine Spalte&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|-&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabellen nebeneinander ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gleich breite Tabellen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Listen in Tabellen, Bilder in Tabellen ===&lt;br /&gt;
Tabellen können Tabellen, Bilder und Wiki-Syntax-Formatierung enthalten:&lt;br /&gt;
&lt;br /&gt;
{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieser Text erzeugt die rechte Tabelle, wenn man ihn in einen Artikel eingibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
→ &#039;&#039;Siehe: [[Wikipedia:Taxoboxen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Bei [[meta:Main Page|MetaWiki]] befindet sich ein [[meta:Help:Table|englischer Artikel]], der die Gestaltung mit Tabellen etwas ausführlicher behandelt.&lt;br /&gt;
* Außerdem gibt es bei [[meta:Main Page|MetaWiki]] einen [[meta:Help:Sorting|englischen Artikel]], der die Sortierung von Tabellen im Detail behandelt.&lt;br /&gt;
* Im Abschnitt [[Wikipedia:Wie gute Artikel aussehen#Tabellen|Tabellen]] in [[Wikipedia:Wie gute Artikel aussehen|Wie gute Artikel aussehen]] wird auf die Bedeutung von Vorlagen zur Vereinheitlichung hingewiesen.&lt;br /&gt;
* Der Abschnitt [[Hilfe:Bilder#Ausrichten im Text|Ausrichten im Text]] in der [[Hilfe:Bilder|Hilfe für Bilder]] über die Positionierung von Bildern in Tabellen&lt;br /&gt;
* In [[Hilfe:Tabellen-Referenz]] sind die einzelnen Möglichkeiten nochmals mit Beispielen aufgeführt.&lt;br /&gt;
* Beispiele: [[:Kategorie:Vorlage:Tabelle]] – Tabellen, die auf mehreren Seiten als Vorlage eingebunden werden&lt;br /&gt;
&lt;br /&gt;
== Hilfen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:PeerBr/WPro|WPro]]&#039;&#039;&#039; (Server zur Zeit nicht erreichbar) ist ein Wikipedia-Editor für den [[Windows Internet Explorer|Internet Explorer]] 6.0, der Tabellen per Knopfdruck einfügen und formatieren kann.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/EXCEL-Tabellenumwandlung|EXCEL-Tabellenumwandlung]]&#039;&#039;&#039; konvertiert den ausgewählten Tabellenbereich aus MS Excel direkt ins Wiki-Tabellenformat. Die wichtigsten Formatierungen wie Fett/Kursiv, Zellenhöhe und -breite, Schriftgröße, Farbinformation aus MS Excel bleiben erhalten.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/Excel2Wiki|Excel2Wiki]]&#039;&#039;&#039; Berücksichtigt verbundene Zellen, dazu auch ein Programm zur Umwandlung der Spalten in Zeilen und umgekehrt und ein Programm zur Zeilenumkehr, d.&amp;amp;nbsp;h. die letzte Zeile wird zur ersten usw.&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:Duesentrieb/csv2wp|csv2wp]]&#039;&#039;&#039; ist ein Werkzeug zum Umwandeln von [[CSV (Dateiformat)|CSV-Datei]]en in Wiki-Tabellenformat. Damit lassen sich z.&amp;amp;nbsp;B. Tabellen aus [[Microsoft Excel]] importieren.&lt;br /&gt;
* Ab [[OpenOffice.org|OpenOffice]] 2.3 kann man Writer-Dokumente ins [http://de.openoffice.org/presse/pressemitteilung_20070917.html Mediawiki-Format] exportieren.&lt;br /&gt;
* [[OpenOffice.org|OpenOffice]]-Tabellen können mit [[Wikipedia:Textverarbeitung/OOoCalc2Wiki|Calc2Wiki]] konvertiert werden. Eine Alternative (mit der ein oder anderen Erweiterung) ist [[Benutzer:Erodeist/Calc2WikiTable|Calc2WikiTable]].&lt;br /&gt;
* [http://www.cnic.org/html2mediawiki.html Umwandlung von HTML-Tabellen in Wiki-Tabellen]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6852</id>
		<title>Tabellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6852"/>
		<updated>2024-07-10T13:17:10Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Shortcut|WP:TAB, WP:TBL}}&lt;br /&gt;
{{Wikipedia-Hilfe}}&lt;br /&gt;
Wikipedia bietet eine eigene Syntax, um &#039;&#039;&#039;Tabellen&#039;&#039;&#039; darzustellen. Diese Syntax ist zwar an das verbreitete [[Hypertext Markup Language|HTML]] angelehnt, erleichtert jedoch durch eine vereinfachte Schreibweise die Arbeit an komplizierteren Tabellen wesentlich. Diese Seite bietet eine Kurzübersicht, wie du Tabellen erstellst, eine ausführliche Darstellung findet sich auf &#039;&#039;&#039;[[Hilfe:Tabellen-Referenz]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um die Zellen einer Tabelle zu formatieren, lassen sich sowohl für die Tabelle als Ganzes als auch für einzelne Zellen HTML-Attribute angeben. Insbesondere kann das &amp;lt;tt&amp;gt;style&amp;lt;/tt&amp;gt;-Attribut verwendet werden, wodurch sich beliebige [[Cascading Style Sheets|CSS]]-Formatierungen realisieren lassen. Zwar lassen sich auch einzelne Zeilen einer Tabelle formatieren, möchte man jedoch ein Attribut an eine bestimmte Spalte vergeben, so muss dies zellenweise geschehen.&lt;br /&gt;
&lt;br /&gt;
== Wann Tabellen einsetzen? ==&lt;br /&gt;
&#039;&#039;&#039;Tabellen&#039;&#039;&#039; sind ein gutes Mittel, um gleichartige Informationen übersichtlich zu gestalten. Sie helfen die Beziehungen zwischen Tabellenzellen und ihren Zeilen und Spalten zu verstehen (siehe [[Semantik|semantische Beziehungen]]). Insbesondere als sortierbare Tabellen bieten sie einen schnellen Überblick beispielsweise über Jahreszahlen, Namen oder Orte.&lt;br /&gt;
:&#039;&#039;Siehe Hauptartikel [[Wikipedia:Tabellen]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Andererseits sind Tabellen komplizierter als normaler Text. Deshalb sollten sie nur dort eingesetzt werden, wo sie tatsächlich für bessere Übersicht sorgen. Überlege immer, ob du die Informationen nicht besser in einer einfachen Liste unterbringen kannst (siehe [[Hilfe:Textgestaltung|Textgestaltung]] und [[Hilfe:Listen|Listen]]).&lt;br /&gt;
&lt;br /&gt;
Tabellen sollte man nicht als „grafisches Gestaltungsmittel“ einsetzen.&lt;br /&gt;
&lt;br /&gt;
== CSS-Klassen für Tabellen ==&lt;br /&gt;
Um Tabellen sowohl in ihren Inhalten als auch bereits im Kopfbereich weitestgehend frei von Elementen zu halten, die die Darstellungsweise betreffen, wurden für das global wirksame CSS einige Klassen entwickelt, die es erlauben, wichtige Stile mit wenigen anschaulichen Anweisungen festzulegen.&lt;br /&gt;
&lt;br /&gt;
=== wikitable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf lässt sich eine schwach grau getönte Tabelle mit sichtbaren, wenngleich dezenten Zellgrenzen erstellen. Zwischen Zellinhalt und Rand wird etwas &amp;quot;Luft&amp;quot; gelassen. Die Standardtabelle ist rahmenlos und hat weißen Hintergrund, was für Layout-Zwecke teilweise erwünscht ist, sich jedoch in bestimmten Fällen zu schlecht vom Text absetzt.&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;prettytable&amp;lt;/code&amp;gt; mit einem ganz ähnlichem Anspruch sollte nicht mehr verwendet werden, um die Kohärenz der Stilmittel zwischen den verschiedenen Wikipedias zu fördern. Sie wird ausschließlich in der deutschen Wikipedia verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sortable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;sortable&amp;quot;&amp;lt;/code&amp;gt; werden Spalten sortierbar gemacht. Das heißt, wenn [[JavaScript]] für die Wikipedia aktiviert ist, können Tabellen durch Klick auf das entsprechende Symbol in einem Spaltenkopf nach dieser Spalte auf- und absteigend sortiert werden. Die mitunter unsortierte Ausgangs-Darstellung erhält man durch Neuladen der Seite. Einzelne Spalten, für die eine Sortierung als unsinnig angesehen wird, können mittels der spaltenweisen Angabe von &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; markiert werden, so werden die Sortierfunktion und -symbol unterdrückt. Mit der gleichen Angabe können auch einzelne Tabellen&#039;&#039;zeilen&#039;&#039; von der Sortierung ausgenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;siehe auch:&#039;&#039; [[:meta:Help:Sorting|MediaWiki Handbook - Sorting]]&lt;br /&gt;
&lt;br /&gt;
=== toptextcells ===&lt;br /&gt;
Durch &amp;lt;code&amp;gt;class=&amp;quot;toptextcells&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf kann das Standardverhalten, dass Texte in Zellen vertikal zentriert dargestellt werden, dahingehend abgeändert werden, dass die Texte immer oben beginnen und der Abstand jeweils nach unten variiert. In Fällen stark unterschiedlicher Auffüllung führt dies zu einer größeren Übersicht, die obere Textzeile bildet mit der oberen Begrenzung zusammen eine Flucht. Die Alternative zu dieser Klasse wäre die Einfügung von style-Anweisungen pro Tabellenzeile.&lt;br /&gt;
&lt;br /&gt;
=== Kombinationen ===&lt;br /&gt;
Die genannten drei Klassen lassen sich kombinieren. Hierbei sollte Augenmaß gewahrt werden, nicht jede Eigenschaft ist immer passend. Sortierbare Wikitables (&amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt;) werden sich häufig anbieten. Oben ausgerichtete Texte in Zellen werden häufig mit Wikitable kombiniert werden. &lt;br /&gt;
&lt;br /&gt;
Auch Kombinationen aller drei Stile sind denkbar, wenn in Tabellen umfangreiche Erläuterungen enthalten sind, diese sollten dann als &amp;lt;code&amp;gt;unsortable&amp;lt;/code&amp;gt; markiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit der class=&amp;quot;wikitable&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Am 23. Februar 2008 wurde die „[[Vorlage:Prettytable]]“ als „veraltet“ [{{fullurl:Spezial:Logbuch|type=delete&amp;amp;page=Vorlage:Prettytable&amp;amp;year=2008&amp;amp;month=2}} gelöscht] und somit endgültig von der [[Cascading Style Sheets|CSS]]-&amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; ersetzt (zu finden in [[MediaWiki:Common.css]]). Daneben existiert auch die &amp;lt;code&amp;gt;class=&amp;quot;prettytable&amp;quot;&amp;lt;/code&amp;gt;, diese sollte aber nicht mehr verwendet werden, da die deutschsprachige Wikipedia die einzige ist, welche diese Klasse verwendet. Im Zuge der Internationalisierung und für den Export ist es hilfreich, wenn sie nicht mehr verwendet wird.&amp;lt;ref&amp;gt;Eine Umstellung auf &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; sollte bei der Bearbeitung eines Artikels erfolgen, Bearbeitungen die nur diese Umstellung beinhalten sowie Botläufe, sind zu unterlassen. Weitere Informationen gibt es dazu unter [[Wikipedia Diskussion:Bots/Archiv 2008#Klasse &amp;quot;wikitable&amp;quot;]] und [[MediaWiki Diskussion:Common.css#Klasse &amp;quot;wikitable&amp;quot;]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Umstellung ist in mancherlei Hinsicht nicht nur ein Segen. So kann mit &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; beispielsweise das [http://de.selfhtml.org/html/referenz/attribute.htm#table &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;&#039;&#039;&#039;cellpadding&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;] (die „Zellen-Polsterung“) anscheinend &#039;&#039;nicht mehr in einem Rutsch&#039;&#039; für die ganze Tabelle verändert/definiert werden&amp;lt;sup&amp;gt;&amp;amp;#91;[[Wikipedia:Fragen zur Wikipedia/Archiv/2008/Woche 25#Falsch angewandtes cellpadding?|WP:FZW-Archiv:&amp;amp;nbsp;Juni&amp;amp;nbsp;2008]]&amp;amp;#93;&amp;lt;/sup&amp;gt;. Wo deshalb „unbedingt“ nötig, kann statt &amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;{| class=&amp;quot;wikitable&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doch noch eine Entsprechung der „[[Vorlage:Prettytable]]“ verwendet werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;border=&amp;quot;1&amp;quot; &amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;cellpadding=&amp;quot;20&amp;quot;&amp;lt;/span&amp;gt; style=&amp;quot;margin:1em 1em 1em 0; background:#f9f9f9; border:1px #AAA solid; border-collapse:collapse; empty-cells:show;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Tipp: Mit der Eigenschaft &amp;lt;code&amp;gt;text-indent&amp;lt;/code&amp;gt; und einem Wert so um die 4px bekommt man einen ganz vernünftigen Abstand zum linken Rand hin. Wenn das hinter der Klasse &amp;quot;wikitable sortable&amp;quot; oder &amp;quot;wikitable&amp;quot; notiert wird, bezieht sich diese Zuweisung auf alle Zellen. So könnte die erste Zeile einer Tabelle aussehen: &amp;lt;code&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-indent:4px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfache Tabelle ==&lt;br /&gt;
Eine einfache Beispieltabelle aus dem Artikel [[Bayern-Landshut#Liste der Herzöge von Bayern-Landshut|Bayern-Landshut]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !!  Regierungszeit                       !!  Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]    || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die obige Tabelle wird durch den folgenden Quelltext erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !! Regierungszeit                                !! Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]              || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;{|&amp;lt;/code&amp;gt; beginnen eine Tabelle, während &amp;lt;code&amp;gt;|}&amp;lt;/code&amp;gt; sie abschließen. Beide Tags müssen an einem Zeilenanfang stehen.&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; veranlasst, dass die ganze Tabelle nach den Vorgaben der Klasse &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; formatiert wird. Diese sieht unter anderem Trennlinien zwischen den Zellen sowie zusätzlichen Platz zwischen Zelleninhalt und Zellenrand (das sogenannte &#039;&#039;cellpadding&#039;&#039;) vor.&lt;br /&gt;
* Zeilen, die mit einem Ausrufezeichen (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) beginnen, definieren Kopfzeilen von Tabellen. Der Text in einer Zelle einer solchen Zeile wird zentriert und fettgedruckt. Gewöhnliche Tabellenzeilen beginnen dagegen mit einem senkrechten Trennstrich (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Das Tag &amp;lt;code&amp;gt;|-&amp;lt;/code&amp;gt; beginnt eine neue Tabellenzeile, falls es im Quelltext an einem Zeilenanfang steht.&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; trennen nebeneinanderliegende Tabellenzellen.&lt;br /&gt;
* Die Zeichenfolge &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; anstatt eines Leerzeichens verhindert einen Zeilenumbruch zwischen den beiden Wörtern, die das Leerzeichen trennt.&lt;br /&gt;
* Die Jahreszahlen werden durch &amp;lt;code&amp;gt;&amp;amp;lt;tt&amp;gt;&amp;lt;/code&amp;gt; mit fester Zeichenbreite dargestellt, um sicherzugehen, dass sie am Bindestrich ausgerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Soll die Tabelle rechtsbündig zum Text ausgerichtet werden, lässt sich dies durch die zusätzliche Klasse &amp;lt;code&amp;gt;float-right&amp;lt;/code&amp;gt; im Attribut erreichen: &amp;lt;code&amp;gt;class=&amp;quot;wikitable float-right&amp;quot;&amp;lt;/code&amp;gt;. Zentrierung der Tabelle erreicht man durch die zusätzliche Klasse &amp;lt;code&amp;gt;centered&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;class=&amp;quot;wikitable centered&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Sortierbare Tabelle ==&lt;br /&gt;
Sortierbare Tabellen ermöglichen verschiedene und vom Leser wählbare Sichtweisen auf eine Sache:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese sortierbare Tabelle wird durch folgenden Code erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Namen ===&lt;br /&gt;
Nach der Namenskonvention steht in Wikipedia zuerst der Vorname, gefolgt vom Nachnamen.&amp;lt;br /&amp;gt;Die [[Vorlage:SortKeyName]] sorgt dafür, dass die Tabellenspalten hier dennoch nach dem Nachnamen sortiert werden:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei komplizierteren Namen, beispielsweise mit zwei Vornamen oder mit Sonderzeichen im Namen funktioniert [[Vorlage:SortKey]]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Liste der Abgeordneten zum Kärntner Landtag (29. Gesetzgebungsperiode)|Abgeordnete im Kärntner Landtag]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahlen und Geldbeträge ===&lt;br /&gt;
Zahlen und Geld-Währungen werden so rechtsbündig und sortierbar dargestellt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rechtsbündige Zahlen werden nur dann korrekt sortiert, wenn die Anzahl der Nachkommastellen bei allen Einträgen einer Spalte gleich sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; [[Vorlage:Dts]] für Datumsangaben, [[Vorlage:Nts]] und [[Vorlage:0]] für Zahlen&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenstellige Zahlen ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Nummer !! Ort &lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
|-&lt;br /&gt;
| 03301 || [[Oranienburg]]&lt;br /&gt;
|-&lt;br /&gt;
| 03302 || [[Hennigsdorf]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Vorwahl 03 (Deutschland)|Telefon-Vorwahl 03 (Deutschland)]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare verschiedenstellige Zahlen mit Dezimaltrennzeichen ===&lt;br /&gt;
Damit bei verschiedenstelligen Zahlen in einer Spalte das Komma immer übereinander dargestellt wird gibt es zwei Möglichkeiten. Beide sind sortierbar. Lösung a) ist angenehmer zu lesen also für Wikipedia geeigneter. Lösung b) ist einfacher zu schreiben und für Zahlen mit immer gleicher Zahl von Nachkommastellen, Währungen beispielsweise, genauso gut geeignet:&lt;br /&gt;
&lt;br /&gt;
a) Verwendung von [[Vorlage:0]] für alle führenden Nullen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b) rechtsbündiger Zellenformatierung unter Verwendung der gleichen Anzahl an Nachkommastellen, wobei die zur Ausrichtung künstlich aufgefüllten Nachkommastellen per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; versteckt werden können, ein zu versteckendes Komma ist per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0|,}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; erzielbar:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahl mit Währungs- oder %-Symbol ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}1 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}3 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Sortierbare Tabelle mit einer nicht-sortierbaren Zeile ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
=== Tabellenüberschriften, Trennstriche ===&lt;br /&gt;
Das folgende Beispiel zeigt, wie man eine Tabellenüberschrift erzeugt, sowie eine Möglichkeit, wie sich Trennstriche zwischen bestimmten Zellen realisieren lassen:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext dieser Beispieltabelle sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeile, die mit &amp;lt;code&amp;gt;|+&amp;lt;/code&amp;gt; beginnt, bezeichnet den Titel der Tabelle.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;border-top: 1pt&amp;lt;/code&amp;gt; weist der Zelle einen oberen Rand mit definierter Breite zu. Weitere Befehle sind: &amp;lt;code&amp;gt;border-left, border-right&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;border-bottom&amp;lt;/code&amp;gt; für einen Rand links, rechts oder unten. &amp;lt;code&amp;gt;border: 1pt&amp;lt;/code&amp;gt; setzt alle vier Ränder.&lt;br /&gt;
&lt;br /&gt;
=== Zellfärbung, Spaltenbreite, Textausrichtung ===&lt;br /&gt;
Dieses Beispiel erläutert, wie man sortierbare Tabellen erstellt, wie man Zellen färbt, den Zelleninhalt rechts ausrichtet und die Spaltenbreite einstellt. Es lehnt sich an die [[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Liste der römischen Kaiser]] an:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext hierfür sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortable&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt; erlaubt die Sortierung der Tabelle nach wählbaren Spalten.&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; können einzelne Spalten von der Sortierbarkeit ausgenommen werden.&lt;br /&gt;
* Mit den Vorlagen [[:Vorlage:Dts]], [[:Vorlage:Nts]] und [[:Vorlage:SortKey]] lässt sich die Sortierreihenfolge einzelner Tabelleneinträge beeinflussen&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;width=&amp;quot;15%&amp;quot;&amp;lt;/code&amp;gt; weist einer Spalte 15 % der Gesamtbreite der Tabelle als Breite zu.&lt;br /&gt;
* Die Ausrichtung von Text rechtsbündig in einer Zelle erreicht man durch die [[Cascading Style Sheets|CSS]]-Anweisung &amp;lt;code&amp;gt;style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Nebeneinanderliegende Zellen kann man sowohl durch das &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;-Zeichen trennen, als auch durch einen Zeilenumbruch gefolgt von einem einfachen &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;-Zeichen.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;|- class=&amp;quot;hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; weist der darauffolgenden Zeile eine Hintergrundfarbe zu. In Artikeln sollen die entsprechenden Standardfarben verwendet werden (siehe [[Hilfe:Farben#Farben verwenden|Farben verwenden]] in der [[Hilfe:Farben|Hilfe zu Farben]]). Außerhalb des Artikelnamensraumes können Farben außer durch ihren englischen Namen auch als Hexadezimalzahl aus sechs Ziffern eingegeben werden, wobei die ersten zwei Ziffern für den Rotanteil von bis zu 256 stehen, die nächsten zwei für den Grünanteil und die letzten zwei für den Blauanteil, das heißt, dass &amp;lt;code&amp;gt;#ff0000&amp;lt;/code&amp;gt; die Farbe Rot bedeutet, &amp;lt;code&amp;gt;#00ff00&amp;lt;/code&amp;gt; steht für Grün und &amp;lt;code&amp;gt;#0000ff&amp;lt;/code&amp;gt; steht für Blau. Durch eine Mischung erhält man beispielsweise Violett: &amp;lt;code&amp;gt;#ff00ff&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Leerzellen können durch einen einfachen Abstand erzeugt werden. Diese Zellen werden aber beim Sortieren an den Anfang gestellt, Leerzellen mit &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; stehen am Ende.&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortbottom&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; führt dazu, dass die Zeile von der Sortierung ausgenommen wird und damit stets als Fußzeile der Tabelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=== Geschachtelte Tabellen ===&lt;br /&gt;
Tabellen können geschachtelt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan + rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot; | A&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| eine Spalte&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|-&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabellen nebeneinander ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gleich breite Tabellen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Listen in Tabellen, Bilder in Tabellen ===&lt;br /&gt;
Tabellen können Tabellen, Bilder und Wiki-Syntax-Formatierung enthalten:&lt;br /&gt;
&lt;br /&gt;
{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieser Text erzeugt die rechte Tabelle, wenn man ihn in einen Artikel eingibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
→ &#039;&#039;Siehe: [[Wikipedia:Taxoboxen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Bei [[meta:Main Page|MetaWiki]] befindet sich ein [[meta:Help:Table|englischer Artikel]], der die Gestaltung mit Tabellen etwas ausführlicher behandelt.&lt;br /&gt;
* Außerdem gibt es bei [[meta:Main Page|MetaWiki]] einen [[meta:Help:Sorting|englischen Artikel]], der die Sortierung von Tabellen im Detail behandelt.&lt;br /&gt;
* Im Abschnitt [[Wikipedia:Wie gute Artikel aussehen#Tabellen|Tabellen]] in [[Wikipedia:Wie gute Artikel aussehen|Wie gute Artikel aussehen]] wird auf die Bedeutung von Vorlagen zur Vereinheitlichung hingewiesen.&lt;br /&gt;
* Der Abschnitt [[Hilfe:Bilder#Ausrichten im Text|Ausrichten im Text]] in der [[Hilfe:Bilder|Hilfe für Bilder]] über die Positionierung von Bildern in Tabellen&lt;br /&gt;
* In [[Hilfe:Tabellen-Referenz]] sind die einzelnen Möglichkeiten nochmals mit Beispielen aufgeführt.&lt;br /&gt;
* Beispiele: [[:Kategorie:Vorlage:Tabelle]] – Tabellen, die auf mehreren Seiten als Vorlage eingebunden werden&lt;br /&gt;
&lt;br /&gt;
== Hilfen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:PeerBr/WPro|WPro]]&#039;&#039;&#039; (Server zur Zeit nicht erreichbar) ist ein Wikipedia-Editor für den [[Windows Internet Explorer|Internet Explorer]] 6.0, der Tabellen per Knopfdruck einfügen und formatieren kann.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/EXCEL-Tabellenumwandlung|EXCEL-Tabellenumwandlung]]&#039;&#039;&#039; konvertiert den ausgewählten Tabellenbereich aus MS Excel direkt ins Wiki-Tabellenformat. Die wichtigsten Formatierungen wie Fett/Kursiv, Zellenhöhe und -breite, Schriftgröße, Farbinformation aus MS Excel bleiben erhalten.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/Excel2Wiki|Excel2Wiki]]&#039;&#039;&#039; Berücksichtigt verbundene Zellen, dazu auch ein Programm zur Umwandlung der Spalten in Zeilen und umgekehrt und ein Programm zur Zeilenumkehr, d.&amp;amp;nbsp;h. die letzte Zeile wird zur ersten usw.&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:Duesentrieb/csv2wp|csv2wp]]&#039;&#039;&#039; ist ein Werkzeug zum Umwandeln von [[CSV (Dateiformat)|CSV-Datei]]en in Wiki-Tabellenformat. Damit lassen sich z.&amp;amp;nbsp;B. Tabellen aus [[Microsoft Excel]] importieren.&lt;br /&gt;
* Ab [[OpenOffice.org|OpenOffice]] 2.3 kann man Writer-Dokumente ins [http://de.openoffice.org/presse/pressemitteilung_20070917.html Mediawiki-Format] exportieren.&lt;br /&gt;
* [[OpenOffice.org|OpenOffice]]-Tabellen können mit [[Wikipedia:Textverarbeitung/OOoCalc2Wiki|Calc2Wiki]] konvertiert werden. Eine Alternative (mit der ein oder anderen Erweiterung) ist [[Benutzer:Erodeist/Calc2WikiTable|Calc2WikiTable]].&lt;br /&gt;
* [http://www.cnic.org/html2mediawiki.html Umwandlung von HTML-Tabellen in Wiki-Tabellen]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6851</id>
		<title>Tabellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Tabellen&amp;diff=6851"/>
		<updated>2024-07-10T13:16:08Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Shortcut|WP:TAB, WP:TBL}}&lt;br /&gt;
{{Wikipedia-Hilfe}}&lt;br /&gt;
Wikipedia bietet eine eigene Syntax, um &#039;&#039;&#039;Tabellen&#039;&#039;&#039; darzustellen. Diese Syntax ist zwar an das verbreitete [[Hypertext Markup Language|HTML]] angelehnt, erleichtert jedoch durch eine vereinfachte Schreibweise die Arbeit an komplizierteren Tabellen wesentlich. Diese Seite bietet eine Kurzübersicht, wie du Tabellen erstellst, eine ausführliche Darstellung findet sich auf &#039;&#039;&#039;[[Hilfe:Tabellen-Referenz]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um die Zellen einer Tabelle zu formatieren, lassen sich sowohl für die Tabelle als Ganzes als auch für einzelne Zellen HTML-Attribute angeben. Insbesondere kann das &amp;lt;tt&amp;gt;style&amp;lt;/tt&amp;gt;-Attribut verwendet werden, wodurch sich beliebige [[Cascading Style Sheets|CSS]]-Formatierungen realisieren lassen. Zwar lassen sich auch einzelne Zeilen einer Tabelle formatieren, möchte man jedoch ein Attribut an eine bestimmte Spalte vergeben, so muss dies zellenweise geschehen.&lt;br /&gt;
&lt;br /&gt;
== Wann Tabellen einsetzen? ==&lt;br /&gt;
&#039;&#039;&#039;Tabellen&#039;&#039;&#039; sind ein gutes Mittel, um gleichartige Informationen übersichtlich zu gestalten. Sie helfen die Beziehungen zwischen Tabellenzellen und ihren Zeilen und Spalten zu verstehen (siehe [[Semantik|semantische Beziehungen]]). Insbesondere als sortierbare Tabellen bieten sie einen schnellen Überblick beispielsweise über Jahreszahlen, Namen oder Orte.&lt;br /&gt;
:&#039;&#039;Siehe Hauptartikel [[Wikipedia:Tabellen]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Andererseits sind Tabellen komplizierter als normaler Text. Deshalb sollten sie nur dort eingesetzt werden, wo sie tatsächlich für bessere Übersicht sorgen. Überlege immer, ob du die Informationen nicht besser in einer einfachen Liste unterbringen kannst (siehe [[Hilfe:Textgestaltung|Textgestaltung]] und [[Hilfe:Listen|Listen]]).&lt;br /&gt;
&lt;br /&gt;
Tabellen sollte man nicht als „grafisches Gestaltungsmittel“ einsetzen.&lt;br /&gt;
&lt;br /&gt;
== CSS-Klassen für Tabellen ==&lt;br /&gt;
Um Tabellen sowohl in ihren Inhalten als auch bereits im Kopfbereich weitestgehend frei von Elementen zu halten, die die Darstellungsweise betreffen, wurden für das global wirksame CSS einige Klassen entwickelt, die es erlauben, wichtige Stile mit wenigen anschaulichen Anweisungen festzulegen.&lt;br /&gt;
&lt;br /&gt;
=== wikitable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf lässt sich eine schwach grau getönte Tabelle mit sichtbaren, wenngleich dezenten Zellgrenzen erstellen. Zwischen Zellinhalt und Rand wird etwas &amp;quot;Luft&amp;quot; gelassen. Die Standardtabelle ist rahmenlos und hat weißen Hintergrund, was für Layout-Zwecke teilweise erwünscht ist, sich jedoch in bestimmten Fällen zu schlecht vom Text absetzt.&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;prettytable&amp;lt;/code&amp;gt; mit einem ganz ähnlichem Anspruch sollte nicht mehr verwendet werden, um die Kohärenz der Stilmittel zwischen den verschiedenen Wikipedias zu fördern. Sie wird ausschließlich in der deutschen Wikipedia verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sortable ===&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;class=&amp;quot;sortable&amp;quot;&amp;lt;/code&amp;gt; werden Spalten sortierbar gemacht. Das heißt, wenn [[JavaScript]] für die Wikipedia aktiviert ist, können Tabellen durch Klick auf das entsprechende Symbol in einem Spaltenkopf nach dieser Spalte auf- und absteigend sortiert werden. Die mitunter unsortierte Ausgangs-Darstellung erhält man durch Neuladen der Seite. Einzelne Spalten, für die eine Sortierung als unsinnig angesehen wird, können mittels der spaltenweisen Angabe von &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; markiert werden, so werden die Sortierfunktion und -symbol unterdrückt. Mit der gleichen Angabe können auch einzelne Tabellen&#039;&#039;zeilen&#039;&#039; von der Sortierung ausgenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;siehe auch:&#039;&#039; [[:meta:Help:Sorting|MediaWiki Handbook - Sorting]]&lt;br /&gt;
&lt;br /&gt;
=== toptextcells ===&lt;br /&gt;
Durch &amp;lt;code&amp;gt;class=&amp;quot;toptextcells&amp;quot;&amp;lt;/code&amp;gt; im Tabellenkopf kann das Standardverhalten, dass Texte in Zellen vertikal zentriert dargestellt werden, dahingehend abgeändert werden, dass die Texte immer oben beginnen und der Abstand jeweils nach unten variiert. In Fällen stark unterschiedlicher Auffüllung führt dies zu einer größeren Übersicht, die obere Textzeile bildet mit der oberen Begrenzung zusammen eine Flucht. Die Alternative zu dieser Klasse wäre die Einfügung von style-Anweisungen pro Tabellenzeile.&lt;br /&gt;
&lt;br /&gt;
=== Kombinationen ===&lt;br /&gt;
Die genannten drei Klassen lassen sich kombinieren. Hierbei sollte Augenmaß gewahrt werden, nicht jede Eigenschaft ist immer passend. Sortierbare Wikitables (&amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt;) werden sich häufig anbieten. Oben ausgerichtete Texte in Zellen werden häufig mit Wikitable kombiniert werden. &lt;br /&gt;
&lt;br /&gt;
Auch Kombinationen aller drei Stile sind denkbar, wenn in Tabellen umfangreiche Erläuterungen enthalten sind, diese sollten dann als &amp;lt;code&amp;gt;unsortable&amp;lt;/code&amp;gt; markiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit der class=&amp;quot;wikitable&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Am 23. Februar 2008 wurde die „[[Vorlage:Prettytable]]“ als „veraltet“ [{{fullurl:Spezial:Logbuch|type=delete&amp;amp;page=Vorlage:Prettytable&amp;amp;year=2008&amp;amp;month=2}} gelöscht] und somit endgültig von der [[Cascading Style Sheets|CSS]]-&amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; ersetzt (zu finden in [[MediaWiki:Common.css]]). Daneben existiert auch die &amp;lt;code&amp;gt;class=&amp;quot;prettytable&amp;quot;&amp;lt;/code&amp;gt;, diese sollte aber nicht mehr verwendet werden, da die deutschsprachige Wikipedia die einzige ist, welche diese Klasse verwendet. Im Zuge der Internationalisierung und für den Export ist es hilfreich, wenn sie nicht mehr verwendet wird.&amp;lt;ref&amp;gt;Eine Umstellung auf &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; sollte bei der Bearbeitung eines Artikels erfolgen, Bearbeitungen die nur diese Umstellung beinhalten sowie Botläufe, sind zu unterlassen. Weitere Informationen gibt es dazu unter [[Wikipedia Diskussion:Bots/Archiv 2008#Klasse &amp;quot;wikitable&amp;quot;]] und [[MediaWiki Diskussion:Common.css#Klasse &amp;quot;wikitable&amp;quot;]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Umstellung ist in mancherlei Hinsicht nicht nur ein Segen. So kann mit &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; beispielsweise das [http://de.selfhtml.org/html/referenz/attribute.htm#table &amp;lt;code&amp;gt;&amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;&#039;&#039;&#039;cellpadding&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;] (die „Zellen-Polsterung“) anscheinend &#039;&#039;nicht mehr in einem Rutsch&#039;&#039; für die ganze Tabelle verändert/definiert werden&amp;lt;sup&amp;gt;&amp;amp;#91;[[Wikipedia:Fragen zur Wikipedia/Archiv/2008/Woche 25#Falsch angewandtes cellpadding?|WP:FZW-Archiv:&amp;amp;nbsp;Juni&amp;amp;nbsp;2008]]&amp;amp;#93;&amp;lt;/sup&amp;gt;. Wo deshalb „unbedingt“ nötig, kann statt &amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;{| class=&amp;quot;wikitable&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; doch noch eine Entsprechung der „[[Vorlage:Prettytable]]“ verwendet werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;border=&amp;quot;1&amp;quot; &amp;lt;span style=&amp;quot;background-color:#FDFBCD;&amp;quot;&amp;gt;cellpadding=&amp;quot;20&amp;quot;&amp;lt;/span&amp;gt; style=&amp;quot;margin:1em 1em 1em 0; background:#f9f9f9; border:1px #AAA solid; border-collapse:collapse; empty-cells:show;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Tipp: Mit der Eigenschaft &amp;lt;code&amp;gt;text-indent&amp;lt;/code&amp;gt; und einem Wert so um die 4px bekommt man einen ganz vernünftigen Abstand zum linken Rand hin. Wenn das hinter der Klasse &amp;quot;wikitable sortable&amp;quot; oder &amp;quot;wikitable&amp;quot; notiert wird, bezieht sich diese Zuweisung auf alle Zellen. So könnte die erste Zeile einer Tabelle aussehen: &amp;lt;code&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-indent:4px&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfache Tabelle ==&lt;br /&gt;
Eine einfache Beispieltabelle aus dem Artikel [[Bayern-Landshut#Liste der Herzöge von Bayern-Landshut|Bayern-Landshut]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !!  Regierungszeit                       !!  Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]    || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die obige Tabelle wird durch den folgenden Quelltext erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name                                          !! Regierungszeit                                !! Abstammung&lt;br /&gt;
|-&lt;br /&gt;
| [[Stephan II. (Bayern)|Stephan&amp;amp;amp;nbsp;II.]]     || &amp;lt;tt&amp;gt;1347–1375&amp;lt;/tt&amp;gt; Herzog von Bayern          || Sohn Kaiser Ludwigs&amp;amp;amp;nbsp;IV.&lt;br /&gt;
|-&lt;br /&gt;
| [[Friedrich (Bayern)|Friedrich]]              || &amp;lt;tt&amp;gt;1375–1393&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Stephans&amp;amp;amp;nbsp;II.&lt;br /&gt;
|-&lt;br /&gt;
| [[Heinrich XVI. (Bayern)|Heinrich&amp;amp;amp;nbsp;XVI.]] || &amp;lt;tt&amp;gt;1393–1450&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Friedrichs&lt;br /&gt;
|-&lt;br /&gt;
| [[Ludwig IX. (Bayern)|Ludwig&amp;amp;amp;nbsp;IX.]]       || &amp;lt;tt&amp;gt;1450–1479&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Heinrichs&amp;amp;amp;nbsp;XVI.&lt;br /&gt;
|-&lt;br /&gt;
| [[Georg (Bayern)|Georg]]                      || &amp;lt;tt&amp;gt;1479–1503&amp;lt;/tt&amp;gt; Herzog von Bayern-Landshut || Sohn Ludwigs&amp;amp;amp;nbsp;IX.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;{|&amp;lt;/code&amp;gt; beginnen eine Tabelle, während &amp;lt;code&amp;gt;|}&amp;lt;/code&amp;gt; sie abschließen. Beide Tags müssen an einem Zeilenanfang stehen.&lt;br /&gt;
* Das Attribut &amp;lt;code&amp;gt;class=&amp;quot;wikitable&amp;quot;&amp;lt;/code&amp;gt; veranlasst, dass die ganze Tabelle nach den Vorgaben der Klasse &amp;lt;code&amp;gt;wikitable&amp;lt;/code&amp;gt; formatiert wird. Diese sieht unter anderem Trennlinien zwischen den Zellen sowie zusätzlichen Platz zwischen Zelleninhalt und Zellenrand (das sogenannte &#039;&#039;cellpadding&#039;&#039;) vor.&lt;br /&gt;
* Zeilen, die mit einem Ausrufezeichen (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) beginnen, definieren Kopfzeilen von Tabellen. Der Text in einer Zelle einer solchen Zeile wird zentriert und fettgedruckt. Gewöhnliche Tabellenzeilen beginnen dagegen mit einem senkrechten Trennstrich (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Das Tag &amp;lt;code&amp;gt;|-&amp;lt;/code&amp;gt; beginnt eine neue Tabellenzeile, falls es im Quelltext an einem Zeilenanfang steht.&lt;br /&gt;
* Die Zeichen &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; trennen nebeneinanderliegende Tabellenzellen.&lt;br /&gt;
* Die Zeichenfolge &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; anstatt eines Leerzeichens verhindert einen Zeilenumbruch zwischen den beiden Wörtern, die das Leerzeichen trennt.&lt;br /&gt;
* Die Jahreszahlen werden durch &amp;lt;code&amp;gt;&amp;amp;lt;tt&amp;gt;&amp;lt;/code&amp;gt; mit fester Zeichenbreite dargestellt, um sicherzugehen, dass sie am Bindestrich ausgerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Soll die Tabelle rechtsbündig zum Text ausgerichtet werden, lässt sich dies durch die zusätzliche Klasse &amp;lt;code&amp;gt;float-right&amp;lt;/code&amp;gt; im Attribut erreichen: &amp;lt;code&amp;gt;class=&amp;quot;wikitable float-right&amp;quot;&amp;lt;/code&amp;gt;. Zentrierung der Tabelle erreicht man durch die zusätzliche Klasse &amp;lt;code&amp;gt;centered&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;class=&amp;quot;wikitable centered&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Sortierbare Tabelle ==&lt;br /&gt;
Sortierbare Tabellen ermöglichen verschiedene und vom Leser wählbare Sichtweisen auf eine Sache:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese sortierbare Tabelle wird durch folgenden Code erzeugt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! ABC !! Länge !! Breite !! Farbe !! class=&amp;quot;unsortable&amp;quot; | Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [[a]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000&lt;br /&gt;
| hellblau&lt;br /&gt;
| Blau ist der Himmel&lt;br /&gt;
|-&lt;br /&gt;
| [[b]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 30&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2&lt;br /&gt;
| grün&lt;br /&gt;
| Grün ist das Gras&lt;br /&gt;
|-&lt;br /&gt;
| [[c]]&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 100&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 90&lt;br /&gt;
| rot&lt;br /&gt;
| Rot ist die Liebe&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Namen ===&lt;br /&gt;
Nach der Namenskonvention steht in Wikipedia zuerst der Vorname, gefolgt vom Nachnamen.&amp;lt;br /&amp;gt;Die [[Vorlage:SortKeyName]] sorgt dafür, dass die Tabellenspalten hier dennoch nach dem Nachnamen sortiert werden:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Vorname !! Nachname&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Bernd|Müller}}&lt;br /&gt;
| Bernd&lt;br /&gt;
| Müller&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Hans|Zehnder}}&lt;br /&gt;
| Hans&lt;br /&gt;
| Zehnder&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKeyName|Stefan|Ackermann}}&lt;br /&gt;
| Stefan&lt;br /&gt;
| Ackermann&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei komplizierteren Namen, beispielsweise mit zwei Vornamen oder mit Sonderzeichen im Namen funktioniert [[Vorlage:SortKey]]:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey|Ambrozy, Peter}}[[Peter Michael Ambrozy|Peter Ambrozy]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Liste der Abgeordneten zum Kärntner Landtag (29. Gesetzgebungsperiode)|Abgeordnete im Kärntner Landtag]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahlen und Geldbeträge ===&lt;br /&gt;
Zahlen und Geld-Währungen werden so rechtsbündig und sortierbar dargestellt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;psyntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! €&amp;lt;br /&amp;gt;sortieren&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 2000,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 3.000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 40.000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 5,10&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1.000.006,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 7000,01&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rechtsbündige Zahlen werden nur dann korrekt sortiert, wenn die Anzahl der Nachkommastellen bei allen Einträgen einer Spalte gleich sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; [[Vorlage:Dts]] für Datumsangaben, [[Vorlage:Nts]] und [[Vorlage:0]] für Zahlen&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenstellige Zahlen ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Nummer !! Ort &lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
|-&lt;br /&gt;
| 03301 || [[Oranienburg]]&lt;br /&gt;
|-&lt;br /&gt;
| 03302 || [[Hennigsdorf]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
| {{SortKey| 033_ | 033x }} || [[Land Brandenburg|Brandenburg]]&lt;br /&gt;
|-&lt;br /&gt;
| {{SortKey| 0330_ | 0330x }} || Oranienburg und Umgebung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Vorwahl 03 (Deutschland)|Telefon-Vorwahl 03 (Deutschland)]]&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare verschiedenstellige Zahlen mit Dezimaltrennzeichen ===&lt;br /&gt;
Damit bei verschiedenstelligen Zahlen in einer Spalte das Komma immer übereinander dargestellt wird gibt es zwei Möglichkeiten. Beide sind sortierbar. Lösung a) ist angenehmer zu lesen also für Wikipedia geeigneter. Lösung b) ist einfacher zu schreiben und für Zahlen mit immer gleicher Zahl von Nachkommastellen, Währungen beispielsweise, genauso gut geeignet:&lt;br /&gt;
&lt;br /&gt;
a) Verwendung von [[Vorlage:0]] für alle führenden Nullen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}{{0}}{{0}}1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}200,2&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| {{0}}{{0}}{{0}}1,1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b) rechtsbündiger Zellenformatierung unter Verwendung der gleichen Anzahl an Nachkommastellen, wobei die zur Ausrichtung künstlich aufgefüllten Nachkommastellen per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; versteckt werden können, ein zu versteckendes Komma ist per &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{0|,}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; erzielbar:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1000{{0|,}}{{0}}{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,0001&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 200,2{{0}}{{0}}{{0}}&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 1,1{{0}}{{0}}{{0}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortierbare Zahl mit Währungs- oder %-Symbol ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}1 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Zähler !! Prozent&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 10 %&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| {{0}}3 %&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| {{0}}7 %&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 80 %&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Sortierbare Tabelle mit einer nicht-sortierbaren Zeile ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable float-right&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Name !! Wert&lt;br /&gt;
|-&lt;br /&gt;
| Alfons&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| Berta&lt;br /&gt;
| 12&lt;br /&gt;
|- class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Fest&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;45&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Cäsar&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| Dietmar&lt;br /&gt;
| 6&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
=== Tabellenüberschriften, Trennstriche ===&lt;br /&gt;
Das folgende Beispiel zeigt, wie man eine Tabellenüberschrift erzeugt, sowie eine Möglichkeit, wie sich Trennstriche zwischen bestimmten Zellen realisieren lassen:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext dieser Beispieltabelle sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ Addition von vier Zahlen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;365&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 123&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 235&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ 277&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border-top: 1pt black solid;&amp;quot; | &amp;lt;tt&amp;gt;1000&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Zeile, die mit &amp;lt;code&amp;gt;|+&amp;lt;/code&amp;gt; beginnt, bezeichnet den Titel der Tabelle.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;border-top: 1pt&amp;lt;/code&amp;gt; weist der Zelle einen oberen Rand mit definierter Breite zu. Weitere Befehle sind: &amp;lt;code&amp;gt;border-left, border-right&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;border-bottom&amp;lt;/code&amp;gt; für einen Rand links, rechts oder unten. &amp;lt;code&amp;gt;border: 1pt&amp;lt;/code&amp;gt; setzt alle vier Ränder.&lt;br /&gt;
&lt;br /&gt;
=== Zellfärbung, Spaltenbreite, Textausrichtung ===&lt;br /&gt;
Dieses Beispiel erläutert, wie man sortierbare Tabellen erstellt, wie man Zellen färbt, den Zelleninhalt rechts ausrichtet und die Spaltenbreite einstellt. Es lehnt sich an die [[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Liste der römischen Kaiser]] an:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Quelltext hierfür sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ style=&amp;quot;padding-bottom:1em;&amp;quot; | Kaiser der Flavischen Dynastie&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Kaiser !! width=&amp;quot;30%&amp;quot; | Vollständiger Name&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | Regierungszeit !! class=&amp;quot;unsortable&amp;quot; width=&amp;quot;40%&amp;quot; | Anmerkungen&lt;br /&gt;
|-&lt;br /&gt;
| [[Vespasian]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 69–79 || konsolidierte Verwaltung und Finanzen des Reiches&lt;br /&gt;
|-&lt;br /&gt;
| [[Titus]] || Titus Flavius Vespasianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | {{SortKey|79-81}}Mitte 79–81 || eröffnete das [[Kolosseum]] in Rom&lt;br /&gt;
|-&lt;br /&gt;
| [[Domitian]] || Titus Flavius Domitianus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 81–96 || beendete römische Expansion in Germanien&lt;br /&gt;
|-&lt;br /&gt;
| [[Lucius Antonius Saturninus|Saturninus]] || Lucius Antonius Saturninus&lt;br /&gt;
| style=&amp;quot;text-align:right&amp;quot; | 89    || Gegenkaiser in Germanien, gefallen&lt;br /&gt;
|- class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;[[Liste der römischen Kaiser der Antike#Liste der römischen Kaiser|Vollst. Liste]]&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortable&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;wikitable sortable&amp;quot;&amp;lt;/code&amp;gt; erlaubt die Sortierung der Tabelle nach wählbaren Spalten.&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;class=&amp;quot;unsortable&amp;quot;&amp;lt;/code&amp;gt; können einzelne Spalten von der Sortierbarkeit ausgenommen werden.&lt;br /&gt;
* Mit den Vorlagen [[:Vorlage:Dts]], [[:Vorlage:Nts]] und [[:Vorlage:SortKey]] lässt sich die Sortierreihenfolge einzelner Tabelleneinträge beeinflussen&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;width=&amp;quot;15%&amp;quot;&amp;lt;/code&amp;gt; weist einer Spalte 15 % der Gesamtbreite der Tabelle als Breite zu.&lt;br /&gt;
* Die Ausrichtung von Text rechtsbündig in einer Zelle erreicht man durch die [[Cascading Style Sheets|CSS]]-Anweisung &amp;lt;code&amp;gt;style=&amp;quot;text-align:right&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Nebeneinanderliegende Zellen kann man sowohl durch das &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;-Zeichen trennen, als auch durch einen Zeilenumbruch gefolgt von einem einfachen &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;-Zeichen.&lt;br /&gt;
* Der Befehl &amp;lt;code&amp;gt;|- class=&amp;quot;hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; weist der darauffolgenden Zeile eine Hintergrundfarbe zu. In Artikeln sollen die entsprechenden Standardfarben verwendet werden (siehe [[Hilfe:Farben#Farben verwenden|Farben verwenden]] in der [[Hilfe:Farben|Hilfe zu Farben]]). Außerhalb des Artikelnamensraumes können Farben außer durch ihren englischen Namen auch als Hexadezimalzahl aus sechs Ziffern eingegeben werden, wobei die ersten zwei Ziffern für den Rotanteil von bis zu 256 stehen, die nächsten zwei für den Grünanteil und die letzten zwei für den Blauanteil, das heißt, dass &amp;lt;code&amp;gt;#ff0000&amp;lt;/code&amp;gt; die Farbe Rot bedeutet, &amp;lt;code&amp;gt;#00ff00&amp;lt;/code&amp;gt; steht für Grün und &amp;lt;code&amp;gt;#0000ff&amp;lt;/code&amp;gt; steht für Blau. Durch eine Mischung erhält man beispielsweise Violett: &amp;lt;code&amp;gt;#ff00ff&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Leerzellen können durch einen einfachen Abstand erzeugt werden. Diese Zellen werden aber beim Sortieren an den Anfang gestellt, Leerzellen mit &amp;lt;code&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/code&amp;gt; stehen am Ende.&lt;br /&gt;
* Das &amp;lt;code&amp;gt;sortbottom&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;class=&amp;quot;sortbottom hintergrundfarbe5&amp;quot;&amp;lt;/code&amp;gt; führt dazu, dass die Zeile von der Sortierung ausgenommen wird und damit stets als Fußzeile der Tabelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=== Geschachtelte Tabellen ===&lt;br /&gt;
Tabellen können geschachtelt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | eine Zeile&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! A&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;colspan + rowspan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#e3e3e3&amp;quot; | A&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#e3e3e3&amp;quot; | C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot; | A&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! B&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| eine Spalte&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! C&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
{| class=&amp;quot;wikitable float-right&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EED5B7&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|- style=&amp;quot;background:#e3e3e3&amp;quot;&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Titel&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | eine Spalte&lt;br /&gt;
| A || B || C&lt;br /&gt;
|-&lt;br /&gt;
| D || E || F&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabellen nebeneinander ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Linke Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Rechte Tabelle&lt;br /&gt;
! Überschrift 1 || Überschrift 2&lt;br /&gt;
|-&lt;br /&gt;
| Feld 1 || Feld 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gleich breite Tabellen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html line&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:5em&amp;quot; | a: 5em&lt;br /&gt;
| style=&amp;quot;width:10em&amp;quot; | b: 10em&lt;br /&gt;
| style=&amp;quot;width:7em&amp;quot; | c: 7em&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Listen in Tabellen, Bilder in Tabellen ===&lt;br /&gt;
Tabellen können Tabellen, Bilder und Wiki-Syntax-Formatierung enthalten:&lt;br /&gt;
&lt;br /&gt;
{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieser Text erzeugt die rechte Tabelle, wenn man ihn in einen Artikel eingibt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;{{Taxobox&lt;br /&gt;
| Taxon_Name       = Hyänen&lt;br /&gt;
| Taxon_WissName   = Hyaenidae&lt;br /&gt;
| Taxon_Rang       = Familie&lt;br /&gt;
| Taxon_Autor      = [[John Edward Gray|Gray]], 1821&lt;br /&gt;
| Taxon2_Name      = Katzenartige&lt;br /&gt;
| Taxon2_WissName  = Feloidea&lt;br /&gt;
| Taxon2_Rang      = Überfamilie&lt;br /&gt;
| Taxon3_Name      = Raubtiere&lt;br /&gt;
| Taxon3_WissName  = Carnivora&lt;br /&gt;
| Taxon3_Rang      = Ordnung&lt;br /&gt;
| Taxon4_Name      = Höhere Säugetiere&lt;br /&gt;
| Taxon4_WissName  = Eutheria&lt;br /&gt;
| Taxon4_Rang      = Unterklasse&lt;br /&gt;
| Taxon5_Name      = Säugetiere&lt;br /&gt;
| Taxon5_WissName  = Mammalia&lt;br /&gt;
| Taxon5_Rang      = Klasse&lt;br /&gt;
| Taxon6_Name      = Kiefermäuler&lt;br /&gt;
| Taxon6_WissName  = Gnathostomata&lt;br /&gt;
| Taxon6_Rang      = Überklasse&lt;br /&gt;
| Bild             = Crocuta-hejda.jpg&lt;br /&gt;
| Bildbeschreibung = [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
| Subtaxa_Rang     = Art&lt;br /&gt;
| Subtaxa          =&lt;br /&gt;
* [[Streifenhyäne]] &#039;&#039;(Hyaena hyaena)&#039;&#039;&lt;br /&gt;
* [[Schabrackenhyäne]] &#039;&#039;(Hyaena brunnea)&#039;&#039;&lt;br /&gt;
* [[Tüpfelhyäne]] &#039;&#039;(Crocuta crocuta)&#039;&#039;&lt;br /&gt;
* [[Erdwolf]] &#039;&#039;(Proteles cristatus)&#039;&#039;&lt;br /&gt;
}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erläuterungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
→ &#039;&#039;Siehe: [[Wikipedia:Taxoboxen]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Bei [[meta:Main Page|MetaWiki]] befindet sich ein [[meta:Help:Table|englischer Artikel]], der die Gestaltung mit Tabellen etwas ausführlicher behandelt.&lt;br /&gt;
* Außerdem gibt es bei [[meta:Main Page|MetaWiki]] einen [[meta:Help:Sorting|englischen Artikel]], der die Sortierung von Tabellen im Detail behandelt.&lt;br /&gt;
* Im Abschnitt [[Wikipedia:Wie gute Artikel aussehen#Tabellen|Tabellen]] in [[Wikipedia:Wie gute Artikel aussehen|Wie gute Artikel aussehen]] wird auf die Bedeutung von Vorlagen zur Vereinheitlichung hingewiesen.&lt;br /&gt;
* Der Abschnitt [[Hilfe:Bilder#Ausrichten im Text|Ausrichten im Text]] in der [[Hilfe:Bilder|Hilfe für Bilder]] über die Positionierung von Bildern in Tabellen&lt;br /&gt;
* In [[Hilfe:Tabellen-Referenz]] sind die einzelnen Möglichkeiten nochmals mit Beispielen aufgeführt.&lt;br /&gt;
* Beispiele: [[:Kategorie:Vorlage:Tabelle]] – Tabellen, die auf mehreren Seiten als Vorlage eingebunden werden&lt;br /&gt;
&lt;br /&gt;
== Hilfen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:PeerBr/WPro|WPro]]&#039;&#039;&#039; (Server zur Zeit nicht erreichbar) ist ein Wikipedia-Editor für den [[Windows Internet Explorer|Internet Explorer]] 6.0, der Tabellen per Knopfdruck einfügen und formatieren kann.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/EXCEL-Tabellenumwandlung|EXCEL-Tabellenumwandlung]]&#039;&#039;&#039; konvertiert den ausgewählten Tabellenbereich aus MS Excel direkt ins Wiki-Tabellenformat. Die wichtigsten Formatierungen wie Fett/Kursiv, Zellenhöhe und -breite, Schriftgröße, Farbinformation aus MS Excel bleiben erhalten.&lt;br /&gt;
* &#039;&#039;&#039;[[Wikipedia:Textverarbeitung/Excel2Wiki|Excel2Wiki]]&#039;&#039;&#039; Berücksichtigt verbundene Zellen, dazu auch ein Programm zur Umwandlung der Spalten in Zeilen und umgekehrt und ein Programm zur Zeilenumkehr, d.&amp;amp;nbsp;h. die letzte Zeile wird zur ersten usw.&lt;br /&gt;
* &#039;&#039;&#039;[[Benutzer:Duesentrieb/csv2wp|csv2wp]]&#039;&#039;&#039; ist ein Werkzeug zum Umwandeln von [[CSV (Dateiformat)|CSV-Datei]]en in Wiki-Tabellenformat. Damit lassen sich z.&amp;amp;nbsp;B. Tabellen aus [[Microsoft Excel]] importieren.&lt;br /&gt;
* Ab [[OpenOffice.org|OpenOffice]] 2.3 kann man Writer-Dokumente ins [http://de.openoffice.org/presse/pressemitteilung_20070917.html Mediawiki-Format] exportieren.&lt;br /&gt;
* [[OpenOffice.org|OpenOffice]]-Tabellen können mit [[Wikipedia:Textverarbeitung/OOoCalc2Wiki|Calc2Wiki]] konvertiert werden. Eine Alternative (mit der ein oder anderen Erweiterung) ist [[Benutzer:Erodeist/Calc2WikiTable|Calc2WikiTable]].&lt;br /&gt;
* [http://www.cnic.org/html2mediawiki.html Umwandlung von HTML-Tabellen in Wiki-Tabellen]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Hostsharing_Wiki_Konventionen&amp;diff=6850</id>
		<title>Hostsharing Wiki Konventionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Hostsharing_Wiki_Konventionen&amp;diff=6850"/>
		<updated>2024-07-10T12:46:57Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Praktisches über den Umgang mit dem HS Wiki und der Software Mediawiki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allgemein - Klauen erwünscht!==&lt;br /&gt;
&lt;br /&gt;
Das Wiki verändert sich mit dem zunehmenden Wissen seiner Benutzer. Daher kann man beim Neuanlegen einer Seite durchaus mal schauen, wie ist eine andere Seite (die gut und sinnvoll aussieht) aufgebaut. Am Besten lernt man, indem man den Quelltext guter Seiten oder Absätze studiert. Auch der eine oder andere Blick in die [[Hilfe]] ist zu Beginn sehr sinnvoll. Aber lasse dich nicht abschrecken. Ändern, Korrigieren, das Arbeiten, geht hier von der ersten Minute an. Also los, mach mit!&lt;br /&gt;
&lt;br /&gt;
== Was soll ins Wiki ==&lt;br /&gt;
&#039;&#039;&#039;Nur reine Dokumentation.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Also nicht: Aktuelles, Produkte, Preise, Hostsharing eG. von der [http://www.hostsharing.net www.hostsharing.net] Seite.&lt;br /&gt;
&lt;br /&gt;
== Seiten anlegen ==&lt;br /&gt;
Das funktioniert dadurch, dass man auf einer vorhandenen Seite einen Link anlegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;[[Link]]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach klickt man den Link und befindet sich auf der neuen, noch leeren Seite. Die kann man jetzt mit &amp;quot;Bearbeiten&amp;quot; mit Inhalten füllen.&lt;br /&gt;
&lt;br /&gt;
=== Eine oder mehrere Seiten? ===&lt;br /&gt;
&lt;br /&gt;
Bitte nicht sofort viele Seiten zu einem Thema anlegen und miteinander verlinken, das stört wahrscheinlich nur unnötig den Lesefluss. Oft ergibt sich die Struktur während des Schreibens von selbst, wie in [[Guter_Stil]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zuerst schreibt man einfach alle Information in eine einzige Seite, gliedert mit Headlines und vertraut auf die seiteninterne Navigation (TOC – Table Of Content), die schon sehr gut ist. Erst wenn die Seite wirklich zu lange wird oder man neue Bereiche erkennt, die klar abgrenzbar sind, teilt man die Seite auf. Dann kann man eine eigene [[Hostsharing_Wiki_Konventionen#Men.C3.BCleiste|Menüleiste]] kreieren und einsetzen, um wiederum Zusammenhänge zwischen den Seiten herzustellen.&lt;br /&gt;
&lt;br /&gt;
== Seiten überarbeiten ==&lt;br /&gt;
&lt;br /&gt;
Bitte beim Überarbeiten bereits vorhandener komplexer Seiten vorsichtig sein, wenn jemand schon gut strukturiert hat und sich auch offenbar tiefe Gedanken dazu gemacht hat. Dann kann der Originalautor auch auf dessen Benutzerseite angeschrieben werden (oder natürlich HS-Intern direkt kontaktiert werden): &amp;quot;Du ich hätte da mal eine Idee...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Außerdem bietet jede Seite eine Diskussionsseite, die in der Regel von den Autoren auch beobachtet wird (die Autoren erhalten bei Änderungen ein Mail). Diese kann ebenfalls zur Kommunikation verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Anrede des Lesers ==&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Guter Stil]] und die zugehörige Diskussion.&lt;br /&gt;
&lt;br /&gt;
Solange keine völlig unpersönliche Sprache gewählt ist, wirst du als Leser in der zweiten Person mit &amp;quot;Du&amp;quot; angesprochen. Die erste Person &amp;quot;ich&amp;quot; wird gemieden, damit auch andere an dem Text weiter arbeiten können. Benötigen wir ausnahmsweise die erste Person, verwenden wir wir. :-)&lt;br /&gt;
&lt;br /&gt;
==Namenskonvention== &lt;br /&gt;
&lt;br /&gt;
Eine Verpflichtung zu bestimmten Namensformen gibt es erst mal keine. Suche Dir einfach einen passenden Namen aus. Seiten können verschoben oder unter anderem Namen aufgerufen werden. Alles lässt sich nachträglich ändern!&lt;br /&gt;
&lt;br /&gt;
Seiten, die sich auf eine bestimmte Software beziehen, sollten so benannt werden, dass der Name der Seite mit dem Namen der Software beginnt. So taucht die Seite in den von MediaWiki automatisch erstellten Seitenlisten alphabetisch unter dem Namen der Software einsortiert auf und ist für Leser leichter aufzufinden. [[:Kategorie:Installationsanleitungen|Installationsanleitungen]] sollten &amp;quot;Xyz installieren&amp;quot; heißen, wenn die Software Xyz heißt, wenn es mehrere Versionen der Software gibt, sollte auch die Versionsnummer mit in den Seitentitel aufgenommen werden und insgesamt müssen Installationsanleitungen natürlich entsprechend kategorisiert werden.&lt;br /&gt;
&lt;br /&gt;
Seiten, die einen sehr allgemeinen Titel tragen und grundsätzliche Erklärungen beinhalten ([[Hive]]) verdienen es vielleicht, ins [[:Kategorie:Glossar|Glossar]] übernommen zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kategorisieren ==&lt;br /&gt;
&lt;br /&gt;
Jede Seite und jede Vorlage sollte kategorisiert werden. Das geschieht am Ende der Seite durch einen speziellen Link mit dem Namensraum &amp;quot;Kategorie&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Plone]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Seiten, die die Dokumentation betreffen, werden grundsätzlich der Kategorie &amp;quot;HSDoku&amp;quot; zugeteilt. Alle Vorlagen bekommen die Kategorie &amp;quot;Vorlage&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Weiterleitungen und Synonyme ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterleitungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kommt ab und zu vor, dass man im Text etwas erwähnen möchte, das an anderer Stelle schon beschrieben ist, aber der Name des Links passt einfach nicht. So lange es sich um eine andere Wortform handelt, bietet sich die Einrichtung einer Weiterleitung an.&lt;br /&gt;
&lt;br /&gt;
Dass [[Hive]] und [[Hives]] auf die gleiche Seite zeigen, ist das Ergebnis einer Weiterleitung. Die originale Seite trägt den Namen &amp;quot;Hive&amp;quot;, damit der Link [[Hives]] auf die gleiche Seite zeigt, bedient er sich eines Redirects. Wenn man einen solchen Link anlegt, zeigt er zuerst einmal auf die neue Seite &amp;quot;Hives&amp;quot;. Dort kann man folgendes eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
#REDIRECT [[Hive]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird [[Hives]] auf [[Hive]] ungelenkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Synonyme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein Synonym hingegen, das nicht allgemein, sondern nur speziell in dem aktuell bearbeiteten Text vorkommen soll, kann durch Umbenennung innerhalb des Links erreicht werden. Hier linkt [[User|Einrichten eines Benutzers]] in Wirklichkeit auf [[User]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
Hier linkt [[User|Einrichten eines Benutzers]] in Wirklichkeit auf [[User]]:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
Ist ein Thema zu umfangreich, um es auf einer Seite abzuhandeln, erhält die Hauptseite einen Absatz &#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;. Hier werden die direkt darunter liegenden Seiten verlinkt.&lt;br /&gt;
&lt;br /&gt;
Für die Seite [[Pakete]] zum Beispiel sieht das so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=markdown&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [[WEB-Paket]]&lt;br /&gt;
* [[Static-Web]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel muss natürlich auch in der Seite [[WEB-Paket]] ein entsprechender Absatz abgelegt werden, da sie ebenfalls auf &amp;quot;tiefer&amp;quot; liegende Seiten verweist.&lt;br /&gt;
&lt;br /&gt;
Es bleibt dem Autor überlassen, ob der Absatz &amp;quot;Weiterführende Links&amp;quot; ganz oben oder ganz unten in der Seite angelegt wird, nur irgendwo in der Mitte hat er naturgemäß wenig Sinn. &amp;quot;Ganz oben&amp;quot; hat  auf allen Seiten Sinn, die so lang sind, dass er sonst nicht gleich am Bildschirm auftaucht.&lt;br /&gt;
&lt;br /&gt;
== Menüleiste ==&lt;br /&gt;
&lt;br /&gt;
In besonderen Fällen kann eine Menüleiste wie zum Beispiel [[Vorlage:HSDoku-DomainLinks‏‎]] verwendet werden. Und zwar dann, wenn die durch die Menüleiste verlinkten Seiten in sehr engem thematischen Zusammenhang stehen, und es dem Benutzer ermöglicht werden soll, schnell zwischen den zusammengehörenden Seiten zu wechseln. Eine Menüleiste darf nur auf den Seiten eingesetzt werden, die direkt von ihr verlinkt werden. &#039;&#039;&#039;Die Menüleiste entfernt und ersetzt den sonst eingeblendeten Titel der Seite!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Löschen und Ersetzen von Seiten ==&lt;br /&gt;
&lt;br /&gt;
=== Löschen ===&lt;br /&gt;
&lt;br /&gt;
Seiten werden nur in sehr begründeten Ausnahmefällen gelöscht, z.B. Spam, Seiten, deren Funktion einen temporären Charakter hatte und die durch Änderungen überflüssig geworden sind oder Seiten, die nicht mit sinnvollen Inhalten gefüllt werden (können). Löschen kann diese Seiten nur ein Administrator im Wiki. Daher wird eine solche Seite als Löschkandidat markiert, indem die entsprechende [[Vorlage:Löschkandidat]] an den Anfang gestellt (und der Grund für den Löschvorschlag in der zugehörigen Diskussionsseite festgehalten) wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
{{Löschkandidat}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Es ist immer vorher zu prüfen, ob die Seite nicht ersetzt werden kann.&#039;&#039;&#039; Das gilt insbesondere dann, wenn davon auszugehen ist, dass Links auf diese Seite zeigen, ob von innerhalb des Wikis oder von außen.&lt;br /&gt;
&lt;br /&gt;
=== Ersetzen ===&lt;br /&gt;
&lt;br /&gt;
Meist werden Seiten ersetzt, Zum Beispiel dann, wenn die auf der ursprünglichen Seite beschriebene Methode veraltet ist. Da aber immer noch Links auf die urprüngliche Seite zeigen können, löschen wir den Inhalt und verwenden als Seiteninhalt &#039;&#039;&#039;einzig und allein&#039;&#039;&#039; die [[Vorlage:Ersetzt]], um mit ihrer Hilfe einen Link auf die neue Seite zu setzen und eine Begründung anzugeben. Dadurch wird gleichzeitig die ursprüngliche Seite aus allen Kategorien entfernt, außer [[:Kategorie:Veraltet]].&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen und Diskussionen ==&lt;br /&gt;
&lt;br /&gt;
Jede Seite hat zusätzlich einen Bereich für die Diskussion. Ist der Inhalt der Seite fehlerhaft, falsch oder einfach diskussionswürdig, schreibt man das entsprechend da hinein. Man kann auch Diskussionen in seine [[Special:Watchlist|Beobachtungsliste]] aufnehmen und wird dann bei Änderungen/Antworten durch Andere benachrichtigt.&lt;br /&gt;
&lt;br /&gt;
Es wird leicht übersehen, neben dem Link &amp;quot;Bearbeiten&amp;quot; gibt es ein kleines &amp;quot;+&amp;quot;, das einem die Antwort erleichtert, man kann sogar einen Betreff eingeben, der als Überschrift erscheint.&lt;br /&gt;
&lt;br /&gt;
== Seiten mit fehlerhaften oder falschen Inhalten ==&lt;br /&gt;
&lt;br /&gt;
Ist man nicht in der Lage, zum Beispiel aufgrund fehlenden Fachwissens, die Seite zu korrigieren, beschreibt man den Fehler in der Diskussionsseite und kategorisiert die Seite als &amp;quot;Baustelle&amp;quot; durch die [[Vorlage:Baustelle]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]] [[Kategorie:Hostsharing Wiki]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Autorenportal&amp;diff=6849</id>
		<title>Autorenportal</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Autorenportal&amp;diff=6849"/>
		<updated>2024-07-10T12:41:23Z</updated>

		<summary type="html">&lt;p&gt;Hsh-milanihl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Hostsharing-Wiki ist ein gemeinsames Projekt der Hostsharing-Mitglieder, in dem wir die Dokumentation der Dienste von Hostsharing überarbeiten und auf den aktuellen Stand bringen möchten. Auf dieser Seite findest du Informationen dazu, wie du dich daran beteiligen kannst.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmelden&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Wiki verwendet den Single-Sign-On-Dienst von Hostsharing, sodass Du Dich im  Wiki mit jedem gültigen [[User]] (Benutzernamen) eines Servers von Hostsharing anmelden kannst. Du kannst Dir natürlich für die Nutzung des Wikis einen eigenen [[User]] in einem Deiner Pakete anlegen, zum Beispiel xyz00-wiki oder xyz00-hsdoku.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Benutzereinstellungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nachdem du dich im Wiki angemeldet hast, ist es sinnvoll, wenn du zunächst deine Benutzereinstellungen anpasst (der Link [[Spezial:Einstellungen | Einstellungen]] - nur sichtbar, wenn Du angemeldet bist). Mindestens deine E-Mail-Adresse solltest du eintragen, denn dann kannst du Seiten im Wiki beobachten und Nachrichten bekommen, wenn eine von dir beobachtete Seite geändert wurde.&lt;br /&gt;
&lt;br /&gt;
Du solltest dich außerdem auf der Hostsharing-Mailingliste (nicht öffentliche Liste) [https://lists.hostsharing.net/mailman/listinfo/website/ website@hostsharing.net] anmelden. Dort diskutieren wir über die Weiterentwicklung der Dokumentation.&lt;br /&gt;
&lt;br /&gt;
== Wo ist Arbeit nötig? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left:2em;font-style:italic&amp;quot;&amp;gt;Die wichtigsten Links: [[:Kategorie:Baustelle|Baustelle]]n, [[Hostsharing_Wiki:Wunschliste Installationsanleitungen|Wunschliste Installationsanleitungen]], [[Ideen für das Wiki]], [[Fehler im Wiki]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz konkret kannst du zum Beispiel schauen, welche Seiten hier im Wiki als [[:Kategorie:Baustelle|Baustelle]] gekennzeichnet sind und diese überarbeiten. Oder du erstellst eine ganz neue Dokumentation zu einem Thema.&lt;br /&gt;
&lt;br /&gt;
Natürlich kannst du auch als Benutzer die Dokumentation lesen und in der Diskussion der entsprechenden Seite darauf hinweisen, wo aus deiner Sicht Verbesserungen notwendig sind. Um eine Seite als Baustelle zu kennzeichnen, trage einfach folgendes ganz am Anfang der Seite ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=twig&amp;gt;{{Baustelle}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Anfang der Seite erscheint dann ein entsprechender Hinweis und die Seite wird in die [[:Kategorie:Baustelle|Liste der Baustellen]] aufgenommen.&lt;br /&gt;
&lt;br /&gt;
== Konventionen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du an der Dokumentation arbeitest, solltest du unsere [[Hilfe:Hostsharing_Wiki_Konventionen|Konventionen]] und [[Hilfe:Guter_Stil|Hinweise zu gutem Stil]] beachten.&lt;br /&gt;
&lt;br /&gt;
== Umgang mit der Wiki-Software ==&lt;br /&gt;
&lt;br /&gt;
Wir verwenden als Software [http://www.mediawiki.org/ MediaWiki]. Nachfolgend einige Links auf Hinweise dazu, wie du im Wiki Texte formatierst und Links anlegst. Gefahrlos ausprobieren kannst du die Wiki-Funktionen auf der Seite [[Sandkasten]], diese ist explizit zum Experimentieren gedacht.&lt;br /&gt;
&lt;br /&gt;
* [[Hilfe:Textgestaltung|Textformatierung im Wiki]]&lt;br /&gt;
* [[Hilfe:Link|Links anlegen]]&lt;br /&gt;
&lt;br /&gt;
== Für den Leser schreiben! ==&lt;br /&gt;
&lt;br /&gt;
Entgegen der langjährigen Tradition in Akademie und Technik, schreiben wir hier vor allem für diejenigen Leser*innen, die noch nicht das wissen, was wir als Autoren wissen. Deshalb immer beim Schreiben von Dokumentation daran denken, daß der Leser womöglich zum allerersten Mal eine Einrichtung vornehmen will, die uns quasi selbstverständlich ist. Das bedeutet, daß die Anleitungen in diesem Wiki mit &#039;&#039;&#039;genauer Terminologie&#039;&#039;&#039; und ohne allzuviele Abkürzungen &#039;&#039;&#039;ausführlich&#039;&#039;&#039; sagen sollen, was der Leser machen muß.&lt;br /&gt;
&lt;br /&gt;
*Falsch: &amp;quot;Dann über die Shell die entsprechenden Rewrite-Zeilen in die .htaccess einfügen.&amp;quot;&lt;br /&gt;
*Besser: &amp;quot;Dann mit ssh als Paketuser xyz00-username an example.com anmelden und folgende Zeilen in die Datei ~/doms/example.com/htdocs-ssl/.htaccess einfügen: ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Hilfe]]&lt;br /&gt;
[[Kategorie:Hostsharing Wiki]]&lt;/div&gt;</summary>
		<author><name>Hsh-milanihl</name></author>
	</entry>
</feed>