<?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-07-27T21:50:43Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7604</id>
		<title>Keycloak installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Keycloak_installieren&amp;diff=7604"/>
		<updated>2026-07-14T09:47:09Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Admin User einrichten */&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 (Realm Role: admin und default-roles-master) 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=Verzeichnis-Struktur&amp;diff=7601</id>
		<title>Verzeichnis-Struktur</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Verzeichnis-Struktur&amp;diff=7601"/>
		<updated>2026-07-08T15:48:51Z</updated>

		<summary type="html">&lt;p&gt;Tim00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Textkasten|rot|Hinweis:|Inhalt ist nun in der HS Dokumentation.&lt;br /&gt;
https://www.hostsharing.net/doc/managed-operations-platform/webpaket/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Verzeichnis-Struktur&amp;diff=7600</id>
		<title>Verzeichnis-Struktur</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Verzeichnis-Struktur&amp;diff=7600"/>
		<updated>2026-07-08T15:48:02Z</updated>

		<summary type="html">&lt;p&gt;Tim00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Textkasten|rot|Hinweis:|Inhalt ist nun in der HS Dokumentation.&lt;br /&gt;
https://www.hostsharing.net/doc/managed-operations-platform/tutorials/webspace/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7599</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7599"/>
		<updated>2026-07-02T04:29:53Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2026.1.3 auf 2026.1.4 */&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.4 auf 2026.1.5 ====&lt;br /&gt;
&lt;br /&gt;
# Im Web-Backend unter Administration-&amp;gt;Backups-&amp;gt; Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)&lt;br /&gt;
# Backup&lt;br /&gt;
# Die lokalen Änderungen sichern:&lt;br /&gt;
# cd discourse&lt;br /&gt;
# mv ~/plugins.bak/discourse-ai plugins&lt;br /&gt;
# git diff v2026.1.4 &amp;gt; diff-2026.1.4.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.5 v2026.1.5&lt;br /&gt;
# evtl. Änderungen aus diff-2026.1.4.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2026.1.4.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.5/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;
#&lt;br /&gt;
# to avoid this error: ERR_PNPM_INVALID_DEPENDENCY_NAME  The current package contains a dependency with an invalid name: &amp;quot;@types/@glimmer__component&amp;quot;&lt;br /&gt;
# vi frontend/discourse-types/package.json&lt;br /&gt;
&lt;br /&gt;
 -    &amp;quot;@types/@glimmer__component&amp;quot;: &amp;quot;npm:@glimmer/component@^2.0.0&amp;quot;,&lt;br /&gt;
 -    &amp;quot;@types/@glint__ember-tsc&amp;quot;: &amp;quot;npm:@glint/ember-tsc@^1.0.7&amp;quot;,&lt;br /&gt;
 -    &amp;quot;@types/@glint__template&amp;quot;: &amp;quot;npm:@glint/template@^1.7.2&amp;quot;&lt;br /&gt;
 +    &amp;quot;@types/glimmer__component&amp;quot;: &amp;quot;npm:@glimmer/component@^2.0.0&amp;quot;,&lt;br /&gt;
 +    &amp;quot;@types/glint__ember-tsc&amp;quot;: &amp;quot;npm:@glint/ember-tsc@^1.0.7&amp;quot;,&lt;br /&gt;
 +    &amp;quot;@types/glint__template&amp;quot;: &amp;quot;npm:@glint/template@^1.7.2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#&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=Skript_hs-list-apps&amp;diff=7598</id>
		<title>Skript hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7598"/>
		<updated>2026-07-01T20:10:57Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
hs-list-apps ist ein Skript, in Python geschrieben, welches viele der aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.&lt;br /&gt;
&lt;br /&gt;
Es hilft, gerade bei Paketen mit vielen Anwendungen, den Überblick zu behalten. Als Reseller will ich zum Beispiel wissen, wieviele Nextclouds in meinem Paket installiert sind, wieviel Platz sie belegen, und auf welchem Versionsstand sie sind.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs_list_apps&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installiert worden sind. Weitere Anwendungen können gerne ins Skript aufgenommen werden. Bitte einen PR oder Issue auf dem Repo bei Codeberg aufmachen.&lt;br /&gt;
&lt;br /&gt;
Es werden einige Annahmen getroffen, wo eine Anwendung zu finden ist. Damit vermeiden wir einen vollständigen Scan der Dateien, der sehr zeitintensiv wäre. z.B. wird erwartet, dass die Nextclouds alle im Benutzerverzeichnis im Ordner nextcloud liegen.&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, die richtige Domain zu bestimmen. Wenn im Benutzer aber mehrere Domains eingetragen sind, wird die mit dem längsten Namen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Das Skript steht auf den Hives zur Verfügung, es liegt in /usr/local/bin, und ist damit Teil des Standardpfades.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann entweder innerhalb eines Benutzers aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-nextcloud@h01:~$ hs-list-apps --detail&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| AppName   | Version | PAC   | USER      | URL                               | RAM    | SSD  | HDD  |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| Nextcloud | 32.0.6  | xyz00 | nextcloud | https://test.nextcloud.example.de | 164.7M | 1.4G | 131M |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter --detail wird der SSD Platz und der HDD Platz nicht berechnet. Das kann sonst etwas Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch vom Paket Admin aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps &lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Wordpress | 6.8.3         | xyz00 | mywordpresstest | https://www.example.de            | 21.2M |     |     |&lt;br /&gt;
| OpenLDAP  | 2.5.13+dfsg-5 | xyz00 | openldap        | https://openldap.example.de       | 28.5M |     |     |&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch nur nach bestimmten Anwendungen suchen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps --app nextcloud&lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7596</id>
		<title>Spamfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7596"/>
		<updated>2026-06-24T08:20:38Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Konfiguration pro Domain */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einrichtung, Konfiguration und Optimierung eines Spamfilters auf den Hostsharing Servern. Der Artikel beschreibt drei alternative Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
