<?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=Tim00</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=Tim00"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Tim00"/>
	<updated>2026-04-28T14:03:51Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7551</id>
		<title>Prozessmanagement mit systemd im Userspace</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7551"/>
		<updated>2026-04-28T12:27:36Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* systemd Unit begrenzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Über systemd ==&lt;br /&gt;
&#039;&#039;systemd&#039;&#039; ist seit einigen Jahren das Init-System aller gängigen Linux-Distributionen. Der &#039;&#039;init&#039;&#039;-Prozess hat im laufenden System die Prozessnummer &amp;quot;1&amp;quot;. Er verwaltet alle anderen Prozesse als Kind-Prozesse.&lt;br /&gt;
&lt;br /&gt;
Auch ein normaler Account ohne besondere Privilegien kann systemd nutzen, um Prozesse im Userspace zu starten und zu kontrollieren. Auf der Hostsharing Managed Operations Platform kann jeder Account mit einer gültigen Login-Shell Dienste unter der Kontrolle von systemd starten. &lt;br /&gt;
&lt;br /&gt;
Im Hostsharing Managed Webspace ist es zwingend, systemd als Prozessmonitor für eigene Serverdienste zu nutzen; auf einem Hostsharing Managed Server ist es die empfohlene Vorgehensweise (&amp;quot;Best practice&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Eigene Serverdienste mit systemd ==&lt;br /&gt;
&lt;br /&gt;
Die systemd-Konfiguration wird in dem Verzeichnis des Benutzers eingerichtet, unter dem die Anwendung laufen soll.&lt;br /&gt;
In diesem Beispiel soll die Anwendung GotoSocial unter der Benutzerkennung von &#039;&#039;xyz00-service&#039;&#039; laufen.&lt;br /&gt;
Nachdem die Anwendung im Benutzer &#039;&#039;xyz00-service&#039;&#039; installiert wurde, erfolgt nun die Konfiguration von systemd in demselben Benutzer.&lt;br /&gt;
&lt;br /&gt;
Benutzer, die systemd steuern sollen, müssen über eine gültige Shell verfügen, so dass man sich per &#039;&#039;ssh&#039;&#039; oder vom Paketadmin mit dem Befehl &#039;&#039;sudo -i -u xyz00-service&#039;&#039; anmelden kann. &lt;br /&gt;
Die Umgebungsvariable &#039;&#039;XDG_RUNTIME_DIR&#039;&#039; sollte im Environment des Users gesetzt sein, wenn man erfolgreich angemeldet ist. Das testet man mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo $XDG_RUNTIME_DIR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe sollte sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-service@h01:~$ echo $XDG_RUNTIME_DIR &lt;br /&gt;
/run/user/112345&lt;br /&gt;
xyz00-service@h01:~$ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei wird statt &#039;&#039;112345&#039;&#039; eine andere Zahl erscheinen. Diese Zahl ist die numerische User-Id des Users &#039;&#039;xyz00-service&#039;&#039; im System.&lt;br /&gt;
&lt;br /&gt;
=== systemd Units ===&lt;br /&gt;
&lt;br /&gt;
Die systemd-Units für einen User werden im Verzeichnis &#039;&#039;$HOME/.config/systemd/user/&#039;&#039; verwaltet. Dieser Pfad ist fest vorgegeben. Der Pfad muss bei einem neuen Benutzer angelegt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Verzeichnis wird für jeden Service eine Datei mit der Endung &#039;&#039;.service&#039;&#039; angelegt. In diesem Beispiel ist dies eine GotoSocial-Instanz. GotoSocial ist ein einfaches Binärprogramm, das in der Programmiersprache &#039;&#039;Go&#039;&#039; programmiert ist.&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=GotoSocial Service&lt;br /&gt;
#After=my-redis.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/gotosocial&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=%h/gotosocial/gotosocial --config-path %h/gotosocial/config.yaml server start&lt;br /&gt;
StandardOutput=append:%h/var/gotosocial.log&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=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;
Folgende Eigenschaften sind einstellbar:&lt;br /&gt;
&lt;br /&gt;
; After: Hier kann eingestellt werden, welcher Dienst bereits laufen muss, bevor dieser Dienst gestartet wird. Wenn GotoSocial eine Redis-Instanz benötigt, könnte das entsprechend eingestellt werden.&lt;br /&gt;
; Type=simple : &#039;&#039;simple&#039;&#039; ist die Voreinstellung und kann weggelassen werden. Evtl. braucht man auch &#039;&#039;forking&#039;&#039;, wenn ein Dienst als Daemon im Hintergrund startet. Wenn man die Wahl hat, sollte man den Dienst immer im Vordergrund starten und nicht forken.&lt;br /&gt;
; WorkingDirectory : ist das Verzeichnis, in dem der Dienst gestartet wird. %h ist in dieser Datei eine Abkürzung für das Home-Verzeichnis des Users.&lt;br /&gt;
; Environment : Hier wird die Variable &#039;&#039;PATH&#039;&#039; definiert. Man kann mehrere Einträge des Namens &#039;&#039;Environment&#039;&#039; eintragen und bei Bedarf eine beliebige Anzahl von Environment-Variablen definieren.&lt;br /&gt;
; ExecStart : Das Programm, das als Dienst ausgeführt wird. Man kann eine komplette Kommandozeile angeben.&lt;br /&gt;
; StandardOutput : Eine Log-Datei, in die die Standardausgabe des laufenden Dienstes geschrieben wird.&lt;br /&gt;
; StandardError : Entsprechend zu &#039;&#039;StandardOutput&#039;&#039;. Mit &#039;&#039;inherit&#039;&#039; wird die Datei von &#039;&#039;StandardOutput&#039;&#039; geerbt.&lt;br /&gt;
; Restart=always : Der Dienst soll grundsätzlich neu gestartet werden, wenn der Prozess unerwartet beendet wird.&lt;br /&gt;
; PrivateTmp=true : &#039;&#039;/tmp&#039;&#039; und &#039;&#039;/var/tmp&#039;&#039; werden temporär im Namespace gemountet, so dass sie nicht mit anderen Prozessen geteilt werden.&lt;br /&gt;
; WantedBy : sollte im Usermodus von systemd meistens &#039;&#039;default.target&#039;&#039; sein. Andere Targets sind z.B. &#039;&#039;base.target&#039;&#039; oder &#039;&#039;timers.target&#039;&#039;. Für eine komplette Liste: &amp;lt;code&amp;gt;systemctl list-units --user --type=target&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RAM- und CPU-Limits ====&lt;br /&gt;
&lt;br /&gt;
Auf Wunsch kann man die RAM- und CPU-Ressourcen für den Dienst begrenzen. Dazu trägt man weitere Eigenschaften im Abschnitt &#039;&#039;Service&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
...&lt;br /&gt;
MemoryAccounting=true&lt;br /&gt;
CPUAccounting=true&lt;br /&gt;
MemoryHigh=512M&lt;br /&gt;
MemoryMax=768M&lt;br /&gt;
CPUQuota=50%&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; MemoryHigh : Weiches RAM-Limit, das ggf. überschritten werden kann, wenn es unvermeidlich ist.&lt;br /&gt;
; MemoryMax : Hartes, absolutes RAM-Limit.&lt;br /&gt;
; CPUQuota : Maximale Belegung eines CPU-Threads in Prozent. Werte über 100% sind sinnvoll, wenn mehr als ein CPU-Thread verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
==== Ausführliche Dokumentation der Direktiven ====&lt;br /&gt;
Eine ausführliche Dokumentation der Direktiven findet sich hier: &lt;br /&gt;
&lt;br /&gt;
https://www.freedesktop.org/software/systemd/man/latest/systemd.directives.html&lt;br /&gt;
&lt;br /&gt;
=== systemd Unit starten und stoppen ===&lt;br /&gt;
&lt;br /&gt;
Nachdem die systemd-Unit definiert ist, soll der Dienst gestartet werden. &lt;br /&gt;
Für die Verwaltung des Dienstes stehen die folgenden Kommandos zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
==== Reload ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdateien im Verzeichnis &#039;&#039;$HOME/.config/systemd/user/&#039;&#039; werden neu eingelesen. Dieses Kommando ist nach jeder Änderung einer  &#039;&#039;.service&#039;&#039;-Datei nötig.&lt;br /&gt;
&lt;br /&gt;
==== Start und Stopp ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user start gotosocial.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user stop gotosocial.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sind die Kommandos zum Starten und Beenden des Dienstes.&lt;br /&gt;
&lt;br /&gt;
==== Enable und Disable ====&lt;br /&gt;
&lt;br /&gt;
Wenn ein Dienst nach einem Reboot des Servers automatisch gestartet werden soll, muss er aktiviert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user enable gotosocial.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn er nicht automatisch nach einem Reboot starten soll, muss der Dienst entsprechend deaktiviert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user disable gotosocial.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sind die Kommandos, die den Dienst für einen Reboot des Servers aktivieren bzw. deaktivieren.&lt;br /&gt;
&lt;br /&gt;
==== Status ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user status gotosocial.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zeigen den Status aller Dienste des Users bzw. eines bestimmten Dienstes an.&lt;br /&gt;
&lt;br /&gt;
=== Ressourcen einer systemd Unit beschränken ===&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Befehlen können die zur Verfügung stehenden Ressourcen einer systemd Unit beschränkt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user set-property gitea.service MemoryMax=500M&lt;br /&gt;
systemctl --user set-property gitea.service CPUQuota=25%&lt;br /&gt;
systemctl --user set-property gitea.service TasksMax=100&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zeitgesteuerte Ausführung mit systemd ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von systemd können auch wiederkehrende Aufgaben zeitgesteuert automatisiert werden.&lt;br /&gt;
Cronjobs, die früher für solche Zwecke benutzt wurden, lassen sich also durch systemd Units ersetzen.&lt;br /&gt;
Neben dem »service-file« wird dazu eine weitere Unit, nämlich ein »timer-file«, mit der Endung ».timer« angelegt und aktiviert. &lt;br /&gt;
&lt;br /&gt;
=== Einrichten des »service-files« ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
$ cat $HOME/.config/systemd/user/my-cleanup.service &lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Cleanup Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=%h/bin/cleanup-script&lt;br /&gt;
&lt;br /&gt;
ExecStopPost=/usr/local/bin/hs-notify-unit-failure %N %H %u $EXIT_CODE $SERVICE_RESULT %u&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bemerkung: das Skript hs-notify-unit-failure schickt bei einem Fehler des Hauptskripts eine E-Mail an den aktuellen Benutzer, die über .forward oder über .procmailrc auch an eine andere E-Mail Adresse weitergeleitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Testen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user start my-cleanup.service &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichten des »timer-files« ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cat $HOME/.config/systemd/user/my-cleanup.timer &lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Daily My Cleanup Timer&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=daily&lt;br /&gt;
RandomizedDelaySec=3600&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;
Der RandomizedDelay bewirkt, dass der Prozess zufällig im Zeitraum einer Stunde gestartet wird.&lt;br /&gt;
Wenn mehrere Timer-Aufgaben täglich (daily) auf einem System gestartet werden, verhindert diese Einstellung, dass alle Prozesse exakt zur gleichen Zeit starten und das System eventuell überlasten.&lt;br /&gt;
&lt;br /&gt;
Die zufällige Verzögerung sollte in einem sinnvollen Verhältnis zur Frequenz der Zeitsteuerung erfolgen.&lt;br /&gt;
Bei täglich ausgeführten Aufgaben mag eine Stunde (3600 Sekunden) sinnvoll sein.&lt;br /&gt;
Bei Aufgaben, die stündlich ausgeführt werden, wählt man eine kürzere Verzögerung, zum Beispiel fünf Minuten. &lt;br /&gt;
&lt;br /&gt;
Die Syntax der Datei lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemd-analyze verify $HOME/.config/systemd/user/my-cleanup.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einzelne Kalendereinträge lassen sich mit Erklärung ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemd-analyze calendar &#039;*:0/2&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Dokumentation der Direktiven findet sich hier: &lt;br /&gt;
&lt;br /&gt;
https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html&lt;br /&gt;
&lt;br /&gt;
=== Aktivieren der zeitgesteuerten Ausführung ===&lt;br /&gt;
&lt;br /&gt;
Der Timer muss noch aktiviert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user enable my-cleanup.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Übersicht über die Timer im aktuellen User ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user list-timers --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RAM Kontingent eines Webspace ==&lt;br /&gt;
&lt;br /&gt;
Den aktuell belegten RAM eines Webspace &#039;&#039;xyz00&#039;&#039; kann man sich mit dem Befehl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status pacs-xyz00.slice&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ansehen.&lt;br /&gt;
&lt;br /&gt;
Etwa in der fünften Zeile der Ausgabe findet man eine Angabe der Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Memory: 58.4M (max: 14.8G available: 14.8G)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sind aktuell 58,4 Megabyte RAM genutzt, es sind 14,8 Gigabyte RAM für den Webspace verfügbar. Der verfügbare RAM ist das gebuchte Kontingent. Das gebuchte Kontigent wird im Shared Hosting deutlich kleiner sein.&lt;br /&gt;
&lt;br /&gt;
Das RAM Kontingent wird in Schritten von jeweils 128 Ḿegabyte gebucht. Änderungen des RAM Kontingents für einen Webspace nimmt der Service unter [mailto:service@hostsharing.net service@hostsharing.net] entgegen, wie es bei anderen Paketoptionen die Vorgehensweise ist.&lt;br /&gt;
&lt;br /&gt;
== Beliebte Fehler ==&lt;br /&gt;
=== Fehler: Failed to connect to bus: No such file or directory ===&lt;br /&gt;
&lt;br /&gt;
Wenn ich einen systemctl Befehl ausführe, kommt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
Failed to connect to bus: No such file or directory&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte prüfen, ob Lingering für den Benutzer aktiviert ist. Dazu muss im Hsadmin beim Benutzer die Login Shell &amp;lt;code&amp;gt;/bin/bash&amp;lt;/code&amp;gt; eingetragen sein. Falls das bereits der Fall ist, ist es vielleicht ein sehr alter Benutzer. Dann bitte kurz auf &amp;lt;code&amp;gt;/usr/bin/passwd&amp;lt;/code&amp;gt; stellen, und dann wieder auf &amp;lt;code&amp;gt;/bin/bash&amp;lt;/code&amp;gt; zurückstellen.&lt;br /&gt;
&lt;br /&gt;
Evtl. hilft es auch, die Umgebungsvariable XDG_RUNTIME_DIR zu setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das kann auch in die Datei &amp;lt;code&amp;gt;$HOME/.profile&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== Fehler: Beim Starten passiert nichts ===&lt;br /&gt;
&lt;br /&gt;
Ich hatte das Problem bei einem Redis Dienst. Er stoppte innerhalb von Millisekunden. In der Log Datei stand nichts.&lt;br /&gt;
&lt;br /&gt;
Ursache: in der Service Datei war bei &amp;lt;code&amp;gt;WorkingDirectory&amp;lt;/code&amp;gt; ein nicht existierendes Verzeichnis eingetragen.&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* https://www.freedesktop.org/software/systemd/man/latest/systemd.directives.html&lt;br /&gt;
* https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html&lt;br /&gt;
* https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html#systemd-timer-catchup&lt;br /&gt;
* https://wiki.archlinux.org/title/Systemd/Timers#As_a_cron_replacement&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:systemd]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7550</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7550"/>
		<updated>2026-04-28T06:47:32Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Speicherbelegung von einzelnen Benutzern prüfen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Paketspeicher ==&lt;br /&gt;
&lt;br /&gt;
Der im gesamten Paket zur Verfügung stehende bzw genutzte Speicher kann wie folgt abgefragt werden: &lt;br /&gt;
&lt;br /&gt;
Einloggen als Paketadmin &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ pac-du-quota}}&lt;br /&gt;
Es wird der Speicherplatz (NVMe SSD) und der Zusatz-Speicherplatz (HDD) angezeigt.&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ quota -gs}}&lt;br /&gt;
(g &amp;gt; wir nutzen Gruppenquota, s &amp;gt; für Ausgabe in MB). Die Felder bedeuten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 0em 0em 0em 2em; font-size:1em;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:orange;&amp;quot;&lt;br /&gt;
!Feld !! Bedeutung&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|blocks	|| KB belegt&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota || normales (gebuchtes) Limit in KB; &amp;quot;soft quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit || maximales (temporär toleriertes) Limit in KB; &amp;quot;hard quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;quota&amp;quot; bleiben darf (ist nur gesetzt, wenn blocks&amp;gt;quota)&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|files ||Anzahl der INodes (entspricht nicht immer, aber fast einem File. Lediglich Hardlinks verbrauchen nur einen INode pro &amp;quot;realer&amp;quot; Datei)&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota ||normales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit ||maximales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;INode-quota&amp;quot; bleiben darf (ist nur gesetzt, wenn quota überschritten ist)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um zu prüfen, ob ein Paket die Quota bald erreicht oder schon überschritten hat, muss man &#039;&#039;&#039;blocks&#039;&#039;&#039; mit  &#039;&#039;&#039;quota&#039;&#039;&#039; in Verhältnis setzen. Wenn &#039;&#039;&#039;blocks &amp;gt; quota&#039;&#039;&#039;, beginnt die &#039;&#039;grace period&#039;&#039;, während der ein weiterer Anstieg des Speicherverbrauchs noch toleriert wird. In jedem Fall gilt &#039;&#039;&#039;blocks &amp;lt; limit&#039;&#039;&#039;: die &amp;quot;hard quota&amp;quot; kann nicht überschritten werden und liegt z.B. bei 150% der &amp;quot;soft quota&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der genutzte Speicher nur für den Paketadmin selbst kann mit &#039;&#039;&#039;du&#039;&#039;&#039; abgefragt werden: Einloggen als Paket-Admin und &#039;&#039;&#039;du -h&#039;&#039;&#039; eingeben. Der Befehl listet die aktuellen Größen der einzelnen Verzeichnisse auf und am Ende den gesamt belegten Plattenplatz in MB.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Die Auflistung (mit &#039;&#039;&#039;du&#039;&#039;&#039;) erfolgt ohne den Speicherplatz der User, für deren Verzeichnisse der Paketadmin kein Zugriffsrecht hat, ohne Dateien in /tmp/ und ohne Datenbanken!}}&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle unser Danke an die Mitglieder Andreas Loesch und Timotheus Pokorra die das hervorragende Skript &#039;pac-du-quota&#039; bereit gestellt haben.&lt;br /&gt;
&lt;br /&gt;
== Unvermutete Speicherbelegung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal wunderst du dich, welche Dateien deinen Speicherplatz belegen?&lt;br /&gt;
&lt;br /&gt;
du und pac-du-quota zeigen nur die Dateien im Home Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Manche Anwendungen legen im /tmp Verzeichnis für deinen Benutzer Dateien an.&lt;br /&gt;
&lt;br /&gt;
Diese Dateien findest du mit diesem Befehl, für deinen aktuellen Benutzer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ find /tmp/user/$UID&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ ls -la /tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Warnung bei Erreichen des Quotas ==&lt;br /&gt;
&lt;br /&gt;
=== Warnungen beim Paketspeicher ===&lt;br /&gt;
&lt;br /&gt;
Wenn die Speicherbelegung (Soft- oder Hard-Quota) beim Paketspeicher überschritten wird, bekommen die dafür eingetragenen E-Mail-Adressen (siehe Ansprechpartner, OPERATIONS_ALERT) jeden Morgen eine E-Mail mit einem Warn-Hinweis.&lt;br /&gt;
&lt;br /&gt;
=== Speicherbelegung von einzelnen Benutzern prüfen ===&lt;br /&gt;
&lt;br /&gt;
Diese automatische E-Mail berücksichtigt nicht die Quotas der einzelnen Benutzer/Postfächer.&lt;br /&gt;
&lt;br /&gt;
Dafür kann das folgende Python-Skript genutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/check-userquota.py&lt;br /&gt;
&lt;br /&gt;
Es sollte im bin Verzeichnis des Paketnutzers (/home/pacs/xyz00/bin) gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Es muss mit einem Timer eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.timer &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quota&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=00:55:00&lt;br /&gt;
RandomizedDelaySec=3 minutes&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.service &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quotas&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;MAILTO=monitoring@meinedomain.de&amp;quot;&lt;br /&gt;
ExecStart=%h/bin/check-userquota.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktivieren des Timers mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user enable check-userquota.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7549</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7549"/>
		<updated>2026-04-28T06:37:23Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Warn-Emails bei Speicherüberschreitung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Paketspeicher ==&lt;br /&gt;
