<?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=Tim</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=Tim"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Tim"/>
	<updated>2026-04-28T16:16:15Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=7437</id>
		<title>Mailman 3 installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=7437"/>
		<updated>2025-10-07T20:55:03Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Web Frontend */ compress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne &#039;&#039;lists.example.org&#039;&#039; und als Domänennutzer &#039;&#039;xyz00-lists&#039;&#039; verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer &#039;&#039;xyz00-lists&#039;&#039; zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein &#039;&#039;$&#039;&#039; gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die [https://mailman.readthedocs.io/ Mailman-Dokumentation] gelesen und sich mit [https://pipenv.readthedocs.io/en/latest/ Pipenv] beschäftigt zu haben.&lt;br /&gt;
&lt;br /&gt;
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Zunächst muss eine PostgreSQL- oder MySQL-Datenbank angelegt werden. (Mailman läuft auch mit SQLite, ist aber für den Produktivbetrieb nicht empfohlen.) Je nach gewählter Datenbank unterscheiden sich manche Schritte geringfügig, was an den entsprechenden Stellen dokumentiert ist.&lt;br /&gt;
&lt;br /&gt;
== Mailman Core ==&lt;br /&gt;
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
pip3 install --user pipenv&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
source ~/.profile&lt;br /&gt;
mkdir ~/mailman&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv install mailman&lt;br /&gt;
pipenv install mailman_hyperkitty&lt;br /&gt;
pipenv install psycopg2-binary # Für PostgreSQL&lt;br /&gt;
pipenv install pymysql # Für MySQL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Kommando &amp;lt;code&amp;gt;pipenv&amp;lt;/code&amp;gt; muss immer im Verzeichnis &amp;lt;code&amp;gt;~/mailman&amp;lt;/code&amp;gt; ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/mailman/etc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in die Datei &amp;lt;code&amp;gt;~/mailman/core/etc/mailman.cfg&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[mailman]&lt;br /&gt;
site_owner: admin@example.org&lt;br /&gt;
default_language: de&lt;br /&gt;
&lt;br /&gt;
[paths.here]&lt;br /&gt;
var_dir: $cwd/core&lt;br /&gt;
&lt;br /&gt;
[database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html&lt;br /&gt;
class: mailman.database.postgresql.PostgreSQLDatabase&lt;br /&gt;
url: postgresql://myuser:mypassword@mypghost/mailman&lt;br /&gt;
# Fallls MySQL verwendet:&lt;br /&gt;
#class: mailman.database.mysql.MySQLDatabase&lt;br /&gt;
#url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&amp;amp;use_unicode=1&lt;br /&gt;
# SQLite ist Standard, wenn nichts konfiguriert ist&lt;br /&gt;
&lt;br /&gt;
[webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet&lt;br /&gt;
port: 8001 # ändern, falls belegt&lt;br /&gt;
admin_user: restadmin&lt;br /&gt;
admin_pass: restpass&lt;br /&gt;
&lt;br /&gt;
[mta]&lt;br /&gt;
smtp_host: xyz00.hostsharing.net&lt;br /&gt;
smtp_port: 4587&lt;br /&gt;
smtp_user: xyz00-lists&lt;br /&gt;
smtp_pass: secret&lt;br /&gt;
smtp_secure_mode: starttls&lt;br /&gt;
# https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html&lt;br /&gt;
# NullMTA, da MTA nicht selbst konfiguriert werden kann&lt;br /&gt;
incoming: mailman.mta.null.NullMTA&lt;br /&gt;
lmtp_port: 8024 # ändern, falls belegt&lt;br /&gt;
&lt;br /&gt;
[runner.nntp]&lt;br /&gt;
# Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten &lt;br /&gt;
start: no&lt;br /&gt;
&lt;br /&gt;
[archiver.hyperkitty]&lt;br /&gt;
class: mailman_hyperkitty.Archiver&lt;br /&gt;
enable: yes&lt;br /&gt;
# $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden&lt;br /&gt;
configuration: $HOME/mailman/core/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 0600 ~/mailman/core/etc/mailman.cfg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit Hyperkitty als [[#Web_Frontend|Web Frontend]] für das Archiv verwendet werden kann, ist in die Datei &amp;lt;code&amp;gt;~/mailman/core/etc/mailman-hyperkitty.cfg&amp;lt;/code&amp;gt; Foglendes zu schreiben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[general]&lt;br /&gt;
base_url: https://lists.example.org/hyperkitty/&lt;br /&gt;
# Muss identisch mit Key in Hyperkitty sein (s.u.)&lt;br /&gt;
api_key: SecretArchiverAPIKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 0600 ~/mailman/core/etc/mailman-hyperkitty.cfg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kommando &#039;&#039;mailman&#039;&#039; anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
export MAILMAN_CONFIG_FILE=$HOME/mailman/core/etc/mailman.cfg&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv run mailman &amp;quot;$@&amp;quot;&lt;br /&gt;
EOD&lt;br /&gt;
&lt;br /&gt;
chmod +x ~/.local/bin/mailman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Da in &amp;lt;code&amp;gt;mailman&amp;lt;/code&amp;gt; das Verzeichnis gewechselt wird, funktionieren relative Pfadangaben als Argument nicht bzw. nur, wenn man sich bereits in &amp;lt;code&amp;gt;~/mailman&amp;lt;/code&amp;gt; befindet.&lt;br /&gt;
&lt;br /&gt;
Nun kann mit &amp;lt;code&amp;gt;mailman info&amp;lt;/code&amp;gt; nochmal die aktuelle Konfiguration geprüft werden.&lt;br /&gt;
Danach kann Mailman gestartet werden:&lt;br /&gt;
 mailman start&lt;br /&gt;
&lt;br /&gt;
== Web Frontend ==&lt;br /&gt;
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die Redirects aus der &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; gelöscht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo &amp;quot;&amp;quot; &amp;gt; ~/doms/lists.example.org/htdocs-ssl/.htaccess&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die erforderlichen Python-Pakete installiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv install mailman-web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;pipenv --clear&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo \$_SERVER[&#039;REMOTE_ADDR&#039;] . &amp;quot;\n&amp;quot;;&lt;br /&gt;
EOD&lt;br /&gt;
&lt;br /&gt;
curl &amp;lt;nowiki&amp;gt;https://lists.example.org/ip.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
rm ~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird nun in Die Datei &amp;lt;code&amp;gt;~/mailman/web/settings.py&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# See https://mailman-web.readthedocs.io/en/latest/settings.html&lt;br /&gt;
&lt;br /&gt;
from mailman_web.settings.base import *&lt;br /&gt;
from mailman_web.settings.mailman import *&lt;br /&gt;
&lt;br /&gt;
BASE_DIR = os.path.join(os.environ[&#039;HOME&#039;], &#039;mailman&#039;, &#039;web&#039;)&lt;br /&gt;
&lt;br /&gt;
# Default path where static files will be placed.&lt;br /&gt;
# &#039;collectstatic&#039; command will copy all the static files here.&lt;br /&gt;
# Alias this location from your webserver to `/static`&lt;br /&gt;
STATIC_ROOT = os.path.join(BASE_DIR, &#039;static&#039;)&lt;br /&gt;
&lt;br /&gt;
# Make sure that the directory is created or Django will fail on start.&lt;br /&gt;
LOGGING[&#039;handlers&#039;][&#039;file&#039;][&#039;filename&#039;] = os.path.join(BASE_DIR, &#039;logs&#039;, &#039;mailmanweb.log&#039;)&lt;br /&gt;
&lt;br /&gt;
# Change path of Whoosh index&lt;br /&gt;
HAYSTACK_CONNECTIONS[&#039;default&#039;][&#039;PATH&#039;] = os.path.join(BASE_DIR, &#039;whoosh_index&#039;)&lt;br /&gt;
&lt;br /&gt;
# django-compressor&lt;br /&gt;
# https://pypi.python.org/pypi/django_compressor&lt;br /&gt;
COMPRESS_PRECOMPILERS = (&lt;br /&gt;
  (&#039;text/x-scss&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
  (&#039;text/x-sass&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# https://django-q.readthedocs.io/en/latest/configure.html&lt;br /&gt;
# 1 worker is probably enough. (Default is 3.)&lt;br /&gt;
Q_CLUSTER[&#039;workers&#039;] = 1&lt;br /&gt;
&lt;br /&gt;
# Default list of admins who receive the emails from error logging.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#admins&lt;br /&gt;
ADMINS = (&lt;br /&gt;
    (&#039;Mailman Admin&#039;, &#039;admin@example.org&#039;),&lt;br /&gt;
)&lt;br /&gt;
# Database setup.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#databases&lt;br /&gt;
DATABASES = {&lt;br /&gt;
    &#039;default&#039;: {&lt;br /&gt;
        &#039;ENGINE&#039;: &#039;django.db.backends.postgresql_psycopg2&#039;, # Für MySQL: django.db.backends.mysql&lt;br /&gt;
        &#039;HOST&#039;: &#039;localhost&#039;,&lt;br /&gt;
        &#039;NAME&#039;: &#039;database_name&#039;,&lt;br /&gt;
        &#039;USER&#039;: &#039;database_user&#039;,&lt;br /&gt;
        &#039;PASSWORD&#039;: &#039;database_password&#039;,&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Hosts/domain names that are valid for this site; required if DEBUG is False.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts&lt;br /&gt;
ALLOWED_HOSTS = [&lt;br /&gt;
    &#039;lists.example.org&#039;,&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
# A secret key for a particular Django installation. This is used to provide&lt;br /&gt;
# cryptographic signing, and should be set to a unique, unpredictable value.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key&lt;br /&gt;
SECRET_KEY = &#039;change-this-on-your-production-server&#039;&lt;br /&gt;
&lt;br /&gt;
# Mailman Core default API Path&lt;br /&gt;
MAILMAN_REST_API_URL = &#039;http://localhost:8001&#039;&lt;br /&gt;
# Mailman Core API user&lt;br /&gt;
MAILMAN_REST_API_USER = &#039;restadmin&#039;&lt;br /&gt;
# Mailman Core API user&#039;s password.&lt;br /&gt;
MAILMAN_REST_API_PASS = &#039;restpass&#039;&lt;br /&gt;
# Mailman Core Shared archiving key. This value is set in the&lt;br /&gt;
# mailman-hyperkitty&#039;s configuration file.&lt;br /&gt;
MAILMAN_ARCHIVER_KEY = &#039;SecretArchiverAPIKey&#039;&lt;br /&gt;
# Host for Mailman Core, from where Hyperkitty will accept connections&lt;br /&gt;
# for archiving.&lt;br /&gt;
MAILMAN_ARCHIVER_FROM = (&#039;&amp;lt;IP von Mailman Core&amp;gt;&#039;)&lt;br /&gt;
&lt;br /&gt;
# Base URL where Django/Mailman-web would be listening for requests. Used by&lt;br /&gt;
# Mailman Core for fetching templates.&lt;br /&gt;
POSTORIUS_TEMPLATE_BASE_URL = &#039;https://lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# Sender in emails sent out by Postorius.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_FROM_EMAIL&lt;br /&gt;
DEFAULT_FROM_EMAIL = &#039;postorius@lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# If you enable email reporting for error messages, this is where those emails&lt;br /&gt;
# will appear to be coming from. Make sure you set a valid domain name,&lt;br /&gt;
# otherwise the emails may get rejected.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SERVER_EMAIL&lt;br /&gt;
SERVER_EMAIL = &#039;django@lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# Configuration used to send emails.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#email-host&lt;br /&gt;
EMAIL_HOST = &#039;xyz00.hostsharing.net&#039;&lt;br /&gt;
EMAIL_PORT = 4587&lt;br /&gt;
EMAIL_USE_TLS = True&lt;br /&gt;
EMAIL_HOST_USER = &#039;xyz00-lists&#039;&lt;br /&gt;
EMAIL_HOST_PASSWORD = &#039;secret&#039;&lt;br /&gt;
EMAIL_TIMEOUT = 60&lt;br /&gt;
&lt;br /&gt;
# A string representing the time zone for this installation.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TIME_ZONE&lt;br /&gt;
TIME_ZONE = &#039;Europe/Berlin&#039;&lt;br /&gt;
&lt;br /&gt;
# A string representing the language code for this installation.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#language-code&lt;br /&gt;
LANGUAGE_CODE = &#039;de-de&#039;&lt;br /&gt;
&lt;br /&gt;
# Disable support for gravatars in HyperKitty and Postorius.&lt;br /&gt;
# https://docs.mailman3.org/projects/hyperkitty/en/latest/install.html#customization&lt;br /&gt;
HYPERKITTY_ENABLE_GRAVATAR = False&lt;br /&gt;
&lt;br /&gt;
# Hinweis: In der derzeit aktuellen Version (1.3.5) der Komponente&lt;br /&gt;
# django-mailman3 wird obige Variable nicht berücksichtigt. Deshalb kann die&lt;br /&gt;
# folgende Direktive nur mit dem Entwicklungsstand aus git einkommentiert werden.&lt;br /&gt;
# django_gravatar is not required, anymore.&lt;br /&gt;
#INSTALLED_APPS.remove(&#039;django_gravatar&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 600 ~/mailman/web/settings.py&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wird die Konfiguration geändert, nachdem das Web Frontend aufgerufen wurde, muss es neu gestartet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir -p ~/doms/lists.example.org/app-ssl/tmp&lt;br /&gt;
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das für Logs definierte Verzeichnis anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p ~/mailman/web/logs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl &#039;&#039;mailman-web&#039;&#039; eingerichtet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman-web&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
export MAILMAN_WEB_CONFIG=$HOME/mailman/web/settings.py&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv run mailman-web &amp;quot;$@&amp;quot;&lt;br /&gt;
EOD&lt;br /&gt;
chmod +x ~/.local/bin/mailman-web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Datenbankschema eingerichtet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web migrate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Kommando werden statische Daten für das Web Frontend ins konfigurierte Verzeichnis geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web collectstatic&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Fehler zu vermeiden: &amp;quot;You have offline compression enabled but key ... is missing&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web compress&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun müssen die statischen Dateien für das Web Frontend noch per HTTPS verfügbar gemacht werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ln -s ~/mailman/mailman-suite/mailman-suite_project/static ~/doms/lists.example.org/htdocs-ssl/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Anlegen des Administrators des Web Frontends wird dieser Befehl ausgeführt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web createsuperuser&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Übersetzungsdateien nur in Mailman Core, jedoch nicht bei den Web Frontend Komponenten im Binärformat enthalten sind, muss die Konvertierung nachgeholt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
for pofile in $(find $(pipenv --venv) -path &#039;*/locale/*/LC_MESSAGES/*.po&#039;); do&lt;br /&gt;
    mofile=${pofile/.po/.mo}&lt;br /&gt;
    if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then&lt;br /&gt;
      echo $pofile&lt;br /&gt;
      msgfmt $pofile -o $mofile -v&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit das Web Frontend per [[Phusion_Passenger|Phusion Passenger]] geladen werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/app-ssl/passenger_wsgi.py&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
os.environ[&#039;LANG&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
os.environ[&#039;LC_ALL&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
&lt;br /&gt;
HOME = os.environ[&#039;HOME&#039;]&lt;br /&gt;
PIPENV = os.path.join(HOME, &#039;.local&#039;, &#039;bin&#039;, &#039;pipenv&#039;)&lt;br /&gt;
PIPFILE_DIR = os.path.join(HOME, &#039;mailman&#039;)&lt;br /&gt;
PIPENV_PYTHON = subprocess.check_output([PIPENV, &#039;--py&#039;], cwd=PIPFILE_DIR).strip().decode(&#039;utf-8&#039;)&lt;br /&gt;
if sys.executable != PIPENV_PYTHON:&lt;br /&gt;
    os.execl(PIPENV_PYTHON, PIPENV_PYTHON, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
os.environ[&#039;MAILMAN_WEB_CONFIG&#039;] = os.path.join(HOME, &#039;mailman&#039;, &#039;web&#039;, &#039;settings.py&#039;)&lt;br /&gt;
from mailman_web.wsgi import application&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun steht das Web Frontend unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Verfügung. Über die Django Administration sollte unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/admin/sites/site/1/change/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; die Domäne angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Mails an Mailman weiterleiten ==&lt;br /&gt;
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels &#039;&#039;.forward-Datei&#039;&#039; werden eingehende Mails an das Programm &amp;lt;code&amp;gt;msmtp&amp;lt;/code&amp;gt; weitergeleitet, welches diese per [https://de.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP] bei Mailman abliefert. msmtp ist auf den Managed Servern vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
 MM_LMTP_PORT=8024 # In Mailman Core konfigurierter Port&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOD &amp;gt;.forward+mailman&lt;br /&gt;
 &amp;quot;|/usr/bin/msmtp --host=localhost --port=$MM_LMTP_PORT --protocol=lmtp --read-envelope-from \$(echo \$ORIGINAL_RECIPIENT | sed &#039;s/+.\+@/@/&#039;)&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt; Befehl ist erforderlich, damit Mails mit &#039;&#039;Plus Addressing&#039;&#039; mit der eigentlichen Empfängeradresse bei Mailman ankommen.&lt;br /&gt;
&lt;br /&gt;
Für die Domain &amp;lt;code&amp;gt;lists.example.org&amp;lt;/code&amp;gt; wird in HSAdmin oder per &amp;lt;code&amp;gt;hssscript&amp;lt;/code&amp;gt; eine Catchall-Adresse mit &amp;lt;code&amp;gt;xyz00-lists+mailman&amp;lt;/code&amp;gt; als Ziel eingerichtet. Bei einer Catchall-Adresse wird als &amp;lt;code&amp;gt;localpart&amp;lt;/code&amp;gt; ein leerer String angegeben.&lt;br /&gt;
&lt;br /&gt;
== Dienste starten und überwachen ==&lt;br /&gt;
Für die beiden benötigten Dienste kann &#039;&#039;monit&#039;&#039; wie folgt konfiguriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir monit&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/.monitrc&lt;br /&gt;
set daemon 60&lt;br /&gt;
    with start delay 90&lt;br /&gt;
set httpd unixsocket $HOME/monit/monit.sock&lt;br /&gt;
    permission 600&lt;br /&gt;
    allow mailman:monit&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: monit@lists.example.org }&lt;br /&gt;
set alert admin@example.org&lt;br /&gt;
set logfile $HOME/monit/monit.log&lt;br /&gt;
set idfile $HOME/monit/monit.id&lt;br /&gt;
set pidfile $HOME/monit/monit.pid&lt;br /&gt;
set statefile $HOME/monit/monit.state&lt;br /&gt;
&lt;br /&gt;
check process mailman&lt;br /&gt;
    pidfile $HOME/mailman/core/master.pid&lt;br /&gt;
    start program = &amp;quot;$HOME/.local/bin/mailman start&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;$HOME/.local/bin/mailman stop&amp;quot;&lt;br /&gt;
    restart program = &amp;quot;$HOME/.local/bin/mailman restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
check process mailman-web-qcluster&lt;br /&gt;
    matching &amp;quot;mailman-web qcluster&amp;quot;&lt;br /&gt;
    start program = &amp;quot;/bin/bash -c &#039;nohup $HOME/.local/bin/mailman-web qcluster &amp;gt;&amp;gt;$HOME/mailman/web/logs/qcluster.log 2&amp;gt;&amp;amp;1 &amp;amp;&#039;&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/usr/bin/pkill -f &#039;mailman-web qcluster&#039;&amp;quot;&lt;br /&gt;
    depends on mailman&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dienste starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;monit&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für &amp;lt;code&amp;gt;mailman-web qcluster&amp;lt;/code&amp;gt; kann alternativ ein minütlich laufender Systemd Timer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Logrotation ==&lt;br /&gt;
Die Rotation der Logdateien kann so konfiguriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/logrotate.conf&lt;br /&gt;
compress&lt;br /&gt;
delaycompress&lt;br /&gt;
missingok&lt;br /&gt;
notifempty&lt;br /&gt;
dateext&lt;br /&gt;
&lt;br /&gt;
$HOME/monit/monit.log {&lt;br /&gt;
  rotate 1&lt;br /&gt;
  weekly&lt;br /&gt;
  maxsize 1M&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/core/logs/*.log {&lt;br /&gt;
  rotate 6&lt;br /&gt;
  daily&lt;br /&gt;
  sharedscripts&lt;br /&gt;
  postrotate&lt;br /&gt;
    $HOME/.local/bin/mailman reopen &amp;gt;/dev/null ||:&lt;br /&gt;
  endscript&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/web/logs/mailmanweb.log {&lt;br /&gt;
  rotate 6&lt;br /&gt;
  daily&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/web/logs/qcluster.log {&lt;br /&gt;
  rotate 1&lt;br /&gt;
  size 100k&lt;br /&gt;
  postrotate&lt;br /&gt;
    /usr/bin/monit restart mailman-web-qcluster &amp;gt;/dev/null ||:&lt;br /&gt;
  endscript&lt;br /&gt;
}&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &amp;lt;code&amp;gt;qcluster.log&amp;lt;/code&amp;gt; wird hier nur bei Überschreiten der definierten Größe rotiert, um regelmäßige Mails von &#039;&#039;monit&#039;&#039; zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Cron Jobs ==&lt;br /&gt;
Für Mailman sind verschiedene Cron Jobs erforderlich. Zudem sollen nach einem Neustart die &amp;lt;code&amp;gt;monit&amp;lt;/code&amp;gt; Dienste gestartet werden und täglich eine Logrotation erfolgen. Die Einrichtung kann so erfolgen (eine bereits existierende crontab wird überschrieben):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD | crontab -&lt;br /&gt;
MAILTO=admin@example.org&lt;br /&gt;
HOME=$HOME&lt;br /&gt;
PATH=$HOME/.local/bin:/usr/bin:/bin:/usr/sbin&lt;br /&gt;
&lt;br /&gt;
@reboot rm -f \$HOME/monit/monit.pid \$HOME/mailman/core/master.pid &amp;amp;&amp;amp; monit&lt;br /&gt;
&lt;br /&gt;
@daily logrotate -s \$HOME/.logrotate_state \$HOME/logrotate.conf&lt;br /&gt;
&lt;br /&gt;
# Send periodic digests.&lt;br /&gt;
@daily mailman digests --send&lt;br /&gt;
&lt;br /&gt;
* * * * * mailman-web runjobs minutely&lt;br /&gt;
2,17,32,47 * * * * mailman-web runjobs quarter_hourly&lt;br /&gt;
@hourly  mailman-web runjobs hourly&lt;br /&gt;
@daily   mailman-web runjobs daily&lt;br /&gt;
@weekly  mailman-web runjobs weekly&lt;br /&gt;
@monthly mailman-web runjobs monthly&lt;br /&gt;
@yearly  mailman-web runjobs yearly&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll eine existierende crontab nicht überschrieben werden, muss das Kommando &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; ausgeführt und die crontab entsprechend angepasst werden. (Dabei &amp;lt;code&amp;gt;\$HOME&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; mit dem Pfad des Benutzerverzeichnisses ersetzen.)&lt;br /&gt;
&lt;br /&gt;
== Liste anlegen ==&lt;br /&gt;
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;mailman create meine-erste-liste@lists.example.org # Alternativ über Web Frontend&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die E-Mail Adressen für die Mailingliste angelegt werden, im HSAdmin. Zum Beispiel für die Liste meine-erste-liste: meine-erste-liste, meine-erste-liste-join, meine-erste-liste-leave, meine-erste-liste-owner, für die Domain lists.example.org. Die E-Mails sollen in das Postfach gehen, wo mailman installiert ist.&lt;br /&gt;
Alternativ kann eine Catch-All Adresse eingerichtet werden, damit alle E-Mails an die Subdomain in das Postfach vom mailman gehen. Der Catch-All ist laut Postfix Regeln eine Adresse mit einem leeren lokalen Teil (siehe auch der Screenshot in der [[Sympa_installieren#Neue_Liste_einrichten|entsprechenden Anleitung von Sympa]]).&lt;br /&gt;
&lt;br /&gt;
== Die Selbst-Registrierung von Benutzern verhindern ==&lt;br /&gt;
&lt;br /&gt;
Per Default kann sich jede Person im Mailman3 ein Benutzerkonto anlegen. Wenn das nicht erwünscht ist, kann in der Datei &amp;lt;code&amp;gt;var/etc/settings.py&amp;lt;/code&amp;gt; die folgende Zeile hinzugefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ACCOUNT_ADAPTER = &#039;django_mailman3.views.user_adapter.DisableSignupAdapter&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es können in diesem Fall im Django Backend durch den Administrator Benutzerkonten angelegt werden, auf https://lists.example.org/admin/auth/user/&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Python-Pakete für die Aktualisierungen vorliegen ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv update --outdated&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von [https://docs.mailman3.org/projects/mailman/en/latest/src/mailman/docs/NEWS.html Mailman]) zu lesen und auf relevante Änderungen zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Mailman stoppen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
monit stop mailman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update der Pakete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pipenv update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ggf. Pip Cache löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pipenv --clear&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenbankmigrationen durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mailman-web makemigrations&lt;br /&gt;
mailman-web migrate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übersetzungen aktualisieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
for pofile in $(find $(pipenv --venv) -path &#039;*/locale/*/LC_MESSAGES/*.po&#039;); do&lt;br /&gt;
  mofile=${pofile/.po/.mo}&lt;br /&gt;
  if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then&lt;br /&gt;
    echo $pofile&lt;br /&gt;
    msgfmt $pofile -o $mofile -v&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Statische Dateien aktualisieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web collectstatic -c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend die Dienste wieder starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
monit start mailman&lt;br /&gt;
monit start mailman-web-qcluster&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Web Frontend neu starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/doms/lists.example.org/app-ssl/tmp&lt;br /&gt;
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://docs.mailman3.org/en/latest/ Offizielle Anleitung für Mailman3]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mailman3 Ansible Playbook für Hostsharing]&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:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=7436</id>
		<title>Mailman 3 installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=7436"/>
		<updated>2025-10-07T20:50:37Z</updated>

		<summary type="html">&lt;p&gt;Tim: Links und Link zu Ansible Playbook hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne &#039;&#039;lists.example.org&#039;&#039; und als Domänennutzer &#039;&#039;xyz00-lists&#039;&#039; verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer &#039;&#039;xyz00-lists&#039;&#039; zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein &#039;&#039;$&#039;&#039; gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die [https://mailman.readthedocs.io/ Mailman-Dokumentation] gelesen und sich mit [https://pipenv.readthedocs.io/en/latest/ Pipenv] beschäftigt zu haben.&lt;br /&gt;
&lt;br /&gt;
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
Zunächst muss eine PostgreSQL- oder MySQL-Datenbank angelegt werden. (Mailman läuft auch mit SQLite, ist aber für den Produktivbetrieb nicht empfohlen.) Je nach gewählter Datenbank unterscheiden sich manche Schritte geringfügig, was an den entsprechenden Stellen dokumentiert ist.&lt;br /&gt;
&lt;br /&gt;
== Mailman Core ==&lt;br /&gt;
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
pip3 install --user pipenv&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
source ~/.profile&lt;br /&gt;
mkdir ~/mailman&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv install mailman&lt;br /&gt;
pipenv install mailman_hyperkitty&lt;br /&gt;
pipenv install psycopg2-binary # Für PostgreSQL&lt;br /&gt;
pipenv install pymysql # Für MySQL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Kommando &amp;lt;code&amp;gt;pipenv&amp;lt;/code&amp;gt; muss immer im Verzeichnis &amp;lt;code&amp;gt;~/mailman&amp;lt;/code&amp;gt; ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/mailman/etc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in die Datei &amp;lt;code&amp;gt;~/mailman/core/etc/mailman.cfg&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[mailman]&lt;br /&gt;
site_owner: admin@example.org&lt;br /&gt;
default_language: de&lt;br /&gt;
&lt;br /&gt;
[paths.here]&lt;br /&gt;
var_dir: $cwd/core&lt;br /&gt;
&lt;br /&gt;
[database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html&lt;br /&gt;
class: mailman.database.postgresql.PostgreSQLDatabase&lt;br /&gt;
url: postgresql://myuser:mypassword@mypghost/mailman&lt;br /&gt;
# Fallls MySQL verwendet:&lt;br /&gt;
#class: mailman.database.mysql.MySQLDatabase&lt;br /&gt;
#url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&amp;amp;use_unicode=1&lt;br /&gt;
# SQLite ist Standard, wenn nichts konfiguriert ist&lt;br /&gt;
&lt;br /&gt;
[webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet&lt;br /&gt;
port: 8001 # ändern, falls belegt&lt;br /&gt;
admin_user: restadmin&lt;br /&gt;
admin_pass: restpass&lt;br /&gt;
&lt;br /&gt;
[mta]&lt;br /&gt;
smtp_host: xyz00.hostsharing.net&lt;br /&gt;
smtp_port: 4587&lt;br /&gt;
smtp_user: xyz00-lists&lt;br /&gt;
smtp_pass: secret&lt;br /&gt;
smtp_secure_mode: starttls&lt;br /&gt;
# https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html&lt;br /&gt;
# NullMTA, da MTA nicht selbst konfiguriert werden kann&lt;br /&gt;
incoming: mailman.mta.null.NullMTA&lt;br /&gt;
lmtp_port: 8024 # ändern, falls belegt&lt;br /&gt;
&lt;br /&gt;
[runner.nntp]&lt;br /&gt;
# Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten &lt;br /&gt;
start: no&lt;br /&gt;
&lt;br /&gt;
[archiver.hyperkitty]&lt;br /&gt;
class: mailman_hyperkitty.Archiver&lt;br /&gt;
enable: yes&lt;br /&gt;
# $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden&lt;br /&gt;
configuration: $HOME/mailman/core/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 0600 ~/mailman/core/etc/mailman.cfg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit Hyperkitty als [[#Web_Frontend|Web Frontend]] für das Archiv verwendet werden kann, ist in die Datei &amp;lt;code&amp;gt;~/mailman/core/etc/mailman-hyperkitty.cfg&amp;lt;/code&amp;gt; Foglendes zu schreiben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[general]&lt;br /&gt;
base_url: https://lists.example.org/hyperkitty/&lt;br /&gt;
# Muss identisch mit Key in Hyperkitty sein (s.u.)&lt;br /&gt;
api_key: SecretArchiverAPIKey&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 0600 ~/mailman/core/etc/mailman-hyperkitty.cfg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kommando &#039;&#039;mailman&#039;&#039; anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
export MAILMAN_CONFIG_FILE=$HOME/mailman/core/etc/mailman.cfg&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv run mailman &amp;quot;$@&amp;quot;&lt;br /&gt;
EOD&lt;br /&gt;
&lt;br /&gt;
chmod +x ~/.local/bin/mailman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Da in &amp;lt;code&amp;gt;mailman&amp;lt;/code&amp;gt; das Verzeichnis gewechselt wird, funktionieren relative Pfadangaben als Argument nicht bzw. nur, wenn man sich bereits in &amp;lt;code&amp;gt;~/mailman&amp;lt;/code&amp;gt; befindet.&lt;br /&gt;
&lt;br /&gt;
Nun kann mit &amp;lt;code&amp;gt;mailman info&amp;lt;/code&amp;gt; nochmal die aktuelle Konfiguration geprüft werden.&lt;br /&gt;
Danach kann Mailman gestartet werden:&lt;br /&gt;
 mailman start&lt;br /&gt;
&lt;br /&gt;
== Web Frontend ==&lt;br /&gt;
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die Redirects aus der &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; gelöscht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo &amp;quot;&amp;quot; &amp;gt; ~/doms/lists.example.org/htdocs-ssl/.htaccess&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die erforderlichen Python-Pakete installiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv install mailman-web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;pipenv --clear&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo \$_SERVER[&#039;REMOTE_ADDR&#039;] . &amp;quot;\n&amp;quot;;&lt;br /&gt;
EOD&lt;br /&gt;
&lt;br /&gt;
curl &amp;lt;nowiki&amp;gt;https://lists.example.org/ip.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
rm ~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird nun in Die Datei &amp;lt;code&amp;gt;~/mailman/web/settings.py&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# See https://mailman-web.readthedocs.io/en/latest/settings.html&lt;br /&gt;
&lt;br /&gt;
from mailman_web.settings.base import *&lt;br /&gt;
from mailman_web.settings.mailman import *&lt;br /&gt;
&lt;br /&gt;
BASE_DIR = os.path.join(os.environ[&#039;HOME&#039;], &#039;mailman&#039;, &#039;web&#039;)&lt;br /&gt;
&lt;br /&gt;
# Default path where static files will be placed.&lt;br /&gt;
# &#039;collectstatic&#039; command will copy all the static files here.&lt;br /&gt;
# Alias this location from your webserver to `/static`&lt;br /&gt;
STATIC_ROOT = os.path.join(BASE_DIR, &#039;static&#039;)&lt;br /&gt;
&lt;br /&gt;
# Make sure that the directory is created or Django will fail on start.&lt;br /&gt;
LOGGING[&#039;handlers&#039;][&#039;file&#039;][&#039;filename&#039;] = os.path.join(BASE_DIR, &#039;logs&#039;, &#039;mailmanweb.log&#039;)&lt;br /&gt;
&lt;br /&gt;
# Change path of Whoosh index&lt;br /&gt;
HAYSTACK_CONNECTIONS[&#039;default&#039;][&#039;PATH&#039;] = os.path.join(BASE_DIR, &#039;whoosh_index&#039;)&lt;br /&gt;
&lt;br /&gt;
# django-compressor&lt;br /&gt;
# https://pypi.python.org/pypi/django_compressor&lt;br /&gt;
COMPRESS_PRECOMPILERS = (&lt;br /&gt;
  (&#039;text/x-scss&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
  (&#039;text/x-sass&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# https://django-q.readthedocs.io/en/latest/configure.html&lt;br /&gt;
# 1 worker is probably enough. (Default is 3.)&lt;br /&gt;
Q_CLUSTER[&#039;workers&#039;] = 1&lt;br /&gt;
&lt;br /&gt;
# Default list of admins who receive the emails from error logging.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#admins&lt;br /&gt;
ADMINS = (&lt;br /&gt;
    (&#039;Mailman Admin&#039;, &#039;admin@example.org&#039;),&lt;br /&gt;
)&lt;br /&gt;
# Database setup.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#databases&lt;br /&gt;
DATABASES = {&lt;br /&gt;
    &#039;default&#039;: {&lt;br /&gt;
        &#039;ENGINE&#039;: &#039;django.db.backends.postgresql_psycopg2&#039;, # Für MySQL: django.db.backends.mysql&lt;br /&gt;
        &#039;HOST&#039;: &#039;localhost&#039;,&lt;br /&gt;
        &#039;NAME&#039;: &#039;database_name&#039;,&lt;br /&gt;
        &#039;USER&#039;: &#039;database_user&#039;,&lt;br /&gt;
        &#039;PASSWORD&#039;: &#039;database_password&#039;,&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Hosts/domain names that are valid for this site; required if DEBUG is False.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts&lt;br /&gt;
ALLOWED_HOSTS = [&lt;br /&gt;
    &#039;lists.example.org&#039;,&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
# A secret key for a particular Django installation. This is used to provide&lt;br /&gt;
# cryptographic signing, and should be set to a unique, unpredictable value.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key&lt;br /&gt;
SECRET_KEY = &#039;change-this-on-your-production-server&#039;&lt;br /&gt;
&lt;br /&gt;
# Mailman Core default API Path&lt;br /&gt;
MAILMAN_REST_API_URL = &#039;http://localhost:8001&#039;&lt;br /&gt;
# Mailman Core API user&lt;br /&gt;
MAILMAN_REST_API_USER = &#039;restadmin&#039;&lt;br /&gt;
# Mailman Core API user&#039;s password.&lt;br /&gt;
MAILMAN_REST_API_PASS = &#039;restpass&#039;&lt;br /&gt;
# Mailman Core Shared archiving key. This value is set in the&lt;br /&gt;
# mailman-hyperkitty&#039;s configuration file.&lt;br /&gt;
MAILMAN_ARCHIVER_KEY = &#039;SecretArchiverAPIKey&#039;&lt;br /&gt;
# Host for Mailman Core, from where Hyperkitty will accept connections&lt;br /&gt;
# for archiving.&lt;br /&gt;
MAILMAN_ARCHIVER_FROM = (&#039;&amp;lt;IP von Mailman Core&amp;gt;&#039;)&lt;br /&gt;
&lt;br /&gt;
# Base URL where Django/Mailman-web would be listening for requests. Used by&lt;br /&gt;
# Mailman Core for fetching templates.&lt;br /&gt;
POSTORIUS_TEMPLATE_BASE_URL = &#039;https://lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# Sender in emails sent out by Postorius.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_FROM_EMAIL&lt;br /&gt;
DEFAULT_FROM_EMAIL = &#039;postorius@lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# If you enable email reporting for error messages, this is where those emails&lt;br /&gt;
# will appear to be coming from. Make sure you set a valid domain name,&lt;br /&gt;
# otherwise the emails may get rejected.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SERVER_EMAIL&lt;br /&gt;
SERVER_EMAIL = &#039;django@lists.example.org&#039;&lt;br /&gt;
&lt;br /&gt;
# Configuration used to send emails.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#email-host&lt;br /&gt;
EMAIL_HOST = &#039;xyz00.hostsharing.net&#039;&lt;br /&gt;
EMAIL_PORT = 4587&lt;br /&gt;
EMAIL_USE_TLS = True&lt;br /&gt;
EMAIL_HOST_USER = &#039;xyz00-lists&#039;&lt;br /&gt;
EMAIL_HOST_PASSWORD = &#039;secret&#039;&lt;br /&gt;
EMAIL_TIMEOUT = 60&lt;br /&gt;
&lt;br /&gt;
# A string representing the time zone for this installation.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TIME_ZONE&lt;br /&gt;
TIME_ZONE = &#039;Europe/Berlin&#039;&lt;br /&gt;
&lt;br /&gt;
# A string representing the language code for this installation.&lt;br /&gt;
# https://docs.djangoproject.com/en/dev/ref/settings/#language-code&lt;br /&gt;
LANGUAGE_CODE = &#039;de-de&#039;&lt;br /&gt;
&lt;br /&gt;
# Disable support for gravatars in HyperKitty and Postorius.&lt;br /&gt;
# https://docs.mailman3.org/projects/hyperkitty/en/latest/install.html#customization&lt;br /&gt;
HYPERKITTY_ENABLE_GRAVATAR = False&lt;br /&gt;
&lt;br /&gt;
# Hinweis: In der derzeit aktuellen Version (1.3.5) der Komponente&lt;br /&gt;
# django-mailman3 wird obige Variable nicht berücksichtigt. Deshalb kann die&lt;br /&gt;
# folgende Direktive nur mit dem Entwicklungsstand aus git einkommentiert werden.&lt;br /&gt;
# django_gravatar is not required, anymore.&lt;br /&gt;
#INSTALLED_APPS.remove(&#039;django_gravatar&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;chmod 600 ~/mailman/web/settings.py&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wird die Konfiguration geändert, nachdem das Web Frontend aufgerufen wurde, muss es neu gestartet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir -p ~/doms/lists.example.org/app-ssl/tmp&lt;br /&gt;
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das für Logs definierte Verzeichnis anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p ~/mailman/web/logs&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl &#039;&#039;mailman-web&#039;&#039; eingerichtet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman-web&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
export MAILMAN_WEB_CONFIG=$HOME/mailman/web/settings.py&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv run mailman-web &amp;quot;$@&amp;quot;&lt;br /&gt;
EOD&lt;br /&gt;
chmod +x ~/.local/bin/mailman-web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Datenbankschema eingerichtet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web migrate&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Kommando werden statische Daten für das Web Frontend ins konfiguriete Verzeichnis geschrieben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web collectstatic&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun müssen die statischen Dateien für das Web Frontend noch per HTTPS verfügbar gemacht werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ln -s ~/mailman/mailman-suite/mailman-suite_project/static ~/doms/lists.example.org/htdocs-ssl/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Anlegen des Administrators des Web Frontends wird dieser Befehl ausgeführt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web createsuperuser&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Übersetzungsdateien nur in Mailman Core, jedoch nicht bei den Web Frontend Komponenten im Binärformat enthalten sind, muss die Konvertierung nachgeholt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
for pofile in $(find $(pipenv --venv) -path &#039;*/locale/*/LC_MESSAGES/*.po&#039;); do&lt;br /&gt;
    mofile=${pofile/.po/.mo}&lt;br /&gt;
    if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then&lt;br /&gt;
      echo $pofile&lt;br /&gt;
      msgfmt $pofile -o $mofile -v&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit das Web Frontend per [[Phusion_Passenger|Phusion Passenger]] geladen werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/app-ssl/passenger_wsgi.py&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
os.environ[&#039;LANG&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
os.environ[&#039;LC_ALL&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
&lt;br /&gt;
HOME = os.environ[&#039;HOME&#039;]&lt;br /&gt;
PIPENV = os.path.join(HOME, &#039;.local&#039;, &#039;bin&#039;, &#039;pipenv&#039;)&lt;br /&gt;
PIPFILE_DIR = os.path.join(HOME, &#039;mailman&#039;)&lt;br /&gt;
PIPENV_PYTHON = subprocess.check_output([PIPENV, &#039;--py&#039;], cwd=PIPFILE_DIR).strip().decode(&#039;utf-8&#039;)&lt;br /&gt;
if sys.executable != PIPENV_PYTHON:&lt;br /&gt;
    os.execl(PIPENV_PYTHON, PIPENV_PYTHON, *sys.argv)&lt;br /&gt;
&lt;br /&gt;
os.environ[&#039;MAILMAN_WEB_CONFIG&#039;] = os.path.join(HOME, &#039;mailman&#039;, &#039;web&#039;, &#039;settings.py&#039;)&lt;br /&gt;
from mailman_web.wsgi import application&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun steht das Web Frontend unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Verfügung. Über die Django Administration sollte unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/admin/sites/site/1/change/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; die Domäne angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Mails an Mailman weiterleiten ==&lt;br /&gt;
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels &#039;&#039;.forward-Datei&#039;&#039; werden eingehende Mails an das Programm &amp;lt;code&amp;gt;msmtp&amp;lt;/code&amp;gt; weitergeleitet, welches diese per [https://de.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP] bei Mailman abliefert. msmtp ist auf den Managed Servern vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
 MM_LMTP_PORT=8024 # In Mailman Core konfigurierter Port&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOD &amp;gt;.forward+mailman&lt;br /&gt;
 &amp;quot;|/usr/bin/msmtp --host=localhost --port=$MM_LMTP_PORT --protocol=lmtp --read-envelope-from \$(echo \$ORIGINAL_RECIPIENT | sed &#039;s/+.\+@/@/&#039;)&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
&lt;br /&gt;
Der &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt; Befehl ist erforderlich, damit Mails mit &#039;&#039;Plus Addressing&#039;&#039; mit der eigentlichen Empfängeradresse bei Mailman ankommen.&lt;br /&gt;
&lt;br /&gt;
Für die Domain &amp;lt;code&amp;gt;lists.example.org&amp;lt;/code&amp;gt; wird in HSAdmin oder per &amp;lt;code&amp;gt;hssscript&amp;lt;/code&amp;gt; eine Catchall-Adresse mit &amp;lt;code&amp;gt;xyz00-lists+mailman&amp;lt;/code&amp;gt; als Ziel eingerichtet. Bei einer Catchall-Adresse wird als &amp;lt;code&amp;gt;localpart&amp;lt;/code&amp;gt; ein leerer String angegeben.&lt;br /&gt;
&lt;br /&gt;
== Dienste starten und überwachen ==&lt;br /&gt;
Für die beiden benötigten Dienste kann &#039;&#039;monit&#039;&#039; wie folgt konfiguriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir monit&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/.monitrc&lt;br /&gt;
set daemon 60&lt;br /&gt;
    with start delay 90&lt;br /&gt;
set httpd unixsocket $HOME/monit/monit.sock&lt;br /&gt;
    permission 600&lt;br /&gt;
    allow mailman:monit&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: monit@lists.example.org }&lt;br /&gt;
set alert admin@example.org&lt;br /&gt;
set logfile $HOME/monit/monit.log&lt;br /&gt;
set idfile $HOME/monit/monit.id&lt;br /&gt;
set pidfile $HOME/monit/monit.pid&lt;br /&gt;
set statefile $HOME/monit/monit.state&lt;br /&gt;
&lt;br /&gt;
check process mailman&lt;br /&gt;
    pidfile $HOME/mailman/core/master.pid&lt;br /&gt;
    start program = &amp;quot;$HOME/.local/bin/mailman start&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;$HOME/.local/bin/mailman stop&amp;quot;&lt;br /&gt;
    restart program = &amp;quot;$HOME/.local/bin/mailman restart&amp;quot;&lt;br /&gt;
&lt;br /&gt;
check process mailman-web-qcluster&lt;br /&gt;
    matching &amp;quot;mailman-web qcluster&amp;quot;&lt;br /&gt;
    start program = &amp;quot;/bin/bash -c &#039;nohup $HOME/.local/bin/mailman-web qcluster &amp;gt;&amp;gt;$HOME/mailman/web/logs/qcluster.log 2&amp;gt;&amp;amp;1 &amp;amp;&#039;&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/usr/bin/pkill -f &#039;mailman-web qcluster&#039;&amp;quot;&lt;br /&gt;
    depends on mailman&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dienste starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;monit&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für &amp;lt;code&amp;gt;mailman-web qcluster&amp;lt;/code&amp;gt; kann alternativ ein minütlich laufender Systemd Timer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Logrotation ==&lt;br /&gt;
Die Rotation der Logdateien kann so konfiguriert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD &amp;gt;~/logrotate.conf&lt;br /&gt;
compress&lt;br /&gt;
delaycompress&lt;br /&gt;
missingok&lt;br /&gt;
notifempty&lt;br /&gt;
dateext&lt;br /&gt;
&lt;br /&gt;
$HOME/monit/monit.log {&lt;br /&gt;
  rotate 1&lt;br /&gt;
  weekly&lt;br /&gt;
  maxsize 1M&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/core/logs/*.log {&lt;br /&gt;
  rotate 6&lt;br /&gt;
  daily&lt;br /&gt;
  sharedscripts&lt;br /&gt;
  postrotate&lt;br /&gt;
    $HOME/.local/bin/mailman reopen &amp;gt;/dev/null ||:&lt;br /&gt;
  endscript&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/web/logs/mailmanweb.log {&lt;br /&gt;
  rotate 6&lt;br /&gt;
  daily&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$HOME/mailman/web/logs/qcluster.log {&lt;br /&gt;
  rotate 1&lt;br /&gt;
  size 100k&lt;br /&gt;
  postrotate&lt;br /&gt;
    /usr/bin/monit restart mailman-web-qcluster &amp;gt;/dev/null ||:&lt;br /&gt;
  endscript&lt;br /&gt;
}&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: &amp;lt;code&amp;gt;qcluster.log&amp;lt;/code&amp;gt; wird hier nur bei Überschreiten der definierten Größe rotiert, um regelmäßige Mails von &#039;&#039;monit&#039;&#039; zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Cron Jobs ==&lt;br /&gt;
Für Mailman sind verschiedene Cron Jobs erforderlich. Zudem sollen nach einem Neustart die &amp;lt;code&amp;gt;monit&amp;lt;/code&amp;gt; Dienste gestartet werden und täglich eine Logrotation erfolgen. Die Einrichtung kann so erfolgen (eine bereits existierende crontab wird überschrieben):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;EOD | crontab -&lt;br /&gt;
MAILTO=admin@example.org&lt;br /&gt;
HOME=$HOME&lt;br /&gt;
PATH=$HOME/.local/bin:/usr/bin:/bin:/usr/sbin&lt;br /&gt;
&lt;br /&gt;
@reboot rm -f \$HOME/monit/monit.pid \$HOME/mailman/core/master.pid &amp;amp;&amp;amp; monit&lt;br /&gt;
&lt;br /&gt;
@daily logrotate -s \$HOME/.logrotate_state \$HOME/logrotate.conf&lt;br /&gt;
&lt;br /&gt;
# Send periodic digests.&lt;br /&gt;
@daily mailman digests --send&lt;br /&gt;
&lt;br /&gt;
* * * * * mailman-web runjobs minutely&lt;br /&gt;
2,17,32,47 * * * * mailman-web runjobs quarter_hourly&lt;br /&gt;
@hourly  mailman-web runjobs hourly&lt;br /&gt;
@daily   mailman-web runjobs daily&lt;br /&gt;
@weekly  mailman-web runjobs weekly&lt;br /&gt;
@monthly mailman-web runjobs monthly&lt;br /&gt;
@yearly  mailman-web runjobs yearly&lt;br /&gt;
EOD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soll eine existierende crontab nicht überschrieben werden, muss das Kommando &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; ausgeführt und die crontab entsprechend angepasst werden. (Dabei &amp;lt;code&amp;gt;\$HOME&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; mit dem Pfad des Benutzerverzeichnisses ersetzen.)&lt;br /&gt;
&lt;br /&gt;
== Liste anlegen ==&lt;br /&gt;
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;mailman create meine-erste-liste@lists.example.org # Alternativ über Web Frontend&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem müssen die E-Mail Adressen für die Mailingliste angelegt werden, im HSAdmin. Zum Beispiel für die Liste meine-erste-liste: meine-erste-liste, meine-erste-liste-join, meine-erste-liste-leave, meine-erste-liste-owner, für die Domain lists.example.org. Die E-Mails sollen in das Postfach gehen, wo mailman installiert ist.&lt;br /&gt;
Alternativ kann eine Catch-All Adresse eingerichtet werden, damit alle E-Mails an die Subdomain in das Postfach vom mailman gehen. Der Catch-All ist laut Postfix Regeln eine Adresse mit einem leeren lokalen Teil (siehe auch der Screenshot in der [[Sympa_installieren#Neue_Liste_einrichten|entsprechenden Anleitung von Sympa]]).&lt;br /&gt;
&lt;br /&gt;
== Die Selbst-Registrierung von Benutzern verhindern ==&lt;br /&gt;
&lt;br /&gt;
Per Default kann sich jede Person im Mailman3 ein Benutzerkonto anlegen. Wenn das nicht erwünscht ist, kann in der Datei &amp;lt;code&amp;gt;var/etc/settings.py&amp;lt;/code&amp;gt; die folgende Zeile hinzugefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ACCOUNT_ADAPTER = &#039;django_mailman3.views.user_adapter.DisableSignupAdapter&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es können in diesem Fall im Django Backend durch den Administrator Benutzerkonten angelegt werden, auf https://lists.example.org/admin/auth/user/&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Python-Pakete für die Aktualisierungen vorliegen ausgeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/mailman&lt;br /&gt;
pipenv update --outdated&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von [https://docs.mailman3.org/projects/mailman/en/latest/src/mailman/docs/NEWS.html Mailman]) zu lesen und auf relevante Änderungen zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Mailman stoppen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
monit stop mailman&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update der Pakete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pipenv update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ggf. Pip Cache löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pipenv --clear&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenbankmigrationen durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mailman-web makemigrations&lt;br /&gt;
mailman-web migrate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übersetzungen aktualisieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
for pofile in $(find $(pipenv --venv) -path &#039;*/locale/*/LC_MESSAGES/*.po&#039;); do&lt;br /&gt;
  mofile=${pofile/.po/.mo}&lt;br /&gt;
  if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then&lt;br /&gt;
    echo $pofile&lt;br /&gt;
    msgfmt $pofile -o $mofile -v&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Statische Dateien aktualisieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mailman-web collectstatic -c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend die Dienste wieder starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
monit start mailman&lt;br /&gt;
monit start mailman-web-qcluster&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Web Frontend neu starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/doms/lists.example.org/app-ssl/tmp&lt;br /&gt;
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://docs.mailman3.org/en/latest/ Offizielle Anleitung für Mailman3]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mailman3 Ansible Playbook für Hostsharing]&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:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7435</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7435"/>
		<updated>2025-10-02T08:12:13Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Beispiel Anwendungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Container Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Integration in Hostsharing Managed Platform ==&lt;br /&gt;
&lt;br /&gt;
=== Subdomain einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir haben bereits die Hauptdomain bei Hostsharing gebucht.&lt;br /&gt;
&lt;br /&gt;
Nun soll unsere Anwendung auf dem Container Server auf einer Subdomain laufen.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen einen Caddy Container, um Letsencrypt bereitszustellen (siehe in den Beispielen unten).&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung müssen wir das Zonefile anpassen, um die Subdomain per A und AAAA Eintrag auf den Container Server zu verweisen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;dig&amp;lt;/code&amp;gt; ermitteln wir die ipv4 und ipv6 Adressen unseres Container Servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t A +short vm4xxx.hostsharing.net&lt;br /&gt;
dig -t AAAA +short vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung, legen wir ein Zonefile an. Siehe auch die Anleitung im Handbuch: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doms/meinedomain.de/etc/pri.meinedomain.de&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
{DEFAULT_ZONEFILE}&lt;br /&gt;
&lt;br /&gt;
meinesubdomain      IN A       83.223.xx.xxx&lt;br /&gt;
meinesubdomain      IN AAAA    2a01:xx:xxxx::xxxx:xxxx:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tunnel zur Managed Datenbank einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir lassen die Anwendung auf dem Container Server laufen. Dort kann natürlich auch die Datenbank laufen, in einem eigenen Container.&lt;br /&gt;
&lt;br /&gt;
Wir haben aber auch Datenbanken in der Managed Umgebung von Hostsharing, mit allen Vorteilen (regelmäßiges Backup, usw.).&lt;br /&gt;
&lt;br /&gt;
Wenn wir eine managed Datenbank aus der Managed Umgebung auf dem Container Server einbinden wollen, sind folgende Schritte notwendig:&lt;br /&gt;
&lt;br /&gt;
* TODO Es muss ein Tunnel eingerichtet werden, damit die Datenbank vom Container Server aus erreichbar ist.&lt;br /&gt;
* TODO: Anpassungen an Docker Compose. Beispiel&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud High Performance Backend mit Caddy ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend&lt;br /&gt;
&lt;br /&gt;
=== OnlyOffice Documentserver ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/onlyoffice-document_server&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7434</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7434"/>
		<updated>2025-10-01T10:24:33Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Container Umgebung mit Caddy und Python Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Container Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Integration in Hostsharing Managed Platform ==&lt;br /&gt;
&lt;br /&gt;
=== Subdomain einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir haben bereits die Hauptdomain bei Hostsharing gebucht.&lt;br /&gt;
&lt;br /&gt;
Nun soll unsere Anwendung auf dem Container Server auf einer Subdomain laufen.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen einen Caddy Container, um Letsencrypt bereitszustellen (siehe in den Beispielen unten).&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung müssen wir das Zonefile anpassen, um die Subdomain per A und AAAA Eintrag auf den Container Server zu verweisen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;dig&amp;lt;/code&amp;gt; ermitteln wir die ipv4 und ipv6 Adressen unseres Container Servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t A +short vm4xxx.hostsharing.net&lt;br /&gt;
dig -t AAAA +short vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung, legen wir ein Zonefile an. Siehe auch die Anleitung im Handbuch: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doms/meinedomain.de/etc/pri.meinedomain.de&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
{DEFAULT_ZONEFILE}&lt;br /&gt;
&lt;br /&gt;
meinesubdomain      IN A       83.223.xx.xxx&lt;br /&gt;
meinesubdomain      IN AAAA    2a01:xx:xxxx::xxxx:xxxx:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tunnel zur Managed Datenbank einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir lassen die Anwendung auf dem Container Server laufen. Dort kann natürlich auch die Datenbank laufen, in einem eigenen Container.&lt;br /&gt;
&lt;br /&gt;
Wir haben aber auch Datenbanken in der Managed Umgebung von Hostsharing, mit allen Vorteilen (regelmäßiges Backup, usw.).&lt;br /&gt;
&lt;br /&gt;
Wenn wir eine managed Datenbank aus der Managed Umgebung auf dem Container Server einbinden wollen, sind folgende Schritte notwendig:&lt;br /&gt;
&lt;br /&gt;
* TODO Es muss ein Tunnel eingerichtet werden, damit die Datenbank vom Container Server aus erreichbar ist.&lt;br /&gt;
* TODO: Anpassungen an Docker Compose. Beispiel&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;br /&gt;
&lt;br /&gt;
=== Nextcloud High Performance Backend mit Caddy ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nextcloud-high_performance_backend&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7433</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7433"/>
		<updated>2025-10-01T07:01:15Z</updated>

		<summary type="html">&lt;p&gt;Tim: Integration in Managed Platform&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Container Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm4xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Integration in Hostsharing Managed Platform ==&lt;br /&gt;
&lt;br /&gt;
=== Subdomain einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir haben bereits die Hauptdomain bei Hostsharing gebucht.&lt;br /&gt;
&lt;br /&gt;
Nun soll unsere Anwendung auf dem Container Server auf einer Subdomain laufen.&lt;br /&gt;
&lt;br /&gt;
Wir benutzen einen Caddy Container, um Letsencrypt bereitszustellen (siehe in den Beispielen unten).&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung müssen wir das Zonefile anpassen, um die Subdomain per A und AAAA Eintrag auf den Container Server zu verweisen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;dig&amp;lt;/code&amp;gt; ermitteln wir die ipv4 und ipv6 Adressen unseres Container Servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
dig -t A +short vm4xxx.hostsharing.net&lt;br /&gt;
dig -t AAAA +short vm4xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Managed Umgebung, legen wir ein Zonefile an. Siehe auch die Anleitung im Handbuch: https://www.hostsharing.net/doc/managed-operations-platform/zonefile/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doms/meinedomain.de/etc/pri.meinedomain.de&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
{DEFAULT_ZONEFILE}&lt;br /&gt;
&lt;br /&gt;
meinesubdomain      IN A       83.223.xx.xxx&lt;br /&gt;
meinesubdomain      IN AAAA    2a01:xx:xxxx::xxxx:xxxx:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tunnel zur Managed Datenbank einrichten ===&lt;br /&gt;
&lt;br /&gt;
Wir lassen die Anwendung auf dem Container Server laufen. Dort kann natürlich auch die Datenbank laufen, in einem eigenen Container.&lt;br /&gt;
&lt;br /&gt;
Wir haben aber auch Datenbanken in der Managed Umgebung von Hostsharing, mit allen Vorteilen (regelmäßiges Backup, usw.).&lt;br /&gt;
&lt;br /&gt;
Wenn wir eine managed Datenbank aus der Managed Umgebung auf dem Container Server einbinden wollen, sind folgende Schritte notwendig:&lt;br /&gt;
&lt;br /&gt;
* TODO Es muss ein Tunnel eingerichtet werden, damit die Datenbank vom Container Server aus erreichbar ist.&lt;br /&gt;
* TODO: Anpassungen an Docker Compose. Beispiel&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7420</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7420"/>
		<updated>2025-09-03T06:19:53Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* 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;
&amp;lt;/syntaxhighlight&amp;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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7419</id>
		<title>Speicherbelegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Speicherbelegung&amp;diff=7419"/>
		<updated>2025-09-03T06:18:50Z</updated>

		<summary type="html">&lt;p&gt;Tim: 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 dein Paket xyz00:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
find /tmp/user/$UID&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7417</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7417"/>
		<updated>2025-09-01T09:29:49Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Erste Schritte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Beispiel Anwendungen ==&lt;br /&gt;
=== Container Umgebung mit Nginx und Certbot ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/nginx-certbot&lt;br /&gt;
=== Container Umgebung mit Caddy und Python Anwendung ===&lt;br /&gt;
TODO siehe https://codeberg.org/tpokorra/hs.compose/src/branch/main/caddy-test&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7416</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7416"/>
		<updated>2025-09-01T09:27:20Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Hilfreiche Befehle für Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Podman ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7415</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7415"/>
		<updated>2025-09-01T09:26:54Z</updated>

		<summary type="html">&lt;p&gt;Tim: hilfreiche Befehle für Docker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# in einem Ordner ausführen, wo eine Datei mit dem Namen docker-compose.yml liegt, um die Umgebung zu bauen und zu starten:&lt;br /&gt;
docker compose up --detach&lt;br /&gt;
&lt;br /&gt;
# zeige alle laufenden Container&lt;br /&gt;
docker ps -a&lt;br /&gt;
&lt;br /&gt;
# zeige die Logs eines Containers&lt;br /&gt;
docker logs mein-container&lt;br /&gt;
&lt;br /&gt;
# wechsle in eine Shell im Container&lt;br /&gt;
docker exec -t -i mein-container /bin/sh&lt;br /&gt;
&lt;br /&gt;
# Images aktualisieren&lt;br /&gt;
docker compose pull&lt;br /&gt;
&lt;br /&gt;
# Containerumgebung stoppen und löschen&lt;br /&gt;
docker compose down&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hilfreiche Befehle für Docker ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7414</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7414"/>
		<updated>2025-09-01T09:09:50Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Erste Schritte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7413</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7413"/>
		<updated>2025-09-01T09:07:19Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root-Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root-Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7412</id>
		<title>Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Container&amp;diff=7412"/>
		<updated>2025-09-01T09:06:52Z</updated>

		<summary type="html">&lt;p&gt;Tim: erste Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit, einen Container Server mit Docker oder mit Podman zu buchen.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Managed Umgebung, also ohne Root-Rechte, wo Docker bzw. Podman rootless ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Falls vom Installationsskript einer Anwendung Root Rechte erforderlich sind, kann entweder versucht werden, dies anzupassen, oder es kann ein Cloud Server gebucht werden, wo der Benutzer Root Rechte hat.&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Bei der Bestellung des Cloud Servers sollte direkt der Public SSH Key mitgegeben werden, am besten bereits nach dem Ed25519-Standard, siehe auch [https://www.heise.de/tipps-tricks/SSH-Key-erstellen-so-geht-s-4400280.html].&lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt über den Benutzer tallyman über SSH auf den Container Server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh tallyman@vm2xxx.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einen &amp;quot;Hello World&amp;quot; Docker Container zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tallyman@vm2xxx:~$ docker run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Entsprechend sieht der Befehl für Podman aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
podman run hello-world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=7411</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=7411"/>
		<updated>2025-08-27T08:30:46Z</updated>

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

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

		<summary type="html">&lt;p&gt;Tim: /* Am Beispiel von 3.4.5 auf 3.4.7 */&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;
==== Am Beispiel von 3.4.5 auf 3.4.7 ====&lt;br /&gt;
&lt;br /&gt;
# Im Web-Backend unter Administration-&amp;gt;Backups-&amp;gt; Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)&lt;br /&gt;
# Backup&lt;br /&gt;
# Die lokalen Änderungen sichern:&lt;br /&gt;
# cd discourse&lt;br /&gt;
# git diff v3.4.5 &amp;gt; diff-3.4.5.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.4.7 v3.4.7&lt;br /&gt;
# evtl. Änderungen aus diff-3.4.1.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.4.5.txt&lt;br /&gt;
# git commit -a -m &amp;quot;spezifische Änderungen für diese Instanz&amp;quot; --no-verify&lt;br /&gt;
# Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.3.8&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.8&amp;quot; &amp;gt; .ruby-version&lt;br /&gt;
# installiere Node 22: https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/install-nodejs.sh&lt;br /&gt;
# source ~/.profile&lt;br /&gt;
# gem update --system&lt;br /&gt;
# bundle&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-9&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# 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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7408</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7408"/>
		<updated>2025-08-23T04:37:38Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Update: bei old-stable Version bleiben */&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 noch nicht ausprobiert (siehe https://nextcloud-talk.readthedocs.io/en/latest/quick-install/)&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://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;br /&gt;
[[Kategorie:Nextcloud]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7407</id>
		<title>Znuny installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7407"/>
		<updated>2025-08-20T12:53:48Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[https://www.znuny.org/de Znuny] ist ein Open Source Ticketing System, und ist als Community Fork von OTRS entstanden. Das Versprechen ist, ein Ticket System mit Langzeitunterstützung (LTS) zu bieten.&lt;br /&gt;
&lt;br /&gt;
Znuny ist in Perl geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Znuny 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/znuny&lt;br /&gt;
&lt;br /&gt;
== Updates ==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es eine Übersicht über die aktuellen Versionen von Znuny: https://www.znuny.org/de/releases&lt;br /&gt;
&lt;br /&gt;
Updates werden hier beschrieben:&lt;br /&gt;
* auf Znuny 6.5: https://doc.znuny.org/znuny_lts/releases/installupdate/update/update-6.5.html&lt;br /&gt;
&lt;br /&gt;
Vor der Durchführung eines Updates auf dem Produktivsystem sollte ein Backup erstellt werden, das im Fall eines Problems wiederhergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Cronjob sollte deaktiviert werden, und im Administrationsbereich von Znuny sollte der Wartungsmodus aktiviert werden (unter SystemWartung).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
#    Kommentar einfügen vor:&lt;br /&gt;
&lt;br /&gt;
#*/5 * * * *    $HOME/otrs/bin/otrs.Daemon.pl start &amp;amp;&amp;gt;/dev/null&lt;br /&gt;
$HOME/otrs/bin/otrs.Daemon.pl stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss der Tarball der gewünschten Version von Znuny heruntergeladen werden, und entpackt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei (Kernel/Config.pm) muss aus dem alten Verzeichnis in das neue Verzeichnis kopiert werden, ebenso evtl. Dateien in var/article. Cronjobs sollten ebenfalls von var/cron ins neue Verzeichnis kopiert werden.&lt;br /&gt;
&lt;br /&gt;
Dann wird der symbolische Link gelöscht, und ein neuer symbolischer Link auf das neue Verzeichnis eingerichtet, zum Beispiel so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm Znuny &amp;amp;&amp;amp; ln -s znuny-6.5.6 Znuny&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach werden die folgenden Befehle ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd Znuny&lt;br /&gt;
./bin/otrs.Console.pl Maint::Database::Check&lt;br /&gt;
./bin/otrs.CheckModules.pl --all&lt;br /&gt;
./scripts/MigrateToZnuny6_5.pl&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::ReinstallAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können die Cronjobs wieder aktiviert werden, und der Wartungsmodus kann beendet werden.&lt;br /&gt;
&lt;br /&gt;
Gegebenenfalls müssen die Prozess-Tickets nach einem Update wieder in Betrieb genommen werden, in der Admin-Oberfläche unter Prozessmanagement.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
=== Prozesse ===&lt;br /&gt;
&lt;br /&gt;
Es lassen sich beliebige Prozesse einrichten.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch ein Blogbeitrag inkl. Video unseres Mitglieds Timotheus Pokorra:  https://solidevereine.de/blog/2023/06/13/2023-06-znuny_prozess/&lt;br /&gt;
&lt;br /&gt;
=== Eingehende E-Mails in Queues sortieren ===&lt;br /&gt;
&lt;br /&gt;
Eingehende E-Mails können nach verschiedenen Kriterien mit Procmail in verschiedene Queues einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Das sieht zum Beispiel für eine Queue Service mit Subqueue Letsencrypt so aus, in der Datei &amp;lt;code&amp;gt;.procmailrc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
:0&lt;br /&gt;
* ^From: .+expiry@letsencrypt.org&lt;br /&gt;
|${HOME}/otrs/bin/otrs.Console.pl Maint::PostMaster::Read --target-queue Service::Letsencrypt --quiet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatische Antwort bei eingehenden E-Mails ===&lt;br /&gt;
&lt;br /&gt;
Normalerweise haben wir eine automatisierte Antwort für eingehende E-Mails (&amp;quot;Wir haben Ihre Anfrage erhalten, und melden uns bald bei Ihnen&amp;quot;). Das konfigurieren wir in den Einstellungen bei &#039;&#039;&#039;Auto Response&#039;&#039;&#039;/&#039;&#039;&#039;Automatische Antworten&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von manchen Dienstleistern erhalten wir E-Mails im Ticketsystem, und wollen dort keine automatisierte Antwort schicken. &lt;br /&gt;
Um das umzusetzen, bearbeiten wir in den Einstellungen bei Systemkonfiguration den Eintrag &#039;&#039;&#039;SendNoAutoResponseRegExp&#039;&#039;&#039;, wo wir einen regulären Ausdruck definieren können.&lt;br /&gt;
&lt;br /&gt;
siehe auch https://doc.znuny.org/znuny_lts/admin/communication/autoresponses/index.html&lt;br /&gt;
&lt;br /&gt;
== Fehlersuche ==&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei ist in &amp;lt;code&amp;gt;Kernel/Config.pm&amp;lt;/code&amp;gt;. Die Default Einstellungen sind zu finden in &amp;lt;code&amp;gt;Kernel/Config/Defaults.pm&amp;lt;/code&amp;gt; (siehe auch [https://github.com/znuny/Znuny/blob/dev/Kernel/Config/Defaults.pm])&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird in das SysLog (System Log) des Users geloggt. Dieses Log kann so gelesen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
journalctl --user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.znuny.org/de Webseite des Znuny Projekts]&lt;br /&gt;
*[https://github.com/znuny/Znuny Quelltext von Znuny bei Github]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/znuny 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:Helpdesk]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7406</id>
		<title>Znuny installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7406"/>
		<updated>2025-08-20T12:49:42Z</updated>

		<summary type="html">&lt;p&gt;Tim: Verschiedene Punkte unter dem Thema Einrichtung zusammengefasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[https://www.znuny.org/de Znuny] ist ein Open Source Ticketing System, und ist als Community Fork von OTRS entstanden. Das Versprechen ist, ein Ticket System mit Langzeitunterstützung (LTS) zu bieten.&lt;br /&gt;
&lt;br /&gt;
Znuny ist in Perl geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Znuny 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/znuny&lt;br /&gt;
&lt;br /&gt;
== Updates ==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es eine Übersicht über die aktuellen Versionen von Znuny: https://www.znuny.org/de/releases&lt;br /&gt;
&lt;br /&gt;
Updates werden hier beschrieben:&lt;br /&gt;
* auf Znuny 6.5: https://doc.znuny.org/znuny_lts/releases/installupdate/update/update-6.5.html&lt;br /&gt;
&lt;br /&gt;
Vor der Durchführung eines Updates auf dem Produktivsystem sollte ein Backup erstellt werden, das im Fall eines Problems wiederhergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Cronjob sollte deaktiviert werden, und im Administrationsbereich von Znuny sollte der Wartungsmodus aktiviert werden (unter SystemWartung).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
#    Kommentar einfügen vor:&lt;br /&gt;
&lt;br /&gt;
#*/5 * * * *    $HOME/otrs/bin/otrs.Daemon.pl start &amp;amp;&amp;gt;/dev/null&lt;br /&gt;
$HOME/otrs/bin/otrs.Daemon.pl stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss der Tarball der gewünschten Version von Znuny heruntergeladen werden, und entpackt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei (Kernel/Config.pm) muss aus dem alten Verzeichnis in das neue Verzeichnis kopiert werden, ebenso evtl. Dateien in var/article. Cronjobs sollten ebenfalls von var/cron ins neue Verzeichnis kopiert werden.&lt;br /&gt;
&lt;br /&gt;
Dann wird der symbolische Link gelöscht, und ein neuer symbolischer Link auf das neue Verzeichnis eingerichtet, zum Beispiel so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm Znuny &amp;amp;&amp;amp; ln -s znuny-6.5.6 Znuny&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach werden die folgenden Befehle ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd Znuny&lt;br /&gt;
./bin/otrs.Console.pl Maint::Database::Check&lt;br /&gt;
./bin/otrs.CheckModules.pl --all&lt;br /&gt;
./scripts/MigrateToZnuny6_5.pl&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::ReinstallAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können die Cronjobs wieder aktiviert werden, und der Wartungsmodus kann beendet werden.&lt;br /&gt;
&lt;br /&gt;
Gegebenenfalls müssen die Prozess-Tickets nach einem Update wieder in Betrieb genommen werden, in der Admin-Oberfläche unter Prozessmanagement.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
=== Prozesse ===&lt;br /&gt;
&lt;br /&gt;
Es lassen sich beliebige Prozesse einrichten.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch ein Blogbeitrag inkl. Video unseres Mitglieds Timotheus Pokorra:  https://solidevereine.de/blog/2023/06/13/2023-06-znuny_prozess/&lt;br /&gt;
&lt;br /&gt;
=== Eingehende E-Mails in Queues sortieren ===&lt;br /&gt;
&lt;br /&gt;
Eingehende E-Mails können nach verschiedenen Kriterien mit Procmail in verschiedene Queues einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Das sieht zum Beispiel für eine Queue Service mit Subqueue Letsencrypt so aus, in der Datei &amp;lt;code&amp;gt;.procmailrc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
:0&lt;br /&gt;
* ^From: .+expiry@letsencrypt.org&lt;br /&gt;
|${HOME}/otrs/bin/otrs.Console.pl Maint::PostMaster::Read --target-queue Service::Letsencrypt --quiet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatische Antwort bei eingehenden E-Mails ===&lt;br /&gt;
&lt;br /&gt;
Normalerweise haben wir eine automatisierte Antwort für eingehende E-Mails (&amp;quot;Wir haben Ihre Anfrage erhalten, und melden uns bald bei Ihnen&amp;quot;). Das konfigurieren wir in den Einstellungen bei &#039;&#039;&#039;Auto Response&#039;&#039;&#039;/&#039;&#039;&#039;Automatische Antworten&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von manchen Dienstleistern erhalten wir E-Mails im Ticketsystem, und wollen dort keine automatisierte Antwort schicken. &lt;br /&gt;
Um das umzusetzen, bearbeiten wir in den Einstellungen bei Systemkonfiguration den Eintrag &#039;&#039;&#039;SendNoAutoResponseRegExp&#039;&#039;&#039;, wo wir einen regulären Ausdruck definieren können.&lt;br /&gt;
&lt;br /&gt;
siehe auch https://doc.znuny.org/znuny_lts/admin/communication/autoresponses/index.html&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.znuny.org/de Webseite des Znuny Projekts]&lt;br /&gt;
*[https://github.com/znuny/Znuny Quelltext von Znuny bei Github]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/znuny 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:Helpdesk]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7405</id>
		<title>Znuny installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Znuny_installieren&amp;diff=7405"/>
		<updated>2025-08-20T07:51:01Z</updated>

		<summary type="html">&lt;p&gt;Tim: Automatische Antwort bei eingehenden E-Mails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[https://www.znuny.org/de Znuny] ist ein Open Source Ticketing System, und ist als Community Fork von OTRS entstanden. Das Versprechen ist, ein Ticket System mit Langzeitunterstützung (LTS) zu bieten.&lt;br /&gt;
&lt;br /&gt;
Znuny ist in Perl geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Technische Details ==&lt;br /&gt;
Es gibt ein Ansible Skript, das die Installationsschritte für Znuny 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/znuny&lt;br /&gt;
&lt;br /&gt;
== Updates ==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es eine Übersicht über die aktuellen Versionen von Znuny: https://www.znuny.org/de/releases&lt;br /&gt;
&lt;br /&gt;
Updates werden hier beschrieben:&lt;br /&gt;
* auf Znuny 6.5: https://doc.znuny.org/znuny_lts/releases/installupdate/update/update-6.5.html&lt;br /&gt;
&lt;br /&gt;
Vor der Durchführung eines Updates auf dem Produktivsystem sollte ein Backup erstellt werden, das im Fall eines Problems wiederhergestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Cronjob sollte deaktiviert werden, und im Administrationsbereich von Znuny sollte der Wartungsmodus aktiviert werden (unter SystemWartung).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
#    Kommentar einfügen vor:&lt;br /&gt;
&lt;br /&gt;
#*/5 * * * *    $HOME/otrs/bin/otrs.Daemon.pl start &amp;amp;&amp;gt;/dev/null&lt;br /&gt;
$HOME/otrs/bin/otrs.Daemon.pl stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss der Tarball der gewünschten Version von Znuny heruntergeladen werden, und entpackt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei (Kernel/Config.pm) muss aus dem alten Verzeichnis in das neue Verzeichnis kopiert werden, ebenso evtl. Dateien in var/article. Cronjobs sollten ebenfalls von var/cron ins neue Verzeichnis kopiert werden.&lt;br /&gt;
&lt;br /&gt;
Dann wird der symbolische Link gelöscht, und ein neuer symbolischer Link auf das neue Verzeichnis eingerichtet, zum Beispiel so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm Znuny &amp;amp;&amp;amp; ln -s znuny-6.5.6 Znuny&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach werden die folgenden Befehle ausgeführt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd Znuny&lt;br /&gt;
./bin/otrs.Console.pl Maint::Database::Check&lt;br /&gt;
./bin/otrs.CheckModules.pl --all&lt;br /&gt;
./scripts/MigrateToZnuny6_5.pl&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::ReinstallAll&lt;br /&gt;
./bin/otrs.Console.pl Admin::Package::UpgradeAll&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können die Cronjobs wieder aktiviert werden, und der Wartungsmodus kann beendet werden.&lt;br /&gt;
&lt;br /&gt;
Gegebenenfalls müssen die Prozess-Tickets nach einem Update wieder in Betrieb genommen werden, in der Admin-Oberfläche unter Prozessmanagement.&lt;br /&gt;
&lt;br /&gt;
== Prozesse ==&lt;br /&gt;
&lt;br /&gt;
Es lassen sich beliebige Prozesse einrichten.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch ein Blogbeitrag inkl. Video unseres Mitglieds Timotheus Pokorra:  https://solidevereine.de/blog/2023/06/13/2023-06-znuny_prozess/&lt;br /&gt;
&lt;br /&gt;
== Eingehende E-Mails in Queues sortieren ==&lt;br /&gt;
&lt;br /&gt;
Eingehende E-Mails können nach verschiedenen Kriterien mit Procmail in verschiedene Queues einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
Das sieht zum Beispiel für eine Queue Service mit Subqueue Letsencrypt so aus, in der Datei &amp;lt;code&amp;gt;.procmailrc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
:0&lt;br /&gt;
* ^From: .+expiry@letsencrypt.org&lt;br /&gt;
|${HOME}/otrs/bin/otrs.Console.pl Maint::PostMaster::Read --target-queue Service::Letsencrypt --quiet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Automatische Antwort bei eingehenden E-Mails ==&lt;br /&gt;
&lt;br /&gt;
Normalerweise haben wir eine automatisierte Antwort für eingehende E-Mails (&amp;quot;Wir haben Ihre Anfrage erhalten, und melden uns bald bei Ihnen&amp;quot;). Das konfigurieren wir in den Einstellungen bei &#039;&#039;&#039;Auto Response&#039;&#039;&#039;/&#039;&#039;&#039;Automatische Antworten&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Von manchen Dienstleistern erhalten wir E-Mails im Ticketsystem, und wollen dort keine automatisierte Antwort schicken. &lt;br /&gt;
Um das umzusetzen, bearbeiten wir in den Einstellungen bei Systemkonfiguration den Eintrag &#039;&#039;&#039;SendNoAutoResponseRegExp&#039;&#039;&#039;, wo wir einen regulären Ausdruck definieren können.&lt;br /&gt;
&lt;br /&gt;
siehe auch https://doc.znuny.org/znuny_lts/admin/communication/autoresponses/index.html&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.znuny.org/de Webseite des Znuny Projekts]&lt;br /&gt;
*[https://github.com/znuny/Znuny Quelltext von Znuny bei Github]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/znuny 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:Helpdesk]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7383</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7383"/>
		<updated>2025-06-11T20:44:08Z</updated>

		<summary type="html">&lt;p&gt;Tim: Beispiel Cryptpad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
=== Cryptpad als Beispiel für SetEnvIf und env in Headern ===&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zum vorherigen Beispiel ist die .htaccess Datei von Cryptpad noch komplexer, siehe [[Cryptpad#Webserver_Konfiguration]].&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel können Umgebungsvariablen auch wieder zurückgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
SetEnvIfNoCase Host ^(?!sandbox\.).*$ !SET_UNSAFE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und Header können gesetzt werden, abhängig davon ob die Umgebungsvariable gesetzt wurde oder nicht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
Header Set DebugAllowAllOrigins &amp;quot;allowall&amp;quot; env=ALLOW_ALL_ORIGINS&lt;br /&gt;
Header Set DebugAllowOrigins &amp;quot;sandboxonly&amp;quot; env=!ALLOW_ALL_ORIGINS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beachte: &amp;lt;code&amp;gt;SetEnv&amp;lt;/code&amp;gt; kann in diesem Fall nicht eingesetzt werden, der Wert der Variablen steht einfach noch nicht zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das geht nicht&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
SetEnv MYTEST true&lt;br /&gt;
&amp;lt;If &amp;quot;%{ENV:MYTEST} == &#039;true&#039;&amp;quot;&amp;gt;&lt;br /&gt;
Header Set DebugMyTest1 &amp;quot;DebugMyTest1&amp;quot;&lt;br /&gt;
&amp;lt;/If&amp;gt;&lt;br /&gt;
Header Set DebugMyTest2 &amp;quot;%{ENV:MYTEST}e&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/$1 [last]&lt;br /&gt;
RewriteRule &amp;quot;/(.*)$&amp;quot; https://www.hostsharing.net/alles/$1 [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test -I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
Location: https://www.hostsharing.net/push/test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cryptpad&amp;diff=7382</id>
		<title>Cryptpad</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cryptpad&amp;diff=7382"/>
		<updated>2025-06-11T20:33:52Z</updated>

		<summary type="html">&lt;p&gt;Tim: Refactoring, mit angepasster .htaccess&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cryptpad =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cryptpad&#039;&#039;&#039; ist ein Online-Office, dass in erster Linie im Internet-Browser zu bedienen ist. Das Alleinstellungsmerkmal ist die &#039;&#039;&#039;Ende-zu-Ende-Verschlüsselung&#039;&#039;&#039; aller Dokumente. Die Entschlüsselung und die Verschlüsselung erfolgen im Browser. Auf dem Server sind keinerlei lesbare Daten abgelegt.&lt;br /&gt;
&lt;br /&gt;
Cryptpad bietet Editoren für formatierte &#039;&#039;&#039;Textdokumente&#039;&#039;&#039; (im HTML-Format) und für &#039;&#039;&#039;Markdown-Dateien&#039;&#039;&#039; und andere Textdateien. Der Anwendungsfall der &#039;&#039;&#039;Tabellenkalkulation&#039;&#039;&#039; wird durch Onlyoffice-Tabellen abgedeckt. Präsentationen können mit Hilfe von Markdown erstellt werden. Bilder und PDF-Dokumente können in die Umgebung hochgeladen und im Browser betrachtet werden. Ein &#039;&#039;&#039;Kalender&#039;&#039;&#039; und ein &#039;&#039;&#039;Kanbanboard&#039;&#039;&#039; zur Aufgabenverwaltung vervollständigen das Angebot.&lt;br /&gt;
&lt;br /&gt;
Das Projekt stellt eine gute [https://docs.cryptpad.fr/de/admin_guide/installation.html Installationsanleitung] bereit. Leider ist die Konfiguration des Webservers nur für NGinX dokumentiert, so dass für die Konfiguration des Apache Webserver einige Experimente notwendig wurden.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Mitglieder, die einen Managed Webspace im Shared Hosting nutzen, müssen für ihre Cryptpad-Installation einen &amp;quot;eigenen Serverdienst&amp;quot; beim Hostsharing-Service anmelden. Diese Option ist im Shared Hosting kostenpflichtig. Für den Serverdienst werden zwei IP-Ports mit dem Server vereinbart. Im Beispiel werden Ports &#039;30001&#039; und &#039;30002&#039; genutzt.&lt;br /&gt;
&lt;br /&gt;
Für die Installation werden mit Hilfe von HSAdmin ein User (hier: &#039;xyz00-cryptpad&#039;) und eine Domain angelegt (hier: &#039;cryptpad.hs-example.de&#039;). Die Entwickler empfehlen die Nutzung von zwei Domains für eine Cryptpad Installation. Wir nutzen hier eine &#039;leichtgewichtige&#039; Subdomain &#039;sandbox.cryptpad.hs-example.de&#039;, die bei Hostsharing ohne weitere Konfiguration nutzbar ist. &lt;br /&gt;
&lt;br /&gt;
Für die aktuelle Version wird Node LTS (Version 22.x) empfohlen. Zur Installation (erfolgt weiter unten) siehe&lt;br /&gt;
[[NodeJS]].&lt;br /&gt;
&lt;br /&gt;
== Webserver Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Aufschalten der Domain &#039;cryptpad.hs-example.de&#039; passen wir die generierte Verzeichnisstruktur der Domain wie folgt an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/cryptpad.hs-example.de&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl/.htaccess&lt;br /&gt;
mkdir subs/sandbox subs-ssl/sandbox&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In die Verzeichnisse &#039;subs/sandbox&#039;, &#039;htdocs&#039;, &#039;subs-ssl/sandbox&#039; und &#039;htdocs-ssl&#039; werden jeweils Dateien mit dem Namen &#039;.htaccess&#039; zur Konfiguration des Apache Webserver abgelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# cd ~/doms/cryptpad.hs-example.de&lt;br /&gt;
# cat subs/sandbox/.htaccess&lt;br /&gt;
&lt;br /&gt;
Redirect permanent / https://sandbox.cryptpad.hs-example.de/&lt;br /&gt;
&lt;br /&gt;
# cd ~/doms/cryptpad.hs-example.de&lt;br /&gt;
# cat subs-ssl/sandbox/.htaccess&lt;br /&gt;
&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&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:30002%{REQUEST_URI}  [proxy]&lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:30001%{REQUEST_URI} [proxy,last]&lt;br /&gt;
&lt;br /&gt;
# cd ~/doms/cryptpad.hs-example.de&lt;br /&gt;
# cat htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /   &lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:30002%{REQUEST_URI}  [proxy]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:30001%{REQUEST_URI} [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere &#039;.htaccess&#039;-Datei liegt direkt im Hauptverzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
* Beachte die überlangen Zeilen!&lt;br /&gt;
* Wir orientieren uns an der Beispiel Konfiguration des NGinx Servers vom Cryptpad Projekt: [https://github.com/cryptpad/cryptpad/blob/main/docs/example-advanced.nginx.conf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# cd ~/doms/cryptpad.hs-example.de&lt;br /&gt;
# cat .htaccess &lt;br /&gt;
&lt;br /&gt;
# OnlyOffice fonts may be loaded from both domains&lt;br /&gt;
SetEnvIf REQUEST_URI ^/common/onlyoffice/.*/fonts/.*$ ALLOW_ALL_ORIGINS&lt;br /&gt;
Header Set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=ALLOW_ALL_ORIGINS&lt;br /&gt;
Header Set Access-Control-Allow-Origin &amp;quot;https://sandbox.cryptpad.hs-example.de&amp;quot; env=!ALLOW_ALL_ORIGINS&lt;br /&gt;
&lt;br /&gt;
Header Set Access-Control-Allow-Methods &amp;quot;GET, POST, OPTIONS&amp;quot;&lt;br /&gt;
Header Set Access-Control-Allow-Headers &amp;quot;DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range&amp;quot;&lt;br /&gt;
Header Set Access-Control-Max-Age &amp;quot;1728000&amp;quot;&lt;br /&gt;
Header Set X-XSS-Protection &amp;quot;1; mode=block&amp;quot;&lt;br /&gt;
Header Set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
Header Set Cross-Origin-Resource-Policy &amp;quot;cross-origin&amp;quot;&lt;br /&gt;
Header Set Cross-Origin-Embedder-Policy &amp;quot;require-corp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# the following assets are loaded via the sandbox domain&lt;br /&gt;
# they unfortunately still require exceptions to the sandboxing to work correctly.&lt;br /&gt;
# if ($uri ~ ^/(?:sheet|doc|presentation)/inner.html) { set $unsafe 1; }&lt;br /&gt;
# if ($uri ~ ^/common/onlyoffice/.*/.*\.html) { set $unsafe 1; }&lt;br /&gt;
# if ($uri ~ ^/common/onlyoffice/dist/.*/sdkjs/common/spell/spell/spell.js.*$) { set $unsafe 1; }&lt;br /&gt;
SetEnvIf REQUEST_URI ^/(sheet|doc|presentation)/inner\.html SET_UNSAFE&lt;br /&gt;
SetEnvIf REQUEST_URI ^/common/onlyoffice/.*/.*\.html SET_UNSAFE&lt;br /&gt;
SetEnvIf REQUEST_URI ^/common/onlyoffice/dist/.*/sdkjs/common/spell/spell/spell.js.* SET_UNSAFE&lt;br /&gt;
&lt;br /&gt;
# everything except the sandbox domain is a privileged scope, as they might be used to handle keys&lt;br /&gt;
# if ($host != $sandbox_domain) { set $unsafe 0; }&lt;br /&gt;
SetEnvIfNoCase Host ^sandbox.*$ IS_SANDBOX&lt;br /&gt;
SetEnvIfNoCase Host ^(?!sandbox\.).*$ NOT_SANDBOX&lt;br /&gt;
SetEnvIfNoCase Host ^(?!sandbox\.).*$ !SET_UNSAFE&lt;br /&gt;
&lt;br /&gt;
# this iframe is an exception. Office file formats are converted outside of the sandboxed scope&lt;br /&gt;
# because of bugs in Chromium-based browsers that incorrectly ignore headers that are supposed to enable&lt;br /&gt;
# the use of some modern APIs that we require when javascript is run in a cross-origin context.&lt;br /&gt;
# We&#039;ve applied other sandboxing techniques to mitigate the risk of running WebAssembly in this privileged scope&lt;br /&gt;
# if ($uri ~ ^/unsafeiframe/inner\.html) { set $unsafe 1; }&lt;br /&gt;
SetEnvIf REQUEST_URI ^/unsafeiframe/inner\.html SET_UNSAFE=1&lt;br /&gt;
&lt;br /&gt;
# !SET_UNSAFE: script-src without exceptions&lt;br /&gt;
Header Set Content-Security-Policy &amp;quot;default-src &#039;none&#039;; child-src https://cryptpad.hs-example.de; worker-src &#039;self&#039;; media-src blob:; style-src &#039;unsafe-inline&#039; &#039;self&#039; https://cryptpad.hs-example.de; script-src &#039;self&#039; resource: https://cryptpad.hs-example.de; connect-src &#039;self&#039; https://cryptpad.hs-example.de blob: wss://cryptpad.hs-example.de https://sandbox.cryptpad.hs-example.de; font-src &#039;self&#039; data: https://cryptpad.hs-example.de; img-src &#039;self&#039; data: blob: https://cryptpad.hs-example.de; frame-src &#039;self&#039; https://sandbox.cryptpad.hs-example.de blob:; frame-ancestors &#039;self&#039; https: vector:&amp;quot; env=!SET_UNSAFE&lt;br /&gt;
# SET_UNSAFE: script-src with unsafe exceptions&lt;br /&gt;
Header Set Content-Security-Policy &amp;quot;default-src &#039;none&#039;; child-src https://cryptpad.hs-example.de; worker-src &#039;self&#039;; media-src blob:; style-src &#039;unsafe-inline&#039; &#039;self&#039; https://cryptpad.hs-example.de; script-src &#039;self&#039; &#039;unsafe-eval&#039; &#039;unsafe-inline&#039; resource: https://cryptpad.hs-example.de; connect-src &#039;self&#039; https://cryptpad.hs-example.de blob: wss://cryptpad.hs-example.de https://sandbox.cryptpad.hs-example.de; font-src &#039;self&#039; data: https://cryptpad.hs-example.de; img-src &#039;self&#039; data: blob: https://cryptpad.hs-example.de; frame-src &#039;self&#039; https://sandbox.cryptpad.hs-example.de blob:; frame-ancestors &#039;self&#039; https: vector:&amp;quot; env=SET_UNSAFE&lt;br /&gt;
&lt;br /&gt;
# for debugging&lt;br /&gt;
Header Set DebugAllowAllOrigins &amp;quot;allowall&amp;quot; env=ALLOW_ALL_ORIGINS&lt;br /&gt;
Header Set DebugAllowOrigins &amp;quot;sandboxonly&amp;quot; env=!ALLOW_ALL_ORIGINS&lt;br /&gt;
Header Set DebugSetUnsafe &amp;quot;unsafe&amp;quot; env=SET_UNSAFE&lt;br /&gt;
Header Set DebugIsSafe &amp;quot;safe&amp;quot; env=!SET_UNSAFE&lt;br /&gt;
Header Set DebugIsSandbox &amp;quot;sandbox&amp;quot; env=IS_SANDBOX&lt;br /&gt;
Header Set DebugIsMainDomain &amp;quot;maindomain&amp;quot; env=NOT_SANDBOX&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwei Datenverzeichnisse werden angelegt und direkt ins &#039;htdocs-ssl&#039; verlinkt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir data&lt;br /&gt;
mkdir data/blob&lt;br /&gt;
mkdir data/block&lt;br /&gt;
cd $HOME/doms/cryptpad.hs-example.de/htdocs-ssl/&lt;br /&gt;
ln -s /home/pacs/xyz00/users/cryptpad/data/blob .&lt;br /&gt;
ln -s /home/pacs/xyz00/users/cryptpad/data/block .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Link muss angepasst werden, wenn der Blob-Speicher in den Zusatzspeicher unter /home/storage verschoben wird (siehe unten)!&lt;br /&gt;
&lt;br /&gt;
== Installation von NodeJS ==&lt;br /&gt;
&lt;br /&gt;
Nach dieser [https://wiki.hostsharing.net/index.php?title=NodeJS Anleitung] hier im Wiki sollte mit Hilfe von &#039;nvm&#039; &#039;node&#039; in der Version 22 installiert werden.&lt;br /&gt;
&lt;br /&gt;
== Installation des Cryptpad ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd $HOME&lt;br /&gt;
git clone https://github.com/xwiki-labs/cryptpad.git cryptpad&lt;br /&gt;
cd cryptpad &lt;br /&gt;
# aktuelle Version nachsehen&lt;br /&gt;
git checkout 2025.3.1&lt;br /&gt;
npm ci&lt;br /&gt;
npm run install:components&lt;br /&gt;
cd config&lt;br /&gt;
cp config.example.js config.js&lt;br /&gt;
vi config.js&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meine Konfiguration in der &#039;config.js&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript line&amp;gt;&lt;br /&gt;
// $ cat config.js&lt;br /&gt;
module.exports = {&lt;br /&gt;
 &lt;br /&gt;
   httpUnsafeOrigin: &#039;https://cryptpad.hs-example.de&#039;,&lt;br /&gt;
   httpSafeOrigin: &amp;quot;https://sandbox.cryptpad.hs-example.de&amp;quot;,&lt;br /&gt;
   httpAddress: &#039;127.0.0.1&#039;,&lt;br /&gt;
   httpPort: 30001,&lt;br /&gt;
   websocketPort: 30002,&lt;br /&gt;
   maxWorkers: 4,&lt;br /&gt;
   /*&lt;br /&gt;
   adminKeys: [&lt;br /&gt;
       &amp;quot;[admin@cryptpad.hs-example.de/xxxxxxxxxxxxxxxxxxxxxxxx=]&amp;quot;,&lt;br /&gt;
   ],&lt;br /&gt;
   */&lt;br /&gt;
   inactiveTime: 90, // days&lt;br /&gt;
   archiveRetentionTime: 15,&lt;br /&gt;
   accountRetentionTime: 365,&lt;br /&gt;
   maxUploadSize: 8 * 1024 * 1024,&lt;br /&gt;
   filePath: &#039;/home/pacs/xyz00/users/cryptpad/data/file/&#039;,&lt;br /&gt;
   archivePath: &#039;/home/pacs/xyz00/users/cryptpad/data/archive/&#039;,&lt;br /&gt;
   pinPath: &#039;/home/pacs/xyz00/users/cryptpad/data/pins&#039;,&lt;br /&gt;
   taskPath: &#039;/home/pacs/xyz00/users/cryptpad/data/tasks&#039;,&lt;br /&gt;
   blockPath: &#039;/home/pacs/xyz00/users/cryptpad/data/block&#039;,&lt;br /&gt;
   blobPath: &#039;/home/pacs/xyz00/users/cryptpad/data/blob&#039;,&lt;br /&gt;
   blobStagingPath: &#039;/home/pacs/xyz00/users/cryptpad/data/blobstage&#039;,&lt;br /&gt;
   decreePath: &#039;/home/pacs/xyz00/users/cryptpad/data/decrees&#039;,&lt;br /&gt;
   logPath: &#039;/home/pacs/xyz00/users/cryptpad/data/logs&#039;,&lt;br /&gt;
   logToStdout: true,&lt;br /&gt;
   logLevel: &#039;info&#039;,&lt;br /&gt;
   logFeedback: false,&lt;br /&gt;
   verbose: false,&lt;br /&gt;
   installMethod: &#039;unspecified&#039;,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Admin-Key wird später ergänzt. Der erste registrierte User im Cryptpad kann den öffentlichen Schlüssel aus seinem Profil herauskopieren.&lt;br /&gt;
&lt;br /&gt;
Wenn größere Datenmengen erwartet werden, kann der &#039;blobPath&#039; in den Zusatzspeicher verlegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript line&amp;gt;&lt;br /&gt;
   blobPath: &#039;/home/storage/xyz00/users/cryptpad/data/blob&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation von onlyoffice ==&lt;br /&gt;
&lt;br /&gt;
Es kann onlyoffice installiert werden, um auch das Bearbeiten von z.B. Calc/Excel Dateien zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd ~/cryptpad&lt;br /&gt;
/install-onlyoffice.sh --accept-license&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start des Cryptpad ==&lt;br /&gt;
&lt;br /&gt;
Ich starte das Cryptpad zunächst einfach mit dem &#039;nohup&#039;-Kommando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd ~/cryptpad&lt;br /&gt;
nohup node server &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cryptpad als Dienst starten ==&lt;br /&gt;
&lt;br /&gt;
Die Cryptpad-Prozesse sollen von Systemd als Dienst automatisch gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dazu legen wir eine Systemd-Unit an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.config/systemd/user/&lt;br /&gt;
vi $HOME/.config/systemd/user/cryptpad.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der Datei soll sein: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Cryptpad&lt;br /&gt;
After=network.target&lt;br /&gt;
 &lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=%h/cryptpad&lt;br /&gt;
Environment=&amp;quot;NODE_ENV=production&amp;quot;&lt;br /&gt;
Environment=&amp;quot;PATH=%h/node_modules/.bin:/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=%h/.nvm/versions/node/v22.16.0/bin/node server&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 Node-Version im Pfad muss ggf. korrigiert werden)&lt;br /&gt;
&lt;br /&gt;
Der Dienst wird aktiviert und gestartet mit:&lt;br /&gt;
&lt;br /&gt;
 systemctl --user daemon-reload&lt;br /&gt;
 systemctl --user enable cryptpad.service&lt;br /&gt;
 systemctl --user start cryptpad.service&lt;br /&gt;
&lt;br /&gt;
= weiterführende Links =&lt;br /&gt;
&lt;br /&gt;
* [https://cryptpad.fr/ Die Cryptpad Installation der Entwickler]&lt;br /&gt;
* [https://docs.cryptpad.fr/de/ Dokumentation in deutscher Sprache]&lt;br /&gt;
* [https://docs.cryptpad.fr/de/admin_guide/installation.html Installationanleitung]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cryptpad 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:Software]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7374</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7374"/>
		<updated>2025-06-03T08:24:20Z</updated>

		<summary type="html">&lt;p&gt;Tim: 3.3.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;
==== Am Beispiel von 3.4.1 auf 3.4.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;
# git diff v3.4.1 &amp;gt; diff-3.4.1.txt&lt;br /&gt;
# git fetch&lt;br /&gt;
# git checkout -b hostsharing-deployment-v3.4.4 v3.4.4&lt;br /&gt;
# evtl. Änderungen aus diff-3.4.1.txt wieder übernehmen und committen&lt;br /&gt;
# patch -p1 &amp;lt; diff-3.4.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 (endlich :) ) eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse_docker/blob/main/image/base/Dockerfile)&lt;br /&gt;
# Dies ist der Fall, also&lt;br /&gt;
# rbenv install 3.3.7&lt;br /&gt;
# rbenv rehash&lt;br /&gt;
# echo &amp;quot;3.3.7&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&lt;br /&gt;
# npm install -g terser uglify-js pnpm@9&lt;br /&gt;
# corepack use pnpm@latest-9&lt;br /&gt;
# pnpm install&lt;br /&gt;
# export $(grep -v &#039;^#&#039; ~/discourse.env | xargs -d &#039;\n&#039;)&lt;br /&gt;
# 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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7357</id>
		<title>Discourse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Discourse_installieren&amp;diff=7357"/>
		<updated>2025-05-17T06:50:44Z</updated>

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

		<summary type="html">&lt;p&gt;Tim: /* 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.&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7347</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7347"/>
		<updated>2025-05-02T16:20:14Z</updated>

		<summary type="html">&lt;p&gt;Tim: maintenance:repair ergänzt&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;
== 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 28 auf Nextcloud 29, obwohl Nextcloud 28 noch mehrere Monate gepflegt wird, und manche Apps noch nicht bereit sind für Nextcloud 29.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch eine Alternative eingerichtet werden, in der Datei nextcloud/config/config.php, unter dem Eintrag updater.server.url&lt;br /&gt;
&lt;br /&gt;
Hier wird z.B. auf einen Updater von unserem Mitglied Timotheus Pokorra verwiesen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
updater_server_url: &amp;quot;https://ncupdater.solidcharity.com&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dahinter läuft ein Skript, mit dem wir noch länger eine bestimmte Version anbieten können: https://codeberg.org/tpokorra/ncupdater&lt;br /&gt;
&lt;br /&gt;
= Daten auf HDD Storage =&lt;br /&gt;
== Einrichtung des HDD Storage ==&lt;br /&gt;
&lt;br /&gt;
Um den langsameren aber günstigeren HDD Storage von Hostsharing zu nutzen, kann das data Verzeichnis von SSD auf HDD Storage verschoben werden. Ein symbolischer Link reicht nicht aus, man muss den Pfad in der Nextcloud Konfigurationsdatei anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# Nextcloud in Wartungsmodus versetzen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
# Daten auf HDD Storage verschieben&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ mv data /home/storage/xyz00/users/cloud/&lt;br /&gt;
# symbolischen Link anlegen&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ ln -s /home/storage/xyz00/users/cloud/data data&lt;br /&gt;
# Pfad in config.php ändern&lt;br /&gt;
nano config/config.php&lt;br /&gt;
# Die Zeile mit &#039;datadirectory&#039; finden und entsprechend ändern:&lt;br /&gt;
# &#039;datadirectory&#039; =&amp;gt; &#039;/home/storage/xyz00/users/cloud/data&#039;,&lt;br /&gt;
# Wartungsmodus beenden&lt;br /&gt;
xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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://ownyourbits.com/2019/06/29/understanding-and-improving-nextcloud-previews/ Optimierung des Caches für Previews]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/nextcloud Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Reseller bei HS =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.ossaas.de OS SaaS]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;br /&gt;
[[Kategorie:Nextcloud]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7341</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7341"/>
		<updated>2025-04-19T04:18:08Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Links */&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;
&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7340</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7340"/>
		<updated>2025-04-19T04:17:28Z</updated>

		<summary type="html">&lt;p&gt;Tim: Einen Admin Benutzer hinzufügen&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;
&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://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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7339</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7339"/>
		<updated>2025-04-19T04:15:10Z</updated>

		<summary type="html">&lt;p&gt;Tim: 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 # oder ~/doms/meinedomain.de/subs-ssl/www/ oder wo sonst Wordpress installiert ist&lt;br /&gt;
~/bin/wp-cli.phar core verify-checksums&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://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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7338</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7338"/>
		<updated>2025-04-19T04:09:44Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Links */&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;
== 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;
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;
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;
== 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://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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7337</id>
		<title>Wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Wordpress&amp;diff=7337"/>
		<updated>2025-04-19T04:09:30Z</updated>

		<summary type="html">&lt;p&gt;Tim: Umstrukturierung&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;
== 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;
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;
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;
== 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://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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7334</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=7334"/>
		<updated>2025-04-09T17:54:44Z</updated>

		<summary type="html">&lt;p&gt;Tim: hs-notify-unit-failure&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;
== 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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7333</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=7333"/>
		<updated>2025-04-08T12:24:58Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* 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;
== 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;
Environment=MAILTO=admin@example@org&lt;br /&gt;
ExecStopPost=-/bin/bash -c &#039;if [ &amp;quot;$EXIT_STATUS&amp;quot; != &amp;quot;0&amp;quot; ]; then mail -s &amp;quot;ERROR with cleanup service&amp;quot; &amp;quot;$MAILTO&amp;quot; &amp;lt;&amp;lt;&amp;lt;&amp;quot;SYSTEMD status \n Service_result: $SERVICE_RESULT \n Exit_code(systemd): $EXIT_CODE \n Exit_status(proc exit code): $EXIT_STATUS\n`journalctl --user --no-pager -n 20 -u my-cleanup.service`&amp;quot;; fi&#039;&lt;br /&gt;
&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7332</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=7332"/>
		<updated>2025-04-08T12:23:50Z</updated>

		<summary type="html">&lt;p&gt;Tim: timer with email notification on error&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;
== 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&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;
Environment=MAILTO=admin@example@org&lt;br /&gt;
ExecStopPost=-/bin/bash -c &#039;if [ &amp;quot;$EXIT_STATUS&amp;quot; != &amp;quot;0&amp;quot; ]; then mail -s &amp;quot;ERROR with cleanup service&amp;quot; &amp;quot;$MAILTO&amp;quot; &amp;lt;&amp;lt;&amp;lt;&amp;quot;SYSTEMD status \n Service_result: $SERVICE_RESULT \n Exit_code(systemd): $EXIT_CODE \n Exit_status(proc exit code): $EXIT_STATUS\n`journalctl --user --no-pager -n 20 -u my-cleanup.service`&amp;quot;; fi&#039;&lt;br /&gt;
&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7331</id>
		<title>Matrix Synapse installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Matrix_Synapse_installieren&amp;diff=7331"/>
		<updated>2025-04-07T03:57:31Z</updated>

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

		<summary type="html">&lt;p&gt;Tim: /* Rewrite Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/$1 [last]&lt;br /&gt;
RewriteRule &amp;quot;/(.*)$&amp;quot; https://www.hostsharing.net/alles/$1 [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test -I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
Location: https://www.hostsharing.net/push/test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7329</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7329"/>
		<updated>2025-03-31T16:20:47Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Rewrite Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/ [last]&lt;br /&gt;
RewriteRule .* https://www.hostsharing.net/alles/ [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test -I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
Location: https://www.hostsharing.net/push/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7328</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7328"/>
		<updated>2025-03-31T16:20:19Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Rewrite Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/ [last]&lt;br /&gt;
RewriteRule .* https://www.hostsharing.net/alles/ [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test -I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
Location: https://www.hostsharing.net/alles/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7327</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7327"/>
		<updated>2025-03-31T16:19:35Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Rewrite Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/ [last]&lt;br /&gt;
RewriteRule .* https://www.hostsharing.net/alles/ [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The document has moved &amp;lt;a href=&amp;quot;https://www.hostsharing.net/alles/&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7326</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7326"/>
		<updated>2025-03-31T16:18:26Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Rewrite Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder auch zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule &amp;quot;push/(.*)$&amp;quot; https://www.hostsharing.net/push/ [last]&lt;br /&gt;
RewriteRule .* https://www.hostsharing.net/alles/ [last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit curl testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
curl -XGET https://hello.beispielverein.de/push/test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das gibt aus, wohin der Redirect geht: z.B &amp;lt;code&amp;gt;&amp;lt;p&amp;gt;The document has moved &amp;lt;a href=&amp;quot;https://www.hostsharing.net/alles/&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=RAM_Belegung&amp;diff=7325</id>
		<title>RAM Belegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=RAM_Belegung&amp;diff=7325"/>
		<updated>2025-03-28T10:49:48Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* systemd status slice */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
Manchmal ist es sinnvoll, gerade bei komplexeren Installationen jenseits von PHP, dass man weiß, wieviel RAM Hauptspeicher für eine Anwendung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Generell ist zu empfehlen, jede Anwendung in einem eigenen User zu betreiben. Das hilft auch hier, denn dann kann man leichter sehen, welche Anwendung wieviel Speicher verbraucht.&lt;br /&gt;
&lt;br /&gt;
== htop ==&lt;br /&gt;
Ein hilfreicher Befehl ist &amp;lt;code&amp;gt;htop&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00-max@h01:~$ htop --user `whoami`}}&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00-max@h01:~$ htop --user xyz00-max}}&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl werden für den aktuellen Benutzer xyz00-max die einzelnen Prozesse angezeigt. Leider ist aber der Speicherverbrauch im Hauptspeicher nicht so einfach zu erkennen.&lt;br /&gt;
&lt;br /&gt;
== systemd status slice ==&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Prozessmanagement_mit_systemd_im_Userspace#RAM_Kontingent_eines_Webspace|RAM Kontingent eines Webspace]]&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;
Da wird der RAM Verbrauch für den gesamten Webspace xyz00 angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Skript list-memory-usage ==&lt;br /&gt;
Unser Mitglied Timotheus Pokorra hat ein [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/list-memory-usage Skript in Python] geschrieben, das den Speicherverbrauch pro Benutzer und auch in einer Übersicht anzeigen kann.&lt;br /&gt;
&lt;br /&gt;
Es wird heruntergeladen und für die Ausführung vorbereitet:&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&lt;br /&gt;
xyz00@h01:~$ wget https://codeberg.org/tpokorra/hostsharing-scripts/raw/branch/main/list-memory-usage &lt;br /&gt;
xyz00@h01:~$ chmod a+x list-memory-usage}}&lt;br /&gt;
&lt;br /&gt;
Nun gibt es folgende Optionen:&lt;br /&gt;
&lt;br /&gt;
Zeigt alle Prozesse, nach Größe sortiert, inkl. des Users und dem Namen des Prozesses und der belegte Speicherplatz im Arbeitsspeicher. Darunter wird die Summe aller Prozesse pro User gelistet, nach Gesamtgröße sortiert:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage}}&lt;br /&gt;
&lt;br /&gt;
Zeige alle Prozesse eines bestimmten Benutzers, und die Summe des belegten Arbeitsspeichers:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --user xyz00-user }}&lt;br /&gt;
&lt;br /&gt;
Zeige alle Prozesse eines bestimmten Programms, über alle Benutzer hinweg:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --name php }}&lt;br /&gt;
&lt;br /&gt;
Normalerweise werden einige Prozesse und Benutzer ausgeblendet. Mit dieser Option werden alle Prozesse und Benutzer berücksichtigt:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --all}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=RAM_Belegung&amp;diff=7324</id>
		<title>RAM Belegung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=RAM_Belegung&amp;diff=7324"/>
		<updated>2025-03-28T10:49:16Z</updated>

		<summary type="html">&lt;p&gt;Tim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
Manchmal ist es sinnvoll, gerade bei komplexeren Installationen jenseits von PHP, dass man weiß, wieviel RAM Hauptspeicher für eine Anwendung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Generell ist zu empfehlen, jede Anwendung in einem eigenen User zu betreiben. Das hilft auch hier, denn dann kann man leichter sehen, welche Anwendung wieviel Speicher verbraucht.&lt;br /&gt;
&lt;br /&gt;
== htop ==&lt;br /&gt;
Ein hilfreicher Befehl ist &amp;lt;code&amp;gt;htop&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00-max@h01:~$ htop --user `whoami`}}&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||xyz00-max@h01:~$ htop --user xyz00-max}}&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl werden für den aktuellen Benutzer xyz00-max die einzelnen Prozesse angezeigt. Leider ist aber der Speicherverbrauch im Hauptspeicher nicht so einfach zu erkennen.&lt;br /&gt;
&lt;br /&gt;
== systemd status slice ==&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[RAM_Kontingent_eines_Webspace|Prozessmanagement_mit_systemd_im_Userspace#RAM_Kontingent_eines_Webspace]]&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;
Da wird der RAM Verbrauch für den gesamten Webspace xyz00 angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Skript list-memory-usage ==&lt;br /&gt;
Unser Mitglied Timotheus Pokorra hat ein [https://codeberg.org/tpokorra/hostsharing-scripts/src/branch/main/list-memory-usage Skript in Python] geschrieben, das den Speicherverbrauch pro Benutzer und auch in einer Übersicht anzeigen kann.&lt;br /&gt;
&lt;br /&gt;
Es wird heruntergeladen und für die Ausführung vorbereitet:&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gruen||&lt;br /&gt;
xyz00@h01:~$ wget https://codeberg.org/tpokorra/hostsharing-scripts/raw/branch/main/list-memory-usage &lt;br /&gt;
xyz00@h01:~$ chmod a+x list-memory-usage}}&lt;br /&gt;
&lt;br /&gt;
Nun gibt es folgende Optionen:&lt;br /&gt;
&lt;br /&gt;
Zeigt alle Prozesse, nach Größe sortiert, inkl. des Users und dem Namen des Prozesses und der belegte Speicherplatz im Arbeitsspeicher. Darunter wird die Summe aller Prozesse pro User gelistet, nach Gesamtgröße sortiert:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage}}&lt;br /&gt;
&lt;br /&gt;
Zeige alle Prozesse eines bestimmten Benutzers, und die Summe des belegten Arbeitsspeichers:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --user xyz00-user }}&lt;br /&gt;
&lt;br /&gt;
Zeige alle Prozesse eines bestimmten Programms, über alle Benutzer hinweg:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --name php }}&lt;br /&gt;
&lt;br /&gt;
Normalerweise werden einige Prozesse und Benutzer ausgeblendet. Mit dieser Option werden alle Prozesse und Benutzer berücksichtigt:&lt;br /&gt;
{{Textkasten|gruen||xyz00@h01:~$ ./list-memory-usage --all}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Pakete bei HS]]&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7316</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7316"/>
		<updated>2025-03-18T14:39:51Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Passwortschutz abhängig vom REQUEST_URI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7315</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7315"/>
		<updated>2025-03-18T11:25:13Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Passwortschutz abhängig vom REQUEST_URI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
SetEnvIf REQUEST_URI ^/admin/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/app.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7314</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7314"/>
		<updated>2025-03-18T11:24:18Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Passwortschutz abhängig vom REQUEST_URI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
SetEnvIf REQUEST_URI ^/admin/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7313</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7313"/>
		<updated>2025-03-18T11:24:04Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Passwortschutz von CGI- und PHP-Anwendungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Passwortschutz abhängig vom REQUEST_URI ===&lt;br /&gt;
&lt;br /&gt;
Falls ich für eine oder mehrere REQUEST_URI eine htpasswd Abfrage möchte, z.B. für Keycloak Admin Login:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/realms/master/.* HTTPAUTHPROTECT&lt;br /&gt;
SetEnvIf REQUEST_URI ^/admin/.* HTTPAUTHPROTECT&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Allow,Deny&lt;br /&gt;
Satisfy any&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from all&lt;br /&gt;
Deny from env=HTTPAUTHPROTECT&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
&lt;br /&gt;
Anders herum würde es auch gehen: Wenn ich für eine oder mehrere REQUEST_URI keine htpasswd Abfrage möchte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
SetEnvIf REQUEST_URI ^/public/.* NOPASSWD&lt;br /&gt;
&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/login.beispielverein.de/.htpasswd&lt;br /&gt;
&lt;br /&gt;
Order Deny,Allow&lt;br /&gt;
Satisfy Any&lt;br /&gt;
Deny from all&lt;br /&gt;
Require valid-user&lt;br /&gt;
Allow from env=NOPASSWD&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://stackoverflow.com/a/11439361/1632368] für eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7312</id>
		<title>.htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=.htaccess&amp;diff=7312"/>
		<updated>2025-03-18T07:24:07Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Passwortschutz für Dateien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; Dateien innerhalb der Dokument-Verzeichnisse einer Domain (möglichst in ~/doms/example.com/.htaccess oder gezielt in Unterverzeichnissen subs/www ect. ), können Einstellungen des Apache Webservers konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann angegeben werden, welches Apache-Modul für bestimmte Dateien (oder bestimmte Datei-Endungen) benutzt werden soll, wohin Dokumente verschoben worden sind, oder auch, wer Zugriff auf die Dateien hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einstellen von MIME-Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# Download von Zertifikaten ermöglichen:&lt;br /&gt;
AddType application/x-x509-ca-cert .crt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einstellen des im HTTP Header angegebenen Zeichensatzes ==&lt;br /&gt;
&lt;br /&gt;
für .html Dateien:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddCharset UTF-8 .html&lt;br /&gt;
&lt;br /&gt;
# oder&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(für PHP Skripte siehe [[PHP]] )&lt;br /&gt;
&lt;br /&gt;
== Einstellen von Datei Handlern ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
AddType application/x-httpd-phpcgi .php &lt;br /&gt;
Action application/x-httpd-phpcgi /fastcgi-bin/phpstub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Passwortschutz für Dateien==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Sofern der Zugriff http Zugriff auf die Dateien nicht automatisch auf https:// bzw. [[TLS_/_SSL|SSL]] umgeleitet wird, können die Passwörter unverschlüsselt übertragen werden!&lt;br /&gt;
&lt;br /&gt;
Zunächst wollen wir den Zugriff auf ein Unterverzeichnis unserer Beispiel-Domain per .htaccess einschränken. Dazu legen wir zunächst eine Passwort-Datei an. Am einfachsten lässt sich diese spezielle Passwort-Datei in einer Shell anlegen. Wir legen sie in das etc-Verzeichnis der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ cd ~/doms/example.com/etc&lt;br /&gt;
xyz00-doms@hopi$ htpasswd -c .htpasswd peter&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim ersten User, hier peter wird das Programm htpasswd mit der Option -c (create) aufgerufen, aber auch wirklich nur beim ersten mal, da sonst die Datei .htpasswd neu erzeugt werden würde und vorherige Einträge damit gelöscht wären.&lt;br /&gt;
&lt;br /&gt;
Sollte es beim Versuch, die Datei anzulegen, zu der Fehlermeldung kommando htpasswd nicht bekannt kommen, dann müssen wir zunächst den Befehl lokalisieren und mit dem richtigen Pfad neu aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ locate htpasswd&lt;br /&gt;
/usr/bin/htpasswd&lt;br /&gt;
xyz00-doms@hopi$ /usr/bin/htpasswd -c .htpasswd peter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim zweiten User erfolgt der Aufruf dann ohne die Option -c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-doms@hopi$ htpasswd .htpasswd petra&lt;br /&gt;
New password: *****&lt;br /&gt;
Re-type new password: *****&lt;br /&gt;
xyz00-doms@hopi$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sternchen * stehen selbstverständlich für das jeweilige Passwort, welches dem User zugeordnet werden soll.&lt;br /&gt;
&lt;br /&gt;
Diese Datei könnten wir auch einfach mit scp/pscp oder FTP hochladen, dabei stellt sich dann jedoch die Frage, wie wir sie erzeugen. Auf den meisten Windows-Systemen dürfte kein htpasswd-Kommando verfügbar sein. Für diese Fälle gibt es eine online-Version z.b.: https://de.functions-online.com/crypt.html&lt;br /&gt;
die Ausgabe einfach mit Copy&amp;amp;Paste in eine Datei kopieren und diese hochladen.&lt;br /&gt;
&lt;br /&gt;
Die so angelegte Passwort-Datei kann nun von einer oder mehreren .htaccess-Dateien verwendet werden. Dazu begeben wir uns in das zu schützende Verzeichnis und legen dort eine Datei .htaccess an. Dies kann wieder per Upload oder in einer Shell geschehen. Die Datei kann beispielsweise so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
order allow,deny&lt;br /&gt;
allow from all&lt;br /&gt;
require valid-user&lt;br /&gt;
Authname &amp;quot;Privater Bereich, bitte Anmelden.&amp;quot;&lt;br /&gt;
Authtype Basic&lt;br /&gt;
AuthUserFile /home/doms/example.com/etc/.htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei verweist die letzte Zeile auf die von uns angelegte .htpasswd Datei. Zu beachten ist:&lt;br /&gt;
* Das die Pfadangabe absolut erfolgt, um einen &amp;quot;Internal Server Error&amp;quot; zu vermeiden.&lt;br /&gt;
* Falls die Datei innerhalb des Dokumenten Verzeichnisses liegen muss, sie auf jeden Fall .htpasswd heißt, damit sie vom Webserver nicht herausgegeben wird.&lt;br /&gt;
* Die .htaccess Datei in den Paketdomains innerhalb des web/ bzw. web-ssl/ Verzeichnisses liegen muss, damit kein &amp;quot;Internal Server Error&amp;quot; auftritt.&lt;br /&gt;
&lt;br /&gt;
===Passwortschutz von CGI- und PHP-Anwendungen===&lt;br /&gt;
&lt;br /&gt;
Mit dem beschriebenen Mechanismus können selbstverständlich auch PHP-Skripte und CGI-Anwendungen vor unberechtigten Zugriffen geschützt werden. In dem geschützten Skript kann über die Umgebungsvariable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; der Benutzername des Benutzers abgefragt werden, der sich angemeldet hat.&lt;br /&gt;
&lt;br /&gt;
In PHP-Skripten kann mit Hilfe der automatisch global sichtbaren Variablen &amp;lt;code&amp;gt;$_ENV&amp;lt;/code&amp;gt; auf die Umgebungsvariablen zugegriffen werden. Um die Variable &amp;lt;code&amp;gt;REDIRECT_REMOTE_USER&amp;lt;/code&amp;gt; zu lesen, schreibt man also &amp;lt;code&amp;gt;$_ENV[&#039;REDIRECT_REMOTE_USER&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / http://www.example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rewrite Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteRule ^mailman/(.*)$      /cgi-bin/mailman/$1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nur SSL erlauben und automatisch umschalten ==&lt;br /&gt;
&lt;br /&gt;
Bei per Symlink zusammengeschalteten Verzeichnissen, kann dies für die Verzeichnisse auf die nur per SSL zugegriffen werden soll, wie folgt erreicht werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
# SSL so fordern, dass ggf. Basic Auth nur einmal innerhalb von SSL abgefragt wird.&lt;br /&gt;
#&lt;br /&gt;
#SSLOptions +StrictRequire  #Bei HS festgelegt.&lt;br /&gt;
SSLRequireSSL&lt;br /&gt;
ErrorDocument 403 https://xyz00.hostsharing.net/https/URL/mit/entspechendem/Ziel/Verzeichnis&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird auf eine xyz00 Domain umgeleitet für die das HS Zertifikat gilt. Liegen die Seiten nicht dort ist die entprechende URL des Speicherortes mit https:// anzugegeben.&lt;br /&gt;
&lt;br /&gt;
Bei separaten Verzeichnissen für ssl und nicht-ssl kann auch ein permanenter Redirekt gelegt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://www.example.org/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um alle http Requests nach https weiter zu leiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{SERVER_PORT} !=443&lt;br /&gt;
RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verzeichnislisting ausschalten==&lt;br /&gt;
&lt;br /&gt;
Ruft ein Nutzer ein Verzeichnis auf, z.B. www.example.com/verzeichnis, so wird normalerweise die sich darin befindliche index.html als Standard aufgerufen. Gibt es diese Datei nicht, wird der Inhalt des Verzeichnisses gelistet. Das kann ein Sicherheitsproblem sein.&lt;br /&gt;
&lt;br /&gt;
Die Einstellung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
IndexIgnore * &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sorgt dafür, dass alle Datein Unterhalb des Speicherortes der .htaccess Datei für das Verzeichnislisting ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Listen der Verzeichnisse kann auch schon auf Dateisystemebene durch ändern der Verzeichnisrechte (o-r) unterbunden werden, wodurch auch lokale User berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
== Ausnahme die eigene IP-Adresse ==&lt;br /&gt;
&lt;br /&gt;
Zum Testen willst du möglicherweise auf ein anderes Backend zugreifen, als es die normalen Webseiten-Besucherinnen tun. Du kannst die eigene IP-Adresse als &amp;quot;RewriteCond&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REMOTE_ADDR} !=62.27.244.230&lt;br /&gt;
RewriteRule ^(.*) ajp://hsh02.hostsharing.net:8009/$1 [proxy,last]&lt;br /&gt;
 &lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:34380/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Clients blockieren ==&lt;br /&gt;
&lt;br /&gt;
Jeder Web-Browser gibt sich mit einer Kennung zu erkennen. Auch Bots sollten sich mit einer bestimmten Kennung zu erkennen geben. Diese Kennung wird ersichtlich, wenn Du die web.log Datei durchsuchst (siehe [[Traffic]]). Damit ist es möglich, bestimmte Clients oder Bots auszuschließen.&lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel werden der SemrushBot, der MJ12bot, und der AI Bot Claude von Anthropic ausgeschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*SemrushBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*MJ12bot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^.*ClaudeBot.*$ [OR]&lt;br /&gt;
RewriteCond %{HTTP_USER_AGENT} ^$&lt;br /&gt;
RewriteRule ^.* - [F,L]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://stackoverflow.com/a/35775449/1632368&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Verzeichnisse nicht ausliefern ==&lt;br /&gt;
&lt;br /&gt;
zum Beispiel das .git Verzeichnis sollte nicht gezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /\.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder wenn Wordpress für alle URLs mit HTTP Code 200 die Startseite anzeigt, denken manche Angreifer, es läuft ein mailman.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RedirectMatch 404 /mailman/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gesperrte Optionen ==&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die es ermöglichen würden, über den Webserver Rechte anderer&lt;br /&gt;
User zu erhalten, sind nicht erlaubt.&lt;br /&gt;
--&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:WWW]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7310</id>
		<title>Collabora Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7310"/>
		<updated>2025-03-13T13:41:12Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* 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;
Bei weniger als 4 CPU-Threads zeigt Collabora eine Warnung: &amp;quot;Dein Server verfügt über unzureichende Hardware-Ressourcen, was zu einer schlechten Leistung führen kann.&amp;quot;, mit einem Verweis auf [https://sdk.collaboraonline.com/docs/installation/Configuration.html#performance]. Man kommt zu diesem Hinweis, wenn man als Admin angemeldet ist, und auf Hilfe / Server-Prüfung geht.&lt;br /&gt;
&lt;br /&gt;
Das wurde auch von Mitgliedern bestätigt, die mit 3 Personen gleichzeitig an einem Tabellendokument arbeiten wollten.&lt;br /&gt;
&lt;br /&gt;
Es wird bei einem Managed Server daher empfohlen, 4 CPU Threads einzusetzen. Bei den Shared Servern ist das bereits der Fall.&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7309</id>
		<title>Collabora Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7309"/>
		<updated>2025-03-13T13:39:49Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Vorbereitungen */&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;
Bei weniger als 4 CPU-Threads zeigt Collabora eine Warnung: &amp;quot;Dein Server verfügt über unzureichende Hardware-Ressourcen, was zu einer schlechten Leistung führen kann.&amp;quot;, mit einem Verweis auf [https://sdk.collaboraonline.com/docs/installation/Configuration.html#performance]. &lt;br /&gt;
&lt;br /&gt;
Das wurde auch von Mitgliedern bestätigt, die mit 3 Personen gleichzeitig an einem Tabellendokument arbeiten wollten.&lt;br /&gt;
&lt;br /&gt;
Es wird bei einem Managed Server daher empfohlen, 4 CPU Threads einzusetzen. Bei den Shared Servern ist das bereits der Fall.&lt;br /&gt;
&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>Tim</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7308</id>
		<title>Collabora Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Collabora_Online&amp;diff=7308"/>
		<updated>2025-03-13T13:39:17Z</updated>

		<summary type="html">&lt;p&gt;Tim: /* Vorbereitungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Collabora installieren =&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;
&lt;br /&gt;
Empfohlene Hardwareausrüstung:&lt;br /&gt;
&lt;br /&gt;
* Bei weniger als 4 CPU-Threads zeigt Collabora eine Warnung: &amp;quot;Dein Server verfügt über unzureichende Hardware-Ressourcen, was zu einer schlechten Leistung führen kann.&amp;quot;, mit einem Verweis auf [https://sdk.collaboraonline.com/docs/installation/Configuration.html#performance]. Das wurde auch von Mitgliedern bestätigt, die mit 3 Personen gleichzeitig an einem Tabellendokument arbeiten wollten. Es wird bei einem Managed Server daher empfohlen, 4 CPU Threads einzusetzen. Bei den Shared Servern ist das bereits der Fall.&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>Tim</name></author>
	</entry>
</feed>