1. Die Nutzung der &amp;quot;xmailin&amp;quot;-Server für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
2. Die Einrichtung von Spamassassin für das persönliche Postfach&lt;br /&gt;
&lt;br /&gt;
3. Nutzung der Spam-Appliance &amp;quot;SecureMX&amp;quot; für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
= Alternative 1: Maileingangsserver mit Spamfilter nutzen =&lt;br /&gt;
&lt;br /&gt;
Diese Alternative kann von einer Domain-Administration oder vom &amp;quot;Webmaster on Demand&amp;quot; für eine oder mehrere E-Mail-Domains eingerichtet werden. Ein globaler Sieve-Filter für markiete Spam-Nachrichten ist in der Standard-Konfiguration voreingestellt, &lt;br /&gt;
so dass Nachrichten mit Spam-Bewertung in einen vorhandenen Spam-Ordner einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren betreibt Hostsharing zusätzlich zu den vorkonfigurierte Maileingangsservern einen zweiten Satz von Maileingangsservern, bei denen Spamassassin bereits beim Annehmen einer E-Mail ausgeführt wird. Anfang 2026 ist eine Gruppe von Eingangsserver mit der Software &amp;quot;rspamd&amp;quot; hinzugekommen. Eingehende Nachrichten mit Malware oder sehr hoher Bewertung als Spam werden bereits im SMTP-Dialog abgewiesen. Nachrichten mit einem geringeren Spam-Score werden angenommen und zugestellt. Spamassassin fügt die Bewertung für diese Nachrichten in die Header der Nachricht ein, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
X-Spam-Status: Yes, score=11.29&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der globale Sieve-Filter schiebt Nachrichten mit der Markierung &amp;quot;X-Spam-Status: Yes&amp;quot; in einen Ordner &amp;quot;Junk&amp;quot;, wenn der Ordner vorhanden ist. Viele Mailprogramme legen beim ersten Verbinden mit dem IMAP-Server einen solchen Ordner an. Unser &amp;quot;Roundcube&amp;quot;&lt;br /&gt;
unter https://webmail.hostsharing.net ist entsprechend eingerichtet, so dass der Ordner nach einer Nutzung von Webmail vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== Eingangsserver konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Die Maileingangsserver mit Rspamd lassen sich pro Domain konfigurieren, indem die MX-Records im DNS-Zonefile gegenüber dem Default-Zonefile angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Im Zonefile entfällt der Platzhalter &amp;quot;{MX_RR}&amp;quot;. Stattdessen werden die folgenden MX-Records eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin1.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin2.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin3.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Änderung der DNS-Zone siehe: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
Wer sich die Aktion auf der Shell nicht zutraut, möge bitte den &amp;quot;Webmaster on Demand&amp;quot; beauftragen.&lt;br /&gt;
&lt;br /&gt;
Die Änderung des Zonefile kann für eine Domain &amp;quot;hs-example.de&amp;quot; wie folgt überprüft werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
dig +short -t MX hs-example.de @dns1.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Ausgabe wird erwartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
30 xmailin2.hostsharing.net.&lt;br /&gt;
30 xmailin3.hostsharing.net.&lt;br /&gt;
30 xmailin1.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der drei Eingangsserver kann variieren. &lt;br /&gt;
Die führende Zahl ist die Priorität im MX-Record (hier der Wert &amp;quot;30&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Den Filter trainieren ==&lt;br /&gt;
Wer auch am Trainieren des Filters mitwirken möchte, sendet den/die Benutzername/n xyz00-name (das ist der eMail Benutzername) an:&lt;br /&gt;
service (at) hostsharing (dot) net&lt;br /&gt;
&lt;br /&gt;
Das bedeutet dann, dass das Verschieben einer E-Mail in den Spam-Ordner (Junk) darauf Einfluß hat, das zukünftige E-Mails in dieser Art besser als Spam erkannt werden. Andersrum genauso: wenn ich eine E-Mail aus dem Spam-Ordner (Junk) in einen anderen Ordner verschiebe, werden in Zukunft ähnliche E-Mails auch nicht mehr als Spam erkannt.&lt;br /&gt;
&lt;br /&gt;
Da das Training gemeinschaftlich ist, sollte bitte darauf geachtet werden, Newsletter nicht in den Junk Ordner zu schieben, sondern sich davon abzumelden und die E-Mail zu löschen. Nur weil du den Newsletter der Firma xy nicht mehr magst, soll er für andere Benutzer nicht automatisch als Spam erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Konfigurationen pro Domain ==&lt;br /&gt;
&lt;br /&gt;
Die E-Mails werden vom Spamfilter auf verschiedene Kriterien geprüft, für die dann Punkte vergeben werden. Manche Eigenschaften sind positiv, andere sind negativ. Am Ende ergibt das eine Punktzahl.&lt;br /&gt;
&lt;br /&gt;
Voreingestellt ist: &lt;br /&gt;
* ab einer Gesamt-Punktzahl von 5 wird die E-Mail als Spam kategorisiert, und wandert in den Spam-Ordner (Junk).&lt;br /&gt;
* ab einer Gesamt-Punktzahl von 15 wird die E-Mail direkt abgewiesen, und der Absender erhält von seinem E-Mail-Server eine Unzustellbarkeitsbenachrichtigung.&lt;br /&gt;
&lt;br /&gt;
Wir können diese Punktzahlen pro Domain konfigurieren. Das geht leider noch nicht im HSAdmin, daher bitte eine E-Mail an den Hostsharing Service schicken.&lt;br /&gt;
&lt;br /&gt;
Ebenso können einzelne Kriterien pro Domain abgeschaltet werden. Wenn z.B. in Ihren Geschäftsemails oft hohe Euro Beträge vorkommen, wollen Sie vielleicht das Symbol LOTS_OF_MONEY für die Domain meinefirma.de ignorieren. Dann bitte ebenfalls eine E-Mail an den Hostsharing Service schreiben, und wir stellen das für die Domain ein.&lt;br /&gt;
&lt;br /&gt;
= Alternative 2: Persönlichen Spamfilter einrichten =&lt;br /&gt;
&lt;br /&gt;
Hier geht es darum, wie Personen mit (grundlegenden) Kenntnissen in der Shell-Bedienung für ihr persönliches Postfach einen Spam-Filter einrichten können. Spamassassin kann für jedes Postfach individuell konfiguriert werden. Für die Einrichtung und Pflege ist Shell-Zugang zur Mailbox erforderlich.  &lt;br /&gt;
&lt;br /&gt;
Ein Bayesfilter kann mit den persönlichen Nachrichten angelernt werden. Dazu sind tiefergehende Shell-Kenntnisse erforderlich (Shell-Skript und Einrichtung eines systemd-Timers).&lt;br /&gt;
&lt;br /&gt;
== Spamassassin Konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Der Spamfilter &amp;quot;Spamassassin&amp;quot; ist bei HS vorinstalliert. Es muss über das Kommando &amp;quot;spamc&amp;quot;, das Kommando zur Nutzung des Spamassassin-Daemon, in der Datei &amp;quot;.forward&amp;quot; eines Mail-Users aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/spamc -U /var/run/spamd -e /usr/lib/dovecot/deliver&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Spammassassin schreibt seine Testergebnisse in die Headerzeilen jeder E-Mail und leitet die E-Mails weiter an das Programm &amp;quot;deliver&amp;quot; aus dem Dovecot-Paket. Das Sortieren von Spam-EMail in einen Spam-Ordner lässt sich mit Sieve-Filtern umsetzen.&lt;br /&gt;
&lt;br /&gt;
In dieser Variante kann man Spamassassin individuell konfigurieren. Dazu legt man im $HOME des Mailbox-Account ein Verzeichnis &amp;quot;$HOME/.spamassassin&amp;quot; an. Die Konfiguration erfolgt in der Datei &amp;quot;$HOME/.spamassassin/user_prefs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Konfigurationsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
required_score          4.0&lt;br /&gt;
report_safe             0&lt;br /&gt;
use_bayes               1&lt;br /&gt;
bayes_auto_learn        1&lt;br /&gt;
skip_rbl_checks         0&lt;br /&gt;
use_razor2              1&lt;br /&gt;
use_pyzor               1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bayesfilter anlernen ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Bayesfilter eingeschaltet ist, macht es Sinn den Filter mit den Befehlen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
sa-learn --spam &amp;lt;platzhalter-spam-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
sa-learn --ham &amp;lt;platzhalter-erwünschte-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
anzulernen. Ein Bash-Skript für das Erlernen von Spam/Nonspam kann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
HAM_MIN_AGE_DAYS=5&lt;br /&gt;
MAILDIR_HAM=${HOME}/Maildir/cur&lt;br /&gt;
TMPDIR=${HOME}/sa-learn-tmp&lt;br /&gt;
SPAMFOLDER=Junk&lt;br /&gt;
SPAMFOLDER_LEARNED=${SPAMFOLDER}.sa-learned&lt;br /&gt;
MAILDIR_SPAM=${HOME}/Maildir/.${SPAMFOLDER}&lt;br /&gt;
&lt;br /&gt;
# Learn spam from MAILDIR_SPAM&lt;br /&gt;
mkdir -p ${TMPDIR}/spam&lt;br /&gt;
rm -f ${TMPDIR}/spam/*&lt;br /&gt;
SPAM_COUNT=0&lt;br /&gt;
for DIR in &amp;quot;cur&amp;quot; &amp;quot;new&amp;quot;; do&lt;br /&gt;
	DIR=&amp;quot;${MAILDIR_SPAM}/${DIR}&amp;quot;&lt;br /&gt;
	cd ${DIR}&lt;br /&gt;
	# echo &amp;quot;---&amp;quot; DIR ${DIR}&lt;br /&gt;
	for SPAMFILE in $( ls ); do&lt;br /&gt;
		# echo &amp;quot;   &amp;quot; ${SPAMFILE}&lt;br /&gt;
		TMPFILE=&amp;quot;${TMPDIR}/spam/${SPAMFILE}&amp;quot;&lt;br /&gt;
		if ! zcat &amp;quot;${SPAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
			cp &amp;quot;${SPAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
		SPAM_COUNT=$((SPAM_COUNT + 1))&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
sa-learn --spam ${TMPDIR}/spam/*&lt;br /&gt;
&lt;br /&gt;
# Move processed spam to keep it in another folder&lt;br /&gt;
doveadm move -u $(whoami) INBOX.${SPAMFOLDER_LEARNED} mailbox INBOX.${SPAMFOLDER} all 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Learn ham from MAILDIR_HAM (&amp;gt; HAM_MIN_AGE_DAYS days; max. 2x spam count)&lt;br /&gt;
mkdir -p ${TMPDIR}/ham&lt;br /&gt;
rm -f ${TMPDIR}/ham/*&lt;br /&gt;
cd ${MAILDIR_HAM}&lt;br /&gt;
MAX_HAM=$((SPAM_COUNT * 2))&lt;br /&gt;
HAM_COUNT=0&lt;br /&gt;
for HAMFILE in $( find . -type f -mtime +${HAM_MIN_AGE_DAYS} -printf &#039;%T@ %p\n&#039; | sort -rn | cut -d&#039; &#039; -f2- | head -n ${MAX_HAM} ); do&lt;br /&gt;
	TMPFILE=&amp;quot;${TMPDIR}/ham/${HAMFILE}&amp;quot;&lt;br /&gt;
	if ! zcat &amp;quot;${HAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
		cp &amp;quot;${HAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	HAM_COUNT=$((HAM_COUNT + 1))&lt;br /&gt;
done&lt;br /&gt;
sa-learn --ham ${TMPDIR}/ham/*&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Training erfolgte mit ${SPAM_COUNT} Spam, ${HAM_COUNT} (max ${MAX_HAM}) Ham Mails.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden Mails verarbeitet, unabhängig davon, ob sie durch Procmail (unkomprimiert) oder über den Mailclient (komprimiert) verschoben vorliegen.&lt;br /&gt;
Für Ham wird ein Teil des Inhalts der Inbox verwendet, wobei die empfohlene Maximalanzahl von zweimal der Spammailanzahl und ein minimales Alter in Tagen gilt. Das Mindestalter garantiert ein inzwischen erfolgtes manuelles Aussortieren des Spams. Der verarbeitete Spam wird anschließend in ein separates Verzeichnis verschoben um den späteren Zugriff auf False Positives zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird über einen systemd-Timer täglich ausgeführt, der pro Mailbox eingerichtet werden muss.&lt;br /&gt;
&lt;br /&gt;
= Alternative 3: SecureMX zubuchen =&lt;br /&gt;
&lt;br /&gt;
Über unseren Domain-Anbieter &amp;quot;Partnergate&amp;quot; bietet Hostsharing als dritte Alternative die kommerzielle Spam-Appliance von Cisco an. Das Produkt heißt bei Partnergate &amp;quot;SecureMX&amp;quot;: https://www.hostsharing.net/loesungen/email/spam-abwehr/&lt;br /&gt;
&lt;br /&gt;
Die Nutzung von SecureMX ist kostenpflichtig und wird auf Wunsch vom Hostsharing-Service eingerichtet. &lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass bei der Nutzung von SecureMX alle eingehenden E-Mail Nachrichten über Server geleitet werden, die nicht unter der Kontrolle von Hostsharing stehen und proprietäre Software einsetzen. Dieser Sachverhalt muss vom Mitglied ggf. datenschutzrechtlich bewertet werden.&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:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7595</id>
		<title>Spamfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7595"/>
		<updated>2026-06-24T08:14:00Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Den Filter trainieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einrichtung, Konfiguration und Optimierung eines Spamfilters auf den Hostsharing Servern. Der Artikel beschreibt drei alternative Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
1. Die Nutzung der &amp;quot;xmailin&amp;quot;-Server für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
2. Die Einrichtung von Spamassassin für das persönliche Postfach&lt;br /&gt;
&lt;br /&gt;
3. Nutzung der Spam-Appliance &amp;quot;SecureMX&amp;quot; für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
= Alternative 1: Maileingangsserver mit Spamfilter nutzen =&lt;br /&gt;
&lt;br /&gt;
Diese Alternative kann von einer Domain-Administration oder vom &amp;quot;Webmaster on Demand&amp;quot; für eine oder mehrere E-Mail-Domains eingerichtet werden. Ein globaler Sieve-Filter für markiete Spam-Nachrichten ist in der Standard-Konfiguration voreingestellt, &lt;br /&gt;
so dass Nachrichten mit Spam-Bewertung in einen vorhandenen Spam-Ordner einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren betreibt Hostsharing zusätzlich zu den vorkonfigurierte Maileingangsservern einen zweiten Satz von Maileingangsservern, bei denen Spamassassin bereits beim Annehmen einer E-Mail ausgeführt wird. Anfang 2026 ist eine Gruppe von Eingangsserver mit der Software &amp;quot;rspamd&amp;quot; hinzugekommen. Eingehende Nachrichten mit Malware oder sehr hoher Bewertung als Spam werden bereits im SMTP-Dialog abgewiesen. Nachrichten mit einem geringeren Spam-Score werden angenommen und zugestellt. Spamassassin fügt die Bewertung für diese Nachrichten in die Header der Nachricht ein, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
X-Spam-Status: Yes, score=11.29&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der globale Sieve-Filter schiebt Nachrichten mit der Markierung &amp;quot;X-Spam-Status: Yes&amp;quot; in einen Ordner &amp;quot;Junk&amp;quot;, wenn der Ordner vorhanden ist. Viele Mailprogramme legen beim ersten Verbinden mit dem IMAP-Server einen solchen Ordner an. Unser &amp;quot;Roundcube&amp;quot;&lt;br /&gt;
unter https://webmail.hostsharing.net ist entsprechend eingerichtet, so dass der Ordner nach einer Nutzung von Webmail vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== Eingangsserver konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Die Maileingangsserver mit Rspamd lassen sich pro Domain konfigurieren, indem die MX-Records im DNS-Zonefile gegenüber dem Default-Zonefile angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Im Zonefile entfällt der Platzhalter &amp;quot;{MX_RR}&amp;quot;. Stattdessen werden die folgenden MX-Records eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin1.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin2.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin3.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Änderung der DNS-Zone siehe: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
Wer sich die Aktion auf der Shell nicht zutraut, möge bitte den &amp;quot;Webmaster on Demand&amp;quot; beauftragen.&lt;br /&gt;
&lt;br /&gt;
Die Änderung des Zonefile kann für eine Domain &amp;quot;hs-example.de&amp;quot; wie folgt überprüft werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
dig +short -t MX hs-example.de @dns1.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Ausgabe wird erwartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
30 xmailin2.hostsharing.net.&lt;br /&gt;
30 xmailin3.hostsharing.net.&lt;br /&gt;
30 xmailin1.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der drei Eingangsserver kann variieren. &lt;br /&gt;
Die führende Zahl ist die Priorität im MX-Record (hier der Wert &amp;quot;30&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Den Filter trainieren ==&lt;br /&gt;
Wer auch am Trainieren des Filters mitwirken möchte, sendet den/die Benutzername/n xyz00-name (das ist der eMail Benutzername) an:&lt;br /&gt;
service (at) hostsharing (dot) net&lt;br /&gt;
&lt;br /&gt;
Das bedeutet dann, dass das Verschieben einer E-Mail in den Spam-Ordner (Junk) darauf Einfluß hat, das zukünftige E-Mails in dieser Art besser als Spam erkannt werden. Andersrum genauso: wenn ich eine E-Mail aus dem Spam-Ordner (Junk) in einen anderen Ordner verschiebe, werden in Zukunft ähnliche E-Mails auch nicht mehr als Spam erkannt.&lt;br /&gt;
&lt;br /&gt;
Da das Training gemeinschaftlich ist, sollte bitte darauf geachtet werden, Newsletter nicht in den Junk Ordner zu schieben, sondern sich davon abzumelden und die E-Mail zu löschen. Nur weil du den Newsletter der Firma xy nicht mehr magst, soll er für andere Benutzer nicht automatisch als Spam erkannt werden.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration pro Domain ==&lt;br /&gt;
&lt;br /&gt;
= Alternative 2: Persönlichen Spamfilter einrichten =&lt;br /&gt;
&lt;br /&gt;
Hier geht es darum, wie Personen mit (grundlegenden) Kenntnissen in der Shell-Bedienung für ihr persönliches Postfach einen Spam-Filter einrichten können. Spamassassin kann für jedes Postfach individuell konfiguriert werden. Für die Einrichtung und Pflege ist Shell-Zugang zur Mailbox erforderlich.  &lt;br /&gt;
&lt;br /&gt;
Ein Bayesfilter kann mit den persönlichen Nachrichten angelernt werden. Dazu sind tiefergehende Shell-Kenntnisse erforderlich (Shell-Skript und Einrichtung eines systemd-Timers).&lt;br /&gt;
&lt;br /&gt;
== Spamassassin Konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Der Spamfilter &amp;quot;Spamassassin&amp;quot; ist bei HS vorinstalliert. Es muss über das Kommando &amp;quot;spamc&amp;quot;, das Kommando zur Nutzung des Spamassassin-Daemon, in der Datei &amp;quot;.forward&amp;quot; eines Mail-Users aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/spamc -U /var/run/spamd -e /usr/lib/dovecot/deliver&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Spammassassin schreibt seine Testergebnisse in die Headerzeilen jeder E-Mail und leitet die E-Mails weiter an das Programm &amp;quot;deliver&amp;quot; aus dem Dovecot-Paket. Das Sortieren von Spam-EMail in einen Spam-Ordner lässt sich mit Sieve-Filtern umsetzen.&lt;br /&gt;
&lt;br /&gt;
In dieser Variante kann man Spamassassin individuell konfigurieren. Dazu legt man im $HOME des Mailbox-Account ein Verzeichnis &amp;quot;$HOME/.spamassassin&amp;quot; an. Die Konfiguration erfolgt in der Datei &amp;quot;$HOME/.spamassassin/user_prefs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Konfigurationsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
required_score          4.0&lt;br /&gt;
report_safe             0&lt;br /&gt;
use_bayes               1&lt;br /&gt;
bayes_auto_learn        1&lt;br /&gt;
skip_rbl_checks         0&lt;br /&gt;
use_razor2              1&lt;br /&gt;
use_pyzor               1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bayesfilter anlernen ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Bayesfilter eingeschaltet ist, macht es Sinn den Filter mit den Befehlen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
sa-learn --spam &amp;lt;platzhalter-spam-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
sa-learn --ham &amp;lt;platzhalter-erwünschte-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
anzulernen. Ein Bash-Skript für das Erlernen von Spam/Nonspam kann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
HAM_MIN_AGE_DAYS=5&lt;br /&gt;
MAILDIR_HAM=${HOME}/Maildir/cur&lt;br /&gt;
TMPDIR=${HOME}/sa-learn-tmp&lt;br /&gt;
SPAMFOLDER=Junk&lt;br /&gt;
SPAMFOLDER_LEARNED=${SPAMFOLDER}.sa-learned&lt;br /&gt;
MAILDIR_SPAM=${HOME}/Maildir/.${SPAMFOLDER}&lt;br /&gt;
&lt;br /&gt;
# Learn spam from MAILDIR_SPAM&lt;br /&gt;
mkdir -p ${TMPDIR}/spam&lt;br /&gt;
rm -f ${TMPDIR}/spam/*&lt;br /&gt;
SPAM_COUNT=0&lt;br /&gt;
for DIR in &amp;quot;cur&amp;quot; &amp;quot;new&amp;quot;; do&lt;br /&gt;
	DIR=&amp;quot;${MAILDIR_SPAM}/${DIR}&amp;quot;&lt;br /&gt;
	cd ${DIR}&lt;br /&gt;
	# echo &amp;quot;---&amp;quot; DIR ${DIR}&lt;br /&gt;
	for SPAMFILE in $( ls ); do&lt;br /&gt;
		# echo &amp;quot;   &amp;quot; ${SPAMFILE}&lt;br /&gt;
		TMPFILE=&amp;quot;${TMPDIR}/spam/${SPAMFILE}&amp;quot;&lt;br /&gt;
		if ! zcat &amp;quot;${SPAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
			cp &amp;quot;${SPAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
		SPAM_COUNT=$((SPAM_COUNT + 1))&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
sa-learn --spam ${TMPDIR}/spam/*&lt;br /&gt;
&lt;br /&gt;
# Move processed spam to keep it in another folder&lt;br /&gt;
doveadm move -u $(whoami) INBOX.${SPAMFOLDER_LEARNED} mailbox INBOX.${SPAMFOLDER} all 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Learn ham from MAILDIR_HAM (&amp;gt; HAM_MIN_AGE_DAYS days; max. 2x spam count)&lt;br /&gt;
mkdir -p ${TMPDIR}/ham&lt;br /&gt;
rm -f ${TMPDIR}/ham/*&lt;br /&gt;
cd ${MAILDIR_HAM}&lt;br /&gt;
MAX_HAM=$((SPAM_COUNT * 2))&lt;br /&gt;
HAM_COUNT=0&lt;br /&gt;
for HAMFILE in $( find . -type f -mtime +${HAM_MIN_AGE_DAYS} -printf &#039;%T@ %p\n&#039; | sort -rn | cut -d&#039; &#039; -f2- | head -n ${MAX_HAM} ); do&lt;br /&gt;
	TMPFILE=&amp;quot;${TMPDIR}/ham/${HAMFILE}&amp;quot;&lt;br /&gt;
	if ! zcat &amp;quot;${HAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
		cp &amp;quot;${HAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	HAM_COUNT=$((HAM_COUNT + 1))&lt;br /&gt;
done&lt;br /&gt;
sa-learn --ham ${TMPDIR}/ham/*&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Training erfolgte mit ${SPAM_COUNT} Spam, ${HAM_COUNT} (max ${MAX_HAM}) Ham Mails.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden Mails verarbeitet, unabhängig davon, ob sie durch Procmail (unkomprimiert) oder über den Mailclient (komprimiert) verschoben vorliegen.&lt;br /&gt;
Für Ham wird ein Teil des Inhalts der Inbox verwendet, wobei die empfohlene Maximalanzahl von zweimal der Spammailanzahl und ein minimales Alter in Tagen gilt. Das Mindestalter garantiert ein inzwischen erfolgtes manuelles Aussortieren des Spams. Der verarbeitete Spam wird anschließend in ein separates Verzeichnis verschoben um den späteren Zugriff auf False Positives zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird über einen systemd-Timer täglich ausgeführt, der pro Mailbox eingerichtet werden muss.&lt;br /&gt;
&lt;br /&gt;
= Alternative 3: SecureMX zubuchen =&lt;br /&gt;
&lt;br /&gt;
Über unseren Domain-Anbieter &amp;quot;Partnergate&amp;quot; bietet Hostsharing als dritte Alternative die kommerzielle Spam-Appliance von Cisco an. Das Produkt heißt bei Partnergate &amp;quot;SecureMX&amp;quot;: https://www.hostsharing.net/loesungen/email/spam-abwehr/&lt;br /&gt;
&lt;br /&gt;
Die Nutzung von SecureMX ist kostenpflichtig und wird auf Wunsch vom Hostsharing-Service eingerichtet. &lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass bei der Nutzung von SecureMX alle eingehenden E-Mail Nachrichten über Server geleitet werden, die nicht unter der Kontrolle von Hostsharing stehen und proprietäre Software einsetzen. Dieser Sachverhalt muss vom Mitglied ggf. datenschutzrechtlich bewertet werden.&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:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7594</id>
		<title>Spamfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7594"/>
		<updated>2026-06-24T08:13:12Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Den Filter trainieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einrichtung, Konfiguration und Optimierung eines Spamfilters auf den Hostsharing Servern. Der Artikel beschreibt drei alternative Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
1. Die Nutzung der &amp;quot;xmailin&amp;quot;-Server für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
2. Die Einrichtung von Spamassassin für das persönliche Postfach&lt;br /&gt;
&lt;br /&gt;
3. Nutzung der Spam-Appliance &amp;quot;SecureMX&amp;quot; für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
= Alternative 1: Maileingangsserver mit Spamfilter nutzen =&lt;br /&gt;
&lt;br /&gt;
Diese Alternative kann von einer Domain-Administration oder vom &amp;quot;Webmaster on Demand&amp;quot; für eine oder mehrere E-Mail-Domains eingerichtet werden. Ein globaler Sieve-Filter für markiete Spam-Nachrichten ist in der Standard-Konfiguration voreingestellt, &lt;br /&gt;
so dass Nachrichten mit Spam-Bewertung in einen vorhandenen Spam-Ordner einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren betreibt Hostsharing zusätzlich zu den vorkonfigurierte Maileingangsservern einen zweiten Satz von Maileingangsservern, bei denen Spamassassin bereits beim Annehmen einer E-Mail ausgeführt wird. Anfang 2026 ist eine Gruppe von Eingangsserver mit der Software &amp;quot;rspamd&amp;quot; hinzugekommen. Eingehende Nachrichten mit Malware oder sehr hoher Bewertung als Spam werden bereits im SMTP-Dialog abgewiesen. Nachrichten mit einem geringeren Spam-Score werden angenommen und zugestellt. Spamassassin fügt die Bewertung für diese Nachrichten in die Header der Nachricht ein, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
X-Spam-Status: Yes, score=11.29&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der globale Sieve-Filter schiebt Nachrichten mit der Markierung &amp;quot;X-Spam-Status: Yes&amp;quot; in einen Ordner &amp;quot;Junk&amp;quot;, wenn der Ordner vorhanden ist. Viele Mailprogramme legen beim ersten Verbinden mit dem IMAP-Server einen solchen Ordner an. Unser &amp;quot;Roundcube&amp;quot;&lt;br /&gt;
unter https://webmail.hostsharing.net ist entsprechend eingerichtet, so dass der Ordner nach einer Nutzung von Webmail vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== Eingangsserver konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Die Maileingangsserver mit Rspamd lassen sich pro Domain konfigurieren, indem die MX-Records im DNS-Zonefile gegenüber dem Default-Zonefile angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Im Zonefile entfällt der Platzhalter &amp;quot;{MX_RR}&amp;quot;. Stattdessen werden die folgenden MX-Records eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin1.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin2.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin3.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Änderung der DNS-Zone siehe: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
Wer sich die Aktion auf der Shell nicht zutraut, möge bitte den &amp;quot;Webmaster on Demand&amp;quot; beauftragen.&lt;br /&gt;
&lt;br /&gt;
Die Änderung des Zonefile kann für eine Domain &amp;quot;hs-example.de&amp;quot; wie folgt überprüft werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
dig +short -t MX hs-example.de @dns1.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Ausgabe wird erwartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
30 xmailin2.hostsharing.net.&lt;br /&gt;
30 xmailin3.hostsharing.net.&lt;br /&gt;
30 xmailin1.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der drei Eingangsserver kann variieren. &lt;br /&gt;
Die führende Zahl ist die Priorität im MX-Record (hier der Wert &amp;quot;30&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Den Filter trainieren ==&lt;br /&gt;
Wer auch am Trainieren des Filters mitwirken möchte, sendet den/die Benutzername/n xyz00-name (das ist der eMail Benutzername) an:&lt;br /&gt;
service (at) hostsharing (dot) net&lt;br /&gt;
&lt;br /&gt;
Das bedeutet dann, dass das Verschieben einer E-Mail in den Spam-Ordner (Junk) darauf Einfluß hat, das zukünftige E-Mails in dieser Art besser als Spam erkannt werden. Andersrum genauso: wenn ich eine E-Mail aus dem Spam-Ordner (Junk) in einen anderen Ordner verschiebe, werden in Zukunft ähnliche E-Mails auch nicht mehr als Spam erkannt.&lt;br /&gt;
&lt;br /&gt;
Da das Training gemeinschaftlich ist, sollte bitte darauf geachtet werden, Newsletter nicht in den Junk Ordner zu schieben, sondern sich davon abzumelden und die E-Mail zu löschen. Nur weil du den Newsletter der Firma xy nicht mehr magst, soll er für andere Benutzer nicht automatisch als Spam erkannt werden.&lt;br /&gt;
&lt;br /&gt;
= Alternative 2: Persönlichen Spamfilter einrichten =&lt;br /&gt;
&lt;br /&gt;
Hier geht es darum, wie Personen mit (grundlegenden) Kenntnissen in der Shell-Bedienung für ihr persönliches Postfach einen Spam-Filter einrichten können. Spamassassin kann für jedes Postfach individuell konfiguriert werden. Für die Einrichtung und Pflege ist Shell-Zugang zur Mailbox erforderlich.  &lt;br /&gt;
&lt;br /&gt;
Ein Bayesfilter kann mit den persönlichen Nachrichten angelernt werden. Dazu sind tiefergehende Shell-Kenntnisse erforderlich (Shell-Skript und Einrichtung eines systemd-Timers).&lt;br /&gt;
&lt;br /&gt;
== Spamassassin Konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Der Spamfilter &amp;quot;Spamassassin&amp;quot; ist bei HS vorinstalliert. Es muss über das Kommando &amp;quot;spamc&amp;quot;, das Kommando zur Nutzung des Spamassassin-Daemon, in der Datei &amp;quot;.forward&amp;quot; eines Mail-Users aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/spamc -U /var/run/spamd -e /usr/lib/dovecot/deliver&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Spammassassin schreibt seine Testergebnisse in die Headerzeilen jeder E-Mail und leitet die E-Mails weiter an das Programm &amp;quot;deliver&amp;quot; aus dem Dovecot-Paket. Das Sortieren von Spam-EMail in einen Spam-Ordner lässt sich mit Sieve-Filtern umsetzen.&lt;br /&gt;
&lt;br /&gt;
In dieser Variante kann man Spamassassin individuell konfigurieren. Dazu legt man im $HOME des Mailbox-Account ein Verzeichnis &amp;quot;$HOME/.spamassassin&amp;quot; an. Die Konfiguration erfolgt in der Datei &amp;quot;$HOME/.spamassassin/user_prefs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Konfigurationsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
required_score          4.0&lt;br /&gt;
report_safe             0&lt;br /&gt;
use_bayes               1&lt;br /&gt;
bayes_auto_learn        1&lt;br /&gt;
skip_rbl_checks         0&lt;br /&gt;
use_razor2              1&lt;br /&gt;
use_pyzor               1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bayesfilter anlernen ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Bayesfilter eingeschaltet ist, macht es Sinn den Filter mit den Befehlen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
sa-learn --spam &amp;lt;platzhalter-spam-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
sa-learn --ham &amp;lt;platzhalter-erwünschte-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
anzulernen. Ein Bash-Skript für das Erlernen von Spam/Nonspam kann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
HAM_MIN_AGE_DAYS=5&lt;br /&gt;
MAILDIR_HAM=${HOME}/Maildir/cur&lt;br /&gt;
TMPDIR=${HOME}/sa-learn-tmp&lt;br /&gt;
SPAMFOLDER=Junk&lt;br /&gt;
SPAMFOLDER_LEARNED=${SPAMFOLDER}.sa-learned&lt;br /&gt;
MAILDIR_SPAM=${HOME}/Maildir/.${SPAMFOLDER}&lt;br /&gt;
&lt;br /&gt;
# Learn spam from MAILDIR_SPAM&lt;br /&gt;
mkdir -p ${TMPDIR}/spam&lt;br /&gt;
rm -f ${TMPDIR}/spam/*&lt;br /&gt;
SPAM_COUNT=0&lt;br /&gt;
for DIR in &amp;quot;cur&amp;quot; &amp;quot;new&amp;quot;; do&lt;br /&gt;
	DIR=&amp;quot;${MAILDIR_SPAM}/${DIR}&amp;quot;&lt;br /&gt;
	cd ${DIR}&lt;br /&gt;
	# echo &amp;quot;---&amp;quot; DIR ${DIR}&lt;br /&gt;
	for SPAMFILE in $( ls ); do&lt;br /&gt;
		# echo &amp;quot;   &amp;quot; ${SPAMFILE}&lt;br /&gt;
		TMPFILE=&amp;quot;${TMPDIR}/spam/${SPAMFILE}&amp;quot;&lt;br /&gt;
		if ! zcat &amp;quot;${SPAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
			cp &amp;quot;${SPAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
		SPAM_COUNT=$((SPAM_COUNT + 1))&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
sa-learn --spam ${TMPDIR}/spam/*&lt;br /&gt;
&lt;br /&gt;
# Move processed spam to keep it in another folder&lt;br /&gt;
doveadm move -u $(whoami) INBOX.${SPAMFOLDER_LEARNED} mailbox INBOX.${SPAMFOLDER} all 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Learn ham from MAILDIR_HAM (&amp;gt; HAM_MIN_AGE_DAYS days; max. 2x spam count)&lt;br /&gt;
mkdir -p ${TMPDIR}/ham&lt;br /&gt;
rm -f ${TMPDIR}/ham/*&lt;br /&gt;
cd ${MAILDIR_HAM}&lt;br /&gt;
MAX_HAM=$((SPAM_COUNT * 2))&lt;br /&gt;
HAM_COUNT=0&lt;br /&gt;
for HAMFILE in $( find . -type f -mtime +${HAM_MIN_AGE_DAYS} -printf &#039;%T@ %p\n&#039; | sort -rn | cut -d&#039; &#039; -f2- | head -n ${MAX_HAM} ); do&lt;br /&gt;
	TMPFILE=&amp;quot;${TMPDIR}/ham/${HAMFILE}&amp;quot;&lt;br /&gt;
	if ! zcat &amp;quot;${HAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
		cp &amp;quot;${HAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	HAM_COUNT=$((HAM_COUNT + 1))&lt;br /&gt;
done&lt;br /&gt;
sa-learn --ham ${TMPDIR}/ham/*&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Training erfolgte mit ${SPAM_COUNT} Spam, ${HAM_COUNT} (max ${MAX_HAM}) Ham Mails.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden Mails verarbeitet, unabhängig davon, ob sie durch Procmail (unkomprimiert) oder über den Mailclient (komprimiert) verschoben vorliegen.&lt;br /&gt;
Für Ham wird ein Teil des Inhalts der Inbox verwendet, wobei die empfohlene Maximalanzahl von zweimal der Spammailanzahl und ein minimales Alter in Tagen gilt. Das Mindestalter garantiert ein inzwischen erfolgtes manuelles Aussortieren des Spams. Der verarbeitete Spam wird anschließend in ein separates Verzeichnis verschoben um den späteren Zugriff auf False Positives zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird über einen systemd-Timer täglich ausgeführt, der pro Mailbox eingerichtet werden muss.&lt;br /&gt;
&lt;br /&gt;
= Alternative 3: SecureMX zubuchen =&lt;br /&gt;
&lt;br /&gt;
Über unseren Domain-Anbieter &amp;quot;Partnergate&amp;quot; bietet Hostsharing als dritte Alternative die kommerzielle Spam-Appliance von Cisco an. Das Produkt heißt bei Partnergate &amp;quot;SecureMX&amp;quot;: https://www.hostsharing.net/loesungen/email/spam-abwehr/&lt;br /&gt;
&lt;br /&gt;
Die Nutzung von SecureMX ist kostenpflichtig und wird auf Wunsch vom Hostsharing-Service eingerichtet. &lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass bei der Nutzung von SecureMX alle eingehenden E-Mail Nachrichten über Server geleitet werden, die nicht unter der Kontrolle von Hostsharing stehen und proprietäre Software einsetzen. Dieser Sachverhalt muss vom Mitglied ggf. datenschutzrechtlich bewertet werden.&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:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7593</id>
		<title>Spamfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7593"/>
		<updated>2026-06-24T08:09:10Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Filtern lernen teilnehmen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einrichtung, Konfiguration und Optimierung eines Spamfilters auf den Hostsharing Servern. Der Artikel beschreibt drei alternative Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
1. Die Nutzung der &amp;quot;xmailin&amp;quot;-Server für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
2. Die Einrichtung von Spamassassin für das persönliche Postfach&lt;br /&gt;
&lt;br /&gt;
3. Nutzung der Spam-Appliance &amp;quot;SecureMX&amp;quot; für eine komplette Domain&lt;br /&gt;
&lt;br /&gt;
= Alternative 1: Maileingangsserver mit Spamfilter nutzen =&lt;br /&gt;
&lt;br /&gt;
Diese Alternative kann von einer Domain-Administration oder vom &amp;quot;Webmaster on Demand&amp;quot; für eine oder mehrere E-Mail-Domains eingerichtet werden. Ein globaler Sieve-Filter für markiete Spam-Nachrichten ist in der Standard-Konfiguration voreingestellt, &lt;br /&gt;
so dass Nachrichten mit Spam-Bewertung in einen vorhandenen Spam-Ordner einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Seit einigen Jahren betreibt Hostsharing zusätzlich zu den vorkonfigurierte Maileingangsservern einen zweiten Satz von Maileingangsservern, bei denen Spamassassin bereits beim Annehmen einer E-Mail ausgeführt wird. Anfang 2026 ist eine Gruppe von Eingangsserver mit der Software &amp;quot;rspamd&amp;quot; hinzugekommen. Eingehende Nachrichten mit Malware oder sehr hoher Bewertung als Spam werden bereits im SMTP-Dialog abgewiesen. Nachrichten mit einem geringeren Spam-Score werden angenommen und zugestellt. Spamassassin fügt die Bewertung für diese Nachrichten in die Header der Nachricht ein, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
X-Spam-Status: Yes, score=11.29&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der globale Sieve-Filter schiebt Nachrichten mit der Markierung &amp;quot;X-Spam-Status: Yes&amp;quot; in einen Ordner &amp;quot;Junk&amp;quot;, wenn der Ordner vorhanden ist. Viele Mailprogramme legen beim ersten Verbinden mit dem IMAP-Server einen solchen Ordner an. Unser &amp;quot;Roundcube&amp;quot;&lt;br /&gt;
unter https://webmail.hostsharing.net ist entsprechend eingerichtet, so dass der Ordner nach einer Nutzung von Webmail vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== Eingangsserver konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Die Maileingangsserver mit Rspamd lassen sich pro Domain konfigurieren, indem die MX-Records im DNS-Zonefile gegenüber dem Default-Zonefile angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Im Zonefile entfällt der Platzhalter &amp;quot;{MX_RR}&amp;quot;. Stattdessen werden die folgenden MX-Records eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin1.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin2.hostsharing.net.&lt;br /&gt;
{DOM_HOSTNAME}.    IN  MX  30  xmailin3.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Änderung der DNS-Zone siehe: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
Wer sich die Aktion auf der Shell nicht zutraut, möge bitte den &amp;quot;Webmaster on Demand&amp;quot; beauftragen.&lt;br /&gt;
&lt;br /&gt;
Die Änderung des Zonefile kann für eine Domain &amp;quot;hs-example.de&amp;quot; wie folgt überprüft werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
dig +short -t MX hs-example.de @dns1.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Ausgabe wird erwartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
30 xmailin2.hostsharing.net.&lt;br /&gt;
30 xmailin3.hostsharing.net.&lt;br /&gt;
30 xmailin1.hostsharing.net.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der drei Eingangsserver kann variieren. &lt;br /&gt;
Die führende Zahl ist die Priorität im MX-Record (hier der Wert &amp;quot;30&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Den Filter trainieren ==&lt;br /&gt;
Wer auch am Trainieren des Filters mitwirken möchte, sendet den/die Benutzername/n xyz00-name (das ist der eMail Benutzername) an:&lt;br /&gt;
service (at) hostsharing (dot) net&lt;br /&gt;
&lt;br /&gt;
= Alternative 2: Persönlichen Spamfilter einrichten =&lt;br /&gt;
&lt;br /&gt;
Hier geht es darum, wie Personen mit (grundlegenden) Kenntnissen in der Shell-Bedienung für ihr persönliches Postfach einen Spam-Filter einrichten können. Spamassassin kann für jedes Postfach individuell konfiguriert werden. Für die Einrichtung und Pflege ist Shell-Zugang zur Mailbox erforderlich.  &lt;br /&gt;
&lt;br /&gt;
Ein Bayesfilter kann mit den persönlichen Nachrichten angelernt werden. Dazu sind tiefergehende Shell-Kenntnisse erforderlich (Shell-Skript und Einrichtung eines systemd-Timers).&lt;br /&gt;
&lt;br /&gt;
== Spamassassin Konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Der Spamfilter &amp;quot;Spamassassin&amp;quot; ist bei HS vorinstalliert. Es muss über das Kommando &amp;quot;spamc&amp;quot;, das Kommando zur Nutzung des Spamassassin-Daemon, in der Datei &amp;quot;.forward&amp;quot; eines Mail-Users aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/spamc -U /var/run/spamd -e /usr/lib/dovecot/deliver&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Spammassassin schreibt seine Testergebnisse in die Headerzeilen jeder E-Mail und leitet die E-Mails weiter an das Programm &amp;quot;deliver&amp;quot; aus dem Dovecot-Paket. Das Sortieren von Spam-EMail in einen Spam-Ordner lässt sich mit Sieve-Filtern umsetzen.&lt;br /&gt;
&lt;br /&gt;
In dieser Variante kann man Spamassassin individuell konfigurieren. Dazu legt man im $HOME des Mailbox-Account ein Verzeichnis &amp;quot;$HOME/.spamassassin&amp;quot; an. Die Konfiguration erfolgt in der Datei &amp;quot;$HOME/.spamassassin/user_prefs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Konfigurationsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
required_score          4.0&lt;br /&gt;
report_safe             0&lt;br /&gt;
use_bayes               1&lt;br /&gt;
bayes_auto_learn        1&lt;br /&gt;
skip_rbl_checks         0&lt;br /&gt;
use_razor2              1&lt;br /&gt;
use_pyzor               1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bayesfilter anlernen ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Bayesfilter eingeschaltet ist, macht es Sinn den Filter mit den Befehlen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
sa-learn --spam &amp;lt;platzhalter-spam-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
sa-learn --ham &amp;lt;platzhalter-erwünschte-nachricht-oder-verzeichnis&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
anzulernen. Ein Bash-Skript für das Erlernen von Spam/Nonspam kann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
HAM_MIN_AGE_DAYS=5&lt;br /&gt;
MAILDIR_HAM=${HOME}/Maildir/cur&lt;br /&gt;
TMPDIR=${HOME}/sa-learn-tmp&lt;br /&gt;
SPAMFOLDER=Junk&lt;br /&gt;
SPAMFOLDER_LEARNED=${SPAMFOLDER}.sa-learned&lt;br /&gt;
MAILDIR_SPAM=${HOME}/Maildir/.${SPAMFOLDER}&lt;br /&gt;
&lt;br /&gt;
# Learn spam from MAILDIR_SPAM&lt;br /&gt;
mkdir -p ${TMPDIR}/spam&lt;br /&gt;
rm -f ${TMPDIR}/spam/*&lt;br /&gt;
SPAM_COUNT=0&lt;br /&gt;
for DIR in &amp;quot;cur&amp;quot; &amp;quot;new&amp;quot;; do&lt;br /&gt;
	DIR=&amp;quot;${MAILDIR_SPAM}/${DIR}&amp;quot;&lt;br /&gt;
	cd ${DIR}&lt;br /&gt;
	# echo &amp;quot;---&amp;quot; DIR ${DIR}&lt;br /&gt;
	for SPAMFILE in $( ls ); do&lt;br /&gt;
		# echo &amp;quot;   &amp;quot; ${SPAMFILE}&lt;br /&gt;
		TMPFILE=&amp;quot;${TMPDIR}/spam/${SPAMFILE}&amp;quot;&lt;br /&gt;
		if ! zcat &amp;quot;${SPAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
			cp &amp;quot;${SPAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
		SPAM_COUNT=$((SPAM_COUNT + 1))&lt;br /&gt;
	done&lt;br /&gt;
done&lt;br /&gt;
sa-learn --spam ${TMPDIR}/spam/*&lt;br /&gt;
&lt;br /&gt;
# Move processed spam to keep it in another folder&lt;br /&gt;
doveadm move -u $(whoami) INBOX.${SPAMFOLDER_LEARNED} mailbox INBOX.${SPAMFOLDER} all 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Learn ham from MAILDIR_HAM (&amp;gt; HAM_MIN_AGE_DAYS days; max. 2x spam count)&lt;br /&gt;
mkdir -p ${TMPDIR}/ham&lt;br /&gt;
rm -f ${TMPDIR}/ham/*&lt;br /&gt;
cd ${MAILDIR_HAM}&lt;br /&gt;
MAX_HAM=$((SPAM_COUNT * 2))&lt;br /&gt;
HAM_COUNT=0&lt;br /&gt;
for HAMFILE in $( find . -type f -mtime +${HAM_MIN_AGE_DAYS} -printf &#039;%T@ %p\n&#039; | sort -rn | cut -d&#039; &#039; -f2- | head -n ${MAX_HAM} ); do&lt;br /&gt;
	TMPFILE=&amp;quot;${TMPDIR}/ham/${HAMFILE}&amp;quot;&lt;br /&gt;
	if ! zcat &amp;quot;${HAMFILE}&amp;quot; &amp;gt; &amp;quot;${TMPFILE}&amp;quot; 2&amp;gt;/dev/null; then&lt;br /&gt;
		cp &amp;quot;${HAMFILE}&amp;quot; &amp;quot;${TMPFILE}&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	HAM_COUNT=$((HAM_COUNT + 1))&lt;br /&gt;
done&lt;br /&gt;
sa-learn --ham ${TMPDIR}/ham/*&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Training erfolgte mit ${SPAM_COUNT} Spam, ${HAM_COUNT} (max ${MAX_HAM}) Ham Mails.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden Mails verarbeitet, unabhängig davon, ob sie durch Procmail (unkomprimiert) oder über den Mailclient (komprimiert) verschoben vorliegen.&lt;br /&gt;
Für Ham wird ein Teil des Inhalts der Inbox verwendet, wobei die empfohlene Maximalanzahl von zweimal der Spammailanzahl und ein minimales Alter in Tagen gilt. Das Mindestalter garantiert ein inzwischen erfolgtes manuelles Aussortieren des Spams. Der verarbeitete Spam wird anschließend in ein separates Verzeichnis verschoben um den späteren Zugriff auf False Positives zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird über einen systemd-Timer täglich ausgeführt, der pro Mailbox eingerichtet werden muss.&lt;br /&gt;
&lt;br /&gt;
= Alternative 3: SecureMX zubuchen =&lt;br /&gt;
&lt;br /&gt;
Über unseren Domain-Anbieter &amp;quot;Partnergate&amp;quot; bietet Hostsharing als dritte Alternative die kommerzielle Spam-Appliance von Cisco an. Das Produkt heißt bei Partnergate &amp;quot;SecureMX&amp;quot;: https://www.hostsharing.net/loesungen/email/spam-abwehr/&lt;br /&gt;
&lt;br /&gt;
Die Nutzung von SecureMX ist kostenpflichtig und wird auf Wunsch vom Hostsharing-Service eingerichtet. &lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass bei der Nutzung von SecureMX alle eingehenden E-Mail Nachrichten über Server geleitet werden, die nicht unter der Kontrolle von Hostsharing stehen und proprietäre Software einsetzen. Dieser Sachverhalt muss vom Mitglied ggf. datenschutzrechtlich bewertet werden.&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:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=NGinX_installieren&amp;diff=7592</id>
		<title>NGinX installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=NGinX_installieren&amp;diff=7592"/>
		<updated>2026-06-17T03:34:01Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Betreiben des Nginx als Apache Ersatz mit Letsencrypt und HTTP Challenge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
Mit der Option &amp;quot;eigener Daemon&amp;quot; ist es möglich in einem Paket statt des Apache Webserver, den Hostsharing zentral zur Verfügung stellt, einen Nginx (oder einen anderen Webserver) in einem Webspace zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=== Port-Weiterleitung als Apache Ersatz ===&lt;br /&gt;
&lt;br /&gt;
Mit der Bestellung des eigenen Daemon gibt man an, mit den Rechten welcher Nutzerkennung der Nginx-Prozess laufen soll. Die Nutzerkennung muss bereits angelegt sein. Ich verwende hier: &#039;&#039;xyz00-nginx&#039;&#039;. Weiterhin bittet man die Hostmaster eine Portweiterleitung über IPTables-Regeln einzurichten. Ich verwende in dieser Wikiseite 38080 für HTTP und 38443 für HTTPS. Nach Einrichtung der IPTables Regeln in der Firewall wird euer NGinX unter den normalen Ports für HTTPS und HTTPS 80 und 443 erreichbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
&lt;br /&gt;
Nginx ist auf allen Managed Servern vorinstalliert. Wir müssen also lediglich eine Konfigurationsdatei anlegen und anschliessend eine eigene Instanz des Dienstes starten.&lt;br /&gt;
&lt;br /&gt;
Eine Beispielkonfiguration sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot; line&amp;gt;&lt;br /&gt;
error_log /home/pacs/xyz00/users/nginx/var/error.log warn;&lt;br /&gt;
pid /home/pacs/xyz00/users/nginx/var/nginx.pid;&lt;br /&gt;
events {&lt;br /&gt;
  worker_connections 4096;&lt;br /&gt;
}&lt;br /&gt;
http {&lt;br /&gt;
  include /etc/nginx/mime.types;&lt;br /&gt;
  access_log /home/pacs/xyz00/users/nginx/var/access.log;&lt;br /&gt;
  server_names_hash_bucket_size 64;&lt;br /&gt;
  server {&lt;br /&gt;
    listen xyz00.hostsharing.net:38080 default_server;&lt;br /&gt;
    server_name _;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
  }&lt;br /&gt;
  server {&lt;br /&gt;
    listen xyz00.hostsharing.net:38443 ssl http2;&lt;br /&gt;
    server_name www.hs-example.de;&lt;br /&gt;
    ssl_certificate /home/pacs/xyz00/users/nginx/etc/xyz00.hs-example.de.crt;&lt;br /&gt;
    ssl_certificate_key /home/pacs/xyz00/users/nginx/etc/xyz00.hs-example.de.key;&lt;br /&gt;
    root /home/pacs/xyz00/users/nginx/htdocs;&lt;br /&gt;
    index index.html;&lt;br /&gt;
    location / {&lt;br /&gt;
      ssi on;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Betreiben des Nginx als Apache Ersatz mit Letsencrypt und HTTP Challenge ===&lt;br /&gt;
In dem Fall, dass man für einen Kunden ein Projekt auf einer Domain hostet, dessen DNS woanders eingerichtet ist,&lt;br /&gt;
dann hat man das Problem, dass das Let&#039;s Encrypt mit DNS Challenge bei Hostsharing erstmal nicht tut.&lt;br /&gt;
&lt;br /&gt;
Es gibt natürlich die Möglichkeit, die Subdomain per DNS Zonen-Delegation (siehe https://de.wikipedia.org/wiki/NS_Resource_Record#Zonendelegation) zu Hostsharing zu delegieren.&lt;br /&gt;
Falls das aber dem Kunden zu kompliziert ist, kann man auch mit der folgenden Nginx Variante arbeiten:&lt;br /&gt;
&lt;br /&gt;
Die Subdomain mit dem eigenen Nginx konfigurieren, auf den die Standardports 80 und 443 weitergeleitet werden, wie im vorhergehenden Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
Dann kann man auch wieder Let&#039;s Encrypt mit HTTP Challenge einsetzen.&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein Ansible Projekt, das diesen Fall umsetzt: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nginx&lt;br /&gt;
&lt;br /&gt;
Es gibt dort ein Skript &amp;lt;code&amp;gt;~/bin/addwebsite.sh&amp;lt;/code&amp;gt;, das eine Subdomain entsprechend einrichtet, und automatisch das Let&#039;s Encrypt Zertifikat signiert und einrichtet.&lt;br /&gt;
&lt;br /&gt;
Ein Systemd Timer wird eingerichtet, der täglich die Gültigkeit des Zertifikates überprüft und gegebenenfalls das Zertifikat erneuert.&lt;br /&gt;
&lt;br /&gt;
Das Ansible Projekt richtet ebenfalls den systemd Service ein, der für den Start des Nginx Servers zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Betreiben eines lokalen Nginx ===&lt;br /&gt;
&lt;br /&gt;
Es gibt Konstellationen, da soll die Webseite auf dem zentralen Apache Webserver ausgeliefert werden, aber die Dienste dahinter sind leichter mit Nginx zu konfigurieren.&lt;br /&gt;
Das macht auf einem Managed Server Sinn, wo man die Ports frei wählen kann, ohne Rücksicht auf andere Benutzer.&lt;br /&gt;
In diesem Beispiel wurde der Port 18003 gewählt, um dort intern den Nginx hören zu lassen.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall kann die Weiterleitung für den Apache so aussehen:&lt;br /&gt;
&lt;br /&gt;
Datei &amp;lt;code&amp;gt;xyz00-nginx@h99:~/doms/demo.example.org/htdocs-ssl/.htaccess&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
DirectoryIndex index.html&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^(.*) http://127.0.0.1:18003/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die entsprechende Nginx Konfiguration sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot; line&amp;gt;&lt;br /&gt;
error_log /home/pacs/xyz00/users/nginx/var/error.log warn;&lt;br /&gt;
pid /home/pacs/xyz00/users/nginx/var/nginx.pid;&lt;br /&gt;
events {&lt;br /&gt;
  worker_connections 4096;&lt;br /&gt;
}&lt;br /&gt;
http {&lt;br /&gt;
  include /etc/nginx/mime.types;&lt;br /&gt;
  access_log /home/pacs/xyz00/nginx/var/access.log;&lt;br /&gt;
  server_names_hash_bucket_size 64;&lt;br /&gt;
  server {&lt;br /&gt;
    listen 127.0.0.1:18003;&lt;br /&gt;
    server_name _;&lt;br /&gt;
    root /home/pacs/xyz00/users/nginx/htdocs;&lt;br /&gt;
    index index.html;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein Ansible Projekt, das diesen Fall umsetzt: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/roles/nginx&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[https://www.nginx.com/resources/wiki/ Offizielles Wiki von Nginx]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nginx Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&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=7590</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7590"/>
		<updated>2026-06-11T20:29:08Z</updated>

		<summary type="html">&lt;p&gt;Tim00: workaround for issue with pnpm 10&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.3 auf 2026.1.4 ====&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.3 &amp;gt; diff-2026.1.3.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.4 v2026.1.4&lt;br /&gt;
# evtl. Änderungen aus diff-2026.1.3.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2026.1.3.txt&lt;br /&gt;
# git commit -a -m &amp;quot;spezifische Änderungen für diese Instanz&amp;quot; --no-verify&lt;br /&gt;
# Schauen, ob discourse 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.4/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;
#&lt;br /&gt;
# to avoid this error: ERR_PNPM_INVALID_DEPENDENCY_NAME  The current package contains a dependency with an invalid name: &amp;quot;@types/@glimmer__component&amp;quot;&lt;br /&gt;
# vi frontend/discourse-types/package.json&lt;br /&gt;
&lt;br /&gt;
 -    &amp;quot;@types/@glimmer__component&amp;quot;: &amp;quot;npm:@glimmer/component@^2.0.0&amp;quot;,&lt;br /&gt;
 -    &amp;quot;@types/@glint__ember-tsc&amp;quot;: &amp;quot;npm:@glint/ember-tsc@^1.0.7&amp;quot;,&lt;br /&gt;
 -    &amp;quot;@types/@glint__template&amp;quot;: &amp;quot;npm:@glint/template@^1.7.2&amp;quot;&lt;br /&gt;
 +    &amp;quot;@types/glimmer__component&amp;quot;: &amp;quot;npm:@glimmer/component@^2.0.0&amp;quot;,&lt;br /&gt;
 +    &amp;quot;@types/glint__ember-tsc&amp;quot;: &amp;quot;npm:@glint/ember-tsc@^1.0.7&amp;quot;,&lt;br /&gt;
 +    &amp;quot;@types/glint__template&amp;quot;: &amp;quot;npm:@glint/template@^1.7.2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#&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=7589</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7589"/>
		<updated>2026-06-11T20:06:06Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Am Beispiel von 2026.1.3 auf 2026.1.4 */&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.3 auf 2026.1.4 ====&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.3 &amp;gt; diff-2026.1.3.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v2026.1.4 v2026.1.4&lt;br /&gt;
# evtl. Änderungen aus diff-2026.1.3.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-2026.1.3.txt&lt;br /&gt;
# git commit -a -m &amp;quot;spezifische Änderungen für diese Instanz&amp;quot; --no-verify&lt;br /&gt;
# Schauen, ob discourse 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.4/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=Kategorie:Installationsanleitungen&amp;diff=7588</id>
		<title>Kategorie:Installationsanleitungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=7588"/>
		<updated>2026-06-10T10:03:08Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-Links}}&lt;br /&gt;