&lt;br /&gt;
Der im gesamten Paket zur Verfügung stehende bzw genutzte Speicher kann wie folgt abgefragt werden: &lt;br /&gt;
&lt;br /&gt;
Einloggen als Paketadmin &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ pac-du-quota}}&lt;br /&gt;
Es wird der Speicherplatz (NVMe SSD) und der Zusatz-Speicherplatz (HDD) angezeigt.&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ quota -gs}}&lt;br /&gt;
(g &amp;gt; wir nutzen Gruppenquota, s &amp;gt; für Ausgabe in MB). Die Felder bedeuten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 0em 0em 0em 2em; font-size:1em;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:orange;&amp;quot;&lt;br /&gt;
!Feld !! Bedeutung&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|blocks	|| KB belegt&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota || normales (gebuchtes) Limit in KB; &amp;quot;soft quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit || maximales (temporär toleriertes) Limit in KB; &amp;quot;hard quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;quota&amp;quot; bleiben darf (ist nur gesetzt, wenn blocks&amp;gt;quota)&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|files ||Anzahl der INodes (entspricht nicht immer, aber fast einem File. Lediglich Hardlinks verbrauchen nur einen INode pro &amp;quot;realer&amp;quot; Datei)&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota ||normales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit ||maximales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;INode-quota&amp;quot; bleiben darf (ist nur gesetzt, wenn quota überschritten ist)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um zu prüfen, ob ein Paket die Quota bald erreicht oder schon überschritten hat, muss man &#039;&#039;&#039;blocks&#039;&#039;&#039; mit  &#039;&#039;&#039;quota&#039;&#039;&#039; in Verhältnis setzen. Wenn &#039;&#039;&#039;blocks &amp;gt; quota&#039;&#039;&#039;, beginnt die &#039;&#039;grace period&#039;&#039;, während der ein weiterer Anstieg des Speicherverbrauchs noch toleriert wird. In jedem Fall gilt &#039;&#039;&#039;blocks &amp;lt; limit&#039;&#039;&#039;: die &amp;quot;hard quota&amp;quot; kann nicht überschritten werden und liegt z.B. bei 150% der &amp;quot;soft quota&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der genutzte Speicher nur für den Paketadmin selbst kann mit &#039;&#039;&#039;du&#039;&#039;&#039; abgefragt werden: Einloggen als Paket-Admin und &#039;&#039;&#039;du -h&#039;&#039;&#039; eingeben. Der Befehl listet die aktuellen Größen der einzelnen Verzeichnisse auf und am Ende den gesamt belegten Plattenplatz in MB.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Die Auflistung (mit &#039;&#039;&#039;du&#039;&#039;&#039;) erfolgt ohne den Speicherplatz der User, für deren Verzeichnisse der Paketadmin kein Zugriffsrecht hat, ohne Dateien in /tmp/ und ohne Datenbanken!}}&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle unser Danke an die Mitglieder Andreas Loesch und Timotheus Pokorra die das hervorragende Skript &#039;pac-du-quota&#039; bereit gestellt haben.&lt;br /&gt;
&lt;br /&gt;
== Unvermutete Speicherbelegung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal wunderst du dich, welche Dateien deinen Speicherplatz belegen?&lt;br /&gt;
&lt;br /&gt;
du und pac-du-quota zeigen nur die Dateien im Home Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Manche Anwendungen legen im /tmp Verzeichnis für deinen Benutzer Dateien an.&lt;br /&gt;
&lt;br /&gt;
Diese Dateien findest du mit diesem Befehl, für deinen aktuellen Benutzer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ find /tmp/user/$UID&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ ls -la /tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Warnung bei Erreichen des Quotas ==&lt;br /&gt;
&lt;br /&gt;
=== Warnungen beim Paketspeicher ===&lt;br /&gt;
&lt;br /&gt;
Wenn die Speicherbelegung (Soft- oder Hard-Quota) beim Paketspeicher überschritten wird, bekommen die dafür eingetragenen E-Mail-Adressen (siehe Ansprechpartner, OPERATIONS_ALERT) jeden Morgen eine E-Mail mit einem Warn-Hinweis.&lt;br /&gt;
&lt;br /&gt;
=== Speicherbelegung von einzelnen Benutzern prüfen ===&lt;br /&gt;
&lt;br /&gt;
Diese automatische E-Mail berücksichtigt nicht die Quotas der einzelnen Benutzer/Postfächer.&lt;br /&gt;
&lt;br /&gt;
Dafür kann das folgende Python-Skript genutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/check-userquota.py&lt;br /&gt;
&lt;br /&gt;
Es sollte im bin Verzeichnis des Paketnutzers (/home/pacs/xyz00/bin) gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Es muss mit einem Timer eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.timer &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quota&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=00:55:00&lt;br /&gt;
RandomizedDelaySec=3 minutes&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.service &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quotas&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;MAILTO=monitoring@meinedomain.de&amp;quot;&lt;br /&gt;
ExecStart=%h/bin/check-userquota.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktivieren des Timers mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user enable check-userquota --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7548</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7548"/>
		<updated>2026-04-28T06:31:49Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Warn-Emails bei Speicherüberschreitung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Paketspeicher ==&lt;br /&gt;
&lt;br /&gt;
Der im gesamten Paket zur Verfügung stehende bzw genutzte Speicher kann wie folgt abgefragt werden: &lt;br /&gt;
&lt;br /&gt;
Einloggen als Paketadmin &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ pac-du-quota}}&lt;br /&gt;
Es wird der Speicherplatz (NVMe SSD) und der Zusatz-Speicherplatz (HDD) angezeigt.&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ quota -gs}}&lt;br /&gt;
(g &amp;gt; wir nutzen Gruppenquota, s &amp;gt; für Ausgabe in MB). Die Felder bedeuten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 0em 0em 0em 2em; font-size:1em;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:orange;&amp;quot;&lt;br /&gt;
!Feld !! Bedeutung&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|blocks	|| KB belegt&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota || normales (gebuchtes) Limit in KB; &amp;quot;soft quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit || maximales (temporär toleriertes) Limit in KB; &amp;quot;hard quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;quota&amp;quot; bleiben darf (ist nur gesetzt, wenn blocks&amp;gt;quota)&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|files ||Anzahl der INodes (entspricht nicht immer, aber fast einem File. Lediglich Hardlinks verbrauchen nur einen INode pro &amp;quot;realer&amp;quot; Datei)&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota ||normales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit ||maximales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;INode-quota&amp;quot; bleiben darf (ist nur gesetzt, wenn quota überschritten ist)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um zu prüfen, ob ein Paket die Quota bald erreicht oder schon überschritten hat, muss man &#039;&#039;&#039;blocks&#039;&#039;&#039; mit  &#039;&#039;&#039;quota&#039;&#039;&#039; in Verhältnis setzen. Wenn &#039;&#039;&#039;blocks &amp;gt; quota&#039;&#039;&#039;, beginnt die &#039;&#039;grace period&#039;&#039;, während der ein weiterer Anstieg des Speicherverbrauchs noch toleriert wird. In jedem Fall gilt &#039;&#039;&#039;blocks &amp;lt; limit&#039;&#039;&#039;: die &amp;quot;hard quota&amp;quot; kann nicht überschritten werden und liegt z.B. bei 150% der &amp;quot;soft quota&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der genutzte Speicher nur für den Paketadmin selbst kann mit &#039;&#039;&#039;du&#039;&#039;&#039; abgefragt werden: Einloggen als Paket-Admin und &#039;&#039;&#039;du -h&#039;&#039;&#039; eingeben. Der Befehl listet die aktuellen Größen der einzelnen Verzeichnisse auf und am Ende den gesamt belegten Plattenplatz in MB.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Die Auflistung (mit &#039;&#039;&#039;du&#039;&#039;&#039;) erfolgt ohne den Speicherplatz der User, für deren Verzeichnisse der Paketadmin kein Zugriffsrecht hat, ohne Dateien in /tmp/ und ohne Datenbanken!}}&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle unser Danke an die Mitglieder Andreas Loesch und Timotheus Pokorra die das hervorragende Skript &#039;pac-du-quota&#039; bereit gestellt haben.&lt;br /&gt;
&lt;br /&gt;
== Unvermutete Speicherbelegung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal wunderst du dich, welche Dateien deinen Speicherplatz belegen?&lt;br /&gt;
&lt;br /&gt;
du und pac-du-quota zeigen nur die Dateien im Home Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Manche Anwendungen legen im /tmp Verzeichnis für deinen Benutzer Dateien an.&lt;br /&gt;
&lt;br /&gt;
Diese Dateien findest du mit diesem Befehl, für deinen aktuellen Benutzer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ find /tmp/user/$UID&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ ls -la /tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Warnung bei Erreichen des Quotas ==&lt;br /&gt;
&lt;br /&gt;
== Warnungen beim Paketspeicher ==&lt;br /&gt;
&lt;br /&gt;
Wenn die Speicherbelegung (Soft- oder Hard-Quota) beim Paketspeicher überschritten wird, bekommen die dafür eingetragenen E-Mail-Adressen jeden Morgen eine E-Mail mit einem Warn-Hinweis.&lt;br /&gt;
&lt;br /&gt;
== Speicherbelegung von einzelnen Benutzern prüfen ==&lt;br /&gt;
&lt;br /&gt;
Diese automatische E-Mail berücksichtigt nicht die Quotas der einzelnen Benutzer/Postfächer.&lt;br /&gt;
&lt;br /&gt;
Dafür kann das folgende Python-Skript genutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/check-userquota.py&lt;br /&gt;
&lt;br /&gt;
Es sollte im bin Verzeichnis des Paketnutzers (/home/pacs/xyz00/bin) gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Es muss mit einem Timer eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.timer &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quota&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=00:55:00&lt;br /&gt;
RandomizedDelaySec=3 minutes&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&lt;br /&gt;
xyz00@h00:~$ cat .config/systemd/user/check-userquota.service &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=check user quotas&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;MAILTO=monitoring@meinedomain.de&amp;quot;&lt;br /&gt;
ExecStart=%h/bin/check-userquota.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktivieren des Timers mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user enable check-userquota --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7547</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7547"/>
		<updated>2026-04-27T08:18:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* weiterführende Links */ kaputten Link ersetzt&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;