Manche Software wird von vielen unserer Mitglieder verwendet. Deshalb werden hier Installationen dokumentiert, wie sie bei anderen Mitgliedern funktionieren, um die Sache zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine [[Hostsharing_Wiki:Wunschliste Installationsanleitungen|Wunschliste]], in der du Software eintragen kannst, für die du dir eine Installationsanleitung wünscht.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen einer Anwendung, kannst du dieser Anleitung folgen: [[Deinstallieren einer Anwendung]]&lt;br /&gt;
&lt;br /&gt;
=== Freie und datenschutzfreundliche Software-Alternativen  ===&lt;br /&gt;
&lt;br /&gt;
Linksammlungen, die helfen, alternative Software zu finden:&lt;br /&gt;
&lt;br /&gt;
* https://switching.software/&lt;br /&gt;
* https://prism-break.org/de/&lt;br /&gt;
&lt;br /&gt;
=== Tools ===&lt;br /&gt;
Liste mit Tools, die von Hostsharing Mitgliedern veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
* http://hs.andreasloesch.de&lt;br /&gt;
* https://codeberg.org/tpokorra/hostsharing-scripts&lt;br /&gt;
** z.B. [[Skript hs-list-apps]] zum Anzeigen der installierten Anwendungen&lt;br /&gt;
** z.B. [[RAM_Belegung#Skript_list-memory-usage|Skript list-memory-usage]] zum Anzeigen des RAM Verbrauchs&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7587</id>
		<title>Skript hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7587"/>
		<updated>2026-06-10T08:25:14Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
hs-list-apps ist ein Skript, in Python geschrieben, welches viele der aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.&lt;br /&gt;
&lt;br /&gt;
Es hilft, gerade bei Paketen mit vielen Anwendungen, den Überblick zu behalten. Als Reseller will ich zum Beispiel wissen, wieviele Nextclouds in meinem Paket installiert sind, wieviel Platz sie belegen, und auf welchem Versionsstand sie sind.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs-list-apps&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installiert worden sind. Weitere Anwendungen können gerne ins Skript aufgenommen werden. Bitte einen PR oder Issue auf dem Repo bei Codeberg aufmachen.&lt;br /&gt;
&lt;br /&gt;
Es werden einige Annahmen getroffen, wo eine Anwendung zu finden ist. Damit vermeiden wir einen vollständigen Scan der Dateien, der sehr zeitintensiv wäre. z.B. wird erwartet, dass die Nextclouds alle im Benutzerverzeichnis im Ordner nextcloud liegen.&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, die richtige Domain zu bestimmen. Wenn im Benutzer aber mehrere Domains eingetragen sind, wird die mit dem längsten Namen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Das Skript steht auf den Hives zur Verfügung, es liegt in /usr/local/bin, und ist damit Teil des Standardpfades.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann entweder innerhalb eines Benutzers aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-nextcloud@h01:~$ hs-list-apps --detail&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| AppName   | Version | PAC   | USER      | URL                               | RAM    | SSD  | HDD  |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| Nextcloud | 32.0.6  | xyz00 | nextcloud | https://test.nextcloud.example.de | 164.7M | 1.4G | 131M |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter --detail wird der SSD Platz und der HDD Platz nicht berechnet. Das kann sonst etwas Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch vom Paket Admin aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps &lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Wordpress | 6.8.3         | xyz00 | mywordpresstest | https://www.example.de            | 21.2M |     |     |&lt;br /&gt;
| OpenLDAP  | 2.5.13+dfsg-5 | xyz00 | openldap        | https://openldap.example.de       | 28.5M |     |     |&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch nur nach bestimmten Anwendungen suchen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps --app nextcloud&lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7586</id>
		<title>Skript hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7586"/>
		<updated>2026-06-10T08:19:34Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
hs-list-apps ist ein Skript, in Python geschrieben, welches die aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.&lt;br /&gt;
&lt;br /&gt;
Es hilft, gerade bei Paketen mit vielen Anwendungen, den Überblick zu behalten. Als Reseller will ich zum Beispiel wissen, wieviele Nextclouds in meinem Paket installiert sind, wieviel Platz sie belegen, und auf welchem Versionsstand sie sind.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs-list-apps&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installiert worden sind. Weitere Anwendungen können gerne ins Skript aufgenommen werden. Bitte einen PR oder Issue auf dem Repo bei Codeberg aufmachen.&lt;br /&gt;
&lt;br /&gt;
Es werden einige Annahmen getroffen, wo eine Anwendung zu finden ist. Damit vermeiden wir einen vollständigen Scan der Dateien, der sehr zeitintensiv wäre. z.B. wird erwartet, dass die Nextclouds alle im Benutzerverzeichnis im Ordner nextcloud liegen.&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, die richtige Domain zu bestimmen. Wenn im Benutzer aber mehrere Domains eingetragen sind, wird die mit dem längsten Namen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Das Skript steht auf den Hives zur Verfügung, es liegt in /usr/local/bin, und ist damit Teil des Standardpfades.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann entweder innerhalb eines Benutzers aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-nextcloud@h01:~$ hs-list-apps --detail&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| AppName   | Version | PAC   | USER      | URL                               | RAM    | SSD  | HDD  |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| Nextcloud | 32.0.6  | xyz00 | nextcloud | https://test.nextcloud.example.de | 164.7M | 1.4G | 131M |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter --detail wird der SSD Platz und der HDD Platz nicht berechnet. Das kann sonst etwas Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch vom Paket Admin aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps &lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Wordpress | 6.8.3         | xyz00 | mywordpresstest | https://www.example.de            | 21.2M |     |     |&lt;br /&gt;
| OpenLDAP  | 2.5.13+dfsg-5 | xyz00 | openldap        | https://openldap.example.de       | 28.5M |     |     |&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch nur nach bestimmten Anwendungen suchen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps --app nextcloud&lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Hs-list-apps&amp;diff=7585</id>
		<title>Hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Hs-list-apps&amp;diff=7585"/>
		<updated>2026-06-10T08:18:29Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Tim00 verschob die Seite Hs-list-apps nach Skript hs-list-apps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Skript hs-list-apps]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7584</id>
		<title>Skript hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7584"/>
		<updated>2026-06-10T08:18:29Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Tim00 verschob die Seite Hs-list-apps nach Skript hs-list-apps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
hs-list-apps ist ein Skript, in Python geschrieben, welches die aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs-list-apps&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installiert worden sind. Weitere Anwendungen können gerne ins Skript aufgenommen werden. Bitte einen PR oder Issue auf dem Repo bei Codeberg aufmachen.&lt;br /&gt;
&lt;br /&gt;
Es werden einige Annahmen getroffen, wo eine Anwendung zu finden ist. Damit vermeiden wir einen vollständigen Scan der Dateien, der sehr zeitintensiv wäre. z.B. wird erwartet, dass die Nextclouds alle im Benutzerverzeichnis im Ordner nextcloud liegen.&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, die richtige Domain zu bestimmen. Wenn im Benutzer aber mehrere Domains eingetragen sind, wird die mit dem längsten Namen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Das Skript steht auf den Hives zur Verfügung, es liegt in /usr/local/bin, und ist damit Teil des Standardpfades.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann entweder innerhalb eines Benutzers aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-nextcloud@h01:~$ hs-list-apps --detail&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| AppName   | Version | PAC   | USER      | URL                               | RAM    | SSD  | HDD  |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| Nextcloud | 32.0.6  | xyz00 | nextcloud | https://test.nextcloud.example.de | 164.7M | 1.4G | 131M |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter --detail wird der SSD Platz und der HDD Platz nicht berechnet. Das kann sonst etwas Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch vom Paket Admin aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps &lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Wordpress | 6.8.3         | xyz00 | mywordpresstest | https://www.example.de            | 21.2M |     |     |&lt;br /&gt;
| OpenLDAP  | 2.5.13+dfsg-5 | xyz00 | openldap        | https://openldap.example.de       | 28.5M |     |     |&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch nur nach bestimmten Anwendungen suchen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps --app nextcloud&lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7583</id>
		<title>Skript hs-list-apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Skript_hs-list-apps&amp;diff=7583"/>
		<updated>2026-06-10T08:17:59Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Die Seite wurde neu angelegt: „== Beschreibung ==  hs-list-apps ist ein Skript, in Python geschrieben, welches die aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.  Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs-list-apps  == Einschränkungen ==  Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installier…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
&lt;br /&gt;
hs-list-apps ist ein Skript, in Python geschrieben, welches die aktuell installierten Anwendungen und die Belegung von RAM, SSD und HDD anzeigt.&lt;br /&gt;
&lt;br /&gt;
Das Skript wird momentan hier gepflegt: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/hs-list-apps&lt;br /&gt;
&lt;br /&gt;
== Einschränkungen ==&lt;br /&gt;
&lt;br /&gt;
Es werden bisher einige Anwendungen unterstützt, aber längst nicht alle Anwendungen, die bei Hostsharing installiert werden können oder installiert worden sind. Weitere Anwendungen können gerne ins Skript aufgenommen werden. Bitte einen PR oder Issue auf dem Repo bei Codeberg aufmachen.&lt;br /&gt;
&lt;br /&gt;
Es werden einige Annahmen getroffen, wo eine Anwendung zu finden ist. Damit vermeiden wir einen vollständigen Scan der Dateien, der sehr zeitintensiv wäre. z.B. wird erwartet, dass die Nextclouds alle im Benutzerverzeichnis im Ordner nextcloud liegen.&lt;br /&gt;
&lt;br /&gt;
Es wird versucht, die richtige Domain zu bestimmen. Wenn im Benutzer aber mehrere Domains eingetragen sind, wird die mit dem längsten Namen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Das Skript steht auf den Hives zur Verfügung, es liegt in /usr/local/bin, und ist damit Teil des Standardpfades.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann entweder innerhalb eines Benutzers aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-nextcloud@h01:~$ hs-list-apps --detail&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| AppName   | Version | PAC   | USER      | URL                               | RAM    | SSD  | HDD  |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
| Nextcloud | 32.0.6  | xyz00 | nextcloud | https://test.nextcloud.example.de | 164.7M | 1.4G | 131M |&lt;br /&gt;
|-----------|---------|-------|-----------|-----------------------------------|--------|------|------|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter --detail wird der SSD Platz und der HDD Platz nicht berechnet. Das kann sonst etwas Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch vom Paket Admin aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps &lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Wordpress | 6.8.3         | xyz00 | mywordpresstest | https://www.example.de            | 21.2M |     |     |&lt;br /&gt;
| OpenLDAP  | 2.5.13+dfsg-5 | xyz00 | openldap        | https://openldap.example.de       | 28.5M |     |     |&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript kann auch nur nach bestimmten Anwendungen suchen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ hs-list-apps --app nextcloud&lt;br /&gt;
|-----------|---------------|-------|-----------------|----------------------------- -----|-------|-----|-----|&lt;br /&gt;
| AppName   | Version       | PAC   | USER            | URL                               | RAM   | SSD | HDD |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
| Nextcloud | 32.0.6        | xyz00 | nextcloud       | https://test.nextcloud.example.de | 33.0M |     |     |&lt;br /&gt;
|-----------|---------------|-------|-----------------|-----------------------------------|-------|-----|-----|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Benutzer:Tim00&amp;diff=7582</id>
		<title>Benutzer:Tim00</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Benutzer:Tim00&amp;diff=7582"/>
		<updated>2026-06-10T08:14:16Z</updated>

		<summary type="html">&lt;p&gt;Tim00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich heiße Timotheus Pokorra. Ich bin in Siegen, NRW aufgewachsen, und lebe jetzt in Plauen, Sachsen.&lt;br /&gt;
&lt;br /&gt;
Ich bin seit Juni 2002 Mitglied bei Hostsharing.&lt;br /&gt;
&lt;br /&gt;
Seit Oktober 2016 bin ich für die Wartung der Seite wiki.hostsharing.net zuständig.&lt;br /&gt;
&lt;br /&gt;
Seit März 2023 bin ich als Hostmaster und Software-Entwickler bei Hostsharing in Teilzeit angestellt.&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=7581</id>
		<title>Kategorie:Installationsanleitungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=7581"/>
		<updated>2026-06-10T08:04:59Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-Links}}&lt;br /&gt;
Manche Software wird von vielen unserer Mitglieder verwendet. Deshalb werden hier Installationen dokumentiert, wie sie bei anderen Mitgliedern funktionieren, um die Sache zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine [[Hostsharing_Wiki:Wunschliste Installationsanleitungen|Wunschliste]], in der du Software eintragen kannst, für die du dir eine Installationsanleitung wünscht.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen einer Anwendung, kannst du dieser Anleitung folgen: [[Deinstallieren einer Anwendung]]&lt;br /&gt;
&lt;br /&gt;
=== Freie und datenschutzfreundliche Software-Alternativen  ===&lt;br /&gt;
&lt;br /&gt;
Linksammlungen, die helfen, alternative Software zu finden:&lt;br /&gt;
&lt;br /&gt;
* https://switching.software/&lt;br /&gt;
* https://prism-break.org/de/&lt;br /&gt;
&lt;br /&gt;
=== Tools ===&lt;br /&gt;
Liste mit Tools, die von Hostsharing Mitgliedern veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
* http://hs.andreasloesch.de&lt;br /&gt;
* https://codeberg.org/tpokorra/hostsharing-scripts&lt;br /&gt;
** z.B. [[hs-list-apps]] zum Anzeigen der installierten Anwendungen&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=7580</id>
		<title>Kategorie:Installationsanleitungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=7580"/>
		<updated>2026-06-10T08:02:04Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-Links}}&lt;br /&gt;