Falls der &#039;&#039;Redirect&#039;&#039; auf die Domain &#039;&#039;example.org&#039;&#039; umleitet statt auf die Subdomain &#039;&#039;cloud.example.org&#039;&#039;, kann diese Aktion helfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
mkdir -p subs-ssl/www&lt;br /&gt;
cp htdocs/.htaccess subs-ssl/www/.htaccess&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-30.0.6.zip&lt;br /&gt;
unzip nextcloud-30.0.6.zip &lt;br /&gt;
rm nextcloud-30.0.6.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;
Um Probleme mit der Anmeldung der Nextcloud App am Mobilgerät zu vermeiden, müssen folgende Zeilen in der Datei &amp;lt;code&amp;gt;doms/cloud.example.org/.htaccess&amp;lt;/code&amp;gt; eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=htaccess&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{HTTP:Authorization} ^(.*)&lt;br /&gt;
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]&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. Redis wird als eigener Serverdienst gestartet. &#039;&#039;&#039;In Verbindung mit Hostsharing Managed Webspace muss für Redis [https://www.hostsharing.net/paas/managed-webspace/ Arbeitsspeicher für eigene Serverdienste] gebucht werden&#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=/usr/sbin/logrotate -s %h/.logrotate.state %h/.logrotate&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;
=== Nextcloud Cronjob ===&lt;br /&gt;
&lt;br /&gt;
Für die regelmäßigen Hintergrundaufgaben innerhalb der Nextcloud sollte ein Cronjob eingerichtet werden. Wir lösen dies hier mit einem weiteren Systemd-Timer:&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=/usr/bin/php %h/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;
Das Hochleistungs-Backend haben wir mittlerweile bei manchen Mitgliedern bereits im Einsatz. Es wird auf einem Container Server installiert. (siehe auch [[Container#Nextcloud_High_Performance_Backend_mit_Caddy|Nextcloud High Performance Backend auf Container Server]])&lt;br /&gt;
&lt;br /&gt;
Unser Mitglied Timotheus Pokorra bietet auch einen Nextcloud High Performance Backend Server zum Teilen an. Siehe [https://solidevereine.de/organisation/nextcloud/#highperf]&lt;br /&gt;
&lt;br /&gt;
Ohne das Hochleistungs-Backend macht wohl die Audio bzw. Video Funktion kaum Sinn, wenn es mit mehr als 2 Teilnehmern genutzt werden soll. Deswegen empfehlen wir, die Anrufe in Talk zu deaktivieren, und stattdessen die BBB zu benutzen.&lt;br /&gt;
&lt;br /&gt;
Das Deaktivieren der Anrufe geschieht in der Administrationsoberfläche von Nextcloud, unter Talk, &amp;quot;Auf Gruppen beschränken&amp;quot;, &amp;quot;Starten von Anrufen begrenzen&amp;quot;: &amp;quot;Anrufe deaktivieren&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Datei:NextcloudTalkAnrufeDeaktivieren.png]]&lt;br /&gt;
&lt;br /&gt;
Die Warnung wegen dem fehlenden Hochleistungs-Backend lässt sich &amp;quot;entschärfen&amp;quot;: in der Einstellungsseite von Talk in der Administrationsoberfläche, ganz oben, deaktiviere: &amp;quot;Vor Verbindungsproblemen bei Anrufen mit mehr als 2 Teilnehmern warnen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Datei:NextcloudTalkWarnungDeaktivieren.png]]&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;
* Es wird die App [https://apps.nextcloud.com/apps/files_antivirus Antivirus für Dateien] installiert.&lt;br /&gt;
* Bei Modus wird gewählt: &amp;lt;code&amp;gt;ClamAV-Daemon (Socket)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Socket wird gewählt: &amp;lt;code&amp;gt;/var/run/clamav/clamd.ctl&amp;lt;/code&amp;gt;&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&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php updater/updater.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls während des Updates kein Backup angelegt werden soll:&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 updater/updater.phar --no-backup&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;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:repair --include-expensive&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;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:repair --include-expensive&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 maintenance:repair --include-expensive&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 31 auf Nextcloud 32, obwohl Nextcloud 31 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 32.&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/31/&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;
Ein Fallstrick: Im data-Verzeichnis liegt eine versteckte Datei &amp;quot;.ncdata&amp;quot;. Beim Move-Befehl &amp;quot;mv&amp;quot; für das komplette Data-Verzeichnis wird diese Datei mit verschoben. Sonst muss die Datei ggf. ins neue data-Verzeichnis kopiert werden!&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://docs.nextcloud.com/server/stable/admin_manual/installation/server_tuning.html Optimierung des Caches z.B. 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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7546</id>
		<title>Collabora Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7546"/>
		<updated>2026-04-14T06:13:35Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Collabora konfigurieren */ IPv6 und IPv4 eintragen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Collabora installieren =&lt;br /&gt;
&lt;br /&gt;
== Empfohlene Hardwareausrüstung ==&lt;br /&gt;
&lt;br /&gt;
siehe auch https://sdk.collaboraonline.com/docs/installation/Configuration.html#performance&lt;br /&gt;
&lt;br /&gt;
Wir konfigurieren nun Collabora Online so, dass die Anzahl der verfügbaren CPUs automatisch berücksichtigt wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen sind folgende Punkte:&lt;br /&gt;
&lt;br /&gt;
1. Per Mail an service@hostsharing.net die Aktivierung der Paket Option Collabora Online beauftragen mit der Angabe des Paketkürzel xyz00 und des Benutzers xyz00-cloud unter der die Installation läuft.&lt;br /&gt;
&lt;br /&gt;
2. Grundlage bei Hostsharing ist die Installation der Nextcloud laut Wiki Anleitung [[Nextcloud]].&lt;br /&gt;
&lt;br /&gt;
3. Die APP &#039;&#039;Nextcloud Office&#039;&#039; erst installieren wenn der Service die Bestätigung gesendet hat, dass die Aktivierung erfolgt ist. Hinweis: Bei der Nextcloud-Installation wird &#039;&#039;Nextcloud Office&#039;&#039; u.U. automatisch mit installiert. In diesem Fall ist es notwendig, die App zunächst zu deaktivieren: als Admin im Profilmenü &amp;quot;+ Apps&amp;quot; öffnen und sie dort unter &amp;quot;Aktive Apps&amp;quot; deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Collabora installieren ==&lt;br /&gt;
&lt;br /&gt;
Collabora ist auf allen 64 Bit hive installiert. Es muss hier nun noch die APP Collabora Online in der Nextcloud installiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG:&#039;&#039;&#039; Die Freigabe vom Service muss erst per Mail vorliegen!!&lt;br /&gt;
&lt;br /&gt;
1. Anmeldung als &#039;&#039;&#039;Admin&#039;&#039;&#039; in der Nextcloud Installation&lt;br /&gt;
&lt;br /&gt;
2. Rechts oben auf &#039;&#039;&#039;Profilmenü&#039;&#039;&#039; den Eintrag &#039;&#039;&#039;+APP&#039;&#039;&#039; auswählen&lt;br /&gt;
[[Datei:Hs-collabora-app-install.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
3. Im &#039;&#039;&#039;Suchfeld&#039;&#039;&#039; oben &amp;quot;Nextcloud Office&amp;quot; eingeben&lt;br /&gt;
[[Datei:Nextcloud-Office-Suche.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Auf den Button &#039;&#039;Herunterladen und aktivieren&#039;&#039; klicken&lt;br /&gt;
&lt;br /&gt;
Damit ist die APP Nextcloud Office installiert und muss nun noch konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
== Collabora konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Rechts oben unter &#039;&#039;&#039;Profilmenü&#039;&#039;&#039; den Eintrag &#039;&#039;&#039;Einstellungen&#039;&#039;&#039; auswählen.&lt;br /&gt;
&lt;br /&gt;
Anschließend im linken Fensterbereich unter dem Menüpunkt &#039;&#039;&#039;Verwaltung&#039;&#039;&#039;&lt;br /&gt;
den Eintrag &#039;&#039;&#039;Collabora Online&#039;&#039;&#039; auswählen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Nextcloud-Office-Menue.png|300px]]&lt;br /&gt;
&lt;br /&gt;
Hier muss nun die PaketDomain entsprechend Eingetragen werden.&lt;br /&gt;
Wobei &#039;&#039;&#039;xyz00&#039;&#039;&#039;.hostsharing.net durch Ihr Paket Kürzel zu ersetzten ist. &lt;br /&gt;
Es wird kein Port eingetragen!&lt;br /&gt;
Anschließend einmal auf den Button &#039;&#039;Anwenden&#039;&#039; klicken.&lt;br /&gt;
[[Bild:Nextcloud-Office-URL.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen bei &#039;Allow list for WOPI requests&#039; die aufgelöste IP Adresse des Webpaketes xyz00.hostsharing.net einzutragen. Sodass nur diese Collabora Instanz Dokumente aus der Nextcloud erhalten kann. Die IP erhält man z.B. über den Konsolenbefehl &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t AAAA xyz00.hostsharing.net +short&lt;br /&gt;
    2a01:37:1000::53df:4fb1:0&lt;br /&gt;
dig -t A xyz00.hostsharing.net +short&lt;br /&gt;
    83.223.79.177&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die beiden IP Adressen sollten mit Komma getrennt in der Nextcloud auf der Admin Config Seite von Collabora hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Einstellungen können individuell noch vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7545</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7545"/>
		<updated>2026-04-14T03:56:59Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2026.1.1 auf 2026.1.3 */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 2026.1.1 auf 2026.1.3 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v2026.1.1 &amp;gt; diff-2026.1.1.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.3 v2026.1.3&lt;br /&gt;
# evtl. Änderungen aus diff-2026.1.1.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2026.1.1.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile bzw. https://github.com/discourse/discourse/blob/v2026.1.3/Gemfile)&lt;br /&gt;
# Ist dies der Fall, dann:&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@10&lt;br /&gt;
# corepack use pnpm@latest-10&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# Falls die pg extension pg_vector nicht installiert ist: deaktiviere das Plugin während migrate, aber auch für später damit /admin/settings funktioniert (ansonsten in salt pillar pg_vector installieren, und als postgres user: create extension vector;)&lt;br /&gt;
## mkdir -p ~/plugins.bak&lt;br /&gt;
## mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7541</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7541"/>
		<updated>2026-04-04T18:56:36Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2026.1.1 auf 2026.1.3 */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 2026.1.1 auf 2026.1.3 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v2026.1.1 &amp;gt; diff-2026.1.1.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.3 v2026.1.3&lt;br /&gt;
# evtl. Änderungen aus diff-2026.1.1.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2026.1.1.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile bzw. https://github.com/discourse/discourse/blob/v2026.1.3/Gemfile)&lt;br /&gt;
# Ist dies der Fall, dann:&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@10&lt;br /&gt;
# corepack use pnpm@latest-10&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7539</id>
		<title>Collabora Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7539"/>
		<updated>2026-03-14T04:51:44Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Empfohlene Hardwareausrüstung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Collabora installieren =&lt;br /&gt;
&lt;br /&gt;
== Empfohlene Hardwareausrüstung ==&lt;br /&gt;
&lt;br /&gt;
siehe auch https://sdk.collaboraonline.com/docs/installation/Configuration.html#performance&lt;br /&gt;
&lt;br /&gt;
Wir konfigurieren nun Collabora Online so, dass die Anzahl der verfügbaren CPUs automatisch berücksichtigt wird.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen sind folgende Punkte:&lt;br /&gt;
&lt;br /&gt;
1. Per Mail an service@hostsharing.net die Aktivierung der Paket Option Collabora Online beauftragen mit der Angabe des Paketkürzel xyz00 und des Benutzers xyz00-cloud unter der die Installation läuft.&lt;br /&gt;
&lt;br /&gt;
2. Grundlage bei Hostsharing ist die Installation der Nextcloud laut Wiki Anleitung [[Nextcloud]].&lt;br /&gt;
&lt;br /&gt;
3. Die APP &#039;&#039;Nextcloud Office&#039;&#039; erst installieren wenn der Service die Bestätigung gesendet hat, dass die Aktivierung erfolgt ist. Hinweis: Bei der Nextcloud-Installation wird &#039;&#039;Nextcloud Office&#039;&#039; u.U. automatisch mit installiert. In diesem Fall ist es notwendig, die App zunächst zu deaktivieren: als Admin im Profilmenü &amp;quot;+ Apps&amp;quot; öffnen und sie dort unter &amp;quot;Aktive Apps&amp;quot; deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Collabora installieren ==&lt;br /&gt;
&lt;br /&gt;
Collabora ist auf allen 64 Bit hive installiert. Es muss hier nun noch die APP Collabora Online in der Nextcloud installiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG:&#039;&#039;&#039; Die Freigabe vom Service muss erst per Mail vorliegen!!&lt;br /&gt;
&lt;br /&gt;
1. Anmeldung als &#039;&#039;&#039;Admin&#039;&#039;&#039; in der Nextcloud Installation&lt;br /&gt;
&lt;br /&gt;
2. Rechts oben auf &#039;&#039;&#039;Profilmenü&#039;&#039;&#039; den Eintrag &#039;&#039;&#039;+APP&#039;&#039;&#039; auswählen&lt;br /&gt;
[[Datei:Hs-collabora-app-install.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
3. Im &#039;&#039;&#039;Suchfeld&#039;&#039;&#039; oben &amp;quot;Nextcloud Office&amp;quot; eingeben&lt;br /&gt;
[[Datei:Nextcloud-Office-Suche.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Auf den Button &#039;&#039;Herunterladen und aktivieren&#039;&#039; klicken&lt;br /&gt;
&lt;br /&gt;
Damit ist die APP Nextcloud Office installiert und muss nun noch konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
== Collabora konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Rechts oben unter &#039;&#039;&#039;Profilmenü&#039;&#039;&#039; den Eintrag &#039;&#039;&#039;Einstellungen&#039;&#039;&#039; auswählen.&lt;br /&gt;
&lt;br /&gt;
Anschließend im linken Fensterbereich unter dem Menüpunkt &#039;&#039;&#039;Verwaltung&#039;&#039;&#039;&lt;br /&gt;
den Eintrag &#039;&#039;&#039;Collabora Online&#039;&#039;&#039; auswählen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Nextcloud-Office-Menue.png|300px]]&lt;br /&gt;
&lt;br /&gt;
Hier muss nun die PaketDomain entsprechend Eingetragen werden.&lt;br /&gt;
Wobei &#039;&#039;&#039;xyz00&#039;&#039;&#039;.hostsharing.net durch Ihr Paket Kürzel zu ersetzten ist. &lt;br /&gt;
Es wird kein Port eingetragen!&lt;br /&gt;
Anschließend einmal auf den Button &#039;&#039;Anwenden&#039;&#039; klicken.&lt;br /&gt;
[[Bild:Nextcloud-Office-URL.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen bei &#039;Allow list for WOPI requests&#039; die aufgelöste IP Adresse des Webpaketes xyz00.hostsharing.net einzutragen. Sodass nur diese Collabora Instanz Dokumente aus der Nextcloud erhalten kann. Die IP erhält man z.B. über den Konsolenbefehl &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Relevante Zeile im Output sieht ungefähr so aus:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
;; ANSWER SECTION:&lt;br /&gt;
xyz00.hostsharing.net.	3807	IN	A	83.223.79.177&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die IP Adresse ist die, die dann auch in der Nextcloud auf der Admin Config Seite von Collabora hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weitere Einstellungen können individuell noch vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7538</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7538"/>
		<updated>2026-03-13T14:56:56Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Config Web.de -&amp;gt; HS Benutzer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hives schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
#SourceServer imap.web.de&lt;br /&gt;
#SourcePort 143&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
#DestServer xyz00.hostsharing.net&lt;br /&gt;
#DestPort 143&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Python Skript zur Massenverarbeitung ==&lt;br /&gt;
&lt;br /&gt;
Wenn viele Postfächer umgezogen werden sollen, ist es hilfreich, wenn die Befehle und die Passwörter generiert werden können.&lt;br /&gt;
&lt;br /&gt;
Dafür haben wir ein Python-Skript, das in diesem Repository zur Verfügung steht:&lt;br /&gt;
* [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py create_and_move_mailboxes.py]&lt;br /&gt;
* mit einer entsprechenden Konfigurations-Datei: [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes_config-sample.py create_and_move_mailboxes_config-sample.py]&lt;br /&gt;
&lt;br /&gt;
In der Konfigurations-Datei werden die Postfächer mit E-Mail-Adresse und Aliasen, und die Verteiler konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Die Passwörter werden nur einmal generiert, und in einer sqlite Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# dem Kunden die neuen Passwörter mitteilen:&lt;br /&gt;
ACTION=info python3 create_and_move_mailboxes.py&lt;br /&gt;
# Anweisungen in hsscript ausführen:&lt;br /&gt;
ACTION=hsadmin python3 create_and_move_mailboxes.py&lt;br /&gt;
# Anweisungen in ImapCopy einfügen:&lt;br /&gt;
ACTION=imapcopy python3 create_and_move_mailboxes.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite Shell, starten dort screen, um kein Problem bei Verbindungsabbrüchen zu haben, und starten dann den stunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7537</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7537"/>
		<updated>2026-03-12T14:13:58Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Unvermutete Speicherbelegung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Paketspeicher ==&lt;br /&gt;
&lt;br /&gt;
Der im gesamten Paket zur Verfügung stehende bzw genutzte Speicher kann wie folgt abgefragt werden: &lt;br /&gt;
&lt;br /&gt;
Einloggen als Paketadmin &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ pac-du-quota}}&lt;br /&gt;
Es wird der Speicherplatz (NVMe SSD) und der Zusatz-Speicherplatz (HDD) angezeigt.&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ quota -gs}}&lt;br /&gt;
(g &amp;gt; wir nutzen Gruppenquota, s &amp;gt; für Ausgabe in MB). Die Felder bedeuten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 0em 0em 0em 2em; font-size:1em;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:orange;&amp;quot;&lt;br /&gt;
!Feld !! Bedeutung&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|blocks	|| KB belegt&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota || normales (gebuchtes) Limit in KB; &amp;quot;soft quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit || maximales (temporär toleriertes) Limit in KB; &amp;quot;hard quota&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;quota&amp;quot; bleiben darf (ist nur gesetzt, wenn blocks&amp;gt;quota)&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|files ||Anzahl der INodes (entspricht nicht immer, aber fast einem File. Lediglich Hardlinks verbrauchen nur einen INode pro &amp;quot;realer&amp;quot; Datei)&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|quota ||normales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#CAE1FF;&amp;quot;&lt;br /&gt;
|limit ||maximales Limit der INode-Anzahl&lt;br /&gt;
|- style=&amp;quot;background-color:#B9D3EE;&amp;quot;&lt;br /&gt;
|grace || Anzahl der Tage, die man noch über &amp;quot;INode-quota&amp;quot; bleiben darf (ist nur gesetzt, wenn quota überschritten ist)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um zu prüfen, ob ein Paket die Quota bald erreicht oder schon überschritten hat, muss man &#039;&#039;&#039;blocks&#039;&#039;&#039; mit  &#039;&#039;&#039;quota&#039;&#039;&#039; in Verhältnis setzen. Wenn &#039;&#039;&#039;blocks &amp;gt; quota&#039;&#039;&#039;, beginnt die &#039;&#039;grace period&#039;&#039;, während der ein weiterer Anstieg des Speicherverbrauchs noch toleriert wird. In jedem Fall gilt &#039;&#039;&#039;blocks &amp;lt; limit&#039;&#039;&#039;: die &amp;quot;hard quota&amp;quot; kann nicht überschritten werden und liegt z.B. bei 150% der &amp;quot;soft quota&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der genutzte Speicher nur für den Paketadmin selbst kann mit &#039;&#039;&#039;du&#039;&#039;&#039; abgefragt werden: Einloggen als Paket-Admin und &#039;&#039;&#039;du -h&#039;&#039;&#039; eingeben. Der Befehl listet die aktuellen Größen der einzelnen Verzeichnisse auf und am Ende den gesamt belegten Plattenplatz in MB.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Die Auflistung (mit &#039;&#039;&#039;du&#039;&#039;&#039;) erfolgt ohne den Speicherplatz der User, für deren Verzeichnisse der Paketadmin kein Zugriffsrecht hat, ohne Dateien in /tmp/ und ohne Datenbanken!}}&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle unser Danke an die Mitglieder Andreas Loesch und Timotheus Pokorra die das hervorragende Skript &#039;pac-du-quota&#039; bereit gestellt haben.&lt;br /&gt;
&lt;br /&gt;
== Unvermutete Speicherbelegung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal wunderst du dich, welche Dateien deinen Speicherplatz belegen?&lt;br /&gt;
&lt;br /&gt;
du und pac-du-quota zeigen nur die Dateien im Home Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Manche Anwendungen legen im /tmp Verzeichnis für deinen Benutzer Dateien an.&lt;br /&gt;
&lt;br /&gt;
Diese Dateien findest du mit diesem Befehl, für deinen aktuellen Benutzer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ find /tmp/user/$UID&lt;br /&gt;
xyz00-meinbenutzer@hxy:~$ ls -la /tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7536</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7536"/>
		<updated>2026-03-12T05:28:00Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2025.12.0 auf 2026.1.1 */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 2025.12.0 auf 2026.1.1 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v2025.12.0 &amp;gt; diff-2025.12.0.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.1 v2026.1.1&lt;br /&gt;
# evtl. Änderungen aus diff-2025.12.0.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2025.12.0.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile bzw. https://github.com/discourse/discourse/blob/v2026.1.1/Gemfile)&lt;br /&gt;
# Ist dies der Fall, dann:&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@10&lt;br /&gt;
# corepack use pnpm@latest-10&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7535</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7535"/>
		<updated>2026-03-10T17:24:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Szenario */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur den Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen an den Einstellungen der Domain ===&lt;br /&gt;
==== TTL heruntersetzen ====&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SPF Eintrag erweitern ====&lt;br /&gt;
Es sollte der SPF TXT Eintrag um &amp;lt;code&amp;gt;include:spf.hostsharing.net&amp;lt;/code&amp;gt; erweitert werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;br /&gt;
&lt;br /&gt;
=== Der tatsächliche Umzug ===&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen während des Umzugs in dieser Reihenfolge passieren:&lt;br /&gt;
&lt;br /&gt;
* der MX Eintrag auf der Domain muss geändert werden. Alte MX Einträge müssen entfernt werden, und die 3 Einträge mailin1.hostsharing.net, mailin2.hostsharing.net und mailin3.hostsharing.net müssen eingefügt werden.&lt;br /&gt;
* die Passwörter für die alten Postfächer müssen zurückgesetzt werden, es reicht ein Passwort für alle.&lt;br /&gt;
* die Inhalte der Postfächer werden über imapcopy in die Postfächer bei Hostsharing kopiert.&lt;br /&gt;
&lt;br /&gt;
=== Nacharbeiten ===&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgreichen Umzug:&lt;br /&gt;
&lt;br /&gt;
* die Benutzer ändern die Passwörter ihrer neuen Postfächer&lt;br /&gt;
* die Benutzer konfigurieren den E-Mail Client mit den neuen Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Wenn sich der Staub gelegt hat, können danach die Webseite, weitere Anwendungen, und schließlich die gesamte Domain zu Hostsharing umgezogen werden.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7534</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7534"/>
		<updated>2026-03-10T15:47:17Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Durchzuführende Schritte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen an den Einstellungen der Domain ===&lt;br /&gt;
==== TTL heruntersetzen ====&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== SPF Eintrag erweitern ====&lt;br /&gt;
Es sollte der SPF TXT Eintrag um &amp;lt;code&amp;gt;include:spf.hostsharing.net&amp;lt;/code&amp;gt; erweitert werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;br /&gt;
&lt;br /&gt;
=== Der tatsächliche Umzug ===&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen während des Umzugs in dieser Reihenfolge passieren:&lt;br /&gt;
&lt;br /&gt;
* der MX Eintrag auf der Domain muss geändert werden. Alte MX Einträge müssen entfernt werden, und die 3 Einträge mailin1.hostsharing.net, mailin2.hostsharing.net und mailin3.hostsharing.net müssen eingefügt werden.&lt;br /&gt;
* die Passwörter für die alten Postfächer müssen zurückgesetzt werden, es reicht ein Passwort für alle.&lt;br /&gt;
* die Inhalte der Postfächer werden über imapcopy in die Postfächer bei Hostsharing kopiert.&lt;br /&gt;
&lt;br /&gt;
=== Nacharbeiten ===&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgreichen Umzug:&lt;br /&gt;
&lt;br /&gt;
* die Benutzer ändern die Passwörter ihrer neuen Postfächer&lt;br /&gt;
* die Benutzer konfigurieren den E-Mail Client mit den neuen Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Wenn sich der Staub gelegt hat, können danach die Webseite, weitere Anwendungen, und schließlich die gesamte Domain zu Hostsharing umgezogen werden.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7533</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7533"/>
		<updated>2026-03-10T15:46:04Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* SPF Eintrag erweitern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPF Eintrag erweitern ===&lt;br /&gt;
Es sollte der SPF TXT Eintrag um &amp;lt;code&amp;gt;include:spf.hostsharing.net&amp;lt;/code&amp;gt; erweitert werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;br /&gt;
&lt;br /&gt;
=== Der tatsächliche Umzug ===&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen während des Umzugs in dieser Reihenfolge passieren:&lt;br /&gt;
&lt;br /&gt;
* der MX Eintrag auf der Domain muss geändert werden. Alte MX Einträge müssen entfernt werden, und die 3 Einträge mailin1.hostsharing.net, mailin2.hostsharing.net und mailin3.hostsharing.net müssen eingefügt werden.&lt;br /&gt;
* die Passwörter für die alten Postfächer müssen zurückgesetzt werden, es reicht ein Passwort für alle.&lt;br /&gt;
* die Inhalte der Postfächer werden über imapcopy in die Postfächer bei Hostsharing kopiert.&lt;br /&gt;
&lt;br /&gt;
=== Nacharbeiten ===&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgreichen Umzug:&lt;br /&gt;
&lt;br /&gt;
* die Benutzer ändern die Passwörter ihrer neuen Postfächer&lt;br /&gt;
* die Benutzer konfigurieren den E-Mail Client mit den neuen Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Wenn sich der Staub gelegt hat, können danach die Webseite, weitere Anwendungen, und schließlich die gesamte Domain zu Hostsharing umgezogen werden.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7532</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7532"/>
		<updated>2026-03-10T15:45:25Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* TTL heruntersetzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPF Eintrag erweitern ===&lt;br /&gt;
Es sollte der SPF TXT Eintrag um spf.hostsharing.net erweitert werden.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;br /&gt;
&lt;br /&gt;
=== Der tatsächliche Umzug ===&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen während des Umzugs in dieser Reihenfolge passieren:&lt;br /&gt;
&lt;br /&gt;
* der MX Eintrag auf der Domain muss geändert werden. Alte MX Einträge müssen entfernt werden, und die 3 Einträge mailin1.hostsharing.net, mailin2.hostsharing.net und mailin3.hostsharing.net müssen eingefügt werden.&lt;br /&gt;
* die Passwörter für die alten Postfächer müssen zurückgesetzt werden, es reicht ein Passwort für alle.&lt;br /&gt;
* die Inhalte der Postfächer werden über imapcopy in die Postfächer bei Hostsharing kopiert.&lt;br /&gt;
&lt;br /&gt;
=== Nacharbeiten ===&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgreichen Umzug:&lt;br /&gt;
&lt;br /&gt;
* die Benutzer ändern die Passwörter ihrer neuen Postfächer&lt;br /&gt;
* die Benutzer konfigurieren den E-Mail Client mit den neuen Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Wenn sich der Staub gelegt hat, können danach die Webseite, weitere Anwendungen, und schließlich die gesamte Domain zu Hostsharing umgezogen werden.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7531</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7531"/>
		<updated>2026-03-10T15:44:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Ankündigung an die Nutzenden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;br /&gt;
&lt;br /&gt;
=== Der tatsächliche Umzug ===&lt;br /&gt;
&lt;br /&gt;
Folgende Schritte müssen während des Umzugs in dieser Reihenfolge passieren:&lt;br /&gt;
&lt;br /&gt;
* der MX Eintrag auf der Domain muss geändert werden. Alte MX Einträge müssen entfernt werden, und die 3 Einträge mailin1.hostsharing.net, mailin2.hostsharing.net und mailin3.hostsharing.net müssen eingefügt werden.&lt;br /&gt;
* die Passwörter für die alten Postfächer müssen zurückgesetzt werden, es reicht ein Passwort für alle.&lt;br /&gt;
* die Inhalte der Postfächer werden über imapcopy in die Postfächer bei Hostsharing kopiert.&lt;br /&gt;
&lt;br /&gt;
=== Nacharbeiten ===&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgreichen Umzug:&lt;br /&gt;
&lt;br /&gt;
* die Benutzer ändern die Passwörter ihrer neuen Postfächer&lt;br /&gt;
* die Benutzer konfigurieren den E-Mail Client mit den neuen Zugangsdaten&lt;br /&gt;
&lt;br /&gt;
Wenn sich der Staub gelegt hat, können danach die Webseite, weitere Anwendungen, und schließlich die gesamte Domain zu Hostsharing umgezogen werden.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7530</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7530"/>
		<updated>2026-03-10T15:39:38Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Ankündigung an die Nutzenden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
** dabei sollte beachtet werden:&lt;br /&gt;
*** Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
*** evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
** nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
** das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7529</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7529"/>
		<updated>2026-03-10T15:39:17Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Ankündigung an die Nutzenden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die Nutzenden weitergegeben werden. Am besten sollten diese Menschen auch über einen anderen Kanal zu erreichen sein, falls es Probleme beim Wechsel auf das neue Postfach gibt.&lt;br /&gt;
&lt;br /&gt;
Folgende Sachen sollten erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
* Umstellung der Zugangsdaten. Siehe auch Screenshots für Thunderbird auf https://www.hostsharing.net/doc/managed-operations-platform/email/&lt;br /&gt;
* Möglichkeit von Webmail: https://webmail.hostsharing.net&lt;br /&gt;
  * dabei sollte beachtet werden:&lt;br /&gt;
    * Absender Adresse muss bei der ersten Anmeldung korrigiert werden.&lt;br /&gt;
    * evtl. müssen in den Einstellungen die Unterordner abonniert werden, sonst werden sie im Posteingang nicht angezeigt&lt;br /&gt;
* Ändern des temporären Passworts&lt;br /&gt;
  * nach dem erfolgreichen Umzug der Postfächer muss jede Benutzerin das Passwort öndern&lt;br /&gt;
  * das geschieht auf https://admin.hostsharing.net: anmelden, und dann oben rechts auf den eigenen Benutzernamen klicken&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7528</id>
		<title>Umzug aller Postfächer einer Domain</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umzug_aller_Postf%C3%A4cher_einer_Domain&amp;diff=7528"/>
		<updated>2026-03-10T15:00:12Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Die Seite wurde neu angelegt: „== Szenario ==  Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.  Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.  == Durchzuführende Schritte ==  === TTL heruntersetzen === Beim bis…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Szenario ==&lt;br /&gt;
&lt;br /&gt;
Das neue Mitglied hat bisher eine Domain und mehrere Postfächer bei einem Anbieter. Nun soll die Domain, die Webseite, die Postfächer und evtl. auch andere Anwendungen, z.B. eine Nextcloud, zu Hostsharing umgezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wir betrachten hier erstmal nur dem Umzug der Postfächer und der E-Mail Adressen. Die weiteren Schritte können im Anschluss durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Durchzuführende Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== TTL heruntersetzen ===&lt;br /&gt;
Beim bisherigen Anbieter sollte die TTL auf dem MX Eintrag der Domain auf 600 Sekunden gesetzt werden (10 Minuten). &lt;br /&gt;
Das sollte spätestens einen Tag vor dem Umzug erledigt werden, um den Default-Wert der TTL von bis zu 24 Stunden zu vermeiden.&lt;br /&gt;
Dadurch wird die Zeitspanne verringert, in der während des Umzugs nach dem Ändern des MX Eintrages sich der neue Mailempfangsserver im DNS herumspricht.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle TTL lässt sich mit diesem Befehl prüfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t MX meinedomain.de&lt;br /&gt;
   meinedomain.de.		86400	IN	MX	0 xyz.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Es sollte in HSAdmin auf https://admin.hostsharing.net folgende Dinge angelegt werden:&lt;br /&gt;
&lt;br /&gt;
* die Domain meinedomain.de sollte angelegt werden&lt;br /&gt;
* es sollten die Postfächer als Unix Benutzer angelegt werden, und temporäre Passwörter vergeben werden.&lt;br /&gt;
* es sollten die E-Mail Adressen, Aliase und Weiterleitungen eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Es kann dafür auch dieses Python-Skript benutzt werden: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py&lt;br /&gt;
&lt;br /&gt;
=== Ankündigung an die Nutzenden ===&lt;br /&gt;
&lt;br /&gt;
Rechtzeitig muss eine Anleitung und die neuen Zugangsdaten an die&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Domains&amp;diff=7527</id>
		<title>Domains</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Domains&amp;diff=7527"/>
		<updated>2026-03-10T14:48:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Aktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-DomainLinks}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= Domains bei Hostsharing = &lt;br /&gt;
&lt;br /&gt;
aktuelle Dokumentation:&lt;br /&gt;
&lt;br /&gt;
{{Kerndoku|https://www.hostsharing.net/doc/managed-operations-platform/domain/}}&lt;br /&gt;
&lt;br /&gt;
Die Domainverwaltung bei Hostsharing ist in zwei unabhängige Bereiche aufgeteilt:&lt;br /&gt;
&lt;br /&gt;
*  Die &#039;&#039;&#039;Domaineinrichtung&#039;&#039;&#039; in den HS-Paketen, zur Erstellung des Domainverzeichnisses unter [[~/]]doms im Paket und [[Aufschaltung]] einer Domain auf HS [[DNS|Name]]-, Mail- und Webserver. Dies geschieht mit [[hsadmin]] im Webfrontend oder auf der Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
*  Das &#039;&#039;&#039;[http://www.domain-bestellsystem.de Domainbestellsystem]&#039;&#039;&#039; des HS-Partnerunternehmens Partnergate zur [[Konnektierung]], also der eigentlichen Registrierung von Domains bei einem Registrar, und zur Vergabe weiterer Aufträgen an Registrierungstellen. Jedes Mitglied von Hostsharing erhielt für dieses Domainbestellsystem Zugangsdaten, bestehend aus einem Benutzernamen der Form hs-xyz und einem Passwort.&lt;br /&gt;
&lt;br /&gt;
Bei anderen Hostern ist eine Domainbestellung teilweise eine feste Kopplung der Registrierung einer Domain mit Konnektierung und gleichzeitiger Aufschaltung auf bestimmte Nameserver und Webpakete. HS ist hier wesentlich flexibler. Der über HS angebotene Zugang zum Domain-Bestellsystem erlaubt es, Domains zu registrieren und auf frei wählbare DNS-Server zu konnektieren. Auf den HS Nameservern und Paketen lassen sich gleichzeitig beliebige weltweit registrierbare Domains einrichten. Hostsharing unterstützt damit die Einrichtung und den Betrieb von Domains die von beliebigen (auch sehr exotischen) Registrierungsstellen verwaltet und abgerechnet werden können.&lt;br /&gt;
&lt;br /&gt;
= Aktionen = &lt;br /&gt;
&lt;br /&gt;
Typische Domainaktionen beinhalten also koordinierte Änderungen sowohl in der Domainregistrierung als auch der HS-Einrichtung, wie in folgenden Seiten aufgezeigt:&lt;br /&gt;
&lt;br /&gt;
* Eine Domain einrichten: [[Domainregistrierung]]&lt;br /&gt;
* Eine Domain kündigen: [[Domainkündigung]]&lt;br /&gt;
* Verwalten von Domains, Subdomains, Eigentümer, Nameserver: [[Domainverwaltung]]&lt;br /&gt;
* Umzug von allen Postfächern einer Domain von einem anderen Anbieter zu Hostsharing: [[Umzug aller Postfächer einer Domain]]&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
Was ist eine [[Domain]]&amp;lt;br&amp;gt;&lt;br /&gt;
Was ist ein [[Handles|Domainhandle]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[FAQ#Domains|Einträge zu Domains in der HS FAQ]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Domains]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7526</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7526"/>
		<updated>2026-03-06T17:16:25Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Python Skript zur Massenverarbeitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hives schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer imap.web.de&lt;br /&gt;
SourcePort 143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer xyz00.hostsharing.net&lt;br /&gt;
DestPort 143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Python Skript zur Massenverarbeitung ==&lt;br /&gt;
&lt;br /&gt;
Wenn viele Postfächer umgezogen werden sollen, ist es hilfreich, wenn die Befehle und die Passwörter generiert werden können.&lt;br /&gt;
&lt;br /&gt;
Dafür haben wir ein Python-Skript, das in diesem Repository zur Verfügung steht:&lt;br /&gt;
* [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes.py create_and_move_mailboxes.py]&lt;br /&gt;
* mit einer entsprechenden Konfigurations-Datei: [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/create_and_move_mailboxes_config-sample.py create_and_move_mailboxes_config-sample.py]&lt;br /&gt;
&lt;br /&gt;
In der Konfigurations-Datei werden die Postfächer mit E-Mail-Adresse und Aliasen, und die Verteiler konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Die Passwörter werden nur einmal generiert, und in einer sqlite Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# dem Kunden die neuen Passwörter mitteilen:&lt;br /&gt;
ACTION=info python3 create_and_move_mailboxes.py&lt;br /&gt;
# Anweisungen in hsscript ausführen:&lt;br /&gt;
ACTION=hsadmin python3 create_and_move_mailboxes.py&lt;br /&gt;
# Anweisungen in ImapCopy einfügen:&lt;br /&gt;
ACTION=imapcopy python3 create_and_move_mailboxes.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite Shell, starten dort screen, um kein Problem bei Verbindungsabbrüchen zu haben, und starten dann den stunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7525</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7525"/>
		<updated>2026-03-06T17:13:06Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* ssl via stunnel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hives schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer imap.web.de&lt;br /&gt;
SourcePort 143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer xyz00.hostsharing.net&lt;br /&gt;
DestPort 143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Python Skript zur Massenverarbeitung ==&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite Shell, starten dort screen, um kein Problem bei Verbindungsabbrüchen zu haben, und starten dann den stunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7524</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7524"/>
		<updated>2026-03-06T17:09:27Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Installation ImapCopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hives schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer imap.web.de&lt;br /&gt;
SourcePort 143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer xyz00.hostsharing.net&lt;br /&gt;
DestPort 143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite Shell, starten dort screen, um kein Problem bei Verbindungsabbrüchen zu haben, und starten dann den stunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7523</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7523"/>
		<updated>2026-03-05T19:46:50Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2025.12.0 auf 2026.1.1 */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 2025.12.0 auf 2026.1.1 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v2025.12.0 &amp;gt; diff-2025.12.0.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.1 v2026.1.1&lt;br /&gt;
# evtl. Änderungen aus diff-2025.12.0.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2025.12.0.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile bzw. https://github.com/discourse/discourse/blob/v2026.1.1/Gemfile)&lt;br /&gt;
# Ist dies der Fall, dann:&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-10&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7522</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7522"/>
		<updated>2026-03-05T19:39:00Z</updated>

		<summary type="html">&lt;p&gt;Tim00: siehe Ruby Version in Gemfile&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 3.4.7 auf 3.5.1 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v3.4.7 &amp;gt; diff-3.4.7.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.5.1 v3.5.1&lt;br /&gt;
# evtl. Änderungen aus diff-3.4.7.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.4.7.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile bzw. https://github.com/discourse/discourse/blob/v2026.1.1/Gemfile)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-9&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Etherpad_Installieren&amp;diff=7521</id>
		<title>Etherpad Installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Etherpad_Installieren&amp;diff=7521"/>
		<updated>2026-03-05T10:17:05Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Aktualisierung auf 2.6.1 mit mindestens Node 20&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etherpad Lite installieren =&lt;br /&gt;
&lt;br /&gt;
Etherpad ist eine JavaScript-Anwendung mit der mehrere Bearbeiter gleichzeitig einen Text im Browser editieren können. &lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Etherpad können zum Beispiel die Teilnehmer einer Telefonkonferenz gemeinsam an einem Text-Dokument arbeiten.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin &#039;&#039;xyz00&#039;&#039; werden mit HSAdmin ein User angelegt und eine Domain aufgeschaltet. Eine produktive Installation von Etherpad braucht zusätzlich einen MySQL-User und eine MySQL-Datenbank.&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;hsscript&#039;&#039; können diese Ressourcen wie folgt angelegt werden:&lt;br /&gt;
&lt;br /&gt;
Als Paketadmin &#039;&#039;xyz00&#039;&#039; aufrufen: &amp;lt;code&amp;gt;hsscript -i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der HSAdmin-Shell gibt man dann ein:&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-pad&#039;, password:&#039;mein-Geheimwort&#039;, shell:&#039;/bin/bash&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;pad.example.com&#039;, user:&#039;xyz00-pad&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_padusr&#039;, password:&#039;anderes-Geheimwort&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_paddb&#039;, owner:&#039;xyz00_padusr&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Etherpad v2.6.1 benötigt &#039;&#039;nodejs&#039;&#039; in einer Version &amp;gt;= 20. Die Installation erfolgt gemäß der Wiki-Anleitung: [[NodeJS]]&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss der Paketmanager pnpm für Version 2 vorgehalten werden &lt;br /&gt;
&lt;br /&gt;
npm install pnpm@latest-10&lt;br /&gt;
&lt;br /&gt;
Als Paketadmin &#039;&#039;xyz00&#039;&#039; nimmt man mit &amp;lt;code&amp;gt;sudo -u xyz00-pad -i&amp;lt;/code&amp;gt; die Rechte des Domain-Administrators &#039;&#039;xyz00-pad&#039;&#039; für die neue Domain &#039;&#039;pad.example.com&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Die Etherpad-Software kann aus dem Git-Repository bei Github ausgecheckt werden:&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/ether/etherpad-lite.git&lt;br /&gt;
cd etherpad-lite/&lt;br /&gt;
git tag -l&lt;br /&gt;
git checkout tags/2.6.1&lt;br /&gt;
./bin/run.sh &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;git checkout tags/2.6.1&amp;quot; wird Release 2.6.1 ausgecheckt, die heute (05.03.2026) aktuelle Version.&lt;br /&gt;
&lt;br /&gt;
Bei der Initialisierung der Anwendung gibt es einige Warnungen, die man ignorieren kann. Wenn die Initialisierung durchgelaufen ist, kann man&lt;br /&gt;
unter der URL http://xyz00.hostsharing.net:9001/ schon die die Etherpad-Anwendung ohne Datenbank und ohne die gewünschte Domain sehen.&lt;br /&gt;
&lt;br /&gt;
Wir brechen das &#039;&#039;run.sh&#039;&#039;-Skript mit Ctrl-c ab.&lt;br /&gt;
&lt;br /&gt;
== v2: Konfiguration mit Proxy und systemd ==&lt;br /&gt;
&lt;br /&gt;
  # ~/.config/systemd/user/etherpad-lite.service&lt;br /&gt;
  [Unit]&lt;br /&gt;
  Description=Etherpad-Lite Service&lt;br /&gt;
  [Service]&lt;br /&gt;
  WorkingDirectory=%h/etherpad-lite&lt;br /&gt;
  Environment=&amp;quot;NODE_ENV=production&amp;quot;&lt;br /&gt;
  Environment=&amp;quot;BIND=127.0.0.1&amp;quot;&lt;br /&gt;
  Environment=&amp;quot;PATH=/home/pacs/xyz00/users/tools_pad/.nvm/versions/node/v20.18.3/bin:/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
  ExecStart=%h/.nvm/versions/node/v20.18.3/bin/pnpm run prod&lt;br /&gt;
  [Install]&lt;br /&gt;
  WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  # ~/doms/pad.example.com/.htaccess&lt;br /&gt;
  DirectoryIndex disabled&lt;br /&gt;
  RewriteBase /&lt;br /&gt;
  RewriteCond %{HTTP:Connection} Upgrade [NC]&lt;br /&gt;
  RewriteCond %{HTTP:Upgrade} websocket [NC]&lt;br /&gt;
  RewriteRule .* ws://localhost:9001%{REQUEST_URI}  [proxy]&lt;br /&gt;
  RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
  RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
  RewriteRule .* http://localhost:9001%{REQUEST_URI} [proxy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass auf 127.0.0.1 ge-binded wird, und nicht die von Welt erreichbare Adresse 0.0.0.0. Man beachte das im Systemd Service File die node version hardcoded wird und beim Update zwei mal entsprechend angepasst werden muss. Genauso der User und der Paketusername, der leider nicht direkt ersetzt werden kann. &lt;br /&gt;
&lt;br /&gt;
Dass auch nach Neustart der Etherpad Server erreichbar ist: &lt;br /&gt;
&lt;br /&gt;
systemctl --user enable etherpad-lite&lt;br /&gt;
&lt;br /&gt;
== v1: Konfiguration für Apache und Passenger ==&lt;br /&gt;
&lt;br /&gt;
Vor der Nutzung von [[Phusion Passenger]] bitte unbedingt die dortigen Hinweise zur Nutzung beachten.&lt;br /&gt;
&lt;br /&gt;
Die statischen Dateien der Anwendung werden mit den folgenden Befehlen richtig verlinkt&lt;br /&gt;
(immer noch als User &#039;&#039;xyz00-pad&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
cd ~/doms/pad.example.com&lt;br /&gt;
rm -rf subs/www&lt;br /&gt;
rm -rf subs-ssl/www&lt;br /&gt;
rm -rf htdocs-ssl&lt;br /&gt;
ln -s ~/etherpad-lite/src/static htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Anwendung legen wir im Verzeichnis &#039;&#039;~/doms/pad.example.com/app-ssl/&#039;&#039; eine Datei app.js mit dem folgenden Inhalt an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
require(&#039;/home/pacs/xyz00/users/pad/etherpad-lite/node_modules/ep_etherpad-lite/node/server.js&#039;);&lt;br /&gt;
process.chdir(&#039;/home/pacs/xyz00/users/pad/etherpad-lite&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Datenbank anpassen =&lt;br /&gt;
&lt;br /&gt;
Zum Schluß wird in der Datei &#039;&#039;~/etherpad-lite/settings.js&#039;&#039; noch die MySQL-Datenbank konfiguriert. Dazu muss der Teil mit &#039;&#039;dbType: mysql&#039;&#039; aktiv (nicht auskommentiert) sein. Etwa wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
&amp;quot;dbType&amp;quot; : &amp;quot;mysql&amp;quot;,&lt;br /&gt;
&amp;quot;dbSettings&amp;quot; : {&lt;br /&gt;
  &amp;quot;user&amp;quot;    : &amp;quot;xyz00_padusr&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;    : &amp;quot;localhost&amp;quot;,&lt;br /&gt;
  &amp;quot;password&amp;quot;: &amp;quot;anderes-Geheimwort&amp;quot;,&lt;br /&gt;
  &amp;quot;database&amp;quot;: &amp;quot;xyz00_paddb&amp;quot;,&lt;br /&gt;
  &amp;quot;charset&amp;quot; : &amp;quot;utf8mb4&amp;quot;,&lt;br /&gt;
  &amp;quot;insecureAuth&amp;quot;: &amp;quot;true&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einstellungen für den &#039;&#039;dbType: dirty&#039;&#039; werden dafür entfernt.&lt;br /&gt;
&lt;br /&gt;
Weiter unten in der Datei kann dann noch ein Admin-User aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Etherpad sollte nun unter der URL: &#039;&#039;http://pad.example.com/&#039;&#039; erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
= Update = &lt;br /&gt;
&lt;br /&gt;
Etherpad ist sehr pflegeleicht was das Update angeht. Es muss nur die neue Version in Git ausgecheckt werden und ./bin/run.sh erneut (einmalig) ausgeführt werden, damit die dependencies wieder neu gebaut werden. Auch von v1 -&amp;gt; v2 ist sonst nichts weiter zu tun.&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[http://etherpad.org/ Etherpad Homepage (Englisch)]&lt;br /&gt;
*[https://github.com/ether/etherpad-lite/ Github Repository (Englisch)]&lt;br /&gt;
*[https://github.com/ether/etherpad-lite/wiki/Running-Etherpad-on-Phusion-Passenger Running Etherpad on Phusion Passenger (Englisch)]&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:Passenger]]&lt;br /&gt;
[[Kategorie:NodeJS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7520</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7520"/>
		<updated>2026-02-27T19:26:07Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* stunnel aufbauen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hive schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer imap.web.de&lt;br /&gt;
SourcePort 143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer xyz00.hostsharing.net&lt;br /&gt;
DestPort 143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite Shell, starten dort screen, um kein Problem bei Verbindungsabbrüchen zu haben, und starten dann den stunnel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Flarum_installieren&amp;diff=7506</id>
		<title>Flarum installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Flarum_installieren&amp;diff=7506"/>
		<updated>2026-02-16T07:15:12Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Hinweis auf PHP 7.4 entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
[https://flarum.org// Flarum] ist ein freies Forensystem, das sich als Foren-Software der nächsten Generation bezeichnet und Online-Diskussionen zu einem Vergnügen machen will. Es wirbt damit, einfach, schnell und frei zu sein.&lt;br /&gt;
&lt;br /&gt;
Flarum läuft mit PHP und MySQL und lässt sich auf Linux betreiben. Die Installation mit Composer stellt für Benutzer von anderen shared Hosting Umgebungen ein Hindernis dar, bei Hostsharing dagegen ist Composer kein Problem und ermöglicht eine sehr einfache Installation.&lt;br /&gt;
&lt;br /&gt;
Flarum ist der kombinierte Nachfolger von esoTalk und FluxBB.&lt;br /&gt;
&lt;br /&gt;
Flarum steht unter der MIT Lizenz.&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2021 gibt es nun die stabile Version 1.0.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung von Flarum geschieht in der Freizeit der Hauptentwickler, daher scheint es oft, das Projekt tritt auf der Stelle. Dennoch gibt es immer wieder Fortschritte, die man auf https://discuss.flarum.org/t/blog verfolgen kann.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
Diese Installationsanleitung beschreibt, wie Flarum in einer eigens dafür [[Domainverwaltung#Lokale_Subdomains_durch_Aufschalten.3B_Delegieren|aufgeschalteten Subdomain]] über SSL betrieben wird. Für andere Konfigurationen, wie z.B. die Installation von Flarum in einer als Unterverzeichnis von &amp;lt;tt&amp;gt;~/doms/&#039;&#039;domain&#039;&#039;/subs/&amp;lt;/tt&amp;gt; erstellten Subdomain, muß dieses Verfahren leicht angepaßt werden.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil einer Installation in einer aufgeschalteten Subdomain ist, daß die Installation leicht von anderen Domaininhalten, PHP-Konfigurationen, oder sogar von anderen Domain-Administratoren, isoliert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Subdomain aufschalten ===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden folgende Domainkonfigurationsdaten als Beispiel verwendet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Subdomain || &amp;lt;tt&amp;gt;discuss.example.org&amp;lt;/tt&amp;gt;  || Die Subdomain, unter der eine Flarum-Instanz laufen soll&lt;br /&gt;
|-&lt;br /&gt;
| Domain-Admin || &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; || Der User, dem die Subdomain delegiert wurde&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quellen ===&lt;br /&gt;
&lt;br /&gt;
Die Quellen befinden sich unter:&lt;br /&gt;
* https://github.com/flarum/core&lt;br /&gt;
&lt;br /&gt;
Allerdings empfiehlt sich die Installation über Composer.&lt;br /&gt;
&lt;br /&gt;
==== Installation mit Composer ====&lt;br /&gt;
&lt;br /&gt;
Es sollte eine neuere Version von Composer (momentan 2.4.2) installiert werden, weil die Default Installation schon sehr alt ist (1.8.4). Siehe auch https://getcomposer.org/download/ für den aktuell gültigen sha hash...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
mkdir ~/composer&lt;br /&gt;
cd ~/composer&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php -r &amp;quot;if (hash_file(&#039;sha384&#039;, &#039;composer-setup.php&#039;) === &#039;55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae&#039;) { echo &#039;Installer verified&#039;; } else { echo &#039;Installer corrupt&#039;; unlink(&#039;composer-setup.php&#039;); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
php composer-setup.php&lt;br /&gt;
php -r &amp;quot;unlink(&#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun zur eigentlichen Installation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir flarum&lt;br /&gt;
cd flarum&lt;br /&gt;
php ~/composer/composer.phar create-project flarum/flarum .&lt;br /&gt;
# deutsches Sprachpaket installieren:&lt;br /&gt;
php ~/composer/composer.phar require flarum-lang/german&lt;br /&gt;
# um Platz zu sparen:&lt;br /&gt;
rm -Rf ~/.cache/composer&lt;br /&gt;
cd ~/doms/discuss.example.org&lt;br /&gt;
rm -Rf htdocs-ssl&lt;br /&gt;
ln -s ~/flarum/public htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MySQL vorbereiten ===&lt;br /&gt;
&lt;br /&gt;
Flarum benötigt eine MySQL-Datenbank sowie einen Datenbanknutzer.&lt;br /&gt;
&lt;br /&gt;
Die Tabellen werden später vom Installations-Werkzeug von Flarum eigenständig angelegt.&lt;br /&gt;
&lt;br /&gt;
==== Datenbank und Datenbanknutzer anlegen ====&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung werden folgende Namen für die Datenbank und deren Nutzer verwendet. Das Paket-Kürzel &amp;lt;tt&amp;gt;xyz00&amp;lt;/tt&amp;gt; ist natürlich durch das des betreffenden Pakets zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| DB-Nutzer || &amp;lt;tt&amp;gt;xyz00_flarum&amp;lt;/tt&amp;gt; || Der MySQL-Nutzer, dem die Datenbank gehört und der administrative Tätigkeiten durchführt und dann auch im Betrieb genutzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Datenbank || &amp;lt;tt&amp;gt;xyz00_flarum&amp;lt;/tt&amp;gt;  || Die MySQL-Datenbank, die die Daten von Flarum enthält.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Nutzer und die Datenbank können über die Weboberfläche auf [https://admin.hostsharing.net/ https://admin.hostsharing.net] oder über die Kommandozeile mit [[Hsadmin]] angelegt werden. Siehe dazu die Anleitungen auf der Seite [[MySQL]] und [[Datenbanken]]. Diese Schritte müssen ggf. vom Paket-Admin vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Einrichtung über die Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
Als Besitzer der Flarum-Datenbank &amp;lt;tt&amp;gt;xyz00_flarum&amp;lt;/tt&amp;gt; angeben; als Zeichenkodierung ist das Default &amp;lt;tt&amp;gt;UTF-8&amp;lt;/tt&amp;gt; richtig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
su xyz00&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;mysqluser.add ({set:{name:&#039;xyz00_flarum&#039;,password:&#039;geheim&#039;}})&amp;quot;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;mysqldb.add ({set:{name:&#039;xyz00_flarum&#039;,owner:&#039;xyz00_flarum&#039;,encoding:&#039;utf-8&#039;}})&amp;quot;&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation durchführen ===&lt;br /&gt;
&lt;br /&gt;
Die URL zur Installation von Flarum lautet schlicht und einfach &#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://discuss.example.org&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Man gibt bei &#039;&#039;Forum Title&#039;&#039; den gewünschten Namen des Forums ein. Er kann auch später in den Einstellungen noch geändert werden, im laufenden Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die Datenbank muss wie folgt konfiguriert werden:&lt;br /&gt;
* &#039;&#039;MySQL Host&#039;&#039;: &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;MySQL Database&#039;&#039;: &amp;lt;code&amp;gt;xyz00_flarum&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;MySQL Username&#039;&#039;: &amp;lt;code&amp;gt;xyz00_flarum&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;MySQL Password&#039;&#039;: &amp;lt;code&amp;gt;geheim&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Table Prefix&#039;&#039;: kann leer gelassen werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Admin Username&#039;&#039; ist der Benutzername des Benutzers, der Administrationsrechte haben soll. Entsprechend ist &#039;&#039;Admin Email&#039;&#039; die E-Mail Adresse dieses Benutzers, und &#039;&#039;Admin Password&#039;&#039; sein Passwort, dass in &#039;&#039;Confirm Password&#039;&#039; wiederholt werden muss.&lt;br /&gt;
&lt;br /&gt;
Nun klickt man auf den Schalter mit der Aufschrift &#039;&#039;Install Flarum&#039;&#039;, und die Instanz wird konfiguriert.&lt;br /&gt;
&lt;br /&gt;
Danach wird man in die Flarum Instanz weitergeleitet, und ist direkt als der erstellte Benutzer angemeldet.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Man ändert die Sprache in der Titelleiste von Englisch auf Deutsch.&lt;br /&gt;
&lt;br /&gt;
Man sollte dann in die Einstellungen gehen, die man im Menü oben rechts unter dem Benutzer Avatar findet.&lt;br /&gt;
&lt;br /&gt;
Dort kann man die voreingestellte Sprache für das Forum einstellen, und ob man den Wechsel der Sprache erlaubt.&lt;br /&gt;
&lt;br /&gt;
Außerdem lässt sich unter &amp;quot;E-Mail&amp;quot; ein SMTP Zugang für ein E-Mail Konto einrichten, über welches neue Konten eingerichtet werden können und vergessene Passwörter ersetzt werden können.&lt;br /&gt;
&lt;br /&gt;
Es können auch Kategorien definiert werden, damit lassen sich die Diskussionen besser sortieren.&lt;br /&gt;
&lt;br /&gt;
Man kann auch die Zugriffsrechte konfigurieren. Dafür können verschiedene Gruppen eingerichtet werden. &lt;br /&gt;
&lt;br /&gt;
Im Endeffekt kann man auch über die Zugriffsrechte auch ein geschütztes Forum einrichten, wenn man die Registrierung schließt, und das Lesen von Diskussionen nur Mitgliedern erlaubt. Das einzige Problem ist, dass neue Mitglieder in diesem Fall sich nicht selber registrieren können, und notfalls über eine Erweiterung oder per Hand über die Datenbank angelegt werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Aktualisierung einer bestehenden Installation ==&lt;br /&gt;
&lt;br /&gt;
Neue Versionen von Flarum werden auf dem Blog angekündigt: https://discuss.flarum.org/t/blog?sort=newest&lt;br /&gt;
&lt;br /&gt;
In den Versionsankündigungen ist auch immer ein Abschnitt enthalten, der auf Besonderheiten beim Update hinweist. Diese Hinweise sollten befolgt werden!&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.flarum.org/update/&lt;br /&gt;
&lt;br /&gt;
Es sollte immer ein aktuelles Backup angefertigt werden.&lt;br /&gt;
&lt;br /&gt;
Meistens sind diese Anweisungen ausreichend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd ~/flarum&lt;br /&gt;
php flarum info&lt;br /&gt;
php ~/composer/composer.phar update --prefer-dist --no-dev -a --with-all-dependencies&lt;br /&gt;
php flarum migrate&lt;br /&gt;
php flarum cache:clear&lt;br /&gt;
php flarum info&lt;br /&gt;
rm -Rf ~/.cache/composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Webforen]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7505</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=7505"/>
		<updated>2026-02-12T14:15:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Installation von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
&lt;br /&gt;
# mit Poetry:&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
&lt;br /&gt;
# oder mit Pipenv&lt;br /&gt;
pip install pipenv&lt;br /&gt;
pipenv install matrix-synapse[postgres,oidc] lxml authlib&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;
Normalerweise sollte es so gehen, mit pipenv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv update --outdated || echo &amp;quot;there are packages to update&amp;quot;&lt;br /&gt;
pipenv update&lt;br /&gt;
systemctl --user restart synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seltenen Fällen gibt es Probleme bei den Abhängigkeiten, die schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&lt;br /&gt;
Dann ist es zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, um die Konflikte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
mit poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source ~/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7504</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=7504"/>
		<updated>2026-02-12T05:49:29Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Installation von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
&lt;br /&gt;
# mit Poetry:&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
&lt;br /&gt;
# oder mit Pipenv&lt;br /&gt;
pip install pipenv&lt;br /&gt;
pipenv install matrix-synapse[postgres] matrix-synapse[oidc] lxml&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;
Normalerweise sollte es so gehen, mit pipenv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv update --outdated || echo &amp;quot;there are packages to update&amp;quot;&lt;br /&gt;
pipenv update&lt;br /&gt;
systemctl --user restart synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seltenen Fällen gibt es Probleme bei den Abhängigkeiten, die schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&lt;br /&gt;
Dann ist es zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, um die Konflikte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
mit poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source ~/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7503</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=7503"/>
		<updated>2026-02-12T05:45:54Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Installation von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
&lt;br /&gt;
# mit Poetry:&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
&lt;br /&gt;
# oder mit Pipenv&lt;br /&gt;
pip install pipenv&lt;br /&gt;
pipenv install matrix-synapse[postgres] matrix-synapse[oidc]&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;
Normalerweise sollte es so gehen, mit pipenv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv update --outdated || echo &amp;quot;there are packages to update&amp;quot;&lt;br /&gt;
pipenv update&lt;br /&gt;
systemctl --user restart synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seltenen Fällen gibt es Probleme bei den Abhängigkeiten, die schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&lt;br /&gt;
Dann ist es zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, um die Konflikte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
mit poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source ~/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7502</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=7502"/>
		<updated>2026-02-12T05:43:12Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&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;
Normalerweise sollte es so gehen, mit pipenv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/synapse&lt;br /&gt;
pipenv update --outdated || echo &amp;quot;there are packages to update&amp;quot;&lt;br /&gt;
pipenv update&lt;br /&gt;
systemctl --user restart synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seltenen Fällen gibt es Probleme bei den Abhängigkeiten, die schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&lt;br /&gt;
Dann ist es zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, um die Konflikte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
mit poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source ~/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7501</id>
		<title>ImapCopy</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=ImapCopy&amp;diff=7501"/>
		<updated>2026-02-11T16:55:06Z</updated>

		<summary type="html">&lt;p&gt;Tim00: kleine Verbesserungen: Typo und screen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist ein Werkzeug, mit dem man ein komplettes IMAP-Postfach in ein IMAP-Postfach auf einem anderen Server (bei einem anderen Anbieter) kopieren kann. Wir verwenden es für die Migration von Postfächern. Eine Alternative ist [[OfflineIMAP]].&lt;br /&gt;
&lt;br /&gt;
== Installation ImapCopy ==&lt;br /&gt;
&lt;br /&gt;
ImapCopy ist auf den HS Hive schon installiert&lt;br /&gt;
&lt;br /&gt;
== Einrichtung allgemein ==&lt;br /&gt;
&lt;br /&gt;
Anmelden per ssh als ein Benutzer in einem HS-Paket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort wird ein Arbeitsverzeichnis erstellt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~$ mkdir imapcopy&lt;br /&gt;
xyz00-imapcopy@h01:~$ cd imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in einer Datei ImapCopy.cfg gespeichert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi ImapCopy.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config Web.de -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Muster Inhalt der Datei ImapCopy.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
# imapcopy config&lt;br /&gt;
# all lines beginning with # are comments and will be ignored&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer imap.web.de&lt;br /&gt;
SourcePort 143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer xyz00.hostsharing.net&lt;br /&gt;
DestPort 143&lt;br /&gt;
&lt;br /&gt;
#########&lt;br /&gt;
# Options&lt;br /&gt;
#########&lt;br /&gt;
#&lt;br /&gt;
# DebugSrc and DebugDest will show all traffic between IMAPCopy and Server&lt;br /&gt;
#&lt;br /&gt;
#DebugSrc&lt;br /&gt;
#DebugDst&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to skip&lt;br /&gt;
#################&lt;br /&gt;
#skipfolder INBOX.Trash&lt;br /&gt;
#skipfolder INBOX.Sent&lt;br /&gt;
#skipfolder &amp;quot;INBOX.Sent Objects&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#################&lt;br /&gt;
# Folders to copy&lt;br /&gt;
#################&lt;br /&gt;
#copyfolder INBOX&lt;br /&gt;
#copyfolder &amp;quot;INBOX.My personal files&amp;quot;&lt;br /&gt;
#copyfolder INBOX.Net-Connection.dy&lt;br /&gt;
#copyfolder INBOX.test&lt;br /&gt;
&lt;br /&gt;
####################################################### &lt;br /&gt;
# Rootfolder&lt;br /&gt;
# Can be specified to copy the Folder-Structure under&lt;br /&gt;
# a separate folder instead of inbox&lt;br /&gt;
#######################################################&lt;br /&gt;
#DstRootFolder &amp;quot;Your old Mails&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################&lt;br /&gt;
# Specify Flags that are supported on the destination server&lt;br /&gt;
# (AllowFlags) or flags that should be filtered out (DenyFlags)&lt;br /&gt;
# If not specified, all Flags are copyied 1:1&lt;br /&gt;
# If AllowFlags is specified, all not specified Flags will be&lt;br /&gt;
# removed and  not copied to the destination&lt;br /&gt;
# If DenyFlags is specified, those flags will be removed and&lt;br /&gt;
# the remaining ones will be copied&lt;br /&gt;
# Both (AllowFlags and DenyFlags) could be specified but&lt;br /&gt;
# would (in most cases) make no sense&lt;br /&gt;
##############################################################&lt;br /&gt;
#AllowFlags &amp;quot;\Seen\Answered\Flagged\Deleted\Draft Junk NonJunk $MDNSent $Forwared&amp;quot;&lt;br /&gt;
DenyFlags &amp;quot;\Recent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##############################################################&lt;br /&gt;
# Timezone conversion&lt;br /&gt;
# The imap rfc is not clear on what kind of time offsets&lt;br /&gt;
# can be used. +XXXX -XXXX will be supported on all servers&lt;br /&gt;
# You can add as many entries as needed in the form&lt;br /&gt;
# converttimezone SRC DST&lt;br /&gt;
# to convert zones that your target server rejects&lt;br /&gt;
##############################################################&lt;br /&gt;
converttimezone &amp;quot;UTC&amp;quot; &amp;quot;+0000&amp;quot;&lt;br /&gt;
converttimezone &amp;quot;UT&amp;quot;  &amp;quot;+0000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#       SourceUser           SourcePassword        DestinationUser        DestinationPassword&lt;br /&gt;
Copy    &amp;quot;xyz@web.de&amp;quot;         &amp;quot;Euer-Passwort&amp;quot;       &amp;quot;xyz00-imap&amp;quot;           &amp;quot;Benutzer-Passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Config gmail.com -&amp;gt; HS Benutzer ===&lt;br /&gt;
&lt;br /&gt;
Da ImapCopy nicht direkt SSL unterstützt benötigt z.b. gmail und ggf einige andere die weiter unten beschrieben Lösung mit einem stunnel.&lt;br /&gt;
&lt;br /&gt;
== Testen einer Verbindung ==&lt;br /&gt;
&lt;br /&gt;
Zum testen ob die Daten alle OK sind auf der shell einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
== Daten austauschen ==&lt;br /&gt;
&lt;br /&gt;
Wir empfehlen: Benutze eine &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; Sitzung, damit die Übertragung nicht durch einen Verbindungsabbruch durcheinander kommt!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ screen&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hilfe ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ imapcopy -h&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ man imapcopy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ssl via stunnel ==&lt;br /&gt;
&lt;br /&gt;
Es wird eine Konfuguration Datei , hier stunnel-to-gmail.conf, benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ vi stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei stunnel-to-gmail.conf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
foreground=yes&lt;br /&gt;
&lt;br /&gt;
; Some performance tunings&lt;br /&gt;
socket = l:TCP_NODELAY=1&lt;br /&gt;
socket = r:TCP_NODELAY=1&lt;br /&gt;
&lt;br /&gt;
; Some debugging stuff useful for troubleshooting&lt;br /&gt;
debug = 7&lt;br /&gt;
&lt;br /&gt;
; Pfad for pid file&lt;br /&gt;
pid = /tmp/stunnel4-xyz00.pid&lt;br /&gt;
&lt;br /&gt;
; Use it for client mode&lt;br /&gt;
client = yes&lt;br /&gt;
&lt;br /&gt;
; Service-level configuration&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:10143&lt;br /&gt;
connect = imap.gmail.com:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&lt;br /&gt;
[imap]&lt;br /&gt;
accept = 127.0.0.1:20143&lt;br /&gt;
connect = xyz00.hostsharing.net:993&lt;br /&gt;
retry = yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung in der ImapCopy.cfg ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
##############&lt;br /&gt;
# Sourceserver&lt;br /&gt;
##############&lt;br /&gt;
SourceServer 127.0.0.1&lt;br /&gt;
SourcePort 10143&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
# Destinationserver&lt;br /&gt;
###################&lt;br /&gt;
DestServer 127.0.0.1&lt;br /&gt;
DestPort 20143&lt;br /&gt;
&lt;br /&gt;
#############################&lt;br /&gt;
# List of users and passwords&lt;br /&gt;
#############################&lt;br /&gt;
#     SourceUser       SourcePassword  DestinationUser  DestinationPassword&lt;br /&gt;
Copy  &amp;quot;xyz@gmail.com&amp;quot;  &amp;quot;passwort&amp;quot;      &amp;quot;xyz00-imap&amp;quot;     &amp;quot;passwort&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== stunnel aufbauen ===&lt;br /&gt;
&lt;br /&gt;
Wir öffnen eine zweite shell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-imapcopy@h01:~/imapcopy$ stunnel4 stunnel-to-gmail.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verbindung prüfen und herstellen ===&lt;br /&gt;
&lt;br /&gt;
Siehe -&amp;gt; Testen einer Verbindung&lt;br /&gt;
und   -&amp;gt; Daten austauschen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7496</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=7496"/>
		<updated>2026-01-23T21:24:50Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&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 poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source ~/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7495</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=7495"/>
		<updated>2026-01-23T21:24:28Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Installation von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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;
python -m venv .venv&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;
source ~/synapse/.venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&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 poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7494</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=7494"/>
		<updated>2026-01-23T21:22:42Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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 poetry:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
systemctl --user stop synapse.service&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7493</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=7493"/>
		<updated>2026-01-23T21:21:54Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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;
source .venv/bin/activate&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf ~/synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} ~/synapse.src&lt;br /&gt;
cd ~/synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7492</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=7492"/>
		<updated>2026-01-23T21:21:10Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
rm -Rf synapse.src&lt;br /&gt;
git clone --depth 1 https://github.com/element-hq/synapse.git -b ${release} synapse.src&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install --extras=postgres --extras=oidc&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7484</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=7484"/>
		<updated>2026-01-19T07:56:00Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/poetry.lock -O poetry.lock&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/pyproject.toml -O pyproject.toml&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/README.rst -O README.rst&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7483</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=7483"/>
		<updated>2026-01-19T05:41:34Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Update von Synapse mit Poetry&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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&lt;br /&gt;
release=`curl -L https://api.github.com/repos/element-hq/synapse/releases/latest -s | jq -r &#039;.tag_name&#039;`&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/poetry.lock&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/pyproject.toml&lt;br /&gt;
wget https://raw.githubusercontent.com/element-hq/synapse/refs/tags/$release/README.rst&lt;br /&gt;
pip install poetry&lt;br /&gt;
poetry install&lt;br /&gt;
systemctl --user start synapse.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu empfehlen, Synapse mit der offiziellen poetry.lock Datei zu aktualisieren, weil es sonst Versionskonflikte geben kann, wenn Abhängigkeiten schon wieder aktualisiert wurden, und nicht mehr kompatibel zum aktuellen Synapse sind.&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7482</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=7482"/>
		<updated>2026-01-19T05:10:20Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Update von Synapse */&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;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;RAM&amp;quot;. Benötigt werden min. 512 MB. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/ gebucht werden muss der RAM auch bei einem Managed-Server.&lt;br /&gt;
Wir empfehlen 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;
Als User &#039;&#039;xyz00-matrix&amp;quot; ein Python3 virtualenv 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&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 update --outdated&lt;br /&gt;
pipenv 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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7480</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7480"/>
		<updated>2026-01-16T07:29:49Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 3.4.7 auf 3.5.1 */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 3.4.7 auf 3.5.1 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v3.4.7 &amp;gt; diff-3.4.7.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.5.1 v3.5.1&lt;br /&gt;
# evtl. Änderungen aus diff-3.4.7.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.4.7.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv global 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-9&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7479</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7479"/>
		<updated>2026-01-16T07:27:09Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Updates */&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;
Es müssen noch Erweiterungen für Postgresql installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;&amp;quot;&lt;br /&gt;
psql --user xyz00_discourseuser  -c &amp;quot;CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=append:%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=append:%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;
Siehe auch die unterstützten Releases: https://releases.discourse.org/ und die Tags: https://github.com/discourse/discourse/tags&lt;br /&gt;
&lt;br /&gt;
==== Am Beispiel von 3.4.7 auf 3.5.1 ====&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;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v3.4.7 &amp;gt; diff-3.4.7.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.5.1 v3.5.1&lt;br /&gt;
# evtl. Änderungen aus diff-3.4.7.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.4.7.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 eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle install&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-9&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# wir haben keine pg extension pg_vector, daher deaktivieren wir das Plugin während migrate, aber auch für später damit /admin/settings funktioniert:&lt;br /&gt;
# mkdir -p ~/plugins.bak&lt;br /&gt;
# mv plugins/discourse-ai ~/plugins.bak&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7478</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7478"/>
		<updated>2026-01-12T12:06:42Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gruppen Synchronisation in der Praxis */&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;NextcloudGroups&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: Wichtig: es muss der Name der Gruppe in Nextcloud genommen werden, der in der URL der Gruppe erkennbar ist; nicht der DisplayName&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 wechseln 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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7477</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7477"/>
		<updated>2026-01-12T12:06:00Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gruppen Synchronisation über Rollen ermöglichen */&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;NextcloudGroups&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: Wichtig: es muss der Name der Gruppe in Nextcloud genommen werden, der in der URL der Gruppe erkennbar ist; nicht der DisplayName&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7476</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7476"/>
		<updated>2026-01-12T12:05:10Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gruppen Synchronisation in der Praxis */&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: Wichtig: es muss der Name der Gruppe in Nextcloud genommen werden, der in der URL der Gruppe erkennbar ist; nicht der DisplayName&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7475</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7475"/>
		<updated>2026-01-12T12:04:37Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gruppen Synchronisation in der Praxis */ Problem mit Gruppenname&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;
   Wichtig: es muss der Name der Gruppe in Nextcloud genommen werden, der in der URL der Gruppe erkennbar ist; nicht der DisplayName&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>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:OpenLDAP&amp;diff=7474</id>
		<title>Diskussion:OpenLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:OpenLDAP&amp;diff=7474"/>
		<updated>2026-01-08T07:21:56Z</updated>

		<summary type="html">&lt;p&gt;Tim00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Konfiguration der Overlays ==&lt;br /&gt;
&lt;br /&gt;
 add olcOverlay={0}refint,olcDatabase={1}mdb,cn=config&lt;br /&gt;
 objectClass: olcConfig&lt;br /&gt;
 objectClass: olcOverlayConfig&lt;br /&gt;
 objectClass: olcRefintConfig&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 olcOverlay: {0}refint&lt;br /&gt;
 olcRefintAttribute: memberof member manager owner uniqueMember&lt;br /&gt;
 &lt;br /&gt;
 add olcOverlay={1}memberof,olcDatabase={1}mdb,cn=config&lt;br /&gt;
 objectClass: olcMemberOf&lt;br /&gt;
 objectClass: olcOverlayConfig&lt;br /&gt;
 objectClass: olcConfig&lt;br /&gt;
 objectClass: top&lt;br /&gt;
 olcOverlay: {1}memberof&lt;br /&gt;
 olcMemberOfDangling: error&lt;br /&gt;
 olcMemberOfRefInt: TRUE&lt;br /&gt;
 olcMemberOfGroupOC: groupOfUniqueNames&lt;br /&gt;
 olcMemberOfMemberAD: Member&lt;br /&gt;
 olcMemberOfMemberOfAD: memberOf&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Tim00|Tim00]] ([[Benutzer Diskussion:Tim00|Diskussion]]) 08:21, 8. Jan. 2026 (CET) wurde nun auf der Seite angepasst&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=OpenLDAP&amp;diff=7473</id>
		<title>OpenLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=OpenLDAP&amp;diff=7473"/>
		<updated>2026-01-08T07:20:54Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* memberof Overlay */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OpenLDAP installieren ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: Das Debian-Paket &amp;quot;slapd&amp;quot; ist auf dem Managed Server vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
BASE_DIR=&amp;quot;${HOME}/slapd2&amp;quot;&lt;br /&gt;
BASE_DN=&amp;quot;dc=example,dc=com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
INITIAL_PASSWORD=&amp;quot;myInitialPassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BIND_IP_ADDR=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
BIND_IP_PORT=&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fail, if base directory already exists&lt;br /&gt;
&lt;br /&gt;
if test -e ${BASE_DIR}; then&lt;br /&gt;
    echo &amp;quot;Initialization failed.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    echo &amp;quot;Base directory already exists.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Create directory&lt;br /&gt;
&lt;br /&gt;
mkdir -p -m 700 ${BASE_DIR}&lt;br /&gt;
mkdir ${BASE_DIR}/etc&lt;br /&gt;
mkdir ${BASE_DIR}/run&lt;br /&gt;
mkdir ${BASE_DIR}/var&lt;br /&gt;
&lt;br /&gt;
# create initial configuration:&lt;br /&gt;
#    cd ~/slapd2/etc &amp;amp;&amp;amp; tar -cz . | base64&lt;br /&gt;
#    see also /etc/ldap/slapd.d on a clean bookworm install, with apt-install slapd&lt;br /&gt;
#    need to insert BASE_DIR, BASE_DN, and INITIAL_PASSWORD&lt;br /&gt;
&lt;br /&gt;
# Unpack initital configuration&lt;br /&gt;
&lt;br /&gt;
cd ${BASE_DIR}/etc&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |base64 -d |tar -xz&lt;br /&gt;
H4sIAAAAAAAAA+xdW3PbOJbOM38FppIqO1WJmnfJ6doHtexktevbWHZvet4oEpY4oUgNSSX2dPV/&lt;br /&gt;
3wOAuPACiraV7FZ1qyttSYTE7+AcnDug0U+vvvvDhMfY816Zjmf69hj+2mPPdun71eOV5Vn22DX9&lt;br /&gt;
sWu9Mi3L9+xXyPv+0F692hVlkCP06uHx3yf++2yL0yQKtu1x9PqPAPRjH6OfwvQ/wiy9j1ffTRIY&lt;br /&gt;
/80B/Lcsy4ZxluNZzl/8/xEPlf/wrAjXeBMcWBKG8990HN8H/nugCf7i/494dPMfnv1u/hFmOR4l&lt;br /&gt;
UXz/wnsQBvumjv+OD6u9zn/btMfWK2QehMI9jz85/1+j6d3t1ftPZ5dnN9Pbs1P0cX5+ht6j0yt0&lt;br /&gt;
eXWLzk7nt3/7G7orMCLTsslAGh5Hxms0u5k5Nhrfh2a0NH0jSj8gKTRGtvwnDstZEhTFB5Ql4YKK&lt;br /&gt;
1YyKmRHCWDEwCadlmcfLXYlvH7e4oJeOkT3yRu7IRpfTizN09CXNviU4WuF5ep/lm6CMs/QInZ4t&lt;br /&gt;
Zujo5uPMtj3/A4JBBmLDUKyOO/v73fR8fvsbCoMCz1cp3PciKMM1Wvx2eTv9jKyRM/JHFtzPGlmu&lt;br /&gt;
D08tb2TZ1siAS5b3O0irP/kDve0EawmwLgN7jI4KuOlRscvTYIOP0NsmUJiVEh3fGyjYxMnjW0SG&lt;br /&gt;
HRdvEUBG39YxACvXGOG0jMtHFBeEsG8pWj4eocXdNR2twWILLF41cQXO4yC53G2WOG9NGLuIUrhq&lt;br /&gt;
IJyj7F65cd+03f2yuL1R3l7slgVASVdFNcBAe2YW3nJ/913dpDqCEF9MaghzGma7tMwfL5vz6nrW&lt;br /&gt;
yQdUfsveGyjBZQnEzBdX7x3L91H1GfgbYWUG9/Ee/rMIIfPLT+dn73+dnt+dacC6AuxYgE0AbJKF&lt;br /&gt;
QQIz2UJbSUEWggSQAYLpwGu2cFCOizjCBcjxXqZ74vYTKYAlEcAyKPFVfp1nX+M0xG0YBmJiQMYh&lt;br /&gt;
kL1tNfJleHyB50TBk2PMMJEn0yiCLyyak2IgioaMQAEbwmRS4HiSUBqoKZb7We79btnapT4WlFmm&lt;br /&gt;
IC0DqrJ8FaTxv6m66eS2gUALKoNqc7vESQYYUZntnduJRGBJBLsGhCC5S+OyDsRAQvDqQ9EOxj4X&lt;br /&gt;
z4nEw1U16I4Et1QNfReBNcjCGKQtQqCp43Jd0zd77mVJs2C5Qr0Febj+tIuj9i3ZNbTaxQaK8Dv4&lt;br /&gt;
t81xSG++fISbrgMQ9WihfsN+AbE9HTppByyufJe7Ik5BiGdw01WWP7Yg0gGgekHOQzHmBWqXwDfQ&lt;br /&gt;
CyTckhbEqjTv0TYDBZGIJdsggV1FAcxxNaAD/3lclBoayKUOOgy0z3xYOhKk7bDGNRJmWYeUVPiJ&lt;br /&gt;
cTDQiydfhUydh9bku6Z27qUdsSYK8Kv7+zjEv2QPLezXcBXBZQPBAERHHAK/gXqEpwe/NETWCce/&lt;br /&gt;
fixisIKnOIm/4vyR0cI0U8sOXVeDER+N2HDExg8mDRbUXuY8dV1Io2abXNHhBG/XWYo13tUtvW4g&lt;br /&gt;
GIH4EEFD48M1QhrXarQYaBA1nglOq5YYacdsSyHmoYeQB0oC8RKHaEnP1t1aGjDbVm5d4odbnG9i&lt;br /&gt;
sEfziNiD+7gBxEAcCoxFfDBSRw/ApVUa0pDZjjCs90FYxOCi49smq+HSA7OtBqrN1Uf+EXT8MXh4&lt;br /&gt;
i8QnhQj0o6RKg8yNxsFXQiNuAx+ANp12/kwIR+QqtTKKAILTD95/uKCSVRO/2hXdQgIdoZ1lxye6&lt;br /&gt;
QEeBtJM2t5NxCg57Wvkj8eL0slMQiQ9VGwku/ukljV5qS2sgZcC4JysJQpmvpUzaTpvbzhyvwL7h&lt;br /&gt;
HEc6DpERBmJjhDHlY4lHVDO/AzC6wBsdQmkabW4awakvYzaj8zQC9VtmbQ0QEenhw4AJYtwzzc1A&lt;br /&gt;
LQYhYo9OtqW9tIW9zPE9zmEquQm5wOU6izokSYwEv7CyNptq7ABj4aKFjAsNpIsMbWkS7RMJsQCd&lt;br /&gt;
RadS61TR5cpHSXkQ093xJb0yDMtVmVZHRa/FLk2ew01esdtusxw86Ol2mxAZgNvPMliTD6VCA5hz&lt;br /&gt;
5oDz0SiQw8HTqsYLYljYITV5gxID6dfjRAdemjiHm7gN7rRu7G0SZwZolWcQNG7ZwotiIvIQPhRr&lt;br /&gt;
HF32JF2kTXO4Tcu+pR23ou+i4yrNkoE5JYS/feLtpKlyHK5msgRfheFuG6Rl+67VBQi54M5k6NNu&lt;br /&gt;
6Eib43C9titwPsM54RcJXDrsjmeewA3JOBTKge/IO+jnJaiSeqgjh5w9BGHZKcwG6hABnQQ40s44&lt;br /&gt;
XNeF0/2YZxBAHQyxS1EPRSzth8P1WbADlZRDdHyDv2ZsAZGAqUOfMfRiPNgV/gGUwCcaZPSqOFi/&lt;br /&gt;
BOeJDqe0Ig5Xasps9CBlPhxDqnziuVhhZvmcarFKG+FyJRbmGYTk8vbXQdxeqp9BY1KYZHAN7BaG&lt;br /&gt;
P2U2mcEwkKmDKG2EawvXcwUmqUolHa3SjuzhfZwTt+FwuWNH6nvXEY5ZXMZB0jZQ/ALRKAXolQ3N&lt;br /&gt;
HwZJQt4gNyneIfhylGYlxVPlwgHoaD8Qqbtd7uOuMGhOKiF/34GL2IoOCKY0MECZo3/xAdxPAR1H&lt;br /&gt;
VLv4hv0ApEJ3uYv64JnmXRr/a4c18YkUGpNk1GAgipWRQm8s47LmmQ5YiL4Op7QELlfMUc8EgbNc&lt;br /&gt;
TQ6L47TO29XN6dkNeAjKhas8wi1/ml820IB0SId3p8unS4PjctXdma5r0IdTA7FRSu5vYFpPFxi6&lt;br /&gt;
SnlHOplZmYVZ0leLIh4cG6UpRXV8yRM8OF186CoVIK7vmDRedHs/lahuMKwd1Q0iTpDAqn7DQO6S&lt;br /&gt;
+FDLX2lAPO6crTPQqD1Li14Hh6JzTT0312XsSQj11v1caVo8u+UfJytihtebtuosdgYSfrEybMCC&lt;br /&gt;
0Vk5V5oQzxFxXVIGvV4DhHXAdRjVtL8/P9W6aXFJk+JxTR5tomb6r9LexIbco9OL0yNSdutX0a60&lt;br /&gt;
ET5X0dsC76Isfdzw7wZHwzaP3XL9FtYjvwjeHTGVzAFnJaU95sAl5sAcnYxsx7VH1oltmo5pjizy&lt;br /&gt;
bySTRZsgJkW//D6c2PYFvFiCXnyoWW7S4PCB1GFgBGJDYADqEuT51GOiiqQ0g72XV5sijYZoOR8i&lt;br /&gt;
Um3+wj3poZPnaoDQiBRiowzohdhvs81SkCISdjQI/cm23THIGB0IUR8dmXZX8AS1lFYD3dSvPd22&lt;br /&gt;
2L4McQ2kD3I9s4+33PjIstUppeZIzfsxplZkKgUuWt7qqVp+D5o1RBIbBtdHExfIshzPPSGLdiQr&lt;br /&gt;
iLgSXvpXJCWOtgb6EhYn1VWFv449MT+gBK+C8BEF/H50YdHBPGNBC8bgd1SpC+BE3xw8dQY6Ciwg&lt;br /&gt;
4TJjdCV7UGptJb5oK6laA1rKKEDiClEOJazkLQKAd7Pbu5vpObq4W9yiEF1Mf4PZU2qQ6A3o1CLM&lt;br /&gt;
4y1Vpm+7cVgCB1fWvFOgA4i8RJAYgKWOhEFgNfM3gAVPkyKjz1RUBbmYtOAZ3QBtAZBrbbVk3AaZ&lt;br /&gt;
ypIyWGjuYTeRkjnLKsAkL3ANt/uW5VEbrCBiSTIItRIqvKnku+FVK8PKiGzlNOFtmlXrSg/CNaX+&lt;br /&gt;
Ub3qLElU16paQOUzvUGaBDZcQboaAmVKxbWqykfLeL9kD9U7rGApXkjy9EW1GqdJCnGfKDqC014H&lt;br /&gt;
p1kfgYbfBmo2EfSwfbeX72CXa5x/Id8NVOf8C/lO0ZUtDur53s92YI3K+Jeync1d9xLvZLsr2C6K&lt;br /&gt;
/DgvupY24hc4a40Wc0H9pHDbkNytk8vteZN8NobA9QTccaeUXmvAg5xCaFprdlHJYc/b2pT1qnQK&lt;br /&gt;
HOjfgapmkMAB4waqmkGKBhzEgapmkMQBul5VA6taiJ2Gc77g3KSTczdZR69Ql36Raesu/QKyx1in&lt;br /&gt;
1xEgaAdhWcUwcO1fzDJFR5CuRd0SUZP7vTglkw10GMVSMRkE4SnaZSyYztPDNKFwdU++sh0QV/kG&lt;br /&gt;
mjkkLbHgNB6Dy/hWz+5jXrSpaZ0Ok2Eo08iKL5XUZsMomQhKeMPfEWuETEn2U692YBBPVezXOYSi&lt;br /&gt;
RE8DE2kpvk9yeHSiYjzP4dGJtIGGGL4hkkvl1kCHkFyhmTRe7olkLs9CKXXK6zwLu0qzwN0A1pes&lt;br /&gt;
Z275wL3KSZHFXW01wdf1xgsycBFdlgrSs6p9ch9Qtc2ye1V1VJXrS8xAPRXgmtISq2ygzrBkUGSJ&lt;br /&gt;
FNZi2qEsojiHT5K1UTzCOtgAqGAFqNFxQBraQQwqzdGaoqal79pUoEEnIyLRehrhryBrXQCrCz2R&lt;br /&gt;
o5QI2Z1fn76msuLTCP7MnomULr3oQ4XllaWr6a5cExlgU3JXdDbYBIgNppVEOZq6dFJ0pnef5+fz&lt;br /&gt;
6c1vjJ5GNVgDTDqdorVU1tWIxPHaZWtODRKQK98fyJEaRMdIUzkl8kyqH93VSnJ1WqOEMqqrYqgh&lt;br /&gt;
Urqqovm0Mn6seqQ3gWCzmRGsUvIpt4SwkiPEPq20u/WaR/gKA4mU/V4zOcBI0rheK3PSzROdq0Qm&lt;br /&gt;
FjjcERb0FErAtQhYl0BRDa7XSzr4y1ZOO9OuRTdWBE+mfjpF7/2vNrsnu0wi8vqAFpCOPLsWiOJO&lt;br /&gt;
iML5zflpXLAEGrE6WZx2xdEGErxVWKmtugPj9PIPiMH8D8UsraRofI02UZ/wVRl+YnafmO3pjflp&lt;br /&gt;
kHsQ54e6PorLcogQDPTy3qj/CRGYdPcGJnv2W1hbSX9yf2f7JW7aAW8yJvro+r/nUueTMLW1Bgcp&lt;br /&gt;
fVuaddHvCzedTVu3JDes6XgD9Wp5Klg9Sr65NEDkdUr+jUbBa0iSvoBdK7bNbs4VqlzPdnivC72M&lt;br /&gt;
ZjewinW0dKqRzts7NJkvqwC2Z8IrYeuTYAmyF93dzK+q2oPal2eOTz7wbT7lOihpN14QpwUtiMGH&lt;br /&gt;
lGx++bgFL4ZNtPxWmJaKApAKSUM3VldbXVH2CMCK2SaY24oKNXx5o2zGhkkzoVbvND6J0Dnd6LzG&lt;br /&gt;
TNJagiN6TqKwNYO8pGWgelFrH5go1EDwFQjkL1+YoBvbN3fGcHO4Qu9moD7iY0IzqJxdWO7yIFHu&lt;br /&gt;
296Ni0mh4+5ufvoBLZcTZxKG4fvxPXbeW6Zrvp+Ydvg+Wi4t9yQ8CZ1lYIQ5Jiq2IDqI7vkNItCb&lt;br /&gt;
78QucjYA38bgv5TBZvsBxM72Tcscm2P4Sv8f7I6zxWXzysgdu77j/eM12xf+uvoHD4PuOwaVrL8r&lt;br /&gt;
25ncc9f/643W/08f+v3/9h9pXBxi+/+e/f+W63lec/+/5fh/7f//EY8X7v+PIheHeCn2/1OhGbD9&lt;br /&gt;
vxqn2f0vdSKt6oouwDATwdMtGKxPZ7OrBQK9kEQ/gwWDwI7o5A04Qaluy9gTSs4Gemqrgb7RwGoR&lt;br /&gt;
xX2HdbbBpzynoRIXLIss2ZWEqG1Atspm1EiT8TIJ0qCRtiJLEjvAG+g58O0WfFeUrldxuljjJFGx&lt;br /&gt;
S8AEPh2DCjboiXgbaA00CK/TwityIesgyr6dB0U5WwfpShUS4tmvSHJgMJrxECxuC4tfw3IRp00Q&lt;br /&gt;
FQRjUFPPIBBeC8S4DiJ4+P4g/BaISQ3E/wR5CouvA4iBDsqScQvISQ3IPAWxhHCrjcRAhxWOSQuJ&lt;br /&gt;
qDQwKGcPW1jr339KTtpArBqQj0nQxZnBm7mGwbDa2l/kvFnR5y6OOpWIgTo0O9cvT++mgmBJ109l&lt;br /&gt;
tZW5yFkzjJdxcYnLZhst6+BrqLyXYDXQ3t4vq625RQY7lShv83grK7H0XZaPLKsLDRDkP3Ok29Jg&lt;br /&gt;
tdWviE/j7QLnJEF+neVlS54MdGDla7W1r8g+SyhVL/b+IyjaalSkeeMt/5rWZm+gDczK6tCGxWrr&lt;br /&gt;
U5F+zdLwZht2IfkeWsxqK1QR3sfb/8yKsr6jd37NOwQ1Zy48xSXwezfutxWsyGPGWxD0b1n+pQUu&lt;br /&gt;
hfdB/vMvhwK3APW0fxbbOlhk6ijWTVB0Yt2ALSh+LFa7w0sXejoIGxtbL6YzsYnV6O93finD7bZy&lt;br /&gt;
Fmm6ZZaV10EO67uUU5hvwxG5sIVJhEsR+K5iRKfW020VsduqVuzRJzf4GEsN+wu8RvEmWNE6DyiH&lt;br /&gt;
l/rFOv1vt1Wx2JwO+v8i2LJu/H0Hi7XVqNhBzr7mjLXLtqgw0IGMnTyRjQiACYg6NFNXy68K2x7x&lt;br /&gt;
xb/NivhhGtI+X86VKcFCPL+Mdo7d0xo6G8Laua+vFvPPMkVa9NQfQ9ITR/Jw9P9Kr+iKvKqe12I/&lt;br /&gt;
XblERljk0yQEHto311wK9qju0jXJj6K4arci6XJOJG3rZh+AtcFg6SknJLfJYB2KjdBLvAURkHwe&lt;br /&gt;
PIjnVTwgXnO3HKjnbzH3WLwkTurAckhrbmxVMj4x361DLu5pOVq0LFXy0dP/UcmC5HuDz+AUVpwW&lt;br /&gt;
Du4wEppL2xY5BeHZdFEAQj0nOzZwDqYDcaeF9k4ofQtaOmoOXPUa3DbVj6oorJGga0OtE+C2nCk9&lt;br /&gt;
D4CMa7GNbgDsuntWn2JyZMYwzE0P0Jad09Tl0uAFtFdgVmc/3VzP0JLsTCVx7h7MqhPXEgkIAIfg&lt;br /&gt;
bfqI9sivOWY6vKCbyP7id9U815tadPpO9fWEmLdbV0DSgxRsn7bG1nQn7dG46bPpcINko8qDo6P2&lt;br /&gt;
ikXNBxSgub9loC9i/puF1r1kNH1PW+Q7UjVA7CKE9kWkYsje3rJWLCfUCY1FQZ0zjTVIsTT9UFuk&lt;br /&gt;
R5itF5DZruo4JLlKBp4cd8Xk53K+gPnpwS7dj2Err5UasGWuBL6rXi+b0n63nHSTABZjP5pKHhRn&lt;br /&gt;
RrxiZ2MoIEW/nraTrQFTePEY44lpn9Zax6bV4kIQchAnI0Cqu6ypF0sfu6djrYHCVpzRYJlgDYzq&lt;br /&gt;
ZEYySvrCWiDHiPu2pINDdbCpdD2vBhkFrl2vQeIfWIP0fWvy56lB6ut/zh8xaKAsX7Gm5RdUAvvr&lt;br /&gt;
f6bnjpvnf9u2+9f53z/k8bL638RfBlY0MUX9ryE0AyqBrU9oTwS3fLaFlWxiHTu07UVENGGQn4P2&lt;br /&gt;
SotaS+74xECTD+grXschaKiEjSBnlbBOsrzq4U7ogUADDhSAUH3g8Z+tGN3SHh2rJY5r7AiDIi43&lt;br /&gt;
oLPq6R92qO/4BEgUByMUtAWZj6e6PE5rezS1Z6LzksKTjzodTqutp9XlrIziAhjy2DgmwECMUHlw&lt;br /&gt;
G81XlBlaYhJKRejbGqeo+jAJG4mKj3H3ibSHpXVQyszRks7DNrzZJtkjbh0oaqCKydUBhkGSPNYY&lt;br /&gt;
Ds5O9dEh/JbnCDz3aNvaHLAjK+ksDDwqvWsO3MYc3NLuM/WMWDoDpCmN+JdsGJVwkp6Q+xQHHgpC&lt;br /&gt;
sruHlGuv5xwBn3up/9zi1fU6I+dqtwgL0H9dn31iOcFBJ9bojhHz9WKmHEHIltB5kK529IYED8Qc&lt;br /&gt;
R0KfyGX2LY/LEhN5QsU2+wLPkupj/VMPkdihRIwV5IaJ2FgvYuJEHNKbfjG/OKsfB2cgxW5MSEvq&lt;br /&gt;
bPF6jBbxKsXRaVAGTM2Axqm6z9HiJ/ItGnYZqH72bO+R7p0a0VKP2yNoLLtDctj0B0mlEeod9O9o&lt;br /&gt;
L+9sgV6D+3/98fOw49S8vgMU2lBl7oxY8qt81d4ZV2Gd87TTVX1b7rWyRa5rb29z645Bm3+jWNM2&lt;br /&gt;
Lp0BGvDWjSd5S1oYeIU3ZJuUVLz0LamFaO6uOo2tytle0xN9q+eNPWkx2XvBDkd7g8SKJ+kD2UNL&lt;br /&gt;
MgdxoiQQ4Fm2ZDEUGbqt3tzSj5JsZ55lG2WfEIQ34LQ+yhRzoxn7DSIHlu0aB5axrngD1Rd/9fHm&lt;br /&gt;
gqjeZmL3glgO3y/deix3/wNjubHlj/88sdxzHvr4z/ojzMjSenkLaH/8Z/uW7zT7P33b/iv++xGP&lt;br /&gt;
l8V/2Ly3fNubiPiPC82AwE8O1UR82sOoxMnxD+VZSn66Ibq6ESVn45A/4tBxfqvl9Z2iZfXgFtUN&lt;br /&gt;
sM+KcWT7G0jnITmiUndg4FNpGdS3R2gxXX0xvYcY5UAwuOkXeib+14zszcCnJEVK3mqdfUaGkBGo&lt;br /&gt;
+sxQ6p53wmQ/p5w+l10crMzNrsovEooCMeRi+/j57/JjWf2U6LfZyDbPbSPuYPwwKhfj+JMDvHl4&lt;br /&gt;
OyjycAALqG0dmr5QSN0dSlVDDRE4iYCJ/xIO3QtbvGBuBzYm9s+t30MNj6fWWe1wRTa1a3oIB90j&lt;br /&gt;
tCsPcFzl/t/16aFi3EOFKKJUzmidEgO59ORYYIa4LihpHSG+d2WSY0wZXt0Rpn2nLYpCSpSFO+LR&lt;br /&gt;
104MlfEb40DrGF5CBP/kfn4YL8wK9fGj76hFUafhUG/VX9SiKT9GHzun6Ek0tSgCPX0omqw+ky0P&lt;br /&gt;
daiw/gq+N98PbiCVbV/ZlecTZqDDMsvqs+nyPIgKK9sqXsuoMLrYImJbVjXE7VlPfT+6ol1PVp8R&lt;br /&gt;
F225HMx5tQG144jLhJ8Rq2CHYD1ekU3TAzhEmhS/03Ky+my5LX+rT8TuR+x56+ClDpeF7rcR28Db&lt;br /&gt;
9r62Q1zZPbL/t5z2E060JTnIuae3WUu1aPXiyYJaLl0VSWXE8zS7gYZJYp9nILpHs3JN5rA6HJfd&lt;br /&gt;
ENZR36/y6M4ftvqMt2iDDG5wmOWRJkV+iCZMq8/8ij7KzWkbiLJmDgKkz7iKH9HZfP7+QP63vWvr&lt;br /&gt;
bduGwn3WryD60q1rEt0dB8hD2nSDh1yMKEX3Vujm1qsiu760yYb+9/GQIkVRIqXYilF05ksckRIp&lt;br /&gt;
kTw3nvMdLdYw9zYJnnwgthYAmIfiXJ/VRiKKB72MRMdleBKbGP5IY8H6Q99j0fGMMjkJBzsuj+oa&lt;br /&gt;
OB71w5GRkZMCSVlPcbqFYCopjq3jC04pvktW3AZZknABOT1X90yX9CxEkety00yXGngF4bCDHQ+I&lt;br /&gt;
UqQhvBk/PigSt26gpmBq2Q8ft3Ucwi3xqqmx/AX7cQuINi1svLCvd2TkWITsk5HTI1IlI7d1fEpI&lt;br /&gt;
CjOn6hf9SyBm8P7QvTQ9R+gqvAhxQX0ILyQJhPqddTzRLWH1Y8ivPFlM0zzJHt6Aq7WBGhKAF+al&lt;br /&gt;
oh3P+a0MAy/f00BP5uug47YcZkQ+pGmQvKuKrN6W0OEksmUP6liz2wwTHazC1ZrEckkTIqWaXpJ2&lt;br /&gt;
HWmMgZ5EV3B0HJ/n0fk7zNMVl0JrqvefUE0O8SJF1t12nAHwh34UvL/2rbR2Zy5i4gGPycF+msfp&lt;br /&gt;
deH6Xps1cjg55+3QbF6AsXUIF1Qmn3R0MgXPrROtpxn4xovOP8J3Z1lCWLNN2BVeV30tJZ144TLx&lt;br /&gt;
IgnOSE4mEdjQQExECs4Qr+0wnmEn9AOdYMDzAi3x98vSi/RrmvERGPJSCEgjRFo9aqAkx6SBWoeq&lt;br /&gt;
4/g8O9ByHQF82uU0n96t7+gwDPRQW7gBbYeKho8ZMGbRndJiOjpeLSQCogMO7zsOmDZ8kgHrGC1P&lt;br /&gt;
F8SkQHB2wTR6kTbIwGMmKfJGjzo3MJDt6DKuKcfILWyj25uUIp/wD2kgrmyMblFZvaGJupJlS6lW&lt;br /&gt;
ODoW6TEWSfxTpBknEKvEb+WX9UEWfuv04Vz9eYurY2ieLxn4xusog2/RZDCfs7rNbK+bHtKpnY1U&lt;br /&gt;
2HFuKRJPs9mKeQ+9yNNvY3zBQPzSr1qkfzhemlJIyPpJMnjdkGROBsvVRBAeyzPO/LPsmMOPtQrf&lt;br /&gt;
oDoMJL6KVRXZZ0h06Knoa1ocS+r4hJUv0fVJFFzAm0iwpnEvowZo7kaNAu5vkPMK9yVZkBDGXhII&lt;br /&gt;
QxebqppevoNYfGo1aMdAZdhOMYMMi1UMziqBRVkOHQZpL7zTFYm+rr0o5D3h/l5qdFS1SOMeyhtP&lt;br /&gt;
egusdpRvUT/OYgivBM2qGInu9QykfkHt61UOmfj/EB9anNAIbejRhnCBnRYIlzh90UWtqr4Zk1Nh&lt;br /&gt;
U+lQcIXPQr9TZReqvpOM5apcmzrYyqE0rUFKfcxLUMxajJ482Nbx5Tzi0EDapauZWU0qFSUiZ3lG&lt;br /&gt;
R21z6m1XSf+Wrxgca8Ug2Dxc/vIkUrDRe1OVxKoWFy9+GpKjAj/jejFezL5OcwEjF4B3O+YM4AkG&lt;br /&gt;
gJfR5jI8r4jdKz9bif9rIAk4eCQmAqmDDLdAEmOSVeZuUDMIBTJyDUSZROeLqVM02VyUi4dJaTS9&lt;br /&gt;
IZmccbgoyF4COYIBMrXGgisUrkgT3L6HMX0SmFenGdXNp4EePaO6+TQeP6O6+cTyx2NntNt8qjUD&lt;br /&gt;
VzgZvgrOBXpQJDo06jNZHJHgri/Py59/8Z9XAf8ZXJeN30A3WMWn/2siqZUjHVTI1k0KwVwlfK4s&lt;br /&gt;
5EJkDAVAXtCW4NCPL8pET4pwZ7QNb70iC6Q6dlo5UmblqNgzWZbBGBC3iNVS5iBS8yuO09IYIq3q&lt;br /&gt;
neMeEZn5uhIdFLwz0BjPoUiwG3kLCNTViRctNpqIaOWoLHFU55DygyyzZQgdYZ4jdFVaUjRBz8qO&lt;br /&gt;
mG7+hT7iAtzxMxrYAYYPFXTzMmR9sswDdVsE4Vqiym8gXrO553wUTaQo6GSHnvPesWvtPed//iL6&lt;br /&gt;
/+MFCdshwgo9eHLfJdFRL33Awhl4yvhvKIX/v4WXCb5uDSzPf4a8XnpvKf9z/39p/l+H8WfMbE7/&lt;br /&gt;
NWH6e0H/LuI/XFc5/77js/gPz3NNmH/fc/bxH7so28V/xAnmsQPTIvEfteVTCwIpqgt+V14g9j64&lt;br /&gt;
Qc0pq7cKrNL0BkmSRPGB6w5TzCqd+GCYTJyDIcCIOL6FRYB0M1Zpm46Dl6LnWDKrFGoOPXvoDcz+&lt;br /&gt;
WGWl16effyX9P7C+TxaQ2i1PtiUDLfgflm3L+B+W5e7x/3dSttv/Voy3GN54bP83Lp8aGWCtGB2Q&lt;br /&gt;
qn8v7ivJBLsB04nKc7P4LIbsi4R+YD3uJYoeUJIfpgAvecoh907N39blb9h/8zRd4C2fwO/0nijy&lt;br /&gt;
mYHgP3DQLkId4GH4iZgyfK50ZUFXvJfnz2k73Kw6IrtoRr7Hc/xoOBwh8r50RzD9J72Y3k1XJ8jD&lt;br /&gt;
ZENNA6XvJukLA9OU9IVhi77Qg5rgHA87giXttYMfskjxv3h61lmKd1NPoh8pLfQfz71fpf+WP3D3&lt;br /&gt;
8t9Oynb0f2LHtj+JLRb/y5dPjahfkhpwgSXRv0JDVjcOV59O0NF6uTjKptERdFdWXsxCKiVGWA78&lt;br /&gt;
oBcVha4kEjkZmmGFRDrmLsEIXNP/4UwqjfH/fW7+Z+3737dcef/bWF3c7/8dlC3j/6PE8YduyPY/&lt;br /&gt;
XT7twf9Fu80Mo4OJbBiNdpmizvkBd/HmRW//64cQtOl/Prf/mb7veYD/gVXA/f7fRdlu/3uuF0Z+&lt;br /&gt;
6NT1P6vRANSi+V0mUaPSVzwMX4s4Xv4Jen0WvP1wPro5+houiB61nkym9+z6VV09BOT+5WnFjwAr&lt;br /&gt;
Yss0mxCUM6Lwhfksf7ibrZckVJcqavhSWtcA6dNqqPa1J6pUw5fVSngEllxO0O3Nu7dw4WY2W51f&lt;br /&gt;
CZREeC+oG78/QaOr0e3o7OLD+CwI3l/fnNNv9OZTGn+eQy5prFFaNnJMen2UJ+k9SwBLHdXSL5Wq&lt;br /&gt;
OH8FiFLSVa48vypR7KUmFGz6VQlhz+ovw3vQb08QpnPOwLWObVcnuvEFUKX5rhVZZlVys3ZI84/t&lt;br /&gt;
wc8KI6Wk/+Z3erUHFtBG//HKYOc/pjswgf57lren/7so29F/14nj2HLdOv1ny6eVBVQIfXnXTk17&lt;br /&gt;
NVJbbmAdsd3YUheGUo7l8Oktda41sPeWun2RikD/e9b6y9Jq/3NsLv/jdYr1f9fxB3v6v4uyJf1P&lt;br /&gt;
3MSyJ0Om/yto/h/ZLMJUGDR/gb4vPi4hcYQgyC/W+dEyC+fJYYgriVQ8+0iCz064ED6eJsq75lMi&lt;br /&gt;
St/OZtntJxCscfeWhkwX45LIs39spVXyfLyDgxTf7pj5fk+e92Vf9qWf8h+KyuNkAMgAAA==&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Patch configuration files&lt;br /&gt;
&lt;br /&gt;
sed -e&amp;quot;s%BASE_DIR%${BASE_DIR}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%BASE_DN%${BASE_DN}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%INITIAL_PASSWORD%${INITIAL_PASSWORD}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fix CRC32 checksums on configuration files&lt;br /&gt;
&lt;br /&gt;
for FILE in $(find -name \*.ldif); do&lt;br /&gt;
    CRC32=$(tail -n +3 ${FILE} |crc32 /dev/stdin)&lt;br /&gt;
    sed -e&amp;quot;s/^# CRC32 [0-9a-f]*$/# CRC32 ${CRC32}/&amp;quot; -i ${FILE}&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add Root DSE&lt;br /&gt;
&lt;br /&gt;
DC=$(echo ${BASE_DN} |cut -d &amp;quot;,&amp;quot; -f1 |cut -d &amp;quot;=&amp;quot; -f2)&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |/usr/sbin/slapadd -F &amp;quot;${BASE_DIR}/etc&amp;quot; -b ${BASE_DN}&lt;br /&gt;
dn: ${BASE_DN}&lt;br /&gt;
dc: ${DC}&lt;br /&gt;
objectClass: domain&lt;br /&gt;
objectClass: top&lt;br /&gt;
structuralObjectClass: domain&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Print instructions&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
Instructions&lt;br /&gt;
============&lt;br /&gt;
&lt;br /&gt;
Launch slapd (debug level 0 - foreground mode)&lt;br /&gt;
$ /usr/sbin/slapd -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -F &amp;quot;${BASE_DIR}/etc&amp;quot; -d 0&lt;br /&gt;
&lt;br /&gt;
LDAPvi on cn=config&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,cn=config&amp;quot; -b &amp;quot;cn=config&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LDAPvi on ${BASE_DN}&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,${BASE_DN}&amp;quot; -b &amp;quot;${BASE_DN}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not forget to update the intitial passwords for both identities:&lt;br /&gt;
&lt;br /&gt;
    cn=admin,cn=config&lt;br /&gt;
    cn=admin,${BASE_DN}&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basis-Struktur ergänzen ==&lt;br /&gt;
&lt;br /&gt;
=== Organizational Units ===&lt;br /&gt;
Für viele Anwendungsfälle – wie eine Synchronisation mit [[Keycloak installieren|Keycloak]] – wird empfohlen noch zwei &amp;lt;code&amp;gt;Organizational Units&amp;lt;/code&amp;gt; zu ergänzen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Editor starten mit:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;ldapvi -h &amp;quot;ldap://127.0.0.1:12345/&amp;quot; -D &amp;quot;cn=admin,dc=example,dc=com&amp;quot; -b &amp;quot;dc=example,dc=com&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oben die folgenden Zeilen ergänzen:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
add ou=users,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: users&lt;br /&gt;
&lt;br /&gt;
add ou=groups,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: groups&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun den Editor schließen und noch mit &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; bestätigen.&lt;br /&gt;
&lt;br /&gt;
=== memberof Overlay ===&lt;br /&gt;
&lt;br /&gt;
Um Gruppenmitgliedschaften auch beim User anzuzeigen (mit ldapsearch ... memberof), müssen die Overlays memberof und refint installiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export LDAP_PORT=12345&lt;br /&gt;
mkdir -p ~/ldif&lt;br /&gt;
&lt;br /&gt;
cat &amp;gt; ~/ldif/add-memberof-modules.ldif &amp;lt;&amp;lt; FINISH&lt;br /&gt;
dn: cn=module{0},cn=config&lt;br /&gt;
changetype: modify&lt;br /&gt;
add: olcModuleLoad&lt;br /&gt;
olcModuleLoad: memberof.la&lt;br /&gt;
olcModuleLoad: refint.la&lt;br /&gt;
FINISH&lt;br /&gt;
&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$LDAP_PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -f ~/ldif/add-memberof-modules.ldif -W&lt;br /&gt;
&lt;br /&gt;
cat &amp;gt; ~/ldif/add-memberof-overlay.ldif &amp;lt;&amp;lt; FINISH&lt;br /&gt;
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config&lt;br /&gt;
objectClass: olcMemberOfConfig&lt;br /&gt;
objectClass: olcOverlayConfig&lt;br /&gt;
objectClass: olcConfig&lt;br /&gt;
objectClass: top&lt;br /&gt;
olcOverlay: memberof&lt;br /&gt;
olcMemberOfDangling: error&lt;br /&gt;
olcMemberOfRefInt: TRUE&lt;br /&gt;
olcMemberOfGroupOC: groupOfUniqueNames&lt;br /&gt;
olcMemberOfMemberAD: uniqueMember&lt;br /&gt;
olcMemberOfMemberOfAD: memberOf&lt;br /&gt;
FINISH&lt;br /&gt;
&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$LDAP_PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -f ~/ldif/add-memberof-overlay.ldif -W&lt;br /&gt;
&lt;br /&gt;
cat &amp;gt; ~/ldif/add-refint-overlay.ldif &amp;lt;&amp;lt; FINISH&lt;br /&gt;
dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config&lt;br /&gt;
objectClass: olcConfig&lt;br /&gt;
objectClass: olcOverlayConfig&lt;br /&gt;
objectClass: olcRefintConfig&lt;br /&gt;
objectClass: top&lt;br /&gt;
olcOverlay: refint&lt;br /&gt;
olcRefintAttribute: memberof&lt;br /&gt;
olcRefintAttribute: member&lt;br /&gt;
olcRefintAttribute: uniqueMember&lt;br /&gt;
olcRefintAttribute: manager&lt;br /&gt;
olcRefintAttribute: owner&lt;br /&gt;
FINISH&lt;br /&gt;
&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$LDAP_PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -f ~/ldif/add-refint-overlay.ldif -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autostart ==&lt;br /&gt;
&lt;br /&gt;
Um den neuen LDAP-Dienst dauerhaft laufen zu lassen, sollte [[Systemd]] genutzt werden. Hier ein Beispiel dafür:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In das Verzeichnis die Datei &amp;lt;code&amp;gt;slapd.service&amp;lt;/code&amp;gt; legen und mit beispielsweise den folgenden Inhalten befüllen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Slapd2 Server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=forking&lt;br /&gt;
Restart=always&lt;br /&gt;
WorkingDirectory=%h/ldap/&lt;br /&gt;
&lt;br /&gt;
# eg -d 255 for higher loglevel; but even with -d 0, it won&#039;t fork anymore&lt;br /&gt;
ExecStart=/usr/sbin/slapd -h ldap://127.0.0.1:12345/ -F %h/slapd2/etc&lt;br /&gt;
PIDFile=%h/slapd2/run/slapd.pid&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;
Im Anschluss:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemctl enable --user slapd&lt;br /&gt;
systemctl start --user slapd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; unter Umständen muss ein Administator diese Funktionalität erst für Sie freischalten. Ihr User benötigt womöglich außerdem die folgende Umgebungsvariable um die Befehle ausführen zu können:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pflege der LDAP Daten über die Kommandozeile ==&lt;br /&gt;
=== Benutzer anlegen ===&lt;br /&gt;
&lt;br /&gt;
Datei adduser.ldif (entsprechende Werte ersetzen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
objectClass: inetOrgPerson&lt;br /&gt;
cn: Max&lt;br /&gt;
sn: Mustermann&lt;br /&gt;
uid: mmustermann&lt;br /&gt;
userPassword: TopSecret1234&lt;br /&gt;
mail: mmustermann@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f adduser.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passwort von Benutzer ändern ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldappasswd -H ldap://127.0.0.1:$PORT -x -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -S &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nach Benutzern suchen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT # geht sogar ohne Benutzer&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was kann der normale Benutzer sehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nach Personen mit bestimmter Klasse suchen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;objectClass=inetOrgPerson&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigenschaften aktualisieren ===&lt;br /&gt;
&lt;br /&gt;
Datei modify_email.ldif:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
replace: mail&lt;br /&gt;
mail: mmustermann2@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f modify_email.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neue Gruppe anlegen ===&lt;br /&gt;
&lt;br /&gt;
Siehe oben, das Overlay memberof sollte installiert sein.&lt;br /&gt;
&lt;br /&gt;
Datei addgroup.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
cn: admins&lt;br /&gt;
objectclass: groupOfUniqueNames&lt;br /&gt;
uniqueMember: uid=mmustermann,ou=users,dc=example,dc=org &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f addgroup.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer zu einer Gruppe hinzufügen ===&lt;br /&gt;
&lt;br /&gt;
Datei addmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
add: uniqueMember&lt;br /&gt;
uniqueMember: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f addmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Liste alle Benutzer einer Gruppe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export FILTER=&amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberof=CN=admins,OU=groups,DC=example,DC=org))&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W $FILTER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer aus einer Gruppe entfernen ===&lt;br /&gt;
&lt;br /&gt;
Datei dropmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
delete: uniqueMember&lt;br /&gt;
uniqueMember: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f dropmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer löschen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapdelete -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gruppe löschen ===&lt;br /&gt;
&lt;br /&gt;
Datei delete_group.ldif:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=Test,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: delete&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f delete_group.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.vincentliefooghe.net/content/openldap-setup-multiple-instances-server Ein Setup für mehrere OpenLDAP Instanzen auf einem Server]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
</feed>