Manche Software wird von vielen unserer Mitglieder verwendet. Deshalb werden hier Installationen dokumentiert, wie sie bei anderen Mitgliedern funktionieren, um die Sache zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine [[Hostsharing_Wiki:Wunschliste Installationsanleitungen|Wunschliste]], in der du Software eintragen kannst, für die du dir eine Installationsanleitung wünscht.&lt;br /&gt;
&lt;br /&gt;
Zum Entfernen einer Anwendung, kannst du dieser Anleitung folgen: [[Deinstallieren einer Anwendung]]&lt;br /&gt;
&lt;br /&gt;
=== Freie und datenschutzfreundliche Software-Alternativen  ===&lt;br /&gt;
&lt;br /&gt;
Linksammlungen, die helfen, alternative Software zu finden:&lt;br /&gt;
&lt;br /&gt;
* https://switching.software/&lt;br /&gt;
* https://prism-break.org/de/&lt;br /&gt;
&lt;br /&gt;
=== Tools ===&lt;br /&gt;
Liste mit Tools, die von Hostsharing Mitgliedern veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
* http://hs.andreasloesch.de&lt;br /&gt;
* https://codeberg.org/tpokorra/hostsharing-scripts&lt;br /&gt;
* https://codeberg.org/tpokorra/hs.ansible&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7579</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7579"/>
		<updated>2026-06-06T20:52:23Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Seiten Cache einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datenbank sollten die Benutzer mit administrator Rechten kontrolliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT m.meta_key, m.meta_value, u.id, u.user_login, u.user_email, u.display_name&lt;br /&gt;
FROM wp_usermeta AS m join wp_users AS u ON m.user_id = u.id&lt;br /&gt;
WHERE meta_value LIKE &#039;%administrator%&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objekt Cache einrichten ==&lt;br /&gt;
&lt;br /&gt;
Falls bei dem Bericht über den Zustand der Webseite dieser Eintrag erscheint: &amp;quot;Du solltest einen persistenten Objekt-Cache verwenden&amp;quot;, sollte [[Redis#Redis_installieren|Redis installiert]] werden. Es reicht, wenn Redis auf einem Unix-Socket läuft, es muss nicht auf einem Port laufen.&lt;br /&gt;
&lt;br /&gt;
In der wp-config.php sollte dann (relativ weit oben) eingetragen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
define(&#039;WP_REDIS_SCHEME&#039;, &#039;unix&#039;);&lt;br /&gt;
define(&#039;WP_REDIS_PATH&#039;, &#039;/home/pacs/xyz00/users/service/redis/var/redis-server.sock&#039;);&lt;br /&gt;
define(&#039;WP_REDIS_PASSWORD&#039;, &#039;topsecret&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kann z.B. das Plugin &amp;quot;Redis Object Cache&amp;quot; von Till Küss installiert werden: https://de.wordpress.org/plugins/redis-cache/&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich der Object Cache unter &amp;quot;Einstellungen / Redis&amp;quot; aktivieren.&lt;br /&gt;
&lt;br /&gt;
== Seiten Cache einrichten ==&lt;br /&gt;
&lt;br /&gt;
Falls bei dem Bericht über den Zustand der Webseite dieser Eintrag erscheint: &amp;quot;Seiten-Cache wurde nicht erkannt, ...&amp;quot;, kann das Plugin WP Super Cache von Automattic installiert werden: https://wordpress.org/plugins/wp-super-cache/&lt;br /&gt;
&lt;br /&gt;
Der Cache muss dann in den Einstellungen des Plugins aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7578</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7578"/>
		<updated>2026-06-06T20:47:25Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Objekt Cache einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datenbank sollten die Benutzer mit administrator Rechten kontrolliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT m.meta_key, m.meta_value, u.id, u.user_login, u.user_email, u.display_name&lt;br /&gt;
FROM wp_usermeta AS m join wp_users AS u ON m.user_id = u.id&lt;br /&gt;
WHERE meta_value LIKE &#039;%administrator%&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objekt Cache einrichten ==&lt;br /&gt;
&lt;br /&gt;
Falls bei dem Bericht über den Zustand der Webseite dieser Eintrag erscheint: &amp;quot;Du solltest einen persistenten Objekt-Cache verwenden&amp;quot;, sollte [[Redis#Redis_installieren|Redis installiert]] werden. Es reicht, wenn Redis auf einem Unix-Socket läuft, es muss nicht auf einem Port laufen.&lt;br /&gt;
&lt;br /&gt;
In der wp-config.php sollte dann (relativ weit oben) eingetragen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
define(&#039;WP_REDIS_SCHEME&#039;, &#039;unix&#039;);&lt;br /&gt;
define(&#039;WP_REDIS_PATH&#039;, &#039;/home/pacs/xyz00/users/service/redis/var/redis-server.sock&#039;);&lt;br /&gt;
define(&#039;WP_REDIS_PASSWORD&#039;, &#039;topsecret&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann kann z.B. das Plugin &amp;quot;Redis Object Cache&amp;quot; von Till Küss installiert werden: https://de.wordpress.org/plugins/redis-cache/&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich der Object Cache unter &amp;quot;Einstellungen / Redis&amp;quot; aktivieren.&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=7577</id>
		<title>Redis</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Redis&amp;diff=7577"/>
		<updated>2026-06-06T20:38:07Z</updated>

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

		<summary type="html">&lt;p&gt;Tim00: Objekt Cache einrichten&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datenbank sollten die Benutzer mit administrator Rechten kontrolliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT m.meta_key, m.meta_value, u.id, u.user_login, u.user_email, u.display_name&lt;br /&gt;
FROM wp_usermeta AS m join wp_users AS u ON m.user_id = u.id&lt;br /&gt;
WHERE meta_value LIKE &#039;%administrator%&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objekt Cache einrichten ==&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7575</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=7575"/>
		<updated>2026-06-06T05:30:55Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Einrichten des »service-files« */&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;
Alternativ kann auch eine Umgebungsvariable (z.B. MAILTO) gesetzt werden, in der mehrere E-Mailadressen mit Komma getrennt sein dürfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
Environment=&amp;quot;MAILTO=email1@example.org,alarm@example.org&amp;quot;&lt;br /&gt;
ExecStopPost=/usr/local/bin/hs-notify-unit-failure %N %H %u $EXIT_CODE $SERVICE_RESULT $MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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=Wordpress&amp;diff=7574</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7574"/>
		<updated>2026-06-06T05:17:03Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datenbank sollten die Benutzer mit administrator Rechten kontrolliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT m.meta_key, m.meta_value, u.id, u.user_login, u.user_email, u.display_name&lt;br /&gt;
FROM wp_usermeta AS m join wp_users AS u ON m.user_id = u.id&lt;br /&gt;
WHERE meta_value LIKE &#039;%administrator%&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7573</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7573"/>
		<updated>2026-06-06T05:16:13Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datenbank sollten die Benutzer mit administrator Rechten kontrolliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
select m.meta_key, m.meta_value, u.id, u.user_login, u.user_email, u.display_name from wp_usermeta as m join wp_users as u ON m.user_id = u.id where meta_value like &#039;%administrator%&#039;&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7572</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7572"/>
		<updated>2026-06-05T20:44:27Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7571</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7571"/>
		<updated>2026-06-05T20:08:22Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien finden, die versuchen, einen Benutzer mit administrator Rechten anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; wp-content/languages/plugins/&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; --include \*.php wp-content/cache/&lt;br /&gt;
grep -r &#039;\\&amp;quot;administrator\\&amp;quot;&#039; --include \*.php wp-content/uploads/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7570</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7570"/>
		<updated>2026-06-02T04:35:25Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verdächtige Dateien im uploads und cache Verzeichnis finden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find wp-content/uploads wp-content/cache -type f \&lt;br /&gt;
  \( -name &#039;*.php&#039; -o -name &#039;*.phtml&#039; -o -name &#039;*.phar&#039; -o -name &#039;*.ico&#039; \) -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7569</id>
		<title>Login mit SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7569"/>
		<updated>2026-06-02T04:03:47Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Einrückung von Unterthemen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Um sich einloggen zu können, brauchst Du natürlich die Daten, die Dir von Hostsharing in einer Mail nach der Anmeldung zugeschickt wurden: &lt;br /&gt;
&lt;br /&gt;
Hostname: &#039;&#039;&#039;xyz00.hostsharing.net&#039;&#039;&#039; (wenn eine eigene Domain konnektiert ist auch &amp;lt;eigene-domain&amp;gt;.&amp;lt;tld&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Username: &#039;&#039;&#039;xyz00&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Passwort: &#039;&#039;&#039;(wie in der automatischen Mail mitgeteilt)&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei xyz00 handelt es sich um den Account des Paket-Admins. Initial ist für jedes neue Paket nur ein Admin-Account eingerichtet, dessen Benutzername die Form &#039;&#039;&#039;xyz00&#039;&#039;&#039; besitzt. &lt;br /&gt;
&lt;br /&gt;
Da dieser Account sehr viel Macht über das Paket hat, darf er nur über sichere Protokolle wie SSH benutzt werden. Unsichere Protokolle wie direktes FTP dürfen nicht verwendet werden, da diese die Passwörter im Klartext übertragen. Jeder Administrator auf der Übertragungsstrecke könnte mitlesen. &lt;br /&gt;
&lt;br /&gt;
Gleich vorab: Seine Website kann man später freilich über einen separaten Account per ftps, sftp, scp (und zur Not auch ftp) hochladen, doch dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
Linux Systeme haben meist ssh, scp und sftp Clients vorinstalliert. Eine Freie Software zum sicheren Dateitransfer für Windows ist z.B. [http://winscp.net WinSCP] und ein Shell Zugang mit [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]. &lt;br /&gt;
&lt;br /&gt;
Nach der ggf. nötigen Installation eines ssh Clients, die hier nicht beschrieben werden, da sie nicht Hostsharing-spezifisch ist, kann der erste Login erfolgen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
&lt;br /&gt;
Mit OpenSSH ist der Aufruf auf der Kommandozeile z.B. folgender: &lt;br /&gt;
&lt;br /&gt;
 ssh xyz00@xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
Nach Aufbau der Verbindung wird dann das [[Passwort]] erfragt.&lt;br /&gt;
Danach erscheint in etwa folgende Bildschirmausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Last login: Fri Apr 19 06:43:45 2002 from p5081f0c7.dip.t-dialin.net on pts/7&lt;br /&gt;
&lt;br /&gt;
Linux hopi 2.4.17 #2 SMP Thu Jan 17 14:35:38 CET 2002 i686 unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
| hopi.hostsharing.net |&lt;br /&gt;
| Bei Fragen oder Problemen bitte E-Mail an: |&lt;br /&gt;
| support@hostsharing.net (öffentliche Mailingliste) |&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Last login: Fri Apr 19 09:36:34 2002 from 62.156.160.59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xyz0@hopi:~$ █&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es macht durchaus Sinn, die ganz oben genannte &amp;quot;Last Login&amp;quot; Zeile zu prüfen, ob man dies auch selbst war (Uhrzeit und Provider), unten die &amp;quot;Last Login&amp;quot; Zeile gibt genau genommen das aktuelle Login aus, weil der Programmteil nach dem eigentlichen Login ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Als nächstes ändern wir gleich unser [[Passwort]], da dieses schließlich unverschlüsselt per E-Mail versendet wurde. Dies geschieht unter UNIX mit dem Kommando passwd&lt;br /&gt;
&lt;br /&gt;
== Passwort ändern ==&lt;br /&gt;
&lt;br /&gt;
Eine Änderung des Passwortes geht dem Befehl passwd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ passwd&lt;br /&gt;
&lt;br /&gt;
Changing password for xyz00&lt;br /&gt;
&lt;br /&gt;
(current) UNIX password: ALTESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Enter new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Retype new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ █&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Platzhalter &#039;&#039;&#039;NEUESPASSWORT&#039;&#039;&#039; und &#039;&#039;&#039;ALTESPASSWORT&#039;&#039;&#039; müssen dabei selbstverständlich gegen die entsprechenden [[Passworte]] ausgetauscht werden. Dabei sollte jedes Passwort mindestens 6 Zeichen lang sein, besser 8 Zeichen, und aus Buchstaben, Ziffern und ggf. Sonderzeichen bestehen. Allerdings sollte auf Umlaute verzichtet werden, da diese je nach verwendetem Zugangsweg nicht verwendet werden könnten. &lt;br /&gt;
&lt;br /&gt;
Ggf. kommt es zu Fehlermeldungen, z.B. wenn das neue [[Passwort]] zu simpel ist, oder bei der Wiederholung nicht identisch mit dem ersten Passwort ist. In dem Fall, den Vorgang einfach wiederholen. Solange das neue Passwort nicht erfolgreich übernommen wurde, bleibt das alte gültig. &lt;br /&gt;
&lt;br /&gt;
Es gibt User, denen der Paket-Admin nur das Recht eingeräumt hat, das eigene Passwort zu ändern, indem er ihnen die &amp;quot;Shell&amp;quot; /usr/bin/passwd zugewiesen hat. Diese User können durch einen Shell-Login nur ihr Passwort ändern, da das Programm passwd an Stelle einer Shell gestartet wird. Sie werden nach dem Einloggen automatisch auf diesen Dialog geführt.Mehr dazu unter [[User#Rechte]].&lt;br /&gt;
&lt;br /&gt;
==Sitzung beenden==&lt;br /&gt;
&lt;br /&gt;
Um die Sitzung zu beenden, sich also auszuloggen, gibt man exit ein. Das sieht dann so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ exit &lt;br /&gt;
logout &lt;br /&gt;
Connection to xyz00.hostsharing.net closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Login ohne Passwort ==&lt;br /&gt;
Um logins durch automatisierte Versuche zu erschweren sind auf den shared hosts Mechanismen in Betrieb, die ein Login mit Passwort erschweren, zum Beispiel durch ein Timeout, dass die Eingabe eines Passworts, wenn sie zu lange dauert, nicht funktioniert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(xyz00@xyz00.hostsharing.net) Password:&lt;br /&gt;
Connection closed by 2a01:37:1000::53df:4f85:0 port 22&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man muss also das Passwort in der Zwischenablage haben, dann den Loginbefehl geben und dann sofort das Passwort eingeben. Das ist in vielerlei hinsicht unsicher, da die Zwischenablage evtl gespeichert wird. (ein passwort Manager wie keepassXC löscht die eigenen Abgelegten Werte per Default nach einigen Sekunden), diese Methode, weil es wirklich schnell gehen muss (wenige Sekunden zur Passworteingabe) kann auch zu anderen Fehler führen die dass Passwort offenlegen, z.B. weil es versehentlich in der Hektik in ein falsches Fenster gepostet wird. &lt;br /&gt;
Auch aus anderen Gründen sollte daher der Zugang über SSH mit einem Schlüsselpaar erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Login mit SSH Key ==&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit, einen public SSH Key in den Benutzer hochzuladen. Dann kann die Anmeldung über den privaten Key erfolgen. Siehe auch zur Erstellung des Key Paares: [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html]&lt;br /&gt;
&lt;br /&gt;
Der public SSH Key muss dann hier gespeichert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
nano .ssh/authorized_keys&lt;br /&gt;
# hier den public Key einfügen, und speichern&lt;br /&gt;
chmod 600 .ssh/authorized_keys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal schlägt bei Power-Usern die Anmeldung fehl, wenn zu viele SSH Keys zur Verfügung stehen, und die alle durchprobiert werden. Dann kommt nach einer gewissen Anzahl die Fehlermeldung: zu viele Anmeldungsversuche.&lt;br /&gt;
&lt;br /&gt;
Die Lösung: beim SSH Aufruf muss der richtige private Key referenziert werden, und die anderen Keys ignoriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -p 22 -i /root/.ssh/id_ed25519 -o IdentitiesOnly=yes xyz00@xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
=== Bestimmte Shell Kommandos automatisch ausführen ===&lt;br /&gt;
&lt;br /&gt;
Lege in dem Verzeichnis, in dem Du direkt nach dem Login landest, mit dem Editor Deiner Wahl die Datei .bash_profile mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Get the aliases and functions&lt;br /&gt;
if [ -f ~/.bashrc ]; then&lt;br /&gt;
. ~/.bashrc&lt;br /&gt;
fi&lt;br /&gt;
# User specific environment and startup programs&lt;br /&gt;
PATH=$PATH:$HOME/bin&lt;br /&gt;
BASH_ENV=$HOME/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun kannst du in der Datei .bashrc shell Kommandos eingeben. z.B.: quota -g&lt;br /&gt;
&lt;br /&gt;
=== Editor in der Shell einstellen ===&lt;br /&gt;
&lt;br /&gt;
1. manuell Einloggen und:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
VISUAL=nano&lt;br /&gt;
export VISUAL&lt;br /&gt;
EDITOR=nano&lt;br /&gt;
export EDITOR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. in der bash geht es auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export EDITOR=nano&lt;br /&gt;
export VISUAL=nano&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. automatisch bei jedem Login&lt;br /&gt;
Mit obigen Kommandos in der ~/.bash_profile-Datei.&lt;br /&gt;
&lt;br /&gt;
=== Als Paketadmin in einen Unterbenutzer wechseln ===&lt;br /&gt;
&lt;br /&gt;
Wenn du als Paketadmin xyz00 per SSH angemeldet bist, kannst du ohne Passwort in den Unterbenutzer xyz00-webseite wechseln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -iu xyz00-webseite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Unix-Benutzern, die z.B. nur für Postfächer genutzt werden, ist als Shell nur passwd eingerichtet. Daher musst du bei sudo die gewünsche Shell angeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u xyz00-mail_klaus -s bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Links==&lt;br /&gt;
&lt;br /&gt;
[[HS-Server:SSH-Hostkeys]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Einstieg bei Hostsharing]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7568</id>
		<title>Login mit SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7568"/>
		<updated>2026-06-02T04:02:52Z</updated>

		<summary type="html">&lt;p&gt;Tim00: Als Paketadmin in einen Unterbenutzer wechseln&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Um sich einloggen zu können, brauchst Du natürlich die Daten, die Dir von Hostsharing in einer Mail nach der Anmeldung zugeschickt wurden: &lt;br /&gt;
&lt;br /&gt;
Hostname: &#039;&#039;&#039;xyz00.hostsharing.net&#039;&#039;&#039; (wenn eine eigene Domain konnektiert ist auch &amp;lt;eigene-domain&amp;gt;.&amp;lt;tld&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Username: &#039;&#039;&#039;xyz00&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Passwort: &#039;&#039;&#039;(wie in der automatischen Mail mitgeteilt)&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei xyz00 handelt es sich um den Account des Paket-Admins. Initial ist für jedes neue Paket nur ein Admin-Account eingerichtet, dessen Benutzername die Form &#039;&#039;&#039;xyz00&#039;&#039;&#039; besitzt. &lt;br /&gt;
&lt;br /&gt;
Da dieser Account sehr viel Macht über das Paket hat, darf er nur über sichere Protokolle wie SSH benutzt werden. Unsichere Protokolle wie direktes FTP dürfen nicht verwendet werden, da diese die Passwörter im Klartext übertragen. Jeder Administrator auf der Übertragungsstrecke könnte mitlesen. &lt;br /&gt;
&lt;br /&gt;
Gleich vorab: Seine Website kann man später freilich über einen separaten Account per ftps, sftp, scp (und zur Not auch ftp) hochladen, doch dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
Linux Systeme haben meist ssh, scp und sftp Clients vorinstalliert. Eine Freie Software zum sicheren Dateitransfer für Windows ist z.B. [http://winscp.net WinSCP] und ein Shell Zugang mit [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]. &lt;br /&gt;
&lt;br /&gt;
Nach der ggf. nötigen Installation eines ssh Clients, die hier nicht beschrieben werden, da sie nicht Hostsharing-spezifisch ist, kann der erste Login erfolgen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
&lt;br /&gt;
Mit OpenSSH ist der Aufruf auf der Kommandozeile z.B. folgender: &lt;br /&gt;
&lt;br /&gt;
 ssh xyz00@xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
Nach Aufbau der Verbindung wird dann das [[Passwort]] erfragt.&lt;br /&gt;
Danach erscheint in etwa folgende Bildschirmausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Last login: Fri Apr 19 06:43:45 2002 from p5081f0c7.dip.t-dialin.net on pts/7&lt;br /&gt;
&lt;br /&gt;
Linux hopi 2.4.17 #2 SMP Thu Jan 17 14:35:38 CET 2002 i686 unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
| hopi.hostsharing.net |&lt;br /&gt;
| Bei Fragen oder Problemen bitte E-Mail an: |&lt;br /&gt;
| support@hostsharing.net (öffentliche Mailingliste) |&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Last login: Fri Apr 19 09:36:34 2002 from 62.156.160.59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xyz0@hopi:~$ █&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es macht durchaus Sinn, die ganz oben genannte &amp;quot;Last Login&amp;quot; Zeile zu prüfen, ob man dies auch selbst war (Uhrzeit und Provider), unten die &amp;quot;Last Login&amp;quot; Zeile gibt genau genommen das aktuelle Login aus, weil der Programmteil nach dem eigentlichen Login ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Als nächstes ändern wir gleich unser [[Passwort]], da dieses schließlich unverschlüsselt per E-Mail versendet wurde. Dies geschieht unter UNIX mit dem Kommando passwd&lt;br /&gt;
&lt;br /&gt;
== Passwort ändern ==&lt;br /&gt;
&lt;br /&gt;
Eine Änderung des Passwortes geht dem Befehl passwd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ passwd&lt;br /&gt;
&lt;br /&gt;
Changing password for xyz00&lt;br /&gt;
&lt;br /&gt;
(current) UNIX password: ALTESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Enter new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Retype new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ █&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Platzhalter &#039;&#039;&#039;NEUESPASSWORT&#039;&#039;&#039; und &#039;&#039;&#039;ALTESPASSWORT&#039;&#039;&#039; müssen dabei selbstverständlich gegen die entsprechenden [[Passworte]] ausgetauscht werden. Dabei sollte jedes Passwort mindestens 6 Zeichen lang sein, besser 8 Zeichen, und aus Buchstaben, Ziffern und ggf. Sonderzeichen bestehen. Allerdings sollte auf Umlaute verzichtet werden, da diese je nach verwendetem Zugangsweg nicht verwendet werden könnten. &lt;br /&gt;
&lt;br /&gt;
Ggf. kommt es zu Fehlermeldungen, z.B. wenn das neue [[Passwort]] zu simpel ist, oder bei der Wiederholung nicht identisch mit dem ersten Passwort ist. In dem Fall, den Vorgang einfach wiederholen. Solange das neue Passwort nicht erfolgreich übernommen wurde, bleibt das alte gültig. &lt;br /&gt;
&lt;br /&gt;
Es gibt User, denen der Paket-Admin nur das Recht eingeräumt hat, das eigene Passwort zu ändern, indem er ihnen die &amp;quot;Shell&amp;quot; /usr/bin/passwd zugewiesen hat. Diese User können durch einen Shell-Login nur ihr Passwort ändern, da das Programm passwd an Stelle einer Shell gestartet wird. Sie werden nach dem Einloggen automatisch auf diesen Dialog geführt.Mehr dazu unter [[User#Rechte]].&lt;br /&gt;
&lt;br /&gt;
==Sitzung beenden==&lt;br /&gt;
&lt;br /&gt;
Um die Sitzung zu beenden, sich also auszuloggen, gibt man exit ein. Das sieht dann so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ exit &lt;br /&gt;
logout &lt;br /&gt;
Connection to xyz00.hostsharing.net closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Login ohne Passwort ==&lt;br /&gt;
Um logins durch automatisierte Versuche zu erschweren sind auf den shared hosts Mechanismen in Betrieb, die ein Login mit Passwort erschweren, zum Beispiel durch ein Timeout, dass die Eingabe eines Passworts, wenn sie zu lange dauert, nicht funktioniert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(xyz00@xyz00.hostsharing.net) Password:&lt;br /&gt;
Connection closed by 2a01:37:1000::53df:4f85:0 port 22&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man muss also das Passwort in der Zwischenablage haben, dann den Loginbefehl geben und dann sofort das Passwort eingeben. Das ist in vielerlei hinsicht unsicher, da die Zwischenablage evtl gespeichert wird. (ein passwort Manager wie keepassXC löscht die eigenen Abgelegten Werte per Default nach einigen Sekunden), diese Methode, weil es wirklich schnell gehen muss (wenige Sekunden zur Passworteingabe) kann auch zu anderen Fehler führen die dass Passwort offenlegen, z.B. weil es versehentlich in der Hektik in ein falsches Fenster gepostet wird. &lt;br /&gt;
Auch aus anderen Gründen sollte daher der Zugang über SSH mit einem Schlüsselpaar erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Login mit SSH Key ==&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit, einen public SSH Key in den Benutzer hochzuladen. Dann kann die Anmeldung über den privaten Key erfolgen. Siehe auch zur Erstellung des Key Paares: [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html]&lt;br /&gt;
&lt;br /&gt;
Der public SSH Key muss dann hier gespeichert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
nano .ssh/authorized_keys&lt;br /&gt;
# hier den public Key einfügen, und speichern&lt;br /&gt;
chmod 600 .ssh/authorized_keys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal schlägt bei Power-Usern die Anmeldung fehl, wenn zu viele SSH Keys zur Verfügung stehen, und die alle durchprobiert werden. Dann kommt nach einer gewissen Anzahl die Fehlermeldung: zu viele Anmeldungsversuche.&lt;br /&gt;
&lt;br /&gt;
Die Lösung: beim SSH Aufruf muss der richtige private Key referenziert werden, und die anderen Keys ignoriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -p 22 -i /root/.ssh/id_ed25519 -o IdentitiesOnly=yes xyz00@xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Shell Kommandos automatisch ausführen ==&lt;br /&gt;
&lt;br /&gt;
Lege in dem Verzeichnis, in dem Du direkt nach dem Login landest, mit dem Editor Deiner Wahl die Datei .bash_profile mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Get the aliases and functions&lt;br /&gt;
if [ -f ~/.bashrc ]; then&lt;br /&gt;
. ~/.bashrc&lt;br /&gt;
fi&lt;br /&gt;
# User specific environment and startup programs&lt;br /&gt;
PATH=$PATH:$HOME/bin&lt;br /&gt;
BASH_ENV=$HOME/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun kannst du in der Datei .bashrc shell Kommandos eingeben. z.B.: quota -g&lt;br /&gt;
&lt;br /&gt;
== welcher Editor in der shell ==&lt;br /&gt;
&lt;br /&gt;
1. manuell Einloggen und:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
VISUAL=nano&lt;br /&gt;
export VISUAL&lt;br /&gt;
EDITOR=nano&lt;br /&gt;
export EDITOR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. in der bash geht es auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export EDITOR=nano&lt;br /&gt;
export VISUAL=nano&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. automatisch bei jedem Login&lt;br /&gt;
Mit obigen Kommandos in der ~/.bash_profile-Datei.&lt;br /&gt;
&lt;br /&gt;
== Als Paketadmin in einen Unterbenutzer wechseln ==&lt;br /&gt;
&lt;br /&gt;
Wenn du als Paketadmin xyz00 per SSH angemeldet bist, kannst du ohne Passwort in den Unterbenutzer xyz00-webseite wechseln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -iu xyz00-webseite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Unix-Benutzern, die z.B. nur für Postfächer genutzt werden, ist als Shell nur passwd eingerichtet. Daher musst du bei sudo die gewünsche Shell angeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u xyz00-mail_klaus -s bash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Links==&lt;br /&gt;
&lt;br /&gt;
[[HS-Server:SSH-Hostkeys]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Einstieg bei Hostsharing]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7567</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7567"/>
		<updated>2026-06-01T20:38:10Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7566</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7566"/>
		<updated>2026-06-01T20:37:52Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Gehackte Dateien identifizieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wordpress in 5 Minuten =&lt;br /&gt;
&lt;br /&gt;
Installiert wird Wordpress hier unter der Domain https://blog.example.org.&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;
&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;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;blog.example.org&#039;&#039;&lt;br /&gt;
* MySQL-User &lt;br /&gt;
* MySQL Datenbank&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-blog&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Wordpress Blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;blog.example.org&#039;,user:&#039;xyz00-blog&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqluser.add({set:{name:&#039;xyz00_wpuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; mysqldb.add({set:{name:&#039;xyz00_wpdb&#039;,owner:&#039;xyz00_wpuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Wordpress installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-blog&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  ssh -l xyz00-blog xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs-ssl&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/blog.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
rm .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wordpress downloaden &amp;amp; entpacken z.b. im htdocs-ssl Verzeichnis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O - https://wordpress.org/latest.tar.gz |tar -xz --strip 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wordpress konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
Im Browser auf die Seite &lt;br /&gt;
http://blog.example.org gehen und den Anweisungen folgen.&lt;br /&gt;
&lt;br /&gt;
= Verschiedene Hinweise und Anleitungen =&lt;br /&gt;
== wp-cli installieren ==&lt;br /&gt;
&lt;br /&gt;
wp-cli ist das Kommandozeilen-Werkzeug für WordPress: https://wp-cli.org/de/&lt;br /&gt;
&lt;br /&gt;
Es kann so installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir ~/bin&lt;br /&gt;
cd ~/bin&lt;br /&gt;
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
chmod a+x wp-cli.phar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uraltes Wordpress aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Manche Wordpress Installationen sind so alt, dass wp-login nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
Mit wp-cli kann Wordpress auf die aktuelle Version aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gehackte Dateien identifizieren ==&lt;br /&gt;
&lt;br /&gt;
Falls die Wordpress Instanz gehackt wurde, müssen die veränderten Dateien identifiziert und gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Das geht wieder mit wp-cli.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&lt;br /&gt;
~/bin/wp-cli.phar plugin --skip-themes --skip-plugins verify-checksums --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der wp-config.php sollte keine verdächtige Datei eingebunden werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep include wp-config.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einen Admin Benutzer hinzufügen ==&lt;br /&gt;
&lt;br /&gt;
Wenn du die Pflege einer WordPress Instanz übernehmen sollst, aber noch keinen Admin Benutzer hast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/bin/wp-cli.phar user create meinuser admin@example.org --role=administrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann der Benutzer auch wieder gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/wordpress&lt;br /&gt;
~/bin/wp-cli.phar user delete meinuser&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neue Domain umziehen ==&lt;br /&gt;
Meistens muss nichts weiter geändert werden als die Home und die SITE_URL Option. &lt;br /&gt;
&lt;br /&gt;
Einfach zu ändern geht das indem man sich via phpmyadmin.hostsharing.net in den Datenbank User des Wordpress einloggt und sich die Tabelle wp_options ansieht. Dort müssen die Zeilen mit `siteurl` und `home` an die neuen URLs angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Alternativ kann man das auch über das wp-config.php machen. Meistens gibt es die beiden Einträge noch nicht, einfach an die passende Stelle für die Custom Config neu eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php&amp;gt;&lt;br /&gt;
define(&#039;WP_HOME&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
define(&#039;WP_SITEURL&#039;,&#039;https://www.new-domain.de/&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle mal noch auf alte Domain Einträge zu untersuchen und ggf zu ersetzen. &lt;br /&gt;
Das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%https://old-domain.de%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestehendes Wordpress auf neuen User / Server umziehen / Uploads auf Storage auslagern == &lt;br /&gt;
&lt;br /&gt;
Meistens muss dafür keine weitere Änderung vorgenommen werden. Manchmal haben vorherige Anbieter einen alternativen Upload Pfad gesetzt. Das zeigt sich dadurch das man angeblich keine Schreibberechtigungen hätte beim Hochladen von z.B. Bildern. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit was dort kaputt sein könnte ist, das die Option `upload_path` noch auf einen alten Pfad vom alten Anbieter gesetzt wurde. Diese Option ist auch zu gebrauchen wenn der häufiger doch mal recht schnell wachsende Uploads Ordner auf den Storage und nicht auf die SSD ausgelagert werden soll. &lt;br /&gt;
&lt;br /&gt;
In der wp_options DB-Tabelle muss entsprechend die Variable `upload_path` angepasst werden. z.B. für den User xyz00-wordpress zu /home/storage/xyz00/users/wordpress/uploads&lt;br /&gt;
&lt;br /&gt;
Generell lohnt es sich die wp_options Tabelle noch mal auf den Alten Pfad zu untersuchen und ggf. anzupassen, das geht z.B. so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT * FROM wp_options WHERE option_value LIKE &amp;quot;%/old/path/%&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
*[https://wordpress.org/ Offizielle Webseite von Wordpress]&lt;br /&gt;
*[https://wp-cli.org/de/ WP-CLI ist das Kommandozeilen-Werkzeug für WordPress]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Wordpress Ansible Playbook für Hostsharing]&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:Blog]]&lt;br /&gt;
[[Kategorie:CMS]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7565</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7565"/>
		<updated>2026-05-18T14:02:31Z</updated>

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

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

		<summary type="html">&lt;p&gt;Tim00: /* Login mit SSH Key */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Um sich einloggen zu können, brauchst Du natürlich die Daten, die Dir von Hostsharing in einer Mail nach der Anmeldung zugeschickt wurden: &lt;br /&gt;
&lt;br /&gt;
Hostname: &#039;&#039;&#039;xyz00.hostsharing.net&#039;&#039;&#039; (wenn eine eigene Domain konnektiert ist auch &amp;lt;eigene-domain&amp;gt;.&amp;lt;tld&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Username: &#039;&#039;&#039;xyz00&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Passwort: &#039;&#039;&#039;(wie in der automatischen Mail mitgeteilt)&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei xyz00 handelt es sich um den Account des Paket-Admins. Initial ist für jedes neue Paket nur ein Admin-Account eingerichtet, dessen Benutzername die Form &#039;&#039;&#039;xyz00&#039;&#039;&#039; besitzt. &lt;br /&gt;
&lt;br /&gt;
Da dieser Account sehr viel Macht über das Paket hat, darf er nur über sichere Protokolle wie SSH benutzt werden. Unsichere Protokolle wie direktes FTP dürfen nicht verwendet werden, da diese die Passwörter im Klartext übertragen. Jeder Administrator auf der Übertragungsstrecke könnte mitlesen. &lt;br /&gt;
&lt;br /&gt;
Gleich vorab: Seine Website kann man später freilich über einen separaten Account per ftps, sftp, scp (und zur Not auch ftp) hochladen, doch dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
Linux Systeme haben meist ssh, scp und sftp Clients vorinstalliert. Eine Freie Software zum sicheren Dateitransfer für Windows ist z.B. [http://winscp.net WinSCP] und ein Shell Zugang mit [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]. &lt;br /&gt;
&lt;br /&gt;
Nach der ggf. nötigen Installation eines ssh Clients, die hier nicht beschrieben werden, da sie nicht Hostsharing-spezifisch ist, kann der erste Login erfolgen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
&lt;br /&gt;
Mit OpenSSH ist der Aufruf auf der Kommandozeile z.B. folgender: &lt;br /&gt;
&lt;br /&gt;
 ssh xyz00@xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
Nach Aufbau der Verbindung wird dann das [[Passwort]] erfragt.&lt;br /&gt;
Danach erscheint in etwa folgende Bildschirmausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Last login: Fri Apr 19 06:43:45 2002 from p5081f0c7.dip.t-dialin.net on pts/7&lt;br /&gt;
&lt;br /&gt;
Linux hopi 2.4.17 #2 SMP Thu Jan 17 14:35:38 CET 2002 i686 unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
| hopi.hostsharing.net |&lt;br /&gt;
| Bei Fragen oder Problemen bitte E-Mail an: |&lt;br /&gt;
| support@hostsharing.net (öffentliche Mailingliste) |&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Last login: Fri Apr 19 09:36:34 2002 from 62.156.160.59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xyz0@hopi:~$ █&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es macht durchaus Sinn, die ganz oben genannte &amp;quot;Last Login&amp;quot; Zeile zu prüfen, ob man dies auch selbst war (Uhrzeit und Provider), unten die &amp;quot;Last Login&amp;quot; Zeile gibt genau genommen das aktuelle Login aus, weil der Programmteil nach dem eigentlichen Login ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Als nächstes ändern wir gleich unser [[Passwort]], da dieses schließlich unverschlüsselt per E-Mail versendet wurde. Dies geschieht unter UNIX mit dem Kommando passwd&lt;br /&gt;
&lt;br /&gt;
== Passwort ändern ==&lt;br /&gt;
&lt;br /&gt;
Eine Änderung des Passwortes geht dem Befehl passwd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ passwd&lt;br /&gt;
&lt;br /&gt;
Changing password for xyz00&lt;br /&gt;
&lt;br /&gt;
(current) UNIX password: ALTESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Enter new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Retype new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ █&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Platzhalter &#039;&#039;&#039;NEUESPASSWORT&#039;&#039;&#039; und &#039;&#039;&#039;ALTESPASSWORT&#039;&#039;&#039; müssen dabei selbstverständlich gegen die entsprechenden [[Passworte]] ausgetauscht werden. Dabei sollte jedes Passwort mindestens 6 Zeichen lang sein, besser 8 Zeichen, und aus Buchstaben, Ziffern und ggf. Sonderzeichen bestehen. Allerdings sollte auf Umlaute verzichtet werden, da diese je nach verwendetem Zugangsweg nicht verwendet werden könnten. &lt;br /&gt;
&lt;br /&gt;
Ggf. kommt es zu Fehlermeldungen, z.B. wenn das neue [[Passwort]] zu simpel ist, oder bei der Wiederholung nicht identisch mit dem ersten Passwort ist. In dem Fall, den Vorgang einfach wiederholen. Solange das neue Passwort nicht erfolgreich übernommen wurde, bleibt das alte gültig. &lt;br /&gt;
&lt;br /&gt;
Es gibt User, denen der Paket-Admin nur das Recht eingeräumt hat, das eigene Passwort zu ändern, indem er ihnen die &amp;quot;Shell&amp;quot; /usr/bin/passwd zugewiesen hat. Diese User können durch einen Shell-Login nur ihr Passwort ändern, da das Programm passwd an Stelle einer Shell gestartet wird. Sie werden nach dem Einloggen automatisch auf diesen Dialog geführt.Mehr dazu unter [[User#Rechte]].&lt;br /&gt;
&lt;br /&gt;
==Sitzung beenden==&lt;br /&gt;
&lt;br /&gt;
Um die Sitzung zu beenden, sich also auszuloggen, gibt man exit ein. Das sieht dann so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ exit &lt;br /&gt;
logout &lt;br /&gt;
Connection to xyz00.hostsharing.net closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Login ohne Passwort ==&lt;br /&gt;
Um logins durch automatisierte Versuche zu erschweren sind auf den shared hosts Mechanismen in Betrieb, die ein Login mit Passwort erschweren, zum Beispiel durch ein Timeout, dass die Eingabe eines Passworts, wenn sie zu lange dauert, nicht funktioniert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(xyz00@xyz00.hostsharing.net) Password:&lt;br /&gt;
Connection closed by 2a01:37:1000::53df:4f85:0 port 22&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man muss also das Passwort in der Zwischenablage haben, dann den Loginbefehl geben und dann sofort das Passwort eingeben. Das ist in vielerlei hinsicht unsicher, da die Zwischenablage evtl gespeichert wird. (ein passwort Manager wie keepassXC löscht die eigenen Abgelegten Werte per Default nach einigen Sekunden), diese Methode, weil es wirklich schnell gehen muss (wenige Sekunden zur Passworteingabe) kann auch zu anderen Fehler führen die dass Passwort offenlegen, z.B. weil es versehentlich in der Hektik in ein falsches Fenster gepostet wird. &lt;br /&gt;
Auch aus anderen Gründen sollte daher der Zugang über SSH mit einem Schlüsselpaar erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Login mit SSH Key ==&lt;br /&gt;
&lt;br /&gt;
Es besteht die Möglichkeit, einen public SSH Key in den Benutzer hochzuladen. Dann kann die Anmeldung über den privaten Key erfolgen. Siehe auch zur Erstellung des Key Paares: [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html]&lt;br /&gt;
&lt;br /&gt;
Der public SSH Key muss dann hier gespeichert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
nano .ssh/authorized_keys&lt;br /&gt;
# hier den public Key einfügen, und speichern&lt;br /&gt;
chmod 600 .ssh/authorized_keys&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal schlägt bei Power-Usern die Anmeldung fehl, wenn zu viele SSH Keys zur Verfügung stehen, und die alle durchprobiert werden. Dann kommt nach einer gewissen Anzahl die Fehlermeldung: zu viele Anmeldungsversuche.&lt;br /&gt;
&lt;br /&gt;
Die Lösung: beim SSH Aufruf muss der richtige private Key referenziert werden, und die anderen Keys ignoriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -p 22 -i /root/.ssh/id_ed25519 -o IdentitiesOnly=yes xyz00@xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Shell Kommandos automatisch ausführen ==&lt;br /&gt;
&lt;br /&gt;
Lege in dem Verzeichnis, in dem Du direkt nach dem Login landest, mit dem Editor Deiner Wahl die Datei .bash_profile mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Get the aliases and functions&lt;br /&gt;
if [ -f ~/.bashrc ]; then&lt;br /&gt;
. ~/.bashrc&lt;br /&gt;
fi&lt;br /&gt;
# User specific environment and startup programs&lt;br /&gt;
PATH=$PATH:$HOME/bin&lt;br /&gt;
BASH_ENV=$HOME/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun kannst du in der Datei .bashrc shell Kommandos eingeben. z.B.: quota -g&lt;br /&gt;
&lt;br /&gt;
== welcher Editor in der shell ==&lt;br /&gt;
&lt;br /&gt;
1. manuell Einloggen und:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
VISUAL=nano&lt;br /&gt;
export VISUAL&lt;br /&gt;
EDITOR=nano&lt;br /&gt;
export EDITOR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. in der bash geht es auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export EDITOR=nano&lt;br /&gt;
export VISUAL=nano&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. automatisch bei jedem Login&lt;br /&gt;
Mit obigen Kommandos in der ~/.bash_profile-Datei.&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Links==&lt;br /&gt;
&lt;br /&gt;
[[HS-Server:SSH-Hostkeys]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Einstieg bei Hostsharing]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7552</id>
		<title>Login mit SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=7552"/>
		<updated>2026-04-30T06:46:22Z</updated>

		<summary type="html">&lt;p&gt;Tim00: /* Login ohne Passwort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Um sich einloggen zu können, brauchst Du natürlich die Daten, die Dir von Hostsharing in einer Mail nach der Anmeldung zugeschickt wurden: &lt;br /&gt;
&lt;br /&gt;
Hostname: &#039;&#039;&#039;xyz00.hostsharing.net&#039;&#039;&#039; (wenn eine eigene Domain konnektiert ist auch &amp;lt;eigene-domain&amp;gt;.&amp;lt;tld&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Username: &#039;&#039;&#039;xyz00&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Passwort: &#039;&#039;&#039;(wie in der automatischen Mail mitgeteilt)&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei xyz00 handelt es sich um den Account des Paket-Admins. Initial ist für jedes neue Paket nur ein Admin-Account eingerichtet, dessen Benutzername die Form &#039;&#039;&#039;xyz00&#039;&#039;&#039; besitzt. &lt;br /&gt;
&lt;br /&gt;
Da dieser Account sehr viel Macht über das Paket hat, darf er nur über sichere Protokolle wie SSH benutzt werden. Unsichere Protokolle wie direktes FTP dürfen nicht verwendet werden, da diese die Passwörter im Klartext übertragen. Jeder Administrator auf der Übertragungsstrecke könnte mitlesen. &lt;br /&gt;
&lt;br /&gt;
Gleich vorab: Seine Website kann man später freilich über einen separaten Account per ftps, sftp, scp (und zur Not auch ftp) hochladen, doch dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
Linux Systeme haben meist ssh, scp und sftp Clients vorinstalliert. Eine Freie Software zum sicheren Dateitransfer für Windows ist z.B. [http://winscp.net WinSCP] und ein Shell Zugang mit [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]. &lt;br /&gt;
&lt;br /&gt;
Nach der ggf. nötigen Installation eines ssh Clients, die hier nicht beschrieben werden, da sie nicht Hostsharing-spezifisch ist, kann der erste Login erfolgen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
&lt;br /&gt;
Mit OpenSSH ist der Aufruf auf der Kommandozeile z.B. folgender: &lt;br /&gt;
&lt;br /&gt;
 ssh xyz00@xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
Nach Aufbau der Verbindung wird dann das [[Passwort]] erfragt.&lt;br /&gt;
Danach erscheint in etwa folgende Bildschirmausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Last login: Fri Apr 19 06:43:45 2002 from p5081f0c7.dip.t-dialin.net on pts/7&lt;br /&gt;
&lt;br /&gt;
Linux hopi 2.4.17 #2 SMP Thu Jan 17 14:35:38 CET 2002 i686 unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
| hopi.hostsharing.net |&lt;br /&gt;
| Bei Fragen oder Problemen bitte E-Mail an: |&lt;br /&gt;
| support@hostsharing.net (öffentliche Mailingliste) |&lt;br /&gt;
+----------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Last login: Fri Apr 19 09:36:34 2002 from 62.156.160.59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xyz0@hopi:~$ █&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es macht durchaus Sinn, die ganz oben genannte &amp;quot;Last Login&amp;quot; Zeile zu prüfen, ob man dies auch selbst war (Uhrzeit und Provider), unten die &amp;quot;Last Login&amp;quot; Zeile gibt genau genommen das aktuelle Login aus, weil der Programmteil nach dem eigentlichen Login ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Als nächstes ändern wir gleich unser [[Passwort]], da dieses schließlich unverschlüsselt per E-Mail versendet wurde. Dies geschieht unter UNIX mit dem Kommando passwd&lt;br /&gt;
&lt;br /&gt;
== Passwort ändern ==&lt;br /&gt;
&lt;br /&gt;
Eine Änderung des Passwortes geht dem Befehl passwd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ passwd&lt;br /&gt;
&lt;br /&gt;
Changing password for xyz00&lt;br /&gt;
&lt;br /&gt;
(current) UNIX password: ALTESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Enter new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Retype new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ █&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Platzhalter &#039;&#039;&#039;NEUESPASSWORT&#039;&#039;&#039; und &#039;&#039;&#039;ALTESPASSWORT&#039;&#039;&#039; müssen dabei selbstverständlich gegen die entsprechenden [[Passworte]] ausgetauscht werden. Dabei sollte jedes Passwort mindestens 6 Zeichen lang sein, besser 8 Zeichen, und aus Buchstaben, Ziffern und ggf. Sonderzeichen bestehen. Allerdings sollte auf Umlaute verzichtet werden, da diese je nach verwendetem Zugangsweg nicht verwendet werden könnten. &lt;br /&gt;
&lt;br /&gt;
Ggf. kommt es zu Fehlermeldungen, z.B. wenn das neue [[Passwort]] zu simpel ist, oder bei der Wiederholung nicht identisch mit dem ersten Passwort ist. In dem Fall, den Vorgang einfach wiederholen. Solange das neue Passwort nicht erfolgreich übernommen wurde, bleibt das alte gültig. &lt;br /&gt;
&lt;br /&gt;
Es gibt User, denen der Paket-Admin nur das Recht eingeräumt hat, das eigene Passwort zu ändern, indem er ihnen die &amp;quot;Shell&amp;quot; /usr/bin/passwd zugewiesen hat. Diese User können durch einen Shell-Login nur ihr Passwort ändern, da das Programm passwd an Stelle einer Shell gestartet wird. Sie werden nach dem Einloggen automatisch auf diesen Dialog geführt.Mehr dazu unter [[User#Rechte]].&lt;br /&gt;
&lt;br /&gt;
==Sitzung beenden==&lt;br /&gt;
&lt;br /&gt;
Um die Sitzung zu beenden, sich also auszuloggen, gibt man exit ein. Das sieht dann so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ exit &lt;br /&gt;
logout &lt;br /&gt;
Connection to xyz00.hostsharing.net closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Login ohne Passwort ==&lt;br /&gt;
Um logins durch automatisierte Versuche zu erschweren sind auf den shared hosts Mechanismen in Betrieb, die ein Login mit Passwort erschweren, zum Beispiel durch ein Timeout, dass die Eingabe eines Passworts, wenn sie zu lange dauert, nicht funktioniert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(xyz00@xyz00.hostsharing.net) Password:&lt;br /&gt;
Connection closed by 2a01:37:1000::53df:4f85:0 port 22&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man muss also das Passwort in der Zwischenablage haben, dann den Loginbefehl geben und dann sofort das Passwort eingeben. Das ist in vielerlei hinsicht unsicher, da die Zwischenablage evtl gespeichert wird. (ein passwort Manager wie keepassXC löscht die eigenen Abgelegten Werte per Default nach einigen Sekunden), diese Methode, weil es wirklich schnell gehen muss (wenige Sekunden zur Passworteingabe) kann auch zu anderen Fehler führen die dass Passwort offenlegen, z.B. weil es versehentlich in der Hektik in ein falsches Fenster gepostet wird. &lt;br /&gt;
Auch aus anderen Gründen sollte daher der Zugang über SSH mit einem Schlüsselpaar erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Login mit SSH Key ==&lt;br /&gt;
&lt;br /&gt;
* TODO: Wie lege ich einen private und einen public SSH Key an?&lt;br /&gt;
* TODO: wie lade ich den public SSH Key hoch nach .ssh/authorized_keys; chmod 600 .ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
Manchmal schlägt bei Power-Usern die Anmeldung fehl, wenn zu viele SSH Keys zur Verfügung stehen, und die alle durchprobiert werden. Dann kommt nach einer gewissen Anzahl die Fehlermeldung: zu viele Anmeldungsversuche.&lt;br /&gt;
&lt;br /&gt;
Die Lösung: beim SSH Aufruf muss der richtige private Key referenziert werden, und die anderen Keys ignoriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh -p 22 -i /root/.ssh/id_ed25519 -o IdentitiesOnly=yes xyz00@xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Shell Kommandos automatisch ausführen ==&lt;br /&gt;
&lt;br /&gt;
Lege in dem Verzeichnis, in dem Du direkt nach dem Login landest, mit dem Editor Deiner Wahl die Datei .bash_profile mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Get the aliases and functions&lt;br /&gt;
if [ -f ~/.bashrc ]; then&lt;br /&gt;
. ~/.bashrc&lt;br /&gt;
fi&lt;br /&gt;
# User specific environment and startup programs&lt;br /&gt;
PATH=$PATH:$HOME/bin&lt;br /&gt;
BASH_ENV=$HOME/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun kannst du in der Datei .bashrc shell Kommandos eingeben. z.B.: quota -g&lt;br /&gt;
&lt;br /&gt;
== welcher Editor in der shell ==&lt;br /&gt;
&lt;br /&gt;
1. manuell Einloggen und:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
VISUAL=nano&lt;br /&gt;
export VISUAL&lt;br /&gt;
EDITOR=nano&lt;br /&gt;
export EDITOR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. in der bash geht es auch kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export EDITOR=nano&lt;br /&gt;
export VISUAL=nano&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. automatisch bei jedem Login&lt;br /&gt;
Mit obigen Kommandos in der ~/.bash_profile-Datei.&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Links==&lt;br /&gt;
&lt;br /&gt;
[[HS-Server:SSH-Hostkeys]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Einstieg bei Hostsharing]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim00</name></author>
	</entry>
	<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>
</feed>