<?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=Deg00-m.website</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=Deg00-m.website"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Deg00-m.website"/>
	<updated>2026-04-29T20:59:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Kategorie:HSDoku&amp;diff=7500</id>
		<title>Kategorie:HSDoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:HSDoku&amp;diff=7500"/>
		<updated>2026-02-07T17:45:42Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: fix Link zu doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In dieser Kategorie (sollten) alle Seiten des Wiki zu finden sein, die sich mit der Dokumentation von HS im weitesten Sinne befassen.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;offizielle&#039;&#039;&#039; Kerndokumentation von Hostsharing ist hier: https://doc.hostsharing.net/&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7323</id>
		<title>Traffic</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7323"/>
		<updated>2025-03-25T19:52:29Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Viel Traffic durch Login-Versuche auf Wordpress-Seiten */ tilde expansion funktioniert nur auf der shell, nicht in apache configfiles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als Traffic bezeichnet man Datenverkehr zwischen zwei Computersystemen.&lt;br /&gt;
&lt;br /&gt;
Dies beinhaltet [[Logging#HTTP-Traffic|Web]], [[Logging#Mail-Traffic|Mail]] und [[Logging#FTP-Traffic|FTP]] Verbindungen.&lt;br /&gt;
&lt;br /&gt;
==Traffic Ursachen erkennen==&lt;br /&gt;
&lt;br /&gt;
Hostsharing teilt per Mail mit, wenn der tägliche Durchschnitt an gebuchtem Traffic überschritten wurde. In der Mail steht, welches Paket den Traffic verursacht hat und die Warnung, dass Konsequenzen für die Monatsabrechnungen entstehen können. Wer nicht selbst die Ursachen des zusätzlichen Traffic kennt, kann sie mit folgenden Methoden ergründen:&lt;br /&gt;
&lt;br /&gt;
Als erstes einfach mal den Log ansehen und durchscrollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
less ~/var/web.log&lt;br /&gt;
less ~/var/web.log-yesterday&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da kann man oft schon alleine durch Ansehen gleichförmige Strukturen erkennen, z.B. massenhafte Login-Versuche auf einen Wordpress Blog, die sehr viel Traffic generieren.&lt;br /&gt;
&lt;br /&gt;
==Webzugriffe analysieren==&lt;br /&gt;
&lt;br /&gt;
Diese Idee von Michael Hierweck: Wie bekomme ich heraus, welche Web-Zugriffe für mein Traffic-Volumen&lt;br /&gt;
maßgeblich verantwortlich sind?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Zeile 1: Traffic aus dem Log extrahieren, sortieren, zählen.&lt;br /&gt;
* Zeile 2: über die Einträge wandern&lt;br /&gt;
* Zeile 3: Produkt aus Zugriffen und Einzelvolumen berechnen&lt;br /&gt;
* Zeile 4: Ausgabe von Produkt, Zugriffen und Einzelvolume je Zugriff&lt;br /&gt;
* Zeile 5: sortieren&lt;br /&gt;
&lt;br /&gt;
Das Ganze als Einzeiler zum Kopieren, Einfügen und Ausführen im Terminal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039;|while read FACTOR SUM; do echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Skript gibt den Traffic aus, den gleichförmige Einzelzugriffe generieren, die größten Brocken stehen unten. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
219558 6 36593&lt;br /&gt;
232288 14 16592&lt;br /&gt;
239998 22 10909&lt;br /&gt;
270812 2 135406&lt;br /&gt;
304520 5 60904&lt;br /&gt;
318248 14 22732&lt;br /&gt;
559062 14 39933&lt;br /&gt;
602760 20 30138&lt;br /&gt;
711496 8 88937&lt;br /&gt;
2325929 101 23029&lt;br /&gt;
2351668 29 81092&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz unten sieht man, dass 29 Zugriffe mit je 81092 Bytes zusammen 2351668 Bytes Traffic gekostet haben. In diesem Fall kann man nun ganz simpel im Log nach der dritten Zahl greppen und in less anzeigen, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep 81092 $HOME/var/web.log | less&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich dieses Script öfter brauche ... ===&lt;br /&gt;
&lt;br /&gt;
lohnt es sich, daraus ein kleines Programm zu machen.&lt;br /&gt;
Dazu einfach&lt;br /&gt;
 &lt;br /&gt;
* Texteditor Eurer Wahl öffnen&lt;br /&gt;
* Script-Text hier kopieren und in den Editor einfügen&lt;br /&gt;
Hier noch mal eine etwas erweiterte Version&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher heute -----------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
&lt;br /&gt;
echo &lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher gestern ---------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo &lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log-yesterday |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
echo&lt;br /&gt;
echo Sie koennen nun nach dem Versacher suchen, indem sie die &lt;br /&gt;
echo Logfiles des Tages nach dem Einzelvolumen durchsuchen&lt;br /&gt;
echo &#039;Befehl: grep 81092 $HOME/var/web.log | less&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Script als Datei ohne Erweiterung unter einem griffigen Namen wie &amp;quot;volumenauswertung&amp;quot; speichern&lt;br /&gt;
* Scriptdatei in das Home-Verzeichnis des Paket-Users auf dem Server laden.&lt;br /&gt;
* Permission x zufügen, um das Skript ausführbar zu machen.(In WinSCP: Rechtsklick auf Datei, Eigenschaften-Dialog öffnen, X-Eigenschaft für den Eigentümer setzen)  &lt;br /&gt;
&lt;br /&gt;
Nun kann man dieses Script jederzeit mit ./volumenauswertung starten.&lt;br /&gt;
&lt;br /&gt;
== Wie erkenne ich, welche Webseite gestern am meisten Traffic Volumen hatte? ==&lt;br /&gt;
&lt;br /&gt;
Dieser Einzeiler sollte es zeigen (Datum entsprechend ändern):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
for f in ${HOME}/var/web-*-20230401*; do echo $f; gunzip -c $f | perl -nE &#039;/\[.+\] &amp;quot;.+&amp;quot; \d+ (\d+)/; $sum += $1; END { printf(&amp;quot;%.1f&amp;quot;, $sum/1024/1024); print &amp;quot; MB\n&amp;quot;}&#039;; done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wie bekomme ich IPs mit massenhaften Web-Zugriffen erkannt und gesperrt? ==&lt;br /&gt;
&lt;br /&gt;
IPs mit mehrstelligen Zugriffen werden so gefunden (Hier alle IPs mit vierstelligen Zugriffen, beachte die Ziffer 4 im Ausdruck &amp;quot;egrep &#039;^[0-9]{4,} .*$&#039;&amp;quot;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 | sort | uniq -c |sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{4,} .*$&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als Paketadmin alle IPs mit 10.000 und mehr Web-Zugriffen aus dem&lt;br /&gt;
heutigen Log filtern und dafür Sperreinträge erzeugen, die man in die&lt;br /&gt;
.htaccess kopieren kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 |sort |uniq -c \&lt;br /&gt;
	|sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{5,} .*$&#039; |cut -d &#039; &#039;  -f 2 \&lt;br /&gt;
	|xargs -n1 -r -I XXX echo &amp;quot;deny from XXX&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Zeile 1: Log auswerten und IPs extrahieren und zählen&lt;br /&gt;
* Zeile 2: Filtern (Mit der Anweisung &#039;&#039;&#039;egrep &#039;^[0-9]{5,} .*$&#039;&#039;&#039;&#039; werden durch die Ziffer 5 nur die gefundenen Einträge mit einer fünfstelligen Anzahl von Zugriffen gefunden. Ändert man 5 in 4, werden analog alle Einträge mit vierstelligen Zugriffszahlen gefunden.&lt;br /&gt;
* Zeile 3: Einträge erzeugen&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
=== Viel Traffic durch Login-Versuche auf Wordpress-Seiten ===&lt;br /&gt;
Login-Versuche auf Wordpress-Seiten können viel Traffic verursachen. Auf folgende Weise können wir diesen Traffic vermeiden, weil stumpfe Login-Roboter nicht an der [https://httpd.apache.org/docs/2.4/howto/auth.html Basic Authentication von Apache] vorbei kommen. Wir editieren die Datei &#039;.htaccess&#039; im Domainverzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/example.com&lt;br /&gt;
edit .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Editor geben wir der Datei &#039;&#039;.htaccess&#039;&#039; den folgenden Inhalt hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;lt;Files wp-login.php&amp;gt;&lt;br /&gt;
  AuthName &amp;quot;Protect against silly robots, User username, Pw s3cr3t&amp;quot;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthUserFile /home/doms/example.com/.htpasswd&lt;br /&gt;
  Require valid-user&lt;br /&gt;
&amp;lt;/Files&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir generieren den Hash für das Passwort &#039;&#039;s3cr3t&#039;&#039; für den Benutzer &#039;&#039;username&#039;&#039; mit dem &#039;&#039;htpasswd&#039;&#039; Tool auf folgende Weise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd  ~/doms/example.com&lt;br /&gt;
htpasswd -b -c .htpasswd username s3cr3t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach existiert die Datei &#039;~/doms/example.com/.htpasswd&#039;, mit der Apache den Benutzer und das Passwort prüft.&lt;br /&gt;
&lt;br /&gt;
Falls das Benutzer-Formular der Wordpress-Instanz im Browser über die Adresse &#039;&#039;example.com/wp-login.php&#039;&#039; erreichbar ist, werden wir in Zukunft als Erstes von Apache und als Zweites von Wordpress nach Benutzer und Passwort gefragt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Traffic]]&lt;br /&gt;
[[Kategorie:WebStatistik]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7321</id>
		<title>Traffic</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7321"/>
		<updated>2025-03-25T18:10:42Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als Traffic bezeichnet man Datenverkehr zwischen zwei Computersystemen.&lt;br /&gt;
&lt;br /&gt;
Dies beinhaltet [[Logging#HTTP-Traffic|Web]], [[Logging#Mail-Traffic|Mail]] und [[Logging#FTP-Traffic|FTP]] Verbindungen.&lt;br /&gt;
&lt;br /&gt;
==Traffic Ursachen erkennen==&lt;br /&gt;
&lt;br /&gt;
Hostsharing teilt per Mail mit, wenn der tägliche Durchschnitt an gebuchtem Traffic überschritten wurde. In der Mail steht, welches Paket den Traffic verursacht hat und die Warnung, dass Konsequenzen für die Monatsabrechnungen entstehen können. Wer nicht selbst die Ursachen des zusätzlichen Traffic kennt, kann sie mit folgenden Methoden ergründen:&lt;br /&gt;
&lt;br /&gt;
Als erstes einfach mal den Log ansehen und durchscrollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
less ~/var/web.log&lt;br /&gt;
less ~/var/web.log-yesterday&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da kann man oft schon alleine durch Ansehen gleichförmige Strukturen erkennen, z.B. massenhafte Login-Versuche auf einen Wordpress Blog, die sehr viel Traffic generieren.&lt;br /&gt;
&lt;br /&gt;
==Webzugriffe analysieren==&lt;br /&gt;
&lt;br /&gt;
Diese Idee von Michael Hierweck: Wie bekomme ich heraus, welche Web-Zugriffe für mein Traffic-Volumen&lt;br /&gt;
maßgeblich verantwortlich sind?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Zeile 1: Traffic aus dem Log extrahieren, sortieren, zählen.&lt;br /&gt;
* Zeile 2: über die Einträge wandern&lt;br /&gt;
* Zeile 3: Produkt aus Zugriffen und Einzelvolumen berechnen&lt;br /&gt;
* Zeile 4: Ausgabe von Produkt, Zugriffen und Einzelvolume je Zugriff&lt;br /&gt;
* Zeile 5: sortieren&lt;br /&gt;
&lt;br /&gt;
Das Ganze als Einzeiler zum Kopieren, Einfügen und Ausführen im Terminal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039;|while read FACTOR SUM; do echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Skript gibt den Traffic aus, den gleichförmige Einzelzugriffe generieren, die größten Brocken stehen unten. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
219558 6 36593&lt;br /&gt;
232288 14 16592&lt;br /&gt;
239998 22 10909&lt;br /&gt;
270812 2 135406&lt;br /&gt;
304520 5 60904&lt;br /&gt;
318248 14 22732&lt;br /&gt;
559062 14 39933&lt;br /&gt;
602760 20 30138&lt;br /&gt;
711496 8 88937&lt;br /&gt;
2325929 101 23029&lt;br /&gt;
2351668 29 81092&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz unten sieht man, dass 29 Zugriffe mit je 81092 Bytes zusammen 2351668 Bytes Traffic gekostet haben. In diesem Fall kann man nun ganz simpel im Log nach der dritten Zahl greppen und in less anzeigen, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep 81092 $HOME/var/web.log | less&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich dieses Script öfter brauche ... ===&lt;br /&gt;
&lt;br /&gt;
lohnt es sich, daraus ein kleines Programm zu machen.&lt;br /&gt;
Dazu einfach&lt;br /&gt;
 &lt;br /&gt;
* Texteditor Eurer Wahl öffnen&lt;br /&gt;
* Script-Text hier kopieren und in den Editor einfügen&lt;br /&gt;
Hier noch mal eine etwas erweiterte Version&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher heute -----------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
&lt;br /&gt;
echo &lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher gestern ---------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo &lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log-yesterday |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
echo&lt;br /&gt;
echo Sie koennen nun nach dem Versacher suchen, indem sie die &lt;br /&gt;
echo Logfiles des Tages nach dem Einzelvolumen durchsuchen&lt;br /&gt;
echo &#039;Befehl: grep 81092 $HOME/var/web.log | less&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Script als Datei ohne Erweiterung unter einem griffigen Namen wie &amp;quot;volumenauswertung&amp;quot; speichern&lt;br /&gt;
* Scriptdatei in das Home-Verzeichnis des Paket-Users auf dem Server laden.&lt;br /&gt;
* Permission x zufügen, um das Skript ausführbar zu machen.(In WinSCP: Rechtsklick auf Datei, Eigenschaften-Dialog öffnen, X-Eigenschaft für den Eigentümer setzen)  &lt;br /&gt;
&lt;br /&gt;
Nun kann man dieses Script jederzeit mit ./volumenauswertung starten.&lt;br /&gt;
&lt;br /&gt;
== Wie erkenne ich, welche Webseite gestern am meisten Traffic Volumen hatte? ==&lt;br /&gt;
&lt;br /&gt;
Dieser Einzeiler sollte es zeigen (Datum entsprechend ändern):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
for f in ${HOME}/var/web-*-20230401*; do echo $f; gunzip -c $f | perl -nE &#039;/\[.+\] &amp;quot;.+&amp;quot; \d+ (\d+)/; $sum += $1; END { printf(&amp;quot;%.1f&amp;quot;, $sum/1024/1024); print &amp;quot; MB\n&amp;quot;}&#039;; done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wie bekomme ich IPs mit massenhaften Web-Zugriffen erkannt und gesperrt? ==&lt;br /&gt;
&lt;br /&gt;
IPs mit mehrstelligen Zugriffen werden so gefunden (Hier alle IPs mit vierstelligen Zugriffen, beachte die Ziffer 4 im Ausdruck &amp;quot;egrep &#039;^[0-9]{4,} .*$&#039;&amp;quot;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 | sort | uniq -c |sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{4,} .*$&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als Paketadmin alle IPs mit 10.000 und mehr Web-Zugriffen aus dem&lt;br /&gt;
heutigen Log filtern und dafür Sperreinträge erzeugen, die man in die&lt;br /&gt;
.htaccess kopieren kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 |sort |uniq -c \&lt;br /&gt;
	|sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{5,} .*$&#039; |cut -d &#039; &#039;  -f 2 \&lt;br /&gt;
	|xargs -n1 -r -I XXX echo &amp;quot;deny from XXX&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Zeile 1: Log auswerten und IPs extrahieren und zählen&lt;br /&gt;
* Zeile 2: Filtern (Mit der Anweisung &#039;&#039;&#039;egrep &#039;^[0-9]{5,} .*$&#039;&#039;&#039;&#039; werden durch die Ziffer 5 nur die gefundenen Einträge mit einer fünfstelligen Anzahl von Zugriffen gefunden. Ändert man 5 in 4, werden analog alle Einträge mit vierstelligen Zugriffszahlen gefunden.&lt;br /&gt;
* Zeile 3: Einträge erzeugen&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
=== Viel Traffic durch Login-Versuche auf Wordpress-Seiten ===&lt;br /&gt;
Login-Versuche auf Wordpress-Seiten können viel Traffic verursachen. Auf folgende Weise können wir diesen Traffic vermeiden, weil stumpfe Login-Roboter nicht an der [https://httpd.apache.org/docs/2.4/howto/auth.html Basic Authentication von Apache] vorbei kommen. Wir editieren die Datei &#039;.htaccess&#039; im Domainverzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/example.com&lt;br /&gt;
edit .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Editor geben wir der Datei &#039;&#039;.htaccess&#039;&#039; den folgenden Inhalt hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;lt;Files wp-login.php&amp;gt;&lt;br /&gt;
  AuthName &amp;quot;Protect against silly robots, User username, Pw s3cr3t&amp;quot;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthUserFile /home/doms/example.com/.htpasswd&lt;br /&gt;
  Require valid-user&lt;br /&gt;
&amp;lt;/Files&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir generieren den Hash für das Passwort &#039;&#039;s3cr3t&#039;&#039; für den Benutzer &#039;&#039;username&#039;&#039; mit dem &#039;&#039;htpasswd&#039;&#039; Tool auf folgende Weise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd  ~/doms/example.com&lt;br /&gt;
htpasswd -b -c .htpasswd username s3cr3t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach existiert die Datei &#039;/home/doms/example.com/.htpasswd&#039;, mit der der Apache das Benutzer und Passwort prüfen kann.&lt;br /&gt;
&lt;br /&gt;
Falls das Benutzer-Formular der Wordpress-Instanz im Browser über die Adresse &#039;&#039;example.com/wp-login.php&#039;&#039; erreichbar ist, werden wir in Zukunft als Erstes von Apache und als Zweites von Wordpress nach Benutzer und Passwort gefragt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Traffic]]&lt;br /&gt;
[[Kategorie:WebStatistik]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7320</id>
		<title>Traffic</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7320"/>
		<updated>2025-03-25T09:48:34Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Viel Traffic durch Login-Versuche auf Wordpress-Seiten */ symlinks zu domain-verzeichnis verwendet, example.com&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als Traffic bezeichnet man Datenverkehr zwischen zwei Computersystemen.&lt;br /&gt;
&lt;br /&gt;
Dies beinhaltet [[Logging#HTTP-Traffic|Web]], [[Logging#Mail-Traffic|Mail]] und [[Logging#FTP-Traffic|FTP]] Verbindungen.&lt;br /&gt;
&lt;br /&gt;
==Traffic Ursachen erkennen==&lt;br /&gt;
&lt;br /&gt;
Hostsharing teilt per Mail mit, wenn der tägliche Durchschnitt an gebuchtem Traffic überschritten wurde. In der Mail steht, welches Paket den Traffic verursacht hat und die Warnung, dass Konsequenzen für die Monatsabrechnungen entstehen können. Wer nicht selbst die Ursachen des zusätzlichen Traffic kennt, kann sie mit folgenden Methoden ergründen:&lt;br /&gt;
&lt;br /&gt;
Als erstes einfach mal den Log ansehen und durchscrollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
less ~/var/web.log&lt;br /&gt;
less ~/var/web.log-yesterday&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da kann man oft schon alleine durch Ansehen gleichförmige Strukturen erkennen, z.B. massenhafte Login-Versuche auf einen Wordpress Blog, die sehr viel Traffic generieren.&lt;br /&gt;
&lt;br /&gt;
==Webzugriffe analysieren==&lt;br /&gt;
&lt;br /&gt;
Diese Idee von Michael Hierweck: Wie bekomme ich heraus, welche Web-Zugriffe für mein Traffic-Volumen&lt;br /&gt;
maßgeblich verantwortlich sind?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Zeile 1: Traffic aus dem Log extrahieren, sortieren, zählen.&lt;br /&gt;
* Zeile 2: über die Einträge wandern&lt;br /&gt;
* Zeile 3: Produkt aus Zugriffen und Einzelvolumen berechnen&lt;br /&gt;
* Zeile 4: Ausgabe von Produkt, Zugriffen und Einzelvolume je Zugriff&lt;br /&gt;
* Zeile 5: sortieren&lt;br /&gt;
&lt;br /&gt;
Das Ganze als Einzeiler zum Kopieren, Einfügen und Ausführen im Terminal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039;|while read FACTOR SUM; do echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;done |sort -n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Skript gibt den Traffic aus, den gleichförmige Einzelzugriffe generieren, die größten Brocken stehen unten. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
219558 6 36593&lt;br /&gt;
232288 14 16592&lt;br /&gt;
239998 22 10909&lt;br /&gt;
270812 2 135406&lt;br /&gt;
304520 5 60904&lt;br /&gt;
318248 14 22732&lt;br /&gt;
559062 14 39933&lt;br /&gt;
602760 20 30138&lt;br /&gt;
711496 8 88937&lt;br /&gt;
2325929 101 23029&lt;br /&gt;
2351668 29 81092&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz unten sieht man, dass 29 Zugriffe mit je 81092 Bytes zusammen 2351668 Bytes Traffic gekostet haben. In diesem Fall kann man nun ganz simpel im Log nach der dritten Zahl greppen und in less anzeigen, z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
grep 81092 $HOME/var/web.log | less&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich dieses Script öfter brauche ... ===&lt;br /&gt;
&lt;br /&gt;
lohnt es sich, daraus ein kleines Programm zu machen.&lt;br /&gt;
Dazu einfach&lt;br /&gt;
 &lt;br /&gt;
* Texteditor Eurer Wahl öffnen&lt;br /&gt;
* Script-Text hier kopieren und in den Editor einfügen&lt;br /&gt;
Hier noch mal eine etwas erweiterte Version&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher heute -----------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
&lt;br /&gt;
echo &lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher gestern ---------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo &lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log-yesterday |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
echo&lt;br /&gt;
echo Sie koennen nun nach dem Versacher suchen, indem sie die &lt;br /&gt;
echo Logfiles des Tages nach dem Einzelvolumen durchsuchen&lt;br /&gt;
echo &#039;Befehl: grep 81092 $HOME/var/web.log | less&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Script als Datei ohne Erweiterung unter einem griffigen Namen wie &amp;quot;volumenauswertung&amp;quot; speichern&lt;br /&gt;
* Scriptdatei in das Home-Verzeichnis des Paket-Users auf dem Server laden.&lt;br /&gt;
* Permission x zufügen, um das Skript ausführbar zu machen.(In WinSCP: Rechtsklick auf Datei, Eigenschaften-Dialog öffnen, X-Eigenschaft für den Eigentümer setzen)  &lt;br /&gt;
&lt;br /&gt;
Nun kann man dieses Script jederzeit mit ./volumenauswertung starten.&lt;br /&gt;
&lt;br /&gt;
== Wie erkenne ich, welche Webseite gestern am meisten Traffic Volumen hatte? ==&lt;br /&gt;
&lt;br /&gt;
Dieser Einzeiler sollte es zeigen (Datum entsprechend ändern):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
for f in ${HOME}/var/web-*-20230401*; do echo $f; gunzip -c $f | perl -nE &#039;/\[.+\] &amp;quot;.+&amp;quot; \d+ (\d+)/; $sum += $1; END { printf(&amp;quot;%.1f&amp;quot;, $sum/1024/1024); print &amp;quot; MB\n&amp;quot;}&#039;; done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wie bekomme ich IPs mit massenhaften Web-Zugriffen erkannt und gesperrt? ==&lt;br /&gt;
&lt;br /&gt;
IPs mit mehrstelligen Zugriffen werden so gefunden (Hier alle IPs mit vierstelligen Zugriffen, beachte die Ziffer 4 im Ausdruck &amp;quot;egrep &#039;^[0-9]{4,} .*$&#039;&amp;quot;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 | sort | uniq -c |sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{4,} .*$&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als Paketadmin alle IPs mit 10.000 und mehr Web-Zugriffen aus dem&lt;br /&gt;
heutigen Log filtern und dafür Sperreinträge erzeugen, die man in die&lt;br /&gt;
.htaccess kopieren kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 |sort |uniq -c \&lt;br /&gt;
	|sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{5,} .*$&#039; |cut -d &#039; &#039;  -f 2 \&lt;br /&gt;
	|xargs -n1 -r -I XXX echo &amp;quot;deny from XXX&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Zeile 1: Log auswerten und IPs extrahieren und zählen&lt;br /&gt;
* Zeile 2: Filtern (Mit der Anweisung &#039;&#039;&#039;egrep &#039;^[0-9]{5,} .*$&#039;&#039;&#039;&#039; werden durch die Ziffer 5 nur die gefundenen Einträge mit einer fünfstelligen Anzahl von Zugriffen gefunden. Ändert man 5 in 4, werden analog alle Einträge mit vierstelligen Zugriffszahlen gefunden.&lt;br /&gt;
* Zeile 3: Einträge erzeugen&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
=== Viel Traffic durch Login-Versuche auf Wordpress-Seiten ===&lt;br /&gt;
Login-Versuche auf Wordpress-Seiten können viel Traffic verursachen. Auf folgende Weise können wir diesen Traffic vermeiden, weil stumpfe Login-Roboter nicht an der [https://httpd.apache.org/docs/2.4/howto/auth.html Basic Authentication von Apache] vorbei kommen. Wir editieren die Datei &#039;.htaccess&#039; im Webroot der Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/example.com/htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
edit .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Editor geben wir der Datei &#039;&#039;.htaccess&#039;&#039; den folgenden Inhalt hinzu. Wenn Wordpress bereits eine &#039;.htaccess&#039;-Datei angelegt hat, dann oberhalb des Strings &#039;# BEGIN WordPress&#039;, ab dem WP seine eigenen Einstellungen schreibt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;lt;Files wp-login.php&amp;gt;&lt;br /&gt;
  AuthName &amp;quot;Protect against silly robots, User username, Pw s3cr3t&amp;quot;&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthUserFile /home/doms/example.com/.htpasswd&lt;br /&gt;
  Require valid-user&lt;br /&gt;
&amp;lt;/Files&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir generieren den Hash für das Passwort &#039;&#039;s3cr3t&#039;&#039; für den Benutzer &#039;&#039;username&#039;&#039; mit dem &#039;&#039;htpasswd&#039;&#039; Tool auf folgende Weise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd  ~/doms/example.com&lt;br /&gt;
htpasswd -b -c .htpasswd username s3cr3t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach existiert die Datei &#039;/home/doms/example.com/.htpasswd&#039;, mit der der Apache das Benutzer und Passwort prüfen kann.&lt;br /&gt;
&lt;br /&gt;
Falls das Benutzer-Formular der Wordpress-Instanz im Browser über die Adresse &#039;&#039;example.com/wp-login.php&#039;&#039; erreichbar ist, werden wir in Zukunft als Erstes von Apache und als Zweites von Wordpress nach Benutzer und Passwort gefragt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Traffic]]&lt;br /&gt;
[[Kategorie:WebStatistik]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7140</id>
		<title>Umstellung von Daemon-Diensten auf systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7140"/>
		<updated>2024-12-03T08:57:50Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Rückblick auf Bearbeitung von Cronjobs */ Erklärung Übersicht Cronjobs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anlass dieser Anleitung ==&lt;br /&gt;
&lt;br /&gt;
Ab November 2024 unterstützt die Managed Plattform ein RAM Kontingent pro Managed Webspace. Mitglieder buchen für ihre Webspaces jeweils ein RAM Kontingent in Schritten von jeweils 128 Megabyte. Das unterstützt uns besser bei der verursachergerechten Verteilung der Hardwarekosten, als es vorher mit einer Pauschale pro Serverdienst der Fall war. Ä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;
Damit die RAM Kontingente funktionieren, müssen im Managed Webspace alle Anwendungen, die im Userspace laufen, auf systemd umgestellt werden. Das betrifft Anwendungen, die bisher über z.B. cronjob, supervisor oder monit gestartet wurden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch unsere [[Systemd im Userspace]] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
== Praktische Umstellung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Übergangsphase steht jedem Managed Webspace genügend RAM zur Verfügung, um eigene Serverdienste zu starten.&lt;br /&gt;
Nach der Umstellung aller Dienste auf systemd wird dann das tatsächlich benötigte RAM-Kontingent ermittelt und gebucht.&lt;br /&gt;
&lt;br /&gt;
=== cronjob ===&lt;br /&gt;
&lt;br /&gt;
==== Rückblick auf Bearbeitung von Cronjobs ====&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -l&amp;lt;/code&amp;gt; können die eigenen Cronjobs aufgelistet werden.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; bearbeiten wir unsere Hintergrundjobs.&lt;br /&gt;
&lt;br /&gt;
Wenn am Anfang einer Zeile das Rautezeichen # eingesetzt wird, dann ist die Zeile deaktiviert.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Cronjobs der einzelnen Benutzer eines Webpaketes xyz00 lässt sich so ausgeben, wenn in der Shell des Paket-Benutzers xyz00 folgender Befehl ausgeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd users/; for U in *; do echo &amp;quot;=== $USER-$U&amp;quot;; sudo -u $USER-$U crontab -l | grep -v &amp;quot;#&amp;quot;; done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Seite [[Cron]] werden weitere Einzelheiten beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung auf systemd Timer ====&lt;br /&gt;
&lt;br /&gt;
Hier ist eine schöne Übersicht mit Beispielen: https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html#systemd-timer-catchup&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Nextcloud Hintergrund Job ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Nextcloud Hintergrund Job, der alle 5 Minuten läuft, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd 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;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud Hintergrundjob&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Nextcloud Hintergrundjob&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
RandomizedDelaySec=30&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable nextcloud-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Logrotate aufrufen ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Logrotate Job, der einmal in der Nacht aufgerufen wird, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
13 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Logrotate Job&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Logrotate Job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=01:13&lt;br /&gt;
RandomizedDelaySec=300&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable logrotate-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monit ===&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Redis ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir eine Datei &amp;lt;code&amp;gt;.monitrc&amp;lt;/code&amp;gt;, mit der ein Redis Dienst betrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;monit&amp;quot;&amp;gt;&lt;br /&gt;
set daemon 60&lt;br /&gt;
    with start delay 120&lt;br /&gt;
set logfile /home/pacs/xyz00/nextcloud/var/monit.log&lt;br /&gt;
set idfile /home/pacs/xyz00/nextcloud/var/monit.id&lt;br /&gt;
set statefile /home/pacs/xyz00/nextcloud/var/monit.state&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: webmaster@example.org }&lt;br /&gt;
set alert webmaster@example.org&lt;br /&gt;
set httpd port 12345 address xyz00.hostsharing.net &lt;br /&gt;
     allow monit:topsecret&lt;br /&gt;
check process redis with pidfile /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid&lt;br /&gt;
     start program &amp;quot;/usr/bin/redis-server /home/pacs/xyz00/nextcloud/redis/etc/redis.conf&amp;quot;&lt;br /&gt;
     stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid )&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Start von monit nach einem Reboot des Servers wird verhindert, indem die entsprechende Zeile gelöscht wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&lt;br /&gt;
entferne diese Zeile:&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dienste werden gestoppt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
killall -u $USER -KILL monit&lt;br /&gt;
killall -u $USER -KILL redis-server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Redis Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/redis/var&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
StandardOutput=append:%h/var/log/redis.log&lt;br /&gt;
StandardError=inherit&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;
Es muss noch die folgende Zeile aus &amp;lt;code&amp;gt;redis/etc/redis.conf&amp;lt;/code&amp;gt; entfernt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;conf&amp;quot;&amp;gt;&lt;br /&gt;
daemonize yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun soll der Dienst aktiviert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user enable redis.service --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Apache ====&lt;br /&gt;
&lt;br /&gt;
Es wurden in der Vergangenheit Start- und Stoppskripte empfohlen. Die Startskripte wurden dann um verschiedene Aktionen ergänzt.&lt;br /&gt;
&lt;br /&gt;
Da empfehlen wir, die sonstigen Aktionen in ein eigenes Skript auszulagern, das mit der Direktive &amp;lt;code&amp;gt;ExecStartPre=&amp;lt;/code&amp;gt; gestartet wird.&lt;br /&gt;
Dann kann der eigentliche Prozess mit &amp;lt;code&amp;gt;ExecStart=&amp;lt;/code&amp;gt; gestartet werden, und wird dann auch entsprechend beendet. Dann ist kein Stopp-Skript erforderlich.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch mit &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; ein Stopp-Skript ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== supervisor ===&lt;br /&gt;
&lt;br /&gt;
Bei supervisor wird z.B. in der Datei &amp;lt;code&amp;gt;~/supervisor/etc/supervisord.conf&amp;lt;/code&amp;gt; ein Redis Dienst konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[program:redis]&lt;br /&gt;
command=/usr/bin/redis-server /home/pacs/xyz00/test/loomio/redis/etc/redis.conf&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stdout.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das muss entsprechend durch einen systemd Dienst ersetzt werden, siehe der Abschnitt bei der Umstellung von monit auf systemd.&lt;br /&gt;
&lt;br /&gt;
== Ermittlung und Buchung des benötigten RAM Kontingent ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Prozessmanagement_mit_systemd_im_Userspace#RAM_Kontingent_eines_Webspace|RAM Kontingent eines Webspace]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Systemd]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7139</id>
		<title>Umstellung von Daemon-Diensten auf systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7139"/>
		<updated>2024-12-03T08:54:36Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Rückblick auf Bearbeitung von Cronjobs */ Cronjobs auflisten auch für Zsh und ohne Kommentare&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anlass dieser Anleitung ==&lt;br /&gt;
&lt;br /&gt;
Ab November 2024 unterstützt die Managed Plattform ein RAM Kontingent pro Managed Webspace. Mitglieder buchen für ihre Webspaces jeweils ein RAM Kontingent in Schritten von jeweils 128 Megabyte. Das unterstützt uns besser bei der verursachergerechten Verteilung der Hardwarekosten, als es vorher mit einer Pauschale pro Serverdienst der Fall war. Ä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;
Damit die RAM Kontingente funktionieren, müssen im Managed Webspace alle Anwendungen, die im Userspace laufen, auf systemd umgestellt werden. Das betrifft Anwendungen, die bisher über z.B. cronjob, supervisor oder monit gestartet wurden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch unsere [[Systemd im Userspace]] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
== Praktische Umstellung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Übergangsphase steht jedem Managed Webspace genügend RAM zur Verfügung, um eigene Serverdienste zu starten.&lt;br /&gt;
Nach der Umstellung aller Dienste auf systemd wird dann das tatsächlich benötigte RAM-Kontingent ermittelt und gebucht.&lt;br /&gt;
&lt;br /&gt;
=== cronjob ===&lt;br /&gt;
&lt;br /&gt;
==== Rückblick auf Bearbeitung von Cronjobs ====&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -l&amp;lt;/code&amp;gt; können die eigenen Cronjobs aufgelistet werden.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; bearbeiten wir unsere Hintergrundjobs.&lt;br /&gt;
&lt;br /&gt;
Wenn am Anfang einer Zeile das Rautezeichen # eingesetzt wird, dann ist die Zeile deaktiviert.&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht über die Cronjobs der einzelnen Benutzer eines Webspace lässt sich so ausgeben, als Paket-Benutzer xyz00:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd users/; for U in *; do echo &amp;quot;=== $USER-$U&amp;quot;; sudo -u $USER-$U crontab -l | grep -v &amp;quot;#&amp;quot;; done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf der Seite [[Cron]] werden weitere Einzelheiten beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung auf systemd Timer ====&lt;br /&gt;
&lt;br /&gt;
Hier ist eine schöne Übersicht mit Beispielen: https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html#systemd-timer-catchup&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Nextcloud Hintergrund Job ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Nextcloud Hintergrund Job, der alle 5 Minuten läuft, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd 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;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud Hintergrundjob&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Nextcloud Hintergrundjob&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
RandomizedDelaySec=30&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable nextcloud-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Logrotate aufrufen ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Logrotate Job, der einmal in der Nacht aufgerufen wird, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
13 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Logrotate Job&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Logrotate Job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=01:13&lt;br /&gt;
RandomizedDelaySec=300&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable logrotate-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monit ===&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Redis ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir eine Datei &amp;lt;code&amp;gt;.monitrc&amp;lt;/code&amp;gt;, mit der ein Redis Dienst betrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;monit&amp;quot;&amp;gt;&lt;br /&gt;
set daemon 60&lt;br /&gt;
    with start delay 120&lt;br /&gt;
set logfile /home/pacs/xyz00/nextcloud/var/monit.log&lt;br /&gt;
set idfile /home/pacs/xyz00/nextcloud/var/monit.id&lt;br /&gt;
set statefile /home/pacs/xyz00/nextcloud/var/monit.state&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: webmaster@example.org }&lt;br /&gt;
set alert webmaster@example.org&lt;br /&gt;
set httpd port 12345 address xyz00.hostsharing.net &lt;br /&gt;
     allow monit:topsecret&lt;br /&gt;
check process redis with pidfile /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid&lt;br /&gt;
     start program &amp;quot;/usr/bin/redis-server /home/pacs/xyz00/nextcloud/redis/etc/redis.conf&amp;quot;&lt;br /&gt;
     stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid )&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Start von monit nach einem Reboot des Servers wird verhindert, indem die entsprechende Zeile gelöscht wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&lt;br /&gt;
entferne diese Zeile:&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dienste werden gestoppt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
killall -u $USER -KILL monit&lt;br /&gt;
killall -u $USER -KILL redis-server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Redis Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/redis/var&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
StandardOutput=append:%h/var/log/redis.log&lt;br /&gt;
StandardError=inherit&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;
Es muss noch die folgende Zeile aus &amp;lt;code&amp;gt;redis/etc/redis.conf&amp;lt;/code&amp;gt; entfernt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;conf&amp;quot;&amp;gt;&lt;br /&gt;
daemonize yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun soll der Dienst aktiviert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user enable redis.service --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Apache ====&lt;br /&gt;
&lt;br /&gt;
Es wurden in der Vergangenheit Start- und Stoppskripte empfohlen. Die Startskripte wurden dann um verschiedene Aktionen ergänzt.&lt;br /&gt;
&lt;br /&gt;
Da empfehlen wir, die sonstigen Aktionen in ein eigenes Skript auszulagern, das mit der Direktive &amp;lt;code&amp;gt;ExecStartPre=&amp;lt;/code&amp;gt; gestartet wird.&lt;br /&gt;
Dann kann der eigentliche Prozess mit &amp;lt;code&amp;gt;ExecStart=&amp;lt;/code&amp;gt; gestartet werden, und wird dann auch entsprechend beendet. Dann ist kein Stopp-Skript erforderlich.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch mit &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; ein Stopp-Skript ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== supervisor ===&lt;br /&gt;
&lt;br /&gt;
Bei supervisor wird z.B. in der Datei &amp;lt;code&amp;gt;~/supervisor/etc/supervisord.conf&amp;lt;/code&amp;gt; ein Redis Dienst konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[program:redis]&lt;br /&gt;
command=/usr/bin/redis-server /home/pacs/xyz00/test/loomio/redis/etc/redis.conf&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stdout.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das muss entsprechend durch einen systemd Dienst ersetzt werden, siehe der Abschnitt bei der Umstellung von monit auf systemd.&lt;br /&gt;
&lt;br /&gt;
== Ermittlung und Buchung des benötigten RAM Kontingent ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Prozessmanagement_mit_systemd_im_Userspace#RAM_Kontingent_eines_Webspace|RAM Kontingent eines Webspace]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Systemd]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7136</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7136"/>
		<updated>2024-12-03T01:47:00Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cron wird ersetzt durch [[Prozessmanagement mit systemd im Userspace#Zeitgesteuerte_Ausführung_mit_systemd|Systemd Timer]]&lt;br /&gt;
&lt;br /&gt;
{{Veraltet}}&lt;br /&gt;
{{Löschkandidat}}&lt;br /&gt;
&lt;br /&gt;
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.&lt;br /&gt;
=== Crontab ===&lt;br /&gt;
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.&lt;br /&gt;
&lt;br /&gt;
Anzeigen der aktuellen Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Löschen der kompletten Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ändern der Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Crontab von einer Datei starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab myjob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$crontab -l &amp;gt; myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ crontab myjobs&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ rm myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Dateiformat ===&lt;br /&gt;
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
    * Minute (0-59)&lt;br /&gt;
    * Stunde (0-23)&lt;br /&gt;
    * Tag des Monats (1-31)&lt;br /&gt;
    * Monat (1-12 oder JAN-DEC)&lt;br /&gt;
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).&lt;br /&gt;
&lt;br /&gt;
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
Statt einer Zeitangabe kann auch &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Umgebungsvariablen ===&lt;br /&gt;
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
PWD&lt;br /&gt;
&lt;br /&gt;
LOGNAME&lt;br /&gt;
&lt;br /&gt;
SHLVL&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
&lt;br /&gt;
HOME&lt;br /&gt;
&lt;br /&gt;
PATH&lt;br /&gt;
&lt;br /&gt;
MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# Alle Meldungen per Mail an diesen User schicken&lt;br /&gt;
MAILTO=xyz00&lt;br /&gt;
&lt;br /&gt;
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden&lt;br /&gt;
@reboot rm -f $HOME/var/run/* &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fuenf Minuten nach Mitternacht&lt;br /&gt;
5 0 * * * $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Um 14:15 an jedem Monatsersten&lt;br /&gt;
15 14 1 * * $HOME/bin/monthly&lt;br /&gt;
&lt;br /&gt;
# 0:23, 2:23, 4:23, 6:23 ... 22:23&lt;br /&gt;
23 0-23/2 * * * echo &amp;quot;run 23 minutes after midn, 2am, 4am ..., everyday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Sonntag um 4:05&lt;br /&gt;
5 4 * * sun echo &amp;quot;run at 5 after 4 every sunday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Freitag und jeden 1. des Monats um 4:05&lt;br /&gt;
5 4 1 * 5 echo &amp;quot;run at 5 after 4 every friday and every 1st&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.&lt;br /&gt;
&lt;br /&gt;
=== Performancehinweise ===&lt;br /&gt;
&lt;br /&gt;
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Jobs wenn möglich über Nacht laufen lassen.&lt;br /&gt;
* Priorität des Jobs mit nice reduzieren.&lt;br /&gt;
* Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden. &lt;br /&gt;
&lt;br /&gt;
=== Fehlerquellen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.&lt;br /&gt;
&lt;br /&gt;
Login-Shell: /usr/local/bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
cron: /bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7135</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7135"/>
		<updated>2024-12-03T01:45:33Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cron wird ersetzt durch [[Prozessmanagement mit systemd im Userspace#Zeitgesteuerte_Ausf%C3%BChrung_mit_systemd Systemd-Timer|Systemd Timer]]&lt;br /&gt;
&lt;br /&gt;
{{Veraltet}}&lt;br /&gt;
{{Löschkandidat}}&lt;br /&gt;
&lt;br /&gt;
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.&lt;br /&gt;
=== Crontab ===&lt;br /&gt;
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.&lt;br /&gt;
&lt;br /&gt;
Anzeigen der aktuellen Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Löschen der kompletten Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ändern der Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Crontab von einer Datei starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab myjob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$crontab -l &amp;gt; myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ crontab myjobs&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ rm myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Dateiformat ===&lt;br /&gt;
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
    * Minute (0-59)&lt;br /&gt;
    * Stunde (0-23)&lt;br /&gt;
    * Tag des Monats (1-31)&lt;br /&gt;
    * Monat (1-12 oder JAN-DEC)&lt;br /&gt;
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).&lt;br /&gt;
&lt;br /&gt;
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
Statt einer Zeitangabe kann auch &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Umgebungsvariablen ===&lt;br /&gt;
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
PWD&lt;br /&gt;
&lt;br /&gt;
LOGNAME&lt;br /&gt;
&lt;br /&gt;
SHLVL&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
&lt;br /&gt;
HOME&lt;br /&gt;
&lt;br /&gt;
PATH&lt;br /&gt;
&lt;br /&gt;
MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# Alle Meldungen per Mail an diesen User schicken&lt;br /&gt;
MAILTO=xyz00&lt;br /&gt;
&lt;br /&gt;
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden&lt;br /&gt;
@reboot rm -f $HOME/var/run/* &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fuenf Minuten nach Mitternacht&lt;br /&gt;
5 0 * * * $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Um 14:15 an jedem Monatsersten&lt;br /&gt;
15 14 1 * * $HOME/bin/monthly&lt;br /&gt;
&lt;br /&gt;
# 0:23, 2:23, 4:23, 6:23 ... 22:23&lt;br /&gt;
23 0-23/2 * * * echo &amp;quot;run 23 minutes after midn, 2am, 4am ..., everyday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Sonntag um 4:05&lt;br /&gt;
5 4 * * sun echo &amp;quot;run at 5 after 4 every sunday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Freitag und jeden 1. des Monats um 4:05&lt;br /&gt;
5 4 1 * 5 echo &amp;quot;run at 5 after 4 every friday and every 1st&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.&lt;br /&gt;
&lt;br /&gt;
=== Performancehinweise ===&lt;br /&gt;
&lt;br /&gt;
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Jobs wenn möglich über Nacht laufen lassen.&lt;br /&gt;
* Priorität des Jobs mit nice reduzieren.&lt;br /&gt;
* Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden. &lt;br /&gt;
&lt;br /&gt;
=== Fehlerquellen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.&lt;br /&gt;
&lt;br /&gt;
Login-Shell: /usr/local/bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
cron: /bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7134</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7134"/>
		<updated>2024-12-03T01:42:21Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Veraltet}}&lt;br /&gt;
{{Löschkandidat}}&lt;br /&gt;
&lt;br /&gt;
Cron wird ersetzt durch [https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace#Zeitgesteuerte_Ausf%C3%BChrung_mit_systemd Systemd-Timer]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.&lt;br /&gt;
=== Crontab ===&lt;br /&gt;
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.&lt;br /&gt;
&lt;br /&gt;
Anzeigen der aktuellen Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Löschen der kompletten Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ändern der Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Crontab von einer Datei starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab myjob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$crontab -l &amp;gt; myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ crontab myjobs&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ rm myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Dateiformat ===&lt;br /&gt;
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
    * Minute (0-59)&lt;br /&gt;
    * Stunde (0-23)&lt;br /&gt;
    * Tag des Monats (1-31)&lt;br /&gt;
    * Monat (1-12 oder JAN-DEC)&lt;br /&gt;
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).&lt;br /&gt;
&lt;br /&gt;
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
Statt einer Zeitangabe kann auch &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Umgebungsvariablen ===&lt;br /&gt;
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
PWD&lt;br /&gt;
&lt;br /&gt;
LOGNAME&lt;br /&gt;
&lt;br /&gt;
SHLVL&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
&lt;br /&gt;
HOME&lt;br /&gt;
&lt;br /&gt;
PATH&lt;br /&gt;
&lt;br /&gt;
MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# Alle Meldungen per Mail an diesen User schicken&lt;br /&gt;
MAILTO=xyz00&lt;br /&gt;
&lt;br /&gt;
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden&lt;br /&gt;
@reboot rm -f $HOME/var/run/* &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fuenf Minuten nach Mitternacht&lt;br /&gt;
5 0 * * * $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Um 14:15 an jedem Monatsersten&lt;br /&gt;
15 14 1 * * $HOME/bin/monthly&lt;br /&gt;
&lt;br /&gt;
# 0:23, 2:23, 4:23, 6:23 ... 22:23&lt;br /&gt;
23 0-23/2 * * * echo &amp;quot;run 23 minutes after midn, 2am, 4am ..., everyday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Sonntag um 4:05&lt;br /&gt;
5 4 * * sun echo &amp;quot;run at 5 after 4 every sunday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Freitag und jeden 1. des Monats um 4:05&lt;br /&gt;
5 4 1 * 5 echo &amp;quot;run at 5 after 4 every friday and every 1st&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.&lt;br /&gt;
&lt;br /&gt;
=== Performancehinweise ===&lt;br /&gt;
&lt;br /&gt;
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Jobs wenn möglich über Nacht laufen lassen.&lt;br /&gt;
* Priorität des Jobs mit nice reduzieren.&lt;br /&gt;
* Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden. &lt;br /&gt;
&lt;br /&gt;
=== Fehlerquellen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.&lt;br /&gt;
&lt;br /&gt;
Login-Shell: /usr/local/bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
cron: /bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Cron&amp;diff=7133</id>
		<title>Diskussion:Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Cron&amp;diff=7133"/>
		<updated>2024-12-03T01:41:02Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crontabs werden ersetzt durch Systemd Timers, die Seite sollte also gelöscht werden, wenn Cron weg ist. --[[Benutzer:Deg00-m.website|ChristofT]] ([[Benutzer Diskussion:Deg00-m.website|Diskussion]]) 01:58, 3. Dez. 2024 (CET)&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace&amp;diff=7132</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=7132"/>
		<updated>2024-12-03T01:18:05Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Einrichten des »timer-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&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;
&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;
== 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;
= 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>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Vorlage:HSDoku-Links&amp;diff=7131</id>
		<title>Vorlage:HSDoku-Links</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Vorlage:HSDoku-Links&amp;diff=7131"/>
		<updated>2024-12-03T01:03:59Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Systemd Prozessmanagement ersetzt Cron&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Diese Vorlage dient dazu, eine Leiste mit Toplinks für die HS-Doku anzuzeigen:&lt;br /&gt;
&lt;br /&gt;
{{HSDoku-Links}}&lt;br /&gt;
&lt;br /&gt;
Diese Leiste ist ein Ersatz für die Toplinks der alten HS-Doku und funktioniert zusammen mit dem Konzept der Weiterführenden Links. Siehe [[Hostsharing_Wiki_Konventionen#Weiterf.C3.BChrende_Links | Konventionen]]. Sie wirkt wie ein Portal, sie sollte nur auf der Hauptseite und den Seiten zu finden sein, auf die sie direkt verlinkt. Wenn ich als Betrachter sie sehe, weiß ich, dass ich &amp;quot;ganz oben&amp;quot; bin. Man erkennt auch, dass sie nur auf den Seiten richtig funktioniert, auf die sie zeigt, weil dann der entsprechende Link schwarz wird und nicht mehr aufzurufen ist.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Gib einfach am Anfang der Seite folgendes ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{HSDoku-Links}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Kategorie:Vorlage]]&lt;br /&gt;
[[Kategorie:Navigationsleiste]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{Navigationsleiste&lt;br /&gt;
|TITEL= [[Hostsharing Dokumentation – die Hauptbereiche]]&lt;br /&gt;
|INHALT=&lt;br /&gt;
[[Einstieg bei Hostsharing|Einstieg]] &amp;amp;#124;&lt;br /&gt;
[[Hsadmin]] &amp;amp;#124;&lt;br /&gt;
[[Pakete]] &amp;amp;#124;&lt;br /&gt;
[[User]] &amp;amp;#124;&lt;br /&gt;
[[Domains]] &amp;amp;#124;&lt;br /&gt;
[[Prozessmanagement mit systemd im Userspace|Systemd]] &amp;amp;#124;&lt;br /&gt;
[[Logging]] &amp;amp;#124;&lt;br /&gt;
[[E-Mail]] &amp;amp;#124;&lt;br /&gt;
[[WWW]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Datenbanken]] &amp;amp;#124;&lt;br /&gt;
[[Backup &amp;amp; Restore]] &amp;amp;#124;&lt;br /&gt;
[[:Kategorie:Installationsanleitungen|Installationsanleitungen]] &amp;amp;#124;&lt;br /&gt;
[[FAQ]] &amp;amp;#124;&lt;br /&gt;
[[Bugtracker]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7130</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7130"/>
		<updated>2024-12-03T01:00:48Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Veraltet}}&lt;br /&gt;
&lt;br /&gt;
Cron wird ersetzt durch [https://wiki.hostsharing.net/index.php?title=Prozessmanagement_mit_systemd_im_Userspace#Zeitgesteuerte_Ausf%C3%BChrung_mit_systemd Systemd-Timer]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.&lt;br /&gt;
=== Crontab ===&lt;br /&gt;
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.&lt;br /&gt;
&lt;br /&gt;
Anzeigen der aktuellen Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Löschen der kompletten Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ändern der Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Crontab von einer Datei starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab myjob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$crontab -l &amp;gt; myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ crontab myjobs&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ rm myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Dateiformat ===&lt;br /&gt;
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
    * Minute (0-59)&lt;br /&gt;
    * Stunde (0-23)&lt;br /&gt;
    * Tag des Monats (1-31)&lt;br /&gt;
    * Monat (1-12 oder JAN-DEC)&lt;br /&gt;
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).&lt;br /&gt;
&lt;br /&gt;
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
Statt einer Zeitangabe kann auch &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Umgebungsvariablen ===&lt;br /&gt;
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
PWD&lt;br /&gt;
&lt;br /&gt;
LOGNAME&lt;br /&gt;
&lt;br /&gt;
SHLVL&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
&lt;br /&gt;
HOME&lt;br /&gt;
&lt;br /&gt;
PATH&lt;br /&gt;
&lt;br /&gt;
MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# Alle Meldungen per Mail an diesen User schicken&lt;br /&gt;
MAILTO=xyz00&lt;br /&gt;
&lt;br /&gt;
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden&lt;br /&gt;
@reboot rm -f $HOME/var/run/* &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fuenf Minuten nach Mitternacht&lt;br /&gt;
5 0 * * * $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Um 14:15 an jedem Monatsersten&lt;br /&gt;
15 14 1 * * $HOME/bin/monthly&lt;br /&gt;
&lt;br /&gt;
# 0:23, 2:23, 4:23, 6:23 ... 22:23&lt;br /&gt;
23 0-23/2 * * * echo &amp;quot;run 23 minutes after midn, 2am, 4am ..., everyday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Sonntag um 4:05&lt;br /&gt;
5 4 * * sun echo &amp;quot;run at 5 after 4 every sunday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Freitag und jeden 1. des Monats um 4:05&lt;br /&gt;
5 4 1 * 5 echo &amp;quot;run at 5 after 4 every friday and every 1st&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.&lt;br /&gt;
&lt;br /&gt;
=== Performancehinweise ===&lt;br /&gt;
&lt;br /&gt;
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Jobs wenn möglich über Nacht laufen lassen.&lt;br /&gt;
* Priorität des Jobs mit nice reduzieren.&lt;br /&gt;
* Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden. &lt;br /&gt;
&lt;br /&gt;
=== Fehlerquellen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.&lt;br /&gt;
&lt;br /&gt;
Login-Shell: /usr/local/bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
cron: /bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Cron&amp;diff=7129</id>
		<title>Diskussion:Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Cron&amp;diff=7129"/>
		<updated>2024-12-03T00:58:32Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Die Seite wurde neu angelegt: „Crontabs werden ersetzt durch Systemd Timers --~~~~“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crontabs werden ersetzt durch Systemd Timers --[[Benutzer:Deg00-m.website|ChristofT]] ([[Benutzer Diskussion:Deg00-m.website|Diskussion]]) 01:58, 3. Dez. 2024 (CET)&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7128</id>
		<title>Cron</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Cron&amp;diff=7128"/>
		<updated>2024-12-03T00:57:41Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Cron ist veraltet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Veraltet}}&lt;br /&gt;
&lt;br /&gt;
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.&lt;br /&gt;
=== Crontab ===&lt;br /&gt;
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.&lt;br /&gt;
&lt;br /&gt;
Anzeigen der aktuellen Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -l&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Löschen der kompletten Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ändern der Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Crontab von einer Datei starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
crontab myjob&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$crontab -l &amp;gt; myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ crontab myjobs&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ rm myjobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Dateiformat ===&lt;br /&gt;
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
    * Minute (0-59)&lt;br /&gt;
    * Stunde (0-23)&lt;br /&gt;
    * Tag des Monats (1-31)&lt;br /&gt;
    * Monat (1-12 oder JAN-DEC)&lt;br /&gt;
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).&lt;br /&gt;
&lt;br /&gt;
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
Statt einer Zeitangabe kann auch &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Umgebungsvariablen ===&lt;br /&gt;
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
PWD&lt;br /&gt;
&lt;br /&gt;
LOGNAME&lt;br /&gt;
&lt;br /&gt;
SHLVL&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
&lt;br /&gt;
HOME&lt;br /&gt;
&lt;br /&gt;
PATH&lt;br /&gt;
&lt;br /&gt;
MAILTO&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
# Alle Meldungen per Mail an diesen User schicken&lt;br /&gt;
MAILTO=xyz00&lt;br /&gt;
&lt;br /&gt;
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden&lt;br /&gt;
@reboot rm -f $HOME/var/run/* &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Fuenf Minuten nach Mitternacht&lt;br /&gt;
5 0 * * * $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Um 14:15 an jedem Monatsersten&lt;br /&gt;
15 14 1 * * $HOME/bin/monthly&lt;br /&gt;
&lt;br /&gt;
# 0:23, 2:23, 4:23, 6:23 ... 22:23&lt;br /&gt;
23 0-23/2 * * * echo &amp;quot;run 23 minutes after midn, 2am, 4am ..., everyday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Sonntag um 4:05&lt;br /&gt;
5 4 * * sun echo &amp;quot;run at 5 after 4 every sunday&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Jeden Freitag und jeden 1. des Monats um 4:05&lt;br /&gt;
5 4 1 * 5 echo &amp;quot;run at 5 after 4 every friday and every 1st&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.&lt;br /&gt;
&lt;br /&gt;
=== Performancehinweise ===&lt;br /&gt;
&lt;br /&gt;
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:&lt;br /&gt;
&lt;br /&gt;
* Jobs wenn möglich über Nacht laufen lassen.&lt;br /&gt;
* Priorität des Jobs mit nice reduzieren.&lt;br /&gt;
* Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden. &lt;br /&gt;
&lt;br /&gt;
=== Fehlerquellen ===&lt;br /&gt;
&lt;br /&gt;
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.&lt;br /&gt;
&lt;br /&gt;
Login-Shell: /usr/local/bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
cron: /bin/su wird zuerst gefunden.&lt;br /&gt;
&lt;br /&gt;
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7127</id>
		<title>Umstellung von Daemon-Diensten auf systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7127"/>
		<updated>2024-12-02T22:22:58Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Beispiel: Nextcloud Hintergrund Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anlass dieser Anleitung ==&lt;br /&gt;
&lt;br /&gt;
Ab November 2024 unterstützt die Managed Plattform ein RAM Kontingent pro Managed Webspace. Mitglieder buchen für ihre Webspaces jeweils ein RAM Kontingent in Schritten von jeweils 128 Megabyte. Das unterstützt uns besser bei der verursachergerechten Verteilung der Hardwarekosten, als es vorher mit einer Pauschale pro Serverdienst der Fall war. Ä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;
Damit die RAM Kontingente funktionieren, müssen im Managed Webspace alle Anwendungen, die im Userspace laufen, auf systemd umgestellt werden. Das betrifft Anwendungen, die bisher über z.B. cronjob, supervisor oder monit gestartet wurden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch unsere [[Systemd im Userspace]] Dokumentation.&lt;br /&gt;
&lt;br /&gt;
== Praktische Umstellung ==&lt;br /&gt;
&lt;br /&gt;
Für eine Übergangsphase steht jedem Managed Webspace genügend RAM zur Verfügung, um eigene Serverdienste zu starten.&lt;br /&gt;
Nach der Umstellung aller Dienste auf systemd wird dann das tatsächlich benötigte RAM-Kontingent ermittelt und gebucht.&lt;br /&gt;
&lt;br /&gt;
=== cronjob ===&lt;br /&gt;
&lt;br /&gt;
==== Rückblick auf Bearbeitung von Cronjobs ====&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -l&amp;lt;/code&amp;gt; können die eigenen Cronjobs aufgelistet werden.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; bearbeiten wir unsere Hintergrundjobs.&lt;br /&gt;
&lt;br /&gt;
Wenn am Anfang einer Zeile das Rautezeichen # eingesetzt wird, dann ist die Zeile deaktiviert.&lt;br /&gt;
&lt;br /&gt;
Auf der Seite [[Cron]] werden weitere Einzelheiten beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung auf systemd Timer ====&lt;br /&gt;
&lt;br /&gt;
Hier ist eine schöne Übersicht mit Beispielen: https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html#systemd-timer-catchup&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Nextcloud Hintergrund Job ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Nextcloud Hintergrund Job, der alle 5 Minuten läuft, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
*/5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd 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;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nextcloud Hintergrundjob&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/nextcloud-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Nextcloud Hintergrundjob&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
RandomizedDelaySec=30&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable nextcloud-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Logrotate aufrufen ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir ein Beispiel für einen Logrotate Job, der einmal in der Nacht aufgerufen wird, und in der crontab eingetragen ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;crontab&amp;quot;&amp;gt;&lt;br /&gt;
13 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir deaktivieren diesen Cronjob, in dem wir ein # vor die Zeile setzen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den oneshot Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Logrotate Job&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;
{{Textkasten|gelb|Beachte|Statt $HOME muss %h benutzt werden!}}&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Timer angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/logrotate-job.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit diesem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Timer für Logrotate Job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=01:13&lt;br /&gt;
RandomizedDelaySec=300&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;
Nun soll der Timer noch aktiviert und gestartet werden:&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;
systemctl --user enable logrotate-job.timer --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monit ===&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Redis ====&lt;br /&gt;
&lt;br /&gt;
Hier haben wir eine Datei &amp;lt;code&amp;gt;.monitrc&amp;lt;/code&amp;gt;, mit der ein Redis Dienst betrieben wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;monit&amp;quot;&amp;gt;&lt;br /&gt;
set daemon 60&lt;br /&gt;
    with start delay 120&lt;br /&gt;
set logfile /home/pacs/xyz00/nextcloud/var/monit.log&lt;br /&gt;
set idfile /home/pacs/xyz00/nextcloud/var/monit.id&lt;br /&gt;
set statefile /home/pacs/xyz00/nextcloud/var/monit.state&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: webmaster@example.org }&lt;br /&gt;
set alert webmaster@example.org&lt;br /&gt;
set httpd port 12345 address xyz00.hostsharing.net &lt;br /&gt;
     allow monit:topsecret&lt;br /&gt;
check process redis with pidfile /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid&lt;br /&gt;
     start program &amp;quot;/usr/bin/redis-server /home/pacs/xyz00/nextcloud/redis/etc/redis.conf&amp;quot;&lt;br /&gt;
     stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat /home/pacs/xyz00/nextcloud/redis/var/redis-server.pid )&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Start von monit nach einem Reboot des Servers wird verhindert, indem die entsprechende Zeile gelöscht wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&lt;br /&gt;
entferne diese Zeile:&lt;br /&gt;
@reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dienste werden gestoppt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
killall -u $USER -KILL monit&lt;br /&gt;
killall -u $USER -KILL redis-server&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss ggfs. das Verzeichnis für systemd angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun wird die Datei für den Redis Dienst angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano $HOME/.config/systemd/user/redis.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Redis Service&lt;br /&gt;
After=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/redis/var&lt;br /&gt;
ExecStart=/usr/bin/redis-server %h/redis/etc/redis.conf&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
StandardOutput=append:%h/var/log/redis.log&lt;br /&gt;
StandardError=inherit&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;
Es muss noch die folgende Zeile aus &amp;lt;code&amp;gt;redis/etc/redis.conf&amp;lt;/code&amp;gt; entfernt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;conf&amp;quot;&amp;gt;&lt;br /&gt;
daemonize yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun soll der Dienst aktiviert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl --user enable redis.service --now&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Apache ====&lt;br /&gt;
&lt;br /&gt;
Es wurden in der Vergangenheit Start- und Stoppskripte empfohlen. Die Startskripte wurden dann um verschiedene Aktionen ergänzt.&lt;br /&gt;
&lt;br /&gt;
Da empfehlen wir, die sonstigen Aktionen in ein eigenes Skript auszulagern, das mit der Direktive &amp;lt;code&amp;gt;ExecStartPre=&amp;lt;/code&amp;gt; gestartet wird.&lt;br /&gt;
Dann kann der eigentliche Prozess mit &amp;lt;code&amp;gt;ExecStart=&amp;lt;/code&amp;gt; gestartet werden, und wird dann auch entsprechend beendet. Dann ist kein Stopp-Skript erforderlich.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch mit &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; ein Stopp-Skript ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
=== supervisor ===&lt;br /&gt;
&lt;br /&gt;
Bei supervisor wird z.B. in der Datei &amp;lt;code&amp;gt;~/supervisor/etc/supervisord.conf&amp;lt;/code&amp;gt; ein Redis Dienst konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[program:redis]&lt;br /&gt;
command=/usr/bin/redis-server /home/pacs/xyz00/test/loomio/redis/etc/redis.conf&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/test/supervisor/log/redis-stdout.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das muss entsprechend durch einen systemd Dienst ersetzt werden, siehe der Abschnitt bei der Umstellung von monit auf systemd.&lt;br /&gt;
&lt;br /&gt;
== Ermittlung und Buchung des benötigten RAM Kontingent ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Prozessmanagement_mit_systemd_im_Userspace#RAM_Kontingent_eines_Webspace|RAM Kontingent eines Webspace]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:Systemd]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6495</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6495"/>
		<updated>2024-03-31T16:17:15Z</updated>

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

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

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Links */ Sourcen auf Codeberg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mailing List Management Made Joyful ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mlmmj.org/ mlmmj] ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Vergleichen Sie dazu auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Alternative: [[Mailman_3_installieren]]&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Installation einer Mailingliste in einem Hostsharing Webspace für eine Domain.&lt;br /&gt;
&lt;br /&gt;
== mlmmj ==&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen  ===&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfehle ich das Anlegen eines Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
Sei mein Paket &#039;&#039;xyz00&#039;&#039; und der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sei meine Domain &#039;&#039;example.org&#039;&#039; und die E-Mail-Adresse für die Liste &#039;&#039;discuss@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain muss bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; aufgeschaltet sein. Die E-Mail-Adresse wird ebenfalls mit hsadmin eingerichtet. Das Target ist der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hier werden User und E-Mail-Adresse mit Hilfe des hsadmin-Interpreters &#039;&#039;hsscript&#039;&#039; angelegt:&lt;br /&gt;
&lt;br /&gt;
  xyz00@h03:~$ hsscript -i&lt;br /&gt;
  Password: *************&lt;br /&gt;
  xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung  ===&lt;br /&gt;
&lt;br /&gt;
Ich melde mich auf der Linux-Kommandozeile als User &#039;&#039;xyz00-list&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;quot;mlmmj&amp;quot; an:&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
  mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Das Skript fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
  The Domain for the List? [] : example.org&lt;br /&gt;
  The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
  For the list texts you can choose between the following languages or&lt;br /&gt;
  give a absolute path to a directory containing the texts.&lt;br /&gt;
  Available languages:&lt;br /&gt;
  cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
  The path to texts for the list? [en] : de&lt;br /&gt;
&lt;br /&gt;
Damit ist unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; angelegt,&lt;br /&gt;
das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis die Datei &amp;quot;.forward&amp;quot; mit folgenden Inhalt an (Achtung, die Anführungszeichen nicht vergessen!):&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Diese Datei sorgt dafür, dass eingehende E-Mail für die Liste an das Programm &#039;&#039;mlmmj-recieve&#039;&#039;&lt;br /&gt;
übergeben und dort verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
crontab wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 MAILTO=webmaster@example.org&lt;br /&gt;
 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
 HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
 SHELL=/bin/bash&lt;br /&gt;
 LANG=en_US.UTF-8&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Schluss trage ich noch die gewünschten E-Mail-Adressen ein:&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
 /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes Ce)&lt;br /&gt;
angeben. Dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
=== weitere Konfiguration  ===&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&lt;br /&gt;
Die Liste darf nur E-Mails von eingetragenen Abonnenten weiterleiten:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&lt;br /&gt;
Das Abonnement muss vom Listen-Owner bestätigt werden:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, so dass Antwort-EMails immer an den Verteiler gehen:&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
  echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration im Browser ===&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte. &lt;br /&gt;
Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen&lt;br /&gt;
von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&lt;br /&gt;
 hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ und diese in einem temporären Verzeichnis entpacken.&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot; findet sich die PHP-Admin-Anwendung.&lt;br /&gt;
&lt;br /&gt;
Also den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen,&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
 &lt;br /&gt;
 Require valid-user&lt;br /&gt;
 AuthType Basic&lt;br /&gt;
 AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
 AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&lt;br /&gt;
Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
Ein Passwort angeben und auf&lt;br /&gt;
https://lists.example.org schauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Date &#039;&#039;.forward&#039;&#039; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
 |/usr/bin/procmail&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &#039;&#039;.procmailrc&#039;&#039; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/sh&lt;br /&gt;
 HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
 PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 VERBOSE=yes&lt;br /&gt;
 LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
 DEFAULT&lt;br /&gt;
 &lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
 :0&lt;br /&gt;
 { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Domainregistrierung&amp;diff=5889</id>
		<title>Domainregistrierung</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Domainregistrierung&amp;diff=5889"/>
		<updated>2022-09-27T08:56:26Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Einrichten der Domain auf den HS Servern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-DomainLinks}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=== Erst eine neue Domain über HSAdmin einrichten, dann über das Domain-Bestellsystem registrieren oder von einem anderen Provider transferieren ===&lt;br /&gt;
&lt;br /&gt;
Wird eine neue Domain registriert oder von einem anderen Provider zu Hostsharing transferiert, sollte im Normalfall die Domain bei Hostsharing über HSAdmin eingerichtet werden, bevor die Registrierung letztlich eingeleitet bzw. aktualisiert wird. Sonst kann es zu Problemen beim Konnektieren der Domain kommen.&lt;br /&gt;
&lt;br /&gt;
= Einrichten der Domain auf den HS Servern =&lt;br /&gt;
&lt;br /&gt;
{{Kerndoku|https://doc.hostsharing.net/#kap-ref-domain}}&lt;br /&gt;
&lt;br /&gt;
Der Domainname muss im Punicode Format angelegt werden aus münster.de wird xn--mnster-3ya.de .&lt;br /&gt;
&lt;br /&gt;
Bei diesem Vorgang werden die Verzeichnisse für die Domain im eigenen Paket angelegt und die Domain wird auf die Mail, Web- und Nameserver von HS [[Aufschaltung|aufgeschaltet]]. Letzteres (das Nameserver-Update) ist Voraussetzung für den nächsten Schritt.&lt;br /&gt;
&lt;br /&gt;
= Domainregistrierung oder eingehender Transfer ([[KK]]) =&lt;br /&gt;
&lt;br /&gt;
== Bei fremdem Provider registrierte Domain zum Transfer freischalten ==&lt;br /&gt;
&lt;br /&gt;
Falls die Domain bisher bei einem anderen Provider gehostet ist, muss diesem die Transfer-Absicht mitgeteilt werden. Dafür gibt es bei den jeweiligen Providern etablierte Verfahren, die dort zu erfragen sind. Üblicherweise bekommt man dort einen AuthCode für die Domain mitgeteilt. Gibt es kein etabliertes Verfahren, so kann man wie folgt verfahren:&lt;br /&gt;
&lt;br /&gt;
* Formlos per Brief/Fax den Transfer ankündigen und um Zustimmung bitten, z.B.: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hiermit kündige ich als Owner/Admin-C den Transfer (KK) der &lt;br /&gt;
Domain example.com zur Hostsharing eG, vertreten durch den Registrar &lt;br /&gt;
Internetwire, an. Ich bitte, dem folgenden Transferantrag zuzustimmen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Nach Absendung der Transfer-Ankündigung 3-4 Tage warten, um dem alten Provider  Zeit zu geben auf den Transferantrag zu reagieren. &lt;br /&gt;
* Wenn dem Transfer nicht stattgegeben wird, den Registrar der Domain herausfinden (z.B. über die Nameserver oder zuständige Registry) und bitten den Transfer zuzulassen.&lt;br /&gt;
&lt;br /&gt;
== Neuregistrierung oder Transfer zu Hostsharing ([[KK]]) ==&lt;br /&gt;
&lt;br /&gt;
Die Vorgehensweise ist unter https://doc.hostsharing.net/einstieg/domain.html beschrieben. &lt;br /&gt;
&lt;br /&gt;
* Bei der allerersten Domainregistrierung im Domainbestellsystem müssen die Hostsharing Nameserver noch manuell eingegeben werden. Es sind dies:&lt;br /&gt;
&lt;br /&gt;
     dns1.hostsharing.net&lt;br /&gt;
     dns2.hostsharing.net&lt;br /&gt;
     dns3.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
= E-Mail-Adressen der neu eingerichteten Domain =&lt;br /&gt;
&lt;br /&gt;
Ist die Domain bei Hostsharing aufgeschaltet, sind standardmäßig nur die E-Mail-Adressen webmaster@..., postmaster@... und abuse@... eingerichtet. Die Einrichtung weiterer E-Mail-Adressen ist unter https://doc.hostsharing.net/einstieg/email.html beschrieben.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Domains]]&lt;br /&gt;
[[Kategorie:Hsadmin]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=5820</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=5820"/>
		<updated>2022-06-10T08:21:38Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* weiterführende Links */ HS-Nextcloud-Reseller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
  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;
&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;
  ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&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;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
  cd &lt;br /&gt;
  wget https://download.nextcloud.com/server/releases/nextcloud-24.0.0.zip&lt;br /&gt;
  unzip nextcloud-24.0.0.zip &lt;br /&gt;
  rm nextcloud-24.0.0.zip&lt;br /&gt;
  mkdir data tmp&lt;br /&gt;
  chmod 700 data tmp&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;
  memory_limit=512M&lt;br /&gt;
  session.save_path=/home/pacs/xyz00/users/cloud/tmp&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;
== Nextcloud beschleunigen ==&lt;br /&gt;
&lt;br /&gt;
Dieser Teil ist optional.&lt;br /&gt;
&lt;br /&gt;
Wenn regelmäßig &#039;&#039;&#039;im Browser&#039;&#039;&#039; mit Nextcloud gearbeitet werden soll, ist Nextcloud im Browser oft sehr langsam. Um dies zu verbessern, unterstützt Nextcloud die Anwendung von unterschiedlichen Cache-Verfahren (zum Beispiel Memcache, Redis).&lt;br /&gt;
&lt;br /&gt;
Redis ist auf den Hostsharing-Servern vorinstalliert und wird von den Nextcloud-Entwicklern empfohlen. &#039;&#039;&#039;In Verbindung mit einem Managed Webspace&#039;&#039;&#039; muss Redis als eigener Server &#039;&#039;&#039;Daemon&#039;&#039;&#039; angemeldet werden und ist &#039;&#039;&#039;kostenpflichtig&#039;&#039;&#039;. Siehe zu Kosten im Webspace Konfigurator unter: https://www.hostsharing.net/angebote/managed-webspace/ – &#039;&#039;&#039;1 individueller Serverdienst&#039;&#039;&#039; (Daemons).&lt;br /&gt;
&lt;br /&gt;
Mit dem Hostsharing-Service wird ein IP-Port für die Nutzung von Redis vereinbart.&lt;br /&gt;
&lt;br /&gt;
Für den Redis-Dienst lege ich folgende Struktur an:&lt;br /&gt;
&lt;br /&gt;
  cd ~&lt;br /&gt;
  mkdir -p ~/redis/etc&lt;br /&gt;
  mkdir -p ~/redis/var&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;~/redis/etc&#039;&#039; lege ich eine Konfigurationsdatei &#039;&#039;redis.conf&#039;&#039; für den Redis-Dienst ab:&lt;br /&gt;
&lt;br /&gt;
  daemonize yes&lt;br /&gt;
  pidfile /home/pacs/xyz00/users/cloud/redis/var/redis-server.pid&lt;br /&gt;
  requirepass mein-redis-passwort                    &lt;br /&gt;
  unixsocket /home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&lt;br /&gt;
  unixsocketperm 700&lt;br /&gt;
  port 0&lt;br /&gt;
  tcp-backlog 128&lt;br /&gt;
  timeout 300    &lt;br /&gt;
  loglevel notice&lt;br /&gt;
  logfile /home/pacs/xyz00/users/cloud/redis/var/redis.log&lt;br /&gt;
  databases 16&lt;br /&gt;
  save 900 1 &lt;br /&gt;
  save 300 10  &lt;br /&gt;
  save 60 10000&lt;br /&gt;
  slave-serve-stale-data yes&lt;br /&gt;
  appendonly no&lt;br /&gt;
  dbfilename dump.rdb&lt;br /&gt;
  dir /home/pacs/xyz00/users/cloud/redis/var&lt;br /&gt;
&lt;br /&gt;
Den Start und das Monitoring des Redis-Dienstes übernimmt &#039;&#039;monit&#039;&#039;. Hier eine geeignete Datei &#039;&#039;~/.monitrc&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
  set daemon 60&lt;br /&gt;
      with start delay 20&lt;br /&gt;
  set logfile /home/pacs/xyz00/users/cloud/monit/var/monit.log&lt;br /&gt;
  set idfile /home/pacs/xyz00/users/cloud/monit/var/monit.id&lt;br /&gt;
  set statefile /home/pacs/xyz00/users/cloud/monit/var/monit.state&lt;br /&gt;
  set httpd unixsocket /home/pacs/xyz00/users/cloud/monit/var/monit.sock&lt;br /&gt;
      permission 600&lt;br /&gt;
      allow monit:mein-monit-passwort&lt;br /&gt;
  check process redis with pidfile /home/pacs/xyz00/users/cloud/redis/var/redis-server.pid&lt;br /&gt;
      start program &amp;quot;/usr/bin/redis-server /home/pacs/xyz00/users/cloud/redis/etc/redis.conf&amp;quot;&lt;br /&gt;
      stop program &amp;quot;/bin/bash -c &#039;/bin/kill $( cat /home/pacs/xyz00/users/cloud/redis/var/redis-server.pid )&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte für die Datei &#039;&#039;~/.monitrc&#039;&#039; setzen:&lt;br /&gt;
&lt;br /&gt;
  cd ~&lt;br /&gt;
  chmod 600 .monitrc&lt;br /&gt;
&lt;br /&gt;
Verzeichnis für &#039;&#039;monit&#039;&#039; anlegen:&lt;br /&gt;
&lt;br /&gt;
  cd ~&lt;br /&gt;
  mkdir -p monit/var&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;
  &#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;
&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;
  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;
  /home/pacs/xyz00/users/cloud/monit/var/monit.log {&lt;br /&gt;
    rotate 2&lt;br /&gt;
    weekly&lt;br /&gt;
    missingok&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Eine Crontab sorgt für den Start von Monit und das tägliche Rotieren der Logdateien:&lt;br /&gt;
&lt;br /&gt;
  # m h  dom mon dow   command&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
  PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  MAILTO=webmaster@example.com&lt;br /&gt;
  @reboot /usr/bin/monit -c $HOME/.monitrc&lt;br /&gt;
  1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
  */5 * * * * /usr/bin/php $HOME/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
Die letzte Zeile der &#039;&#039;crontab&#039;&#039; enthält den Cronjob für die regelmäßigen Hintergrundprozesse der Nextcloud. Durch die Erledigung dieser Aufgaben mit Cron lässt sich die Nextcloud ebenfalls etwas beschleunigen.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Online Office ==&lt;br /&gt;
&lt;br /&gt;
In Nextcloud können Office-Dokumente (Textverarbeitung, Tabellen und Präsentationen) im Browser bearbeitet werden. Dazu steht bei Hostsharing die Collabora Developer Version zur Verfügung. Bestellung und Konfiguration sind hier im Wiki auf der Seite [[Collabora_Online]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud mit Nextcloud Talk ==&lt;br /&gt;
&lt;br /&gt;
Über die Nextcloud-App &amp;quot;Talk&amp;quot; können Videokonfererenzen mit Screensharing durchgeführt werden. Für die regelmäßige Nutzung kann es sinnvoll sein einen eigenen TURN Server zu betreiben. Siehe dazu [[Coturn_Installieren]]&lt;br /&gt;
&lt;br /&gt;
== 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;
  cd nextcloud/&lt;br /&gt;
  php occ fulltextsearch:index --output&lt;br /&gt;
&lt;br /&gt;
Wenn dieser Fehler kommt:&lt;br /&gt;
  TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
  must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
  cd nextcloud/&lt;br /&gt;
  php occ fulltextsearch:live -q&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
~/bin/start-fulltextsearchlive&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;
&lt;br /&gt;
~/bin/stop-fulltextsearchlive&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;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&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;
&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;
  xyz00-cloud@h00:~/nextcloud/updater$ chmod u+x updater.phar&lt;br /&gt;
  xyz00-cloud@h00:~/nextcloud/updater$ ./updater.phar&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;
Wartungsmodus per Shell ein- oder ausschalten:&lt;br /&gt;
&lt;br /&gt;
 xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --on&lt;br /&gt;
 xyz00-cloud@h00:~/nextcloud$ php occ maintenance:mode --off&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;
  xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-indices&lt;br /&gt;
  xyz00-cloud@h00:~/nextcloud$ php occ db:add-missing-primary-keys&lt;br /&gt;
  xyz00-cloud@h00:~/nextcloud$ php occ db:convert-filecache-bigint&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;
  #!/bin/bash&lt;br /&gt;
  if [ -f $HOME/nextcloud/occ ]; then &lt;br /&gt;
    echo &amp;quot;Nextcloud Update&amp;quot;; &lt;br /&gt;
    cd $HOME/nextcloud;&lt;br /&gt;
    php updater/updater.phar -vv --no-backup --no-interaction&lt;br /&gt;
    php occ maintenance:mode --on&lt;br /&gt;
    php occ db:add-missing-primary-keys --no-interaction&lt;br /&gt;
    php occ db:add-missing-columns --no-interaction&lt;br /&gt;
    php occ db:add-missing-indices --no-interaction&lt;br /&gt;
    php occ db:convert-filecache-bigint --no-interaction&lt;br /&gt;
    php occ app:update --all&lt;br /&gt;
    php occ maintenance:mode --off&lt;br /&gt;
  else &lt;br /&gt;
    echo &amp;quot;Keine Nextcloud Installation gefunden&amp;quot;; &lt;br /&gt;
  fi&lt;br /&gt;
&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;
 # 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;
&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://github.com/tpokorra/Hostsharing-Ansible-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 Ossass]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:CalDAV]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=5690</id>
		<title>Traffic</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=5690"/>
		<updated>2021-11-14T06:20:30Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Webzugriffe analysieren */ Skript  als Einzeiler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Als Traffic bezeichnet man Datenverkehr zwischen zwei Computersystemen.&lt;br /&gt;
&lt;br /&gt;
Dies beinhaltet [[Logging#HTTP-Traffic|Web]], [[Logging#Mail-Traffic|Mail]] und [[Logging#FTP-Traffic|FTP]] Verbindungen.&lt;br /&gt;
&lt;br /&gt;
==Traffic Ursachen erkennen==&lt;br /&gt;
&lt;br /&gt;
Hostsharing teilt per Mail mit, wenn der tägliche Durchschnitt an gebuchtem Traffic überschritten wurde. In der Mail steht, welches Paket den Traffic verursacht hat und die Warnung, dass Konsequenzen für die Monatsabrechnungen entstehen können. Wer nicht selbst die Ursachen des zusätzlichen Traffic kennt, kann sie mit folgenden Methoden ergründen:&lt;br /&gt;
&lt;br /&gt;
Als erstes einfach mal den Log ansehen und durchscrollen.&lt;br /&gt;
&lt;br /&gt;
  less ~/var/web.log&lt;br /&gt;
  less ~/var/web.log-yesterday&lt;br /&gt;
&lt;br /&gt;
Da kann man oft schon alleine durch Ansehen gleichförmige Strukturen erkennen, z.B. massenhafte Login-Versuche auf einen Wordpress Blog, die sehr viel Traffic generieren.&lt;br /&gt;
&lt;br /&gt;
==Webzugriffe analysieren==&lt;br /&gt;
&lt;br /&gt;
Diese Idee von Michael Hierweck: Wie bekomme ich heraus, welche Web-Zugriffe für mein Traffic-Volumen&lt;br /&gt;
maßgeblich verantwortlich sind?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Zeile 1: Traffic aus dem Log extrahieren, sortieren, zählen.&lt;br /&gt;
* Zeile 2: über die Einträge wandern&lt;br /&gt;
* Zeile 3: Produkt aus Zugriffen und Einzelvolumen berechnen&lt;br /&gt;
* Zeile 4: Ausgabe von Produkt, Zugriffen und Einzelvolume je Zugriff&lt;br /&gt;
* Zeile 5: sortieren&lt;br /&gt;
&lt;br /&gt;
Das Ganze als Einzeiler zum Kopieren, Einfügen und Ausführen im Terminal:&lt;br /&gt;
 cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039;|while read FACTOR SUM; do echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;done |sort -n&lt;br /&gt;
&lt;br /&gt;
Dieser Skript gibt den Traffic aus, den gleichförmige Einzelzugriffe generieren, die größten Brocken stehen unten. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
219558 6 36593&lt;br /&gt;
232288 14 16592&lt;br /&gt;
239998 22 10909&lt;br /&gt;
270812 2 135406&lt;br /&gt;
304520 5 60904&lt;br /&gt;
318248 14 22732&lt;br /&gt;
559062 14 39933&lt;br /&gt;
602760 20 30138&lt;br /&gt;
711496 8 88937&lt;br /&gt;
2325929 101 23029&lt;br /&gt;
2351668 29 81092&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ganz unten sieht man, dass 29 Zugriffe mit je 81092 Bytes zusammen 2351668 Bytes Traffic gekostet haben. In diesem Fall kann man nun ganz simpel im Log nach der dritten Zahl greppen und in less anzeigen, z.B. so:&lt;br /&gt;
&lt;br /&gt;
  grep 81092 $HOME/var/web.log | less&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich dieses Script öfter brauche ... ===&lt;br /&gt;
&lt;br /&gt;
lohnt es sich, daraus ein kleines Programm zu machen.&lt;br /&gt;
Dazu einfach&lt;br /&gt;
 &lt;br /&gt;
* Texteditor Eurer Wahl öffnen&lt;br /&gt;
* Script-Text hier kopieren und in den Editor einfügen&lt;br /&gt;
Hier noch mal eine etwas erweiterte Version&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher heute -----------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
&lt;br /&gt;
echo &lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo ------------- Top 10 Traffic_Verusacher gestern ---------------&lt;br /&gt;
echo ---------------------------------------------------------------&lt;br /&gt;
echo &lt;br /&gt;
echo Gesamtvolumen, Zugriffe, Einzelvolumen&lt;br /&gt;
cat $HOME/var/web.log-yesterday |cut -d &#039; &#039; -f11 |  grep -o &#039;[0-9]*&#039; | sort -n |uniq -c |sed -e&#039;s/^ *//&#039; \&lt;br /&gt;
	|while read FACTOR SUM; do&lt;br /&gt;
		echo &amp;quot;$((${FACTOR} * ${SUM})) ${FACTOR} ${SUM}&amp;quot;;&lt;br /&gt;
	done |sort -n -r|head -10&lt;br /&gt;
echo&lt;br /&gt;
echo Sie koennen nun nach dem Versacher suchen, indem sie die &lt;br /&gt;
echo Logfiles des Tages nach dem Einzelvolumen durchsuchen&lt;br /&gt;
echo &#039;Befehl: grep 81092 $HOME/var/web.log | less&#039;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Script als Datei ohne Erweiterung unter einem griffigen Namen wie &amp;quot;volumenauswertung&amp;quot; speichern&lt;br /&gt;
* Scriptdatei in das Home-Verzeichnis des Paket-Users auf dem Server laden.&lt;br /&gt;
* Permission x zufügen, um das Skript ausführbar zu machen.(In WinSCP: Rechtsklick auf Datei, Eigenschaften-Dialog öffnen, X-Eigenschaft für den Eigentümer setzen)  &lt;br /&gt;
&lt;br /&gt;
Nun kann man dieses Script jederzeit mit ./volumenauswertung starten.&lt;br /&gt;
&lt;br /&gt;
== Wie bekomme ich IPs mit massenhaften Web-Zugriffen erkannt und gesperrt? ==&lt;br /&gt;
&lt;br /&gt;
IPs mit mehrstelligen Zugriffen werden so gefunden (Hier alle IPs mit vierstelligen Zugriffen, beachte die Ziffer 4 im Ausdruck &amp;quot;egrep &#039;^[0-9]{4,} .*$&#039;&amp;quot;):&lt;br /&gt;
  cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 | sort | uniq -c |sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{4,} .*$&#039;&lt;br /&gt;
&lt;br /&gt;
Als Paketadmin alle IPs mit 10.000 und mehr Web-Zugriffen aus dem&lt;br /&gt;
heutigen Log filtern und dafür Sperreinträge erzeugen, die man in die&lt;br /&gt;
.htaccess kopieren kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
cat ${HOME}/var/web.log |cut -d &#039; &#039; -f2 |sort |uniq -c \&lt;br /&gt;
	|sed -e&#039;s/^ *//&#039; | egrep &#039;^[0-9]{5,} .*$&#039; |cut -d &#039; &#039;  -f 2 \&lt;br /&gt;
	|xargs -n1 -r -I XXX &amp;quot;echo deny from XXX&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Zeile 1: Log auswerten und IPs extrahieren und zählen&lt;br /&gt;
* Zeile 2: Filtern (Mit der Anweisung &#039;&#039;&#039;egrep &#039;^[0-9]{5,} .*$&#039;&#039;&#039;&#039; werden durch die Ziffer 5 nur die gefundenen Einträge mit einer fünfstelligen Anzahl von Zugriffen gefunden. Ändert man 5 in 4, werden analog alle Einträge mit vierstelligen Zugriffszahlen gefunden.&lt;br /&gt;
* Zeile 3: Einträge erzeugen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;br /&gt;
[[Kategorie:Traffic]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=5680</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=5680"/>
		<updated>2021-10-09T07:19:46Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Konfiguration im Browser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mailing List Management Made Joyful ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mlmmj.org/ mlmmj] ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Vergleichen Sie dazu auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Alternative: [[Mailman_3_installieren]]&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Installation einer Mailingliste in einem Hostsharing Webspace für eine Domain.&lt;br /&gt;
&lt;br /&gt;
== mlmmj ==&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen  ===&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfehle ich das Anlegen eines Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
Sei mein Paket &#039;&#039;xyz00&#039;&#039; und der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sei meine Domain &#039;&#039;example.org&#039;&#039; und die E-Mail-Adresse für die Liste &#039;&#039;discuss@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain muss bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; aufgeschaltet sein. Die E-Mail-Adresse wird ebenfalls mit hsadmin eingerichtet. Das Target ist der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hier werden User und E-Mail-Adresse mit Hilfe des hsadmin-Interpreters &#039;&#039;hsscript&#039;&#039; angelegt:&lt;br /&gt;
&lt;br /&gt;
  xyz00@h03:~$ hsscript -i&lt;br /&gt;
  Password: *************&lt;br /&gt;
  xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung  ===&lt;br /&gt;
&lt;br /&gt;
Ich melde mich auf der Linux-Kommandozeile als User &#039;&#039;xyz00-list&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;quot;mlmmj&amp;quot; an:&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
  mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Das Skript fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
  The Domain for the List? [] : example.org&lt;br /&gt;
  The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
  For the list texts you can choose between the following languages or&lt;br /&gt;
  give a absolute path to a directory containing the texts.&lt;br /&gt;
  Available languages:&lt;br /&gt;
  cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
  The path to texts for the list? [en] : de&lt;br /&gt;
&lt;br /&gt;
Damit ist unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; angelegt,&lt;br /&gt;
das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis die Datei &amp;quot;.forward&amp;quot; mit folgenden Inhalt an (Achtung, die Anführungszeichen nicht vergessen!):&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Diese Datei sorgt dafür, dass eingehende E-Mail für die Liste an das Programm &#039;&#039;mlmmj-recieve&#039;&#039;&lt;br /&gt;
übergeben und dort verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
crontab wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  MAILTO=webmaster@example.org&lt;br /&gt;
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
  SHELL=/bin/bash&lt;br /&gt;
  LANG=en_US.UTF-8&lt;br /&gt;
  # m h  dom mon dow   command&lt;br /&gt;
  28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Schluss trage ich noch die gewünschten E-Mail-Adressen ein:&lt;br /&gt;
&lt;br /&gt;
  /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
  /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes Ce)&lt;br /&gt;
angeben. Dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
=== weitere Konfiguration  ===&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&lt;br /&gt;
Die Liste darf nur E-Mails von eingetragenen Abonnenten weiterleiten:&lt;br /&gt;
&lt;br /&gt;
  touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&lt;br /&gt;
Das Abonnement muss vom Listen-Owner bestätigt werden:&lt;br /&gt;
&lt;br /&gt;
  touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, so dass Antwort-EMails immer an den Verteiler gehen:&lt;br /&gt;
&lt;br /&gt;
   echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
   echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration im Browser ===&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte. &lt;br /&gt;
Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen&lt;br /&gt;
von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ und diese in einem temporären Verzeichnis entpacken.&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot; findet sich die PHP-Admin-Anwendung.&lt;br /&gt;
&lt;br /&gt;
Also den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen,&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
 &lt;br /&gt;
  Require valid-user&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
  AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&lt;br /&gt;
Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
  cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
  htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
Ein Passwort angeben und auf&lt;br /&gt;
https://lists.example.org schauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Date &#039;&#039;.forward&#039;&#039; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
    |/usr/bin/procmail -p&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &#039;&#039;.procmailrc&#039;&#039; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
    SHELL=/bin/sh&lt;br /&gt;
    HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
    MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
    PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
    VERBOSE=yes&lt;br /&gt;
    LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
    DEFAULT&lt;br /&gt;
    &lt;br /&gt;
    :0:&lt;br /&gt;
    * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
    |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
    &lt;br /&gt;
    :0&lt;br /&gt;
    { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://gitlab.com/mlmmj/ mlmmj auf Gitlab &lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=5679</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=5679"/>
		<updated>2021-10-09T06:55:51Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Mehrere Mailinglisten betreiben */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mailing List Management Made Joyful ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mlmmj.org/ mlmmj] ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Vergleichen Sie dazu auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Alternative: [[Mailman_3_installieren]]&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Installation einer Mailingliste in einem Hostsharing Webspace für eine Domain.&lt;br /&gt;
&lt;br /&gt;
== mlmmj ==&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen  ===&lt;br /&gt;
&lt;br /&gt;
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfehle ich das Anlegen eines Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
Sei mein Paket &#039;&#039;xyz00&#039;&#039; und der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sei meine Domain &#039;&#039;example.org&#039;&#039; und die E-Mail-Adresse für die Liste &#039;&#039;discuss@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain muss bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; aufgeschaltet sein. Die E-Mail-Adresse wird ebenfalls mit hsadmin eingerichtet. Das Target ist der User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hier werden User und E-Mail-Adresse mit Hilfe des hsadmin-Interpreters &#039;&#039;hsscript&#039;&#039; angelegt:&lt;br /&gt;
&lt;br /&gt;
  xyz00@h03:~$ hsscript -i&lt;br /&gt;
  Password: *************&lt;br /&gt;
  xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
  xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung  ===&lt;br /&gt;
&lt;br /&gt;
Ich melde mich auf der Linux-Kommandozeile als User &#039;&#039;xyz00-list&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;quot;mlmmj&amp;quot; an:&lt;br /&gt;
&lt;br /&gt;
  mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
  mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&lt;br /&gt;
Das Skript fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
  The Domain for the List? [] : example.org&lt;br /&gt;
  The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
  For the list texts you can choose between the following languages or&lt;br /&gt;
  give a absolute path to a directory containing the texts.&lt;br /&gt;
  Available languages:&lt;br /&gt;
  cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
  The path to texts for the list? [en] : de&lt;br /&gt;
&lt;br /&gt;
Damit ist unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; angelegt,&lt;br /&gt;
das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
Für den User lege ich in seinem Heimat-Verzeichnis die Datei &amp;quot;.forward&amp;quot; mit folgenden Inhalt an (Achtung, die Anführungszeichen nicht vergessen!):&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Diese Datei sorgt dafür, dass eingehende E-Mail für die Liste an das Programm &#039;&#039;mlmmj-recieve&#039;&#039;&lt;br /&gt;
übergeben und dort verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
crontab wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  MAILTO=webmaster@example.org&lt;br /&gt;
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
  SHELL=/bin/bash&lt;br /&gt;
  LANG=en_US.UTF-8&lt;br /&gt;
  # m h  dom mon dow   command&lt;br /&gt;
  28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Schluss trage ich noch die gewünschten E-Mail-Adressen ein:&lt;br /&gt;
&lt;br /&gt;
  /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
  /usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes Ce)&lt;br /&gt;
angeben. Dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
=== weitere Konfiguration  ===&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&lt;br /&gt;
Die Liste darf nur E-Mails von eingetragenen Abonnenten weiterleiten:&lt;br /&gt;
&lt;br /&gt;
  touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&lt;br /&gt;
Das Abonnement muss vom Listen-Owner bestätigt werden:&lt;br /&gt;
&lt;br /&gt;
  touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, so dass Antwort-EMails immer an den Verteiler gehen:&lt;br /&gt;
&lt;br /&gt;
   echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
   echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj]&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration im Browser ===&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; enthält ein paar einfache PHP- und Perl-Skripte. &lt;br /&gt;
Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen&lt;br /&gt;
von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&lt;br /&gt;
  hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Download von http://mlmmj.org/releases/mlmmj-1.2.18.0.tar.gz auspacken.&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-1.2.18.0/contrib/web/php-admin/&amp;quot; finden Sie im Paket die PHP-Admin-Anwendung.&lt;br /&gt;
&lt;br /&gt;
Also den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen,&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
 &lt;br /&gt;
  Require valid-user&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
  AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&lt;br /&gt;
Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
  cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
  htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
Ein Passwort angeben und auf&lt;br /&gt;
https://lists.example.org schauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Date &#039;&#039;.forward&#039;&#039; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
    |/usr/bin/procmail -p&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &#039;&#039;.procmailrc&#039;&#039; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
    SHELL=/bin/sh&lt;br /&gt;
    HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
    MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
    PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
    VERBOSE=yes&lt;br /&gt;
    LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
    DEFAULT&lt;br /&gt;
    &lt;br /&gt;
    :0:&lt;br /&gt;
    * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
    |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
    &lt;br /&gt;
    :0&lt;br /&gt;
    { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://gitlab.com/mlmmj/ mlmmj auf Gitlab &lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ Nutzung von mlmmj in Verbindung mit Procmail&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5666</id>
		<title>Gitolite installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5666"/>
		<updated>2021-10-02T08:21:55Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
&lt;br /&gt;
Gitolite (https://gitolite.com/gitolite/index.html) ist leichtgewichtiger Server für Git Repositories, der in einem HS Webpaket läuft, ohne dass ein Server (mit eigenem Daemon und Port etc.) installiert sein muss. Es macht in einem Webpaket gehostete Repos über SSH zugänglich. Gitolite ist gut geeignet,wenn eine überschaubare Anzahl Repos und User verwaltet werden soll, es wird gesteuert über ein einziges Configfile und Public-Keys die alle zusammen über Git versioniert sind.&lt;br /&gt;
&lt;br /&gt;
== Gitolite einzurichten ist sehr einfach ==&lt;br /&gt;
&lt;br /&gt;
Du brauchst ein SSH-Keypair (&#039;admin&#039;), das dem Gitolite-Admin den Zugang ermöglicht. Dessen Publickey kopiest du in das homedir deines HS-Users.&lt;br /&gt;
&lt;br /&gt;
Per SSH da eingeloggt, schreibst du:&lt;br /&gt;
&lt;br /&gt;
  gitolite setup -pk admin.pub&lt;br /&gt;
&lt;br /&gt;
Damit ist Gitolite in dem Webpaket bereits installiert. Es hat die Konfigurationsdatei &#039;.gitolite.rc&#039; und das Verzeichnis &#039;/repositories&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
In &#039;/repositories&#039; sind bereits zwei Repos eingerichtet, gitolite-admin.git und testing.git.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Du kannst nun von außerhalb das Admin Repo auf deinen Computer klonen (Achtung, ungeprüft):&lt;br /&gt;
&lt;br /&gt;
git clone xyz00@xyz00.hostsharing.net:gitolite-adminadmin.git&lt;br /&gt;
&lt;br /&gt;
In dem Repo finden sich die zwei Verzeichnisse &#039;&#039;conf&#039;&#039; und &#039;&#039;keydir&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
User entstehen durch gleichnamige Dateien (mit der Endung &#039;.pub&#039;) mit den Public-Keys der User im Verzeichnis &#039;keydir&#039;:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer ~/gitolite-admin » ls keydir &lt;br /&gt;
  admin.pub  anton.pub berta.pub  jenkins.pub  josef.pub&lt;br /&gt;
&lt;br /&gt;
=== Repositories und Zugriffsrechte ===&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Repos und der Zugriffsrechte schreibt man in conf/gitolite.conf, darin kann man auch Gruppen definieren (deren Namen beginnen mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
  # Gruppen &lt;br /&gt;
  @programmierer = anton josef &lt;br /&gt;
  @reader = jenkins gitweb anton &lt;br /&gt;
 &lt;br /&gt;
  # Hier stehen die Repos &lt;br /&gt;
 &lt;br /&gt;
  repo gitolite-admin &lt;br /&gt;
      RW+     =   admin &lt;br /&gt;
 &lt;br /&gt;
  repo example.de &lt;br /&gt;
      RW+         = @programmierer &lt;br /&gt;
      R           = @reader &lt;br /&gt;
 &lt;br /&gt;
  repo example-data &lt;br /&gt;
      R       =   @reader &lt;br /&gt;
      RW+     =   @programmierer &lt;br /&gt;
 &lt;br /&gt;
  repo example-blog &lt;br /&gt;
      RW+     =   anton berta&lt;br /&gt;
&lt;br /&gt;
Man definiert also einfach ein neues Repo und die Zugriffsrechte mit &lt;br /&gt;
einem Eintrag in gitolite.conf.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration versionieren und pushen ===&lt;br /&gt;
&lt;br /&gt;
Das kann man nun wie in Git üblich committen und pushen:&lt;br /&gt;
&lt;br /&gt;
  git add -A&lt;br /&gt;
  git commit -m &amp;quot;Start Gitolite Administration&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
&lt;br /&gt;
Und dann passiert folgendes: Gitolite packt die Keys der User in .ssh/authorized_keys mit einem Command voran, das die Gitolite Shell aufruft.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Und je nachdem wie es in gitolite.conf definiert wurde, haben die User jetzt per SSH Zugriff auf die Repositories, sie können sich einloggen, bekommen aber nur ein Listing zu sehen, das ihre Repos zeigt.&lt;br /&gt;
&lt;br /&gt;
Beachte den Verweis auf das Identity-file:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer » ssh -i admin xyz00@xyz00.hostsharing.net&lt;br /&gt;
  PTY allocation request failed on channel 0&lt;br /&gt;
  hello admin, this is xyz@h00 running gitolite3 3.6.11-2 (Debian) on git 2.20.1&lt;br /&gt;
  &lt;br /&gt;
   R W	gitolite-admin&lt;br /&gt;
   R W	example.de&lt;br /&gt;
   R W	example-data&lt;br /&gt;
   R W	example-blog&lt;br /&gt;
  Connection to deg01.hostsharing.net closed.&lt;br /&gt;
&lt;br /&gt;
Die User können die Repos klonen, und – wenn erlaubt – bearbeiten und wieder pushen.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5665</id>
		<title>Gitolite installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5665"/>
		<updated>2021-10-02T08:20:13Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
Gitolite ist leichtgewichtiger Server für Git Repositories, der in einem HS Webpaket läuft, ohne dass ein Server (mit eigenem Daemon und Port etc.) installiert sein muss. Es macht in einem Webpaket gehostete Repos über SSH zugänglich. Gitolite ist gut geeignet,wenn eine überschaubare Anzahl Repos und User verwaltet werden soll, es wird gesteuert über ein einziges Configfile und Public-Keys die alle zusammen über Git versioniert sind.&lt;br /&gt;
&lt;br /&gt;
== Gitolite einzurichten ist sehr einfach ==&lt;br /&gt;
&lt;br /&gt;
Du brauchst ein SSH-Keypair (&#039;admin&#039;), das dem Gitolite-Admin den Zugang ermöglicht. Dessen Publickey kopiest du in das homedir deines HS-Users.&lt;br /&gt;
&lt;br /&gt;
Per SSH da eingeloggt, schreibst du:&lt;br /&gt;
&lt;br /&gt;
  gitolite setup -pk admin.pub&lt;br /&gt;
&lt;br /&gt;
Damit ist Gitolite in dem Webpaket bereits installiert. Es hat die Konfigurationsdatei &#039;.gitolite.rc&#039; und das Verzeichnis &#039;/repositories&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
In &#039;/repositories&#039; sind bereits zwei Repos eingerichtet, gitolite-admin.git und testing.git.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Du kannst nun von außerhalb das Admin Repo auf deinen Computer klonen (Achtung, ungeprüft):&lt;br /&gt;
&lt;br /&gt;
git clone xyz00@xyz00.hostsharing.net:gitolite-adminadmin.git&lt;br /&gt;
&lt;br /&gt;
In dem Repo finden sich die zwei Verzeichnisse &#039;&#039;conf&#039;&#039; und &#039;&#039;keydir&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
User entstehen durch gleichnamige Dateien (mit der Endung &#039;.pub&#039;) mit den Public-Keys der User im Verzeichnis &#039;keydir&#039;:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer ~/gitolite-admin » ls keydir &lt;br /&gt;
  admin.pub  anton.pub berta.pub  jenkins.pub  josef.pub&lt;br /&gt;
&lt;br /&gt;
=== Repositories und Zugriffsrechte ===&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Repos und der Zugriffsrechte schreibt man in conf/gitolite.conf, darin kann man auch Gruppen definieren (deren Namen beginnen mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
  # Gruppen &lt;br /&gt;
  @programmierer = anton josef &lt;br /&gt;
  @reader = jenkins gitweb anton &lt;br /&gt;
 &lt;br /&gt;
  # Hier stehen die Repos &lt;br /&gt;
 &lt;br /&gt;
  repo gitolite-admin &lt;br /&gt;
      RW+     =   admin &lt;br /&gt;
 &lt;br /&gt;
  repo example.de &lt;br /&gt;
      RW+         = @programmierer &lt;br /&gt;
      R           = @reader &lt;br /&gt;
 &lt;br /&gt;
  repo example-data &lt;br /&gt;
      R       =   @reader &lt;br /&gt;
      RW+     =   @programmierer &lt;br /&gt;
 &lt;br /&gt;
  repo example-blog &lt;br /&gt;
      RW+     =   anton berta&lt;br /&gt;
&lt;br /&gt;
Man definiert also einfach ein neues Repo und die Zugriffsrechte mit &lt;br /&gt;
einem Eintrag in gitolite.conf.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration versionieren und pushen ===&lt;br /&gt;
&lt;br /&gt;
Das kann man nun wie in Git üblich committen und pushen:&lt;br /&gt;
&lt;br /&gt;
  git add -A&lt;br /&gt;
  git commit -m &amp;quot;Start Gitolite Administration&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
&lt;br /&gt;
Und dann passiert folgendes: Gitolite packt die Keys der User in .ssh/authorized_keys mit einem Command voran, das die Gitolite Shell aufruft.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Und je nachdem wie es in gitolite.conf definiert wurde, haben die User jetzt per SSH Zugriff auf die Repositories, sie können sich einloggen, bekommen aber nur ein Listing zu sehen, das ihre Repos zeigt.&lt;br /&gt;
&lt;br /&gt;
Beachte den Verweis auf das Identity-file:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer » ssh -i admin xyz00@xyz00.hostsharing.net&lt;br /&gt;
  PTY allocation request failed on channel 0&lt;br /&gt;
  hello admin, this is xyz@h00 running gitolite3 3.6.11-2 (Debian) on git 2.20.1&lt;br /&gt;
  &lt;br /&gt;
   R W	gitolite-admin&lt;br /&gt;
   R W	example.de&lt;br /&gt;
   R W	example-data&lt;br /&gt;
   R W	example-blog&lt;br /&gt;
  Connection to deg01.hostsharing.net closed.&lt;br /&gt;
&lt;br /&gt;
Die User können die Repos klonen, und – wenn erlaubt – bearbeiten und wieder pushen.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Login_mit_SSH&amp;diff=5663</id>
		<title>Diskussion:Login mit SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Login_mit_SSH&amp;diff=5663"/>
		<updated>2021-09-29T08:29:23Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Neuer Abschnitt /* Login mit SSH-Keypairs beschreiben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anleitung für windowsbenutzer fehlt-werde ich nachreichen-Jochen (01:42, 18. Feb. 2009 Dgy00)&lt;br /&gt;
&lt;br /&gt;
== Login mit SSH-Keypairs beschreiben ==&lt;br /&gt;
&lt;br /&gt;
Beschreibung von ssh-keygen, ssh-copy-id und authorized_keys und der entsprechenden Funktionalität fehlt hier. --[[Benutzer:Deg00-m.website|ChristofT]] ([[Benutzer Diskussion:Deg00-m.website|Diskussion]]) 10:29, 29. Sep. 2021 (CEST)&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=5662</id>
		<title>Login mit SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Login_mit_SSH&amp;diff=5662"/>
		<updated>2021-09-29T08:27:09Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Baustelle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Um sich einloggen zu können, brauchst Du natürlich die Daten, die Dir von Hostsharing in einer Mail nach der Anmeldung zugeschickt wurden: &lt;br /&gt;
&lt;br /&gt;
Hostname: &#039;&#039;&#039;xyz00.hostsharing.net&#039;&#039;&#039; (wenn eine eigene Domain konnektiert ist auch &amp;lt;eigene-domain&amp;gt;.&amp;lt;tld&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Username: &#039;&#039;&#039;xyz00&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Passwort: &#039;&#039;&#039;(wie in der automatischen Mail mitgeteilt)&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei xyz00 handelt es sich um den Account des Paket-Admins. Initial ist für jedes neue Paket nur ein Admin-Account eingerichtet, dessen Benutzername die Form &#039;&#039;&#039;xyz00&#039;&#039;&#039; besitzt. &lt;br /&gt;
&lt;br /&gt;
Da dieser Account sehr viel Macht über das Paket hat, darf er nur über sichere Protokolle wie SSH benutzt werden. Unsichere Protokolle wie direktes FTP dürfen nicht verwendet werden, da diese die Passwörter im Klartext übertragen. Jeder Administrator auf der Übertragungsstrecke könnte mitlesen. &lt;br /&gt;
&lt;br /&gt;
Gleich vorab: Seine Website kann man später freilich über einen separaten Account per ftps, sftp, scp (und zur Not auch ftp) hochladen, doch dazu später mehr.&lt;br /&gt;
&lt;br /&gt;
Linux Systeme haben meist ssh, scp und sftp Clients vorinstalliert. Eine Freie Software zum sicheren Dateitransfer für Windows ist z.B. [http://winscp.net WinSCP] und ein Shell Zugang mit [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]. &lt;br /&gt;
&lt;br /&gt;
Nach der ggf. nötigen Installation eines ssh Clients, die hier nicht beschrieben werden, da sie nicht Hostsharing-spezifisch ist, kann der erste Login erfolgen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
&lt;br /&gt;
Mit OpenSSH ist der Aufruf auf der Kommandozeile z.B. folgender: &lt;br /&gt;
&lt;br /&gt;
 ssh xyz00@xyz00.hostsharing.net&lt;br /&gt;
&lt;br /&gt;
Nach Aufbau der Verbindung wird dann das [[Passwort]] erfragt.&lt;br /&gt;
Danach erscheint in etwa folgende Bildschirmausgabe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 Last login: Fri Apr 19 06:43:45 2002 from p5081f0c7.dip.t-dialin.net on pts/7&lt;br /&gt;
&lt;br /&gt;
 Linux hopi 2.4.17 #2 SMP Thu Jan 17 14:35:38 CET 2002 i686 unknown&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 +----------------------------------------------------------------+&lt;br /&gt;
 | hopi.hostsharing.net |&lt;br /&gt;
 | Bei Fragen oder Problemen bitte E-Mail an: |&lt;br /&gt;
 | support@hostsharing.net (öffentliche Mailingliste) |&lt;br /&gt;
 +----------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
 Last login: Fri Apr 19 09:36:34 2002 from 62.156.160.59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 xyz0@hopi:~$ █&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es macht durchaus Sinn, die ganz oben genannte &amp;quot;Last Login&amp;quot; Zeile zu prüfen, ob man dies auch selbst war (Uhrzeit und Provider), unten die &amp;quot;Last Login&amp;quot; Zeile gibt genau genommen das aktuelle Login aus, weil der Programmteil nach dem eigentlichen Login ausgeführt wird. &lt;br /&gt;
&lt;br /&gt;
Als nächstes ändern wir gleich unser [[Passwort]], da dieses schließlich unverschlüsselt per E-Mail versendet wurde. Dies geschieht unter UNIX mit dem Kommando passwd&lt;br /&gt;
&lt;br /&gt;
== Passwort ändern ==&lt;br /&gt;
&lt;br /&gt;
Eine Änderung des Passwortes geht dem Befehl passwd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ passwd&lt;br /&gt;
&lt;br /&gt;
Changing password for xyz00&lt;br /&gt;
&lt;br /&gt;
(current) UNIX password: ALTESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Enter new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
Retype new UNIX password: NEUESPASSWORT&lt;br /&gt;
&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&lt;br /&gt;
xyz00@hopi:~$ █&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Platzhalter &#039;&#039;&#039;NEUESPASSWORT&#039;&#039;&#039; und &#039;&#039;&#039;ALTESPASSWORT&#039;&#039;&#039; müssen dabei selbstverständlich gegen die entsprechenden [[Passworte]] ausgetauscht werden. Dabei sollte jedes Passwort mindestens 6 Zeichen lang sein, besser 8 Zeichen, und aus Buchstaben, Ziffern und ggf. Sonderzeichen bestehen. Allerdings sollte auf Umlaute verzichtet werden, da diese je nach verwendetem Zugangsweg nicht verwendet werden könnten. &lt;br /&gt;
&lt;br /&gt;
Ggf. kommt es zu Fehlermeldungen, z.B. wenn das neue [[Passwort]] zu simpel ist, oder bei der Wiederholung nicht identisch mit dem ersten Passwort ist. In dem Fall, den Vorgang einfach wiederholen. Solange das neue Passwort nicht erfolgreich übernommen wurde, bleibt das alte gültig. &lt;br /&gt;
&lt;br /&gt;
Es gibt User, denen der Paket-Admin nur das Recht eingeräumt hat, das eigene Passwort zu ändern, indem er ihnen die &amp;quot;Shell&amp;quot; /usr/bin/passwd zugewiesen hat. Diese User können durch einen Shell-Login nur ihr Passwort ändern, da das Programm passwd an Stelle einer Shell gestartet wird. Sie werden nach dem Einloggen automatisch auf diesen Dialog geführt.Mehr dazu unter [[User#Rechte]].&lt;br /&gt;
&lt;br /&gt;
==Sitzung beenden==&lt;br /&gt;
&lt;br /&gt;
Um die Sitzung zu beenden, sich also auszuloggen, gibt man exit ein. Das sieht dann so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
xyz00@hopi:~$ exit &lt;br /&gt;
logout &lt;br /&gt;
Connection to xyz00.hostsharing.net closed.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Möglichkeiten ==&lt;br /&gt;
&lt;br /&gt;
== Bestimmte Shell Kommandos automatisch ausführen ==&lt;br /&gt;
&lt;br /&gt;
Lege in dem Verzeichnis, in dem Du direkt nach dem Login landest, mit dem Editor Deiner Wahl die Datei .bash_profile mit folgendem Inhalt an:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Get the aliases and functions&lt;br /&gt;
if [ -f ~/.bashrc ]; then&lt;br /&gt;
. ~/.bashrc&lt;br /&gt;
fi&lt;br /&gt;
# User specific environment and startup programs&lt;br /&gt;
PATH=$PATH:$HOME/bin&lt;br /&gt;
BASH_ENV=$HOME/.bashrc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und nun kannst du in der Datei .bashrc shell Kommandos eingeben. z.B.: quota -g&lt;br /&gt;
&lt;br /&gt;
== welcher Editor in der shell ==&lt;br /&gt;
&lt;br /&gt;
1. manuell Einloggen und:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VISUAL=nano&lt;br /&gt;
export VISUAL&lt;br /&gt;
EDITOR=nano&lt;br /&gt;
export EDITOR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. in der bash geht es auch kürzer:&lt;br /&gt;
&amp;lt;pre&amp;gt;export EDITOR=nano&lt;br /&gt;
export VISUAL=nano&lt;br /&gt;
&lt;br /&gt;
3. automatisch bei jedem Login&lt;br /&gt;
&lt;br /&gt;
Mit obigen Kommandos in der ~/.bash_profile-Datei.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Links==&lt;br /&gt;
&lt;br /&gt;
[[HS-Server:SSH-Hostkeys]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Einstieg bei Hostsharing]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5661</id>
		<title>Gitolite installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5661"/>
		<updated>2021-09-29T08:25:28Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
Gitolite ist eine Art Server für Git Repositories ohne dass ein Server (mit eigenem Daemon und Port etc.) installiert sein muss. Es macht in einem Webpaket gehostete Repos über SSH zugänglich. Ist gut für eine Handvoll Repos und ein paar User, wird gesteuert über ein Configfile und Public-Keys die alle zusammen über Git versioniert sind.&lt;br /&gt;
&lt;br /&gt;
Gitolite einzurichten ist sehr einfach (wenn man rausbekommen hat wie es funktioniert).&lt;br /&gt;
&lt;br /&gt;
Du brauchst ein SSH-Keypair (&#039;admin&#039;), das dem Gitolite-Admin den Zugang ermöglicht. Dessen Publickey kopiest du in das homedir deines HS-Users.&lt;br /&gt;
&lt;br /&gt;
Per SSH da eingeloggt, schreibst du:&lt;br /&gt;
&lt;br /&gt;
  gitolite setup -pk admin.pub&lt;br /&gt;
&lt;br /&gt;
Damit ist Gitolite in dem Webpaket installiert. Es hat die Konfigurationsdatei &#039;.gitolite.rc&#039; und das Verzeichnis &#039;/repositories&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
In &#039;/repositories&#039; sind bereits zwei Repos eingerichtet, gitolite-admin.git und testing.git.&lt;br /&gt;
&lt;br /&gt;
Du kannst nun von außerhalb das Admin Repo auf deinen Computer klonen (achtung, ungeprüft):&lt;br /&gt;
&lt;br /&gt;
git clone xyz00@xyz00.hostsharing.net:gitolite-adminadmin.git&lt;br /&gt;
&lt;br /&gt;
In dem Repo finden sich die zwei Verzeichnisse conf und keydir.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Repos und der Zugriffsrechte schreibt man in conf/gitolite.conf, darin kann man auch Gruppen definieren (deren Namen beginnen mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
  # Gruppen &lt;br /&gt;
  @programmierer = anton josef &lt;br /&gt;
  @reader = jenkins gitweb anton &lt;br /&gt;
 &lt;br /&gt;
  # Hier stehen die Repos &lt;br /&gt;
 &lt;br /&gt;
  repo gitolite-admin &lt;br /&gt;
      RW+     =   admin &lt;br /&gt;
 &lt;br /&gt;
  repo example.de &lt;br /&gt;
      RW+         = @programmierer &lt;br /&gt;
      R           = @reader &lt;br /&gt;
 &lt;br /&gt;
  repo example-data &lt;br /&gt;
      R       =   @reader &lt;br /&gt;
      RW+     =   @programmierer &lt;br /&gt;
 &lt;br /&gt;
  repo example-blog &lt;br /&gt;
      RW+     =   anton berta&lt;br /&gt;
&lt;br /&gt;
Man definiert also einfach ein neues Repo und die Zugriffsrechte mit &lt;br /&gt;
einem Eintrag in gitolite.conf.&lt;br /&gt;
&lt;br /&gt;
User entstehen durch gleichnamige Dateien (mit der Endung &#039;.pub&#039;) mit den Public-Keys der User im Verzeichnis &#039;keydir&#039;:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer ~/gitolite-admin » ls keydir &lt;br /&gt;
  admin.pub  anton.pub berta.pub  jenkins.pub  josef.pub&lt;br /&gt;
&lt;br /&gt;
Das kann man nun wie in Git üblich committen und pushen:&lt;br /&gt;
&lt;br /&gt;
  git add -A&lt;br /&gt;
  git commit -m &amp;quot;Start Gitolite Administration&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
&lt;br /&gt;
Und dann passiert folgendes: Gitolite packt die Keys der User in .ssh/authorized_keys mit einem Command voran, das die Gitolite Shell aufruft.&lt;br /&gt;
&lt;br /&gt;
Und je nachdem wie es in gitolite.conf definiert wurde, haben die User jetzt per SSH Zugriff auf die Repositories, sie können sich einloggen, bekommen aber nur ein Listing zu sehen, das ihre Repos zeigt.&lt;br /&gt;
&lt;br /&gt;
Beachte den Verweis auf das Identity-file:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer » ssh -i admin xyz00@xyz00.hostsharing.net&lt;br /&gt;
  PTY allocation request failed on channel 0&lt;br /&gt;
  hello admin, this is xyz@h00 running gitolite3 3.6.11-2 (Debian) on git 2.20.1&lt;br /&gt;
  &lt;br /&gt;
   R W	gitolite-admin&lt;br /&gt;
   R W	example.de&lt;br /&gt;
   R W	example-data&lt;br /&gt;
   R W	example-blog&lt;br /&gt;
  Connection to deg01.hostsharing.net closed.&lt;br /&gt;
&lt;br /&gt;
Die User können die Repos klonen, und – wenn erlaubt – bearbeiten und wieder pushen.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5660</id>
		<title>Gitolite installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5660"/>
		<updated>2021-09-29T08:23:04Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Kategorie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
Gitolite ist eine Art Server für Git Repositories ohne dass ein Server (mit eigenem Daemon und Port etc.) installiert sein muss. Es macht in einem Webpaket gehostete Repos über SSH zugänglich. Ist gut für eine Handvoll Repos und ein paar User, wird gesteuert über ein Configfile und Public-Keys die alle zusammen über Git versioniert sind.&lt;br /&gt;
&lt;br /&gt;
Gitolite einzurichten ist sehr einfach (wenn man rausbekommen hat wie es funktioniert).&lt;br /&gt;
&lt;br /&gt;
Du brauchst ein SSH-Keypair (&#039;admin&#039;), das den später Gitolite-Admin Zugang ermöglicht. Dessen Publickey kopiest du in das homedir deines HS-Users.&lt;br /&gt;
&lt;br /&gt;
Per SSH da eingeloggt, schreibst du:&lt;br /&gt;
&lt;br /&gt;
  gitolite setup -pk admin.pub&lt;br /&gt;
&lt;br /&gt;
Damit ist Gitolite in dem Webpaket installiert. Es hat die Konfigurationsdatei &#039;.gitolite.rc&#039; und das Verzeichnis &#039;/repositories&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
In &#039;/repositories&#039; sind bereits zwei Repos eingerichtet, gitolite-admin.git und testing.git.&lt;br /&gt;
&lt;br /&gt;
Du kannst nun von außerhalb das Admin Repo auf deinen Computer klonen (achtung, ungeprüft):&lt;br /&gt;
&lt;br /&gt;
git clone xyz00@xyz00.hostsharing.net:gitolite-adminadmin.git&lt;br /&gt;
&lt;br /&gt;
In dem Repo finden sich die zwei Verzeichnisse conf und keydir.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Repos und der Zugriffsrechte schreibt man in conf/gitolite.conf, darin kann man auch Gruppen definieren (deren Namen beginnen mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
  # Gruppen &lt;br /&gt;
  @programmierer = anton josef &lt;br /&gt;
  @reader = jenkins gitweb anton &lt;br /&gt;
 &lt;br /&gt;
  # Hier stehen die Repos &lt;br /&gt;
 &lt;br /&gt;
  repo gitolite-admin &lt;br /&gt;
      RW+     =   admin &lt;br /&gt;
 &lt;br /&gt;
  repo example.de &lt;br /&gt;
      RW+         = @programmierer &lt;br /&gt;
      R           = @reader &lt;br /&gt;
 &lt;br /&gt;
  repo example-data &lt;br /&gt;
      R       =   @reader &lt;br /&gt;
      RW+     =   @programmierer &lt;br /&gt;
 &lt;br /&gt;
  repo example-blog &lt;br /&gt;
      RW+     =   anton berta&lt;br /&gt;
&lt;br /&gt;
Man definiert also einfach ein neues Repo und die Zugriffsrechte mit &lt;br /&gt;
einem Eintrag in gitolite.conf.&lt;br /&gt;
&lt;br /&gt;
User entstehen durch gleichnamige Dateien (mit der Endung &#039;.pub&#039;) mit den Public-Keys der User im Verzeichnis &#039;keydir&#039;:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer ~/gitolite-admin » ls keydir &lt;br /&gt;
  admin.pub  anton.pub berta.pub  jenkins.pub  josef.pub&lt;br /&gt;
&lt;br /&gt;
Das kann man nun wie in Git üblich committen und pushen:&lt;br /&gt;
&lt;br /&gt;
  git add -A&lt;br /&gt;
  git commit -m &amp;quot;Start Gitolite Administration&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
&lt;br /&gt;
Und dann passiert folgendes: Gitolite packt die Keys der User in .ssh/authorized_keys mit einem Command voran, das die Gitolite Shell aufruft.&lt;br /&gt;
&lt;br /&gt;
Und je nachdem wie es in gitolite.conf definiert wurde, haben die User jetzt per SSH Zugriff auf die Repositories, sie können sich einloggen, bekommen aber nur ein Listing zu sehen, das ihre Repos zeigt.&lt;br /&gt;
&lt;br /&gt;
Beachte den Verweis auf das Identity-file:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer » ssh -i admin xyz00@xyz00.hostsharing.net&lt;br /&gt;
  PTY allocation request failed on channel 0&lt;br /&gt;
  hello admin, this is xyz@h00 running gitolite3 3.6.11-2 (Debian) on git 2.20.1&lt;br /&gt;
  &lt;br /&gt;
   R W	gitolite-admin&lt;br /&gt;
   R W	example.de&lt;br /&gt;
   R W	example-data&lt;br /&gt;
   R W	example-blog&lt;br /&gt;
  Connection to deg01.hostsharing.net closed.&lt;br /&gt;
&lt;br /&gt;
Die User können die Repos klonen, und – wenn erlaubt – bearbeiten und wieder pushen.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5659</id>
		<title>Gitolite installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitolite_installieren&amp;diff=5659"/>
		<updated>2021-09-29T08:21:35Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Gitolite installieren, erster Entwurf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gitolite ist eine Art Server für Git Repositories ohne dass ein Server (mit eigenem Daemon und Port etc.) installiert sein muss. Es macht in einem Webpaket gehostete Repos über SSH zugänglich. Ist gut für eine Handvoll Repos und ein paar User, wird gesteuert über ein Configfile und Public-Keys die alle zusammen über Git versioniert sind.&lt;br /&gt;
&lt;br /&gt;
Gitolite einzurichten ist sehr einfach (wenn man rausbekommen hat wie es funktioniert).&lt;br /&gt;
&lt;br /&gt;
Du brauchst ein SSH-Keypair (&#039;admin&#039;), das den später Gitolite-Admin Zugang ermöglicht. Dessen Publickey kopiest du in das homedir deines HS-Users.&lt;br /&gt;
&lt;br /&gt;
Per SSH da eingeloggt, schreibst du:&lt;br /&gt;
&lt;br /&gt;
  gitolite setup -pk admin.pub&lt;br /&gt;
&lt;br /&gt;
Damit ist Gitolite in dem Webpaket installiert. Es hat die Konfigurationsdatei &#039;.gitolite.rc&#039; und das Verzeichnis &#039;/repositories&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
In &#039;/repositories&#039; sind bereits zwei Repos eingerichtet, gitolite-admin.git und testing.git.&lt;br /&gt;
&lt;br /&gt;
Du kannst nun von außerhalb das Admin Repo auf deinen Computer klonen (achtung, ungeprüft):&lt;br /&gt;
&lt;br /&gt;
git clone xyz00@xyz00.hostsharing.net:gitolite-adminadmin.git&lt;br /&gt;
&lt;br /&gt;
In dem Repo finden sich die zwei Verzeichnisse conf und keydir.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration der Repos und der Zugriffsrechte schreibt man in conf/gitolite.conf, darin kann man auch Gruppen definieren (deren Namen beginnen mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
  # Gruppen &lt;br /&gt;
  @programmierer = anton josef &lt;br /&gt;
  @reader = jenkins gitweb anton &lt;br /&gt;
 &lt;br /&gt;
  # Hier stehen die Repos &lt;br /&gt;
 &lt;br /&gt;
  repo gitolite-admin &lt;br /&gt;
      RW+     =   admin &lt;br /&gt;
 &lt;br /&gt;
  repo example.de &lt;br /&gt;
      RW+         = @programmierer &lt;br /&gt;
      R           = @reader &lt;br /&gt;
 &lt;br /&gt;
  repo example-data &lt;br /&gt;
      R       =   @reader &lt;br /&gt;
      RW+     =   @programmierer &lt;br /&gt;
 &lt;br /&gt;
  repo example-blog &lt;br /&gt;
      RW+     =   anton berta&lt;br /&gt;
&lt;br /&gt;
Man definiert also einfach ein neues Repo und die Zugriffsrechte mit &lt;br /&gt;
einem Eintrag in gitolite.conf.&lt;br /&gt;
&lt;br /&gt;
User entstehen durch gleichnamige Dateien (mit der Endung &#039;.pub&#039;) mit den Public-Keys der User im Verzeichnis &#039;keydir&#039;:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer ~/gitolite-admin » ls keydir &lt;br /&gt;
  admin.pub  anton.pub berta.pub  jenkins.pub  josef.pub&lt;br /&gt;
&lt;br /&gt;
Das kann man nun wie in Git üblich committen und pushen:&lt;br /&gt;
&lt;br /&gt;
  git add -A&lt;br /&gt;
  git commit -m &amp;quot;Start Gitolite Administration&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
&lt;br /&gt;
Und dann passiert folgendes: Gitolite packt die Keys der User in .ssh/authorized_keys mit einem Command voran, das die Gitolite Shell aufruft.&lt;br /&gt;
&lt;br /&gt;
Und je nachdem wie es in gitolite.conf definiert wurde, haben die User jetzt per SSH Zugriff auf die Repositories, sie können sich einloggen, bekommen aber nur ein Listing zu sehen, das ihre Repos zeigt.&lt;br /&gt;
&lt;br /&gt;
Beachte den Verweis auf das Identity-file:&lt;br /&gt;
&lt;br /&gt;
  me@on-my-computer » ssh -i admin xyz00@xyz00.hostsharing.net&lt;br /&gt;
  PTY allocation request failed on channel 0&lt;br /&gt;
  hello admin, this is xyz@h00 running gitolite3 3.6.11-2 (Debian) on git 2.20.1&lt;br /&gt;
  &lt;br /&gt;
   R W	gitolite-admin&lt;br /&gt;
   R W	example.de&lt;br /&gt;
   R W	example-data&lt;br /&gt;
   R W	example-blog&lt;br /&gt;
  Connection to deg01.hostsharing.net closed.&lt;br /&gt;
&lt;br /&gt;
Die User können die Repos klonen, und – wenn erlaubt – bearbeiten und wieder pushen.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Mnogosearch_installieren&amp;diff=5658</id>
		<title>Diskussion:Mnogosearch installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Mnogosearch_installieren&amp;diff=5658"/>
		<updated>2021-09-29T06:42:54Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Neuer Abschnitt /* Baustelle Kompilieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Baustelle Kompilieren ==&lt;br /&gt;
&lt;br /&gt;
Typo 3 ist veraltet, die Kompilierung sollte generisch beschrieben werden.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5657</id>
		<title>Mnogosearch installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5657"/>
		<updated>2021-09-29T06:41:49Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Kompilieren der Mnogosearch aus den Sourcen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Die Suchmaschine für die eigene Webseite ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mnogosearch.org/ Mnogosearch] ist eine Suchmaschine, die für die eigene Webseite verwendet werden kann. Sie ist für Webseiten bis einige tausend Seiten und Traffic, wie er auf einem Shared-Webserver vorkommt, gut geeignet. Die Software muss aus den Sourcen selbst [[#Kompilieren der Mnogosearch aus den Sourcen|kompiliert]] werden und kann mit Datenbanken wie Sqlite3, Mysql oder Postgresql eingesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Hier wird eine Grundinstallation beschrieben. Mnogosearch ist eine sehr umfangreiche Software mit mannigfaltigen Konfigurationsmöglichkeiten. Für die weitergehende Konfiguration muss auf die Dokumentation von [http://www.mnogosearch.org/ Mnogosearch] verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
Mnogosearch ist sehr mächtig und kann vor allen Dingen mit Unicode umgehen, es können viele Dinge eingestellt werden. In dieser Konfiguration funktioniert der indexer als &amp;quot;Crawler&amp;quot;, er surft die eigene Webseite ab und speichert die Einträge für spätere Suchergebnisse. Dabei beachtet er die /robots.txt.&lt;br /&gt;
&lt;br /&gt;
Es können aber auch das Dateisystem und verschiedene Dokumentarten durchsucht werden, es können Bereiche der Webseite ausgeschlossen werden und es können Sektionen in Webseiten definiert werden, die für die Auflistung der Suchergebnisse als wichtiger gewertet werden. Diese Dinge müssen zusätzlich konfiguriert werden. Dies ist nur eine Grundkonfiguration, die aber in den meisten Fällen ausreichen dürfte.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Für die Datenbank und die Konfigurationsdatei wird am besten pro Domain ein Verzeichnis &amp;quot;mnogosearch&amp;quot; eingerichtet und da die Konfigurationsdatei indexer.conf erstellt. Diese Datei kann auch von /etc/mnogosearch/indexer.conf kopiert werden und muss dann entsprechend geändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /home/doms/example.com&lt;br /&gt;
# mkdir mnogosearch&lt;br /&gt;
# cd mnogosearch&lt;br /&gt;
# touch indexer.conf&lt;br /&gt;
# edit indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inhalt von indexer.conf ===&lt;br /&gt;
&lt;br /&gt;
Dies ist die stark gekürzte und auf Notwendiges reduzierte Fassung. Ganz zu Beginn wird die Datenbankdatei und am Ende der zu indizierende Webserver definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########################################################################&lt;br /&gt;
# DBAddr &amp;lt;URL-style database description&amp;gt;&lt;br /&gt;
# Options (type, host, database name, port, user and password) &lt;br /&gt;
# to connect to SQL database.&lt;br /&gt;
# Should be used before any other commands.&lt;br /&gt;
# Has global effect for whole config file.&lt;br /&gt;
# Format:&lt;br /&gt;
#DBAddr &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Default LocalCharset is iso-8859-1 (latin1).&lt;br /&gt;
&lt;br /&gt;
# Full UNICODE&lt;br /&gt;
# Folgendes auskommentieren für iso-8859-1&lt;br /&gt;
LocalCharset UTF-8&lt;br /&gt;
&lt;br /&gt;
###########################################################################&lt;br /&gt;
# StopwordFile &amp;lt;filename&amp;gt;&lt;br /&gt;
# Load stop words from the given text file. You may specify either absolute &lt;br /&gt;
# file name or a name relative to mnoGoSearch /etc directory. You may use&lt;br /&gt;
# several StopwordFile commands.&lt;br /&gt;
#&lt;br /&gt;
StopwordFile stopwords/de.sl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# HTTPHeader &amp;lt;header&amp;gt;&lt;br /&gt;
# You may add your desired headers in indexer HTTP request.&lt;br /&gt;
# You should not use &amp;quot;If-Modified-Since&amp;quot;,&amp;quot;Accept-Charset&amp;quot; headers,&lt;br /&gt;
# these headers are composed by indexer itself.&lt;br /&gt;
# &amp;quot;User-Agent: mnoGoSearch/version&amp;quot; is sent too, but you may override it.&lt;br /&gt;
# Command has global effect for all configuration file.&lt;br /&gt;
#&lt;br /&gt;
HTTPHeader &amp;quot;User-Agent: example.com-indexer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
# Section 2.&lt;br /&gt;
# URL control configuration.&lt;br /&gt;
&lt;br /&gt;
# Allow Configuration&lt;br /&gt;
# Examples&lt;br /&gt;
#  Allow everything:&lt;br /&gt;
#Allow *&lt;br /&gt;
#  Allow everything but .php .cgi .pl extensions case insensitively using regex:&lt;br /&gt;
#Allow NoMatch Regex \.php$|\.cgi$|\.pl$&lt;br /&gt;
#  Allow .HTM extension case sensitively:&lt;br /&gt;
#Allow Case *.HTM&lt;br /&gt;
&lt;br /&gt;
Allow *.html&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
#Disallow [Match|NoMatch] [NoCase|Case] [String|Regex] &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt; ... ]&lt;br /&gt;
#&lt;br /&gt;
# Examples:&lt;br /&gt;
# Disallow URLs that are not in udm.net domains using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch *.udm.net/*&lt;br /&gt;
# Disallow any except known extensions and directory index using &amp;quot;regex&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch Regex \/$|\.htm$|\.html$|\.shtml$|\.phtml$|\.php$|\.txt$&lt;br /&gt;
# Exclude cgi-bin and non-parsed-headers using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow */cgi-bin/* *.cgi */nph-*&lt;br /&gt;
# Exclude anything with &#039;?&#039; sign in URL. Note that &#039;?&#039; sign has a &lt;br /&gt;
# special meaning in &amp;quot;string&amp;quot; match, so we have to use &amp;quot;regex&amp;quot; match here:&lt;br /&gt;
#Disallow Regex  \?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Exclude some known extensions using fast &amp;quot;String&amp;quot; match:&lt;br /&gt;
Disallow *.b    *.sh   *.md5  *.rpm&lt;br /&gt;
Disallow *.arj  *.tar  *.zip  *.tgz  *.gz   *.z     *.bz2 &lt;br /&gt;
Disallow *.lha  *.lzh  *.rar  *.zoo  *.ha   *.tar.Z&lt;br /&gt;
Disallow *.gif  *.jpg  *.jpeg *.bmp  *.tiff *.tif   *.xpm  *.xbm *.pcx&lt;br /&gt;
Disallow *.vdo  *.mpeg *.mpe  *.mpg  *.avi  *.movie *.mov  *.wmv&lt;br /&gt;
Disallow *.mid  *.mp3  *.rm   *.ram  *.wav  *.aiff  *.ra&lt;br /&gt;
Disallow *.vrml *.wrl  *.png  *.ico  *.psd  *.dat&lt;br /&gt;
Disallow *.exe  *.com  *.cab  *.dll  *.bin  *.class *.ex_&lt;br /&gt;
Disallow *.tex  *.texi *.xls  *.doc  *.texinfo&lt;br /&gt;
Disallow *.rtf  *.pdf  *.cdf  *.ps&lt;br /&gt;
Disallow *.ai   *.eps  *.ppt  *.hqx&lt;br /&gt;
Disallow *.cpt  *.bms  *.oda  *.tcl&lt;br /&gt;
Disallow *.o    *.a    *.la   *.so &lt;br /&gt;
Disallow *.pat  *.pm   *.m4   *.am   *.css&lt;br /&gt;
Disallow *.map  *.aif  *.sit  *.sea&lt;br /&gt;
Disallow *.m3u  *.qt&lt;br /&gt;
&lt;br /&gt;
# Exclude Apache directory list in different sort order using &amp;quot;string&amp;quot; match:&lt;br /&gt;
Disallow *D=A *D=D *M=A *M=D *N=A *N=D *S=A *S=D&lt;br /&gt;
&lt;br /&gt;
# More complicated case. RAR .r00-.r99, ARJ a00-a99 files &lt;br /&gt;
# and UNIX shared libraries. We use &amp;quot;Regex&amp;quot; match type here:&lt;br /&gt;
Disallow Regex \.r[0-9][0-9]$ \.a[0-9][0-9]$ \.so\.[0-9]$&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
# Section 3.&lt;br /&gt;
# Mime types and external parsers.&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
#AddType [String|Regex] [Case|NoCase] &amp;lt;mime type&amp;gt; &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt;...]&lt;br /&gt;
# This command associates filename extensions (for services&lt;br /&gt;
# that don&#039;t automatically include them) with their mime types.&lt;br /&gt;
# Currently &amp;quot;file:&amp;quot; protocol uses these commands.&lt;br /&gt;
# Use optional first two parameter to choose comparison type.&lt;br /&gt;
# Default type is &amp;quot;String&amp;quot; &amp;quot;NoCase&amp;quot; (case sensitive string match with&lt;br /&gt;
# &#039;?&#039; and &#039;*&#039; wildcards for one and several characters correspondingly).&lt;br /&gt;
#&lt;br /&gt;
AddType image/x-xpixmap	*.xpm&lt;br /&gt;
AddType image/x-xbitmap	*.xbm&lt;br /&gt;
AddType image/gif	*.gif&lt;br /&gt;
&lt;br /&gt;
AddType	text/plain			*.txt  *.pl *.js *.h *.c *.pm *.e&lt;br /&gt;
AddType	text/html			*.html *.htm&lt;br /&gt;
&lt;br /&gt;
AddType text/rtf			*.rtf&lt;br /&gt;
AddType application/pdf			*.pdf&lt;br /&gt;
AddType application/msword		*.doc&lt;br /&gt;
AddType application/vnd.ms-excel	*.xls&lt;br /&gt;
AddType text/x-postscript		*.ps&lt;br /&gt;
&lt;br /&gt;
# Default unknown type for other extensions:&lt;br /&gt;
AddType	application/unknown *.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Use ParserTimeOut to specify amount of time for parser execution&lt;br /&gt;
# to avoid possible indexer hang.&lt;br /&gt;
&lt;br /&gt;
ParserTimeOut 300&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Section 5.&lt;br /&gt;
# Servers configuration.&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Document sections.&lt;br /&gt;
#&lt;br /&gt;
# Format is:&lt;br /&gt;
#&lt;br /&gt;
#   Section &amp;lt;string&amp;gt; &amp;lt;number&amp;gt; &amp;lt;maxlen&amp;gt; [clone] [sep] [{expr} {repl}]&lt;br /&gt;
#&lt;br /&gt;
# where &amp;lt;string&amp;gt; is a section name and &amp;lt;number&amp;gt; is section ID&lt;br /&gt;
# between 0 and 255. Use 0 if you don&#039;t want to index some of &lt;br /&gt;
# these sections. It is better to use different sections IDs&lt;br /&gt;
# for different documents parts. In this case during search &lt;br /&gt;
# time you&#039;ll be able to give different weight to each part&lt;br /&gt;
# or even disallow some sections at a search time.&lt;br /&gt;
# &amp;lt;maxlen&amp;gt; argument contains a maximum length of section&lt;br /&gt;
# which will be stored in database.&lt;br /&gt;
# &amp;quot;clone&amp;quot; is an optional parameter describing whether this&lt;br /&gt;
# section should affect clone detection. It can &lt;br /&gt;
# be &amp;quot;DetectClone&amp;quot; or &amp;quot;cdon&amp;quot;, or &amp;quot;NoDetectClone&amp;quot; or &amp;quot;cdoff&amp;quot;.&lt;br /&gt;
# By default, url.* section values are not taken in account&lt;br /&gt;
# for clone detection, while any other sections take part&lt;br /&gt;
# in clone detection.&lt;br /&gt;
# &amp;quot;sep&amp;quot; is an optional argument to specify a separator between&lt;br /&gt;
# parts of the same section. It is a space character by default.&lt;br /&gt;
# &amp;quot;expr&amp;quot; and &amp;quot;repl&amp;quot; can be used to extract user defined sections,&lt;br /&gt;
# for example pieces of text between the given tags. &amp;quot;expr&amp;quot; is&lt;br /&gt;
# a regular expression, &amp;quot;repl&amp;quot; is a replacement with $1, $2, etc&lt;br /&gt;
# meta-characters designating matches &amp;quot;expr&amp;quot; matches.&lt;br /&gt;
&lt;br /&gt;
# Standard HTML sections: body, title&lt;br /&gt;
&lt;br /&gt;
Section	body			1	256&lt;br /&gt;
Section title			2	128&lt;br /&gt;
&lt;br /&gt;
# META tags&lt;br /&gt;
# For example &amp;lt;META NAME=&amp;quot;KEYWORDS&amp;quot; CONTENT=&amp;quot;xxxx&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
Section meta.keywords		3	128&lt;br /&gt;
Section	meta.description	4	128&lt;br /&gt;
&lt;br /&gt;
# HTTP headers example, let&#039;s store &amp;quot;Server&amp;quot; HTTP header&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#Section header.server		5	64&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Document&#039;s URL parts&lt;br /&gt;
&lt;br /&gt;
Section url.file		6	0&lt;br /&gt;
Section url.path		7	0&lt;br /&gt;
Section	url.host		8	0&lt;br /&gt;
Section url.proto		9	0&lt;br /&gt;
&lt;br /&gt;
# CrossWords&lt;br /&gt;
&lt;br /&gt;
Section crosswords		10	0&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# If you use CachedCopy for smart excerpts (see below), &lt;br /&gt;
# please keep Charset section active.&lt;br /&gt;
#&lt;br /&gt;
Section Charset 		11 	32&lt;br /&gt;
&lt;br /&gt;
Section Content-Type		12	64&lt;br /&gt;
Section Content-Language	13	16&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want tag attributes&lt;br /&gt;
# to be indexed&lt;br /&gt;
&lt;br /&gt;
#Section attribute.alt		14	128&lt;br /&gt;
#Section attribute.label	15	128&lt;br /&gt;
#Section attribute.summary	16	128&lt;br /&gt;
#Section attribute.title	17	128&lt;br /&gt;
#Section attribute.face		27	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want use NewsExtensions&lt;br /&gt;
# You may add any Newsgroups header to be indexed and stored in urlinfo table&lt;br /&gt;
&lt;br /&gt;
#Section References		18	0&lt;br /&gt;
#Section Message-ID		19	0&lt;br /&gt;
#Section Parent-ID		20	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want index MP3 tags.&lt;br /&gt;
#Section MP3.Song           	21    128&lt;br /&gt;
#Section MP3.Album          	22    128&lt;br /&gt;
#Section MP3.Artist         	23    128&lt;br /&gt;
#Section MP3.Year           	24    128&lt;br /&gt;
&lt;br /&gt;
# Comment this line out if you don&#039;t want to store &amp;quot;cached copies&amp;quot;&lt;br /&gt;
# to generate smart excerpts at search time.&lt;br /&gt;
# Don&#039;t forget to keep &amp;quot;Charset&amp;quot; section active if you use cached copies.&lt;br /&gt;
# NOTE: 3.2.18 has limits for CachedCopy size, 32000 for Ibase and&lt;br /&gt;
# 15000 for Mimer. Other databases do not have limits.&lt;br /&gt;
# If indexer fails with &#039;string too long&#039; error message then reduce&lt;br /&gt;
# this number. This will be fixed in the future versions.&lt;br /&gt;
#&lt;br /&gt;
Section CachedCopy		25 64000&lt;br /&gt;
&lt;br /&gt;
# A user defined section example.&lt;br /&gt;
# Extract text between &amp;lt;h1&amp;gt; and &amp;lt;/h1&amp;gt; tags:&lt;br /&gt;
#Section h1			26 128 &amp;quot;&amp;lt;h1&amp;gt;(.*)&amp;lt;/h1&amp;gt;&amp;quot; $1&lt;br /&gt;
&lt;br /&gt;
#########################################################################&lt;br /&gt;
#Server [Method] [SubSection] &amp;lt;URL&amp;gt; [alias]&lt;br /&gt;
# This is the main command of the indexer.conf file. It&#039;s used &lt;br /&gt;
# to describe web-space you want to index. It also inserts&lt;br /&gt;
# given URL into database to use it as a start point.&lt;br /&gt;
# You may use &amp;quot;Server&amp;quot; command as many times as a number of different&lt;br /&gt;
# servers or their parts you want to index.&lt;br /&gt;
&lt;br /&gt;
# To index whole server &amp;quot;www.example.com&amp;quot;:&lt;br /&gt;
Server http://www.example.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unbedingt im ganzen Dokument example.com durch den eigenen Domainnamen ersetzen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Datenbank erstellen ===&lt;br /&gt;
&lt;br /&gt;
Die Datenbank wird mit dem Programm &#039;&#039;&#039;indexer&#039;&#039;&#039; erstellt. Dabei muss indexer natürlich (und wie bei jedem Aufruf) der Pfad zur eigenen Konfiguration mitgeteilt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -Ecreate /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erster Indexlauf ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -a /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl wird die Datenbank gefüllt. Wir haben in der Konfigurationsdatei definiert, dass alle Seiten mit der Endung .html unter http://www.example.com/ durchsucht und indiziert werden.&lt;br /&gt;
&lt;br /&gt;
Die Option -a ersetzt alle vorhandenen Einträge.&lt;br /&gt;
&lt;br /&gt;
=== Die Suche auf der eigenen Webseite ===&lt;br /&gt;
&lt;br /&gt;
Damit die Suche funktionieren kann, legen wir einen symbolischen Link zu dem Suchprogramm /usr/lib/cgi-bin/search.cgi in das eigene cgi-Verzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ln -s /usr/lib/cgi-bin/search.cgi /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das zugehörige Suchformular kann entweder von /etc/mnogosearch/search.htm in das eigene Webverzeichnis kopiert (mit der Endung &amp;quot;zhtml&amp;quot; - siehe weiter unten) und anschließend editiert werden. Wichtig ist der Verweis auf die eigene Datenbankdatei in der Sektion &amp;quot;variables&amp;quot; ganz zu Beginn:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Minimales Suchformular in Deutsch ====&lt;br /&gt;
&lt;br /&gt;
Folgendes Formular ist bereits eingedeutscht und kann direkt als /home/doms/example.com/subs/www/suche.zhtml abgespeichert werden (man beachte die Endung &amp;quot;zhtml&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# start&lt;br /&gt;
&amp;lt;!--variables&lt;br /&gt;
# Database parameters&lt;br /&gt;
# Format: &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Use proper local and browser charsets&lt;br /&gt;
# Default charset is iso-8859-1 (latin1)&lt;br /&gt;
# which is suitable for the most Western European languages&lt;br /&gt;
&lt;br /&gt;
# Comment this for iso-8859-1&lt;br /&gt;
LocalCharset   utf-8&lt;br /&gt;
BrowserCharset utf-8&lt;br /&gt;
&lt;br /&gt;
# Minimum and maximum word lengths&lt;br /&gt;
#&lt;br /&gt;
#MinWordLength 1&lt;br /&gt;
#MaxWordLength 32&lt;br /&gt;
&lt;br /&gt;
# Number of pages in navigator bar&lt;br /&gt;
#&lt;br /&gt;
#PagesPerScreen 10&lt;br /&gt;
&lt;br /&gt;
# How to hilight searched words.&lt;br /&gt;
#&lt;br /&gt;
HlBeg	&#039;&amp;lt;span style=&amp;quot;background-color: #ff0; color: #f00; font-weight: bold;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
HlEnd	&#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
# Suche auf html-dokumente beschraenken&lt;br /&gt;
ReplaceVar type &amp;quot;text/html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Suche auf auf Wortanfang erweitern&lt;br /&gt;
# Suche nach &amp;quot;gut&amp;quot; findet auch &amp;quot;gute&amp;quot;&lt;br /&gt;
# wirkt wie suchwort*&lt;br /&gt;
ReplaceVar wm &amp;quot;beg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--top--&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=$&amp;amp;(BrowserCharset)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Suche: $&amp;amp;(q)&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color: #fff; }&lt;br /&gt;
a { color: #00c; }&lt;br /&gt;
div.center { text-align: center; }&lt;br /&gt;
table.grey { background-color: #eee; width: 100%; }&lt;br /&gt;
table.white { background-color: #fff; width: 100%; }&lt;br /&gt;
img.logo { border: none; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt; Suche nach:&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;text&amp;quot;   NAME=&amp;quot;q&amp;quot;    VALUE=&amp;quot;$&amp;amp;(q)&amp;quot; SIZE=50 /&amp;gt;&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;submit&amp;quot; NAME=&amp;quot;cmd&amp;quot; VALUE=&amp;quot;Suche!&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--restop--&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100% border=0&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Gefunden: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Ergebnisse &amp;lt;b&amp;gt;$(first)-$(last)&amp;lt;/b&amp;gt; von &amp;lt;B&amp;gt;$(total)&amp;lt;/B&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Die Suche dauerte &amp;lt;b&amp;gt;$(SearchTime)&amp;lt;/b&amp;gt; Sekunden&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
      Sortieren:&lt;br /&gt;
      &amp;lt;!IF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;DRP&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Datum&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSEIF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;SRPD&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Titel&amp;lt;/b&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSE&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Relevanz&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/restop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--res--&amp;gt;&lt;br /&gt;
&amp;lt;DL&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;!IF   NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSEIF NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;short&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSE&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
    &amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;!IFNOT NAME=&amp;quot;Pop_Rank&amp;quot; CONTENT=&amp;quot;0.00000&amp;quot;&amp;gt;Popularity: &amp;lt;b&amp;gt;$(Pop_Rank)&amp;lt;/b&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
   ]&lt;br /&gt;
  &amp;lt;/small&amp;gt;&lt;br /&gt;
  &amp;lt;DD&amp;gt;&lt;br /&gt;
  &amp;lt;table width=60%&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;small&amp;gt;$&amp;amp;(Body)...&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;UL&amp;gt;&lt;br /&gt;
         &amp;lt;li&amp;gt;&lt;br /&gt;
           &amp;lt;small&amp;gt;&lt;br /&gt;
             &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
              - $(Content-Length) bytes [$(Content-Type)] &lt;br /&gt;
              - $(Last-Modified) &lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;stored_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;[&amp;lt;a href=&amp;quot;$(stored_href)&amp;quot;&amp;gt;Cached copy&amp;lt;/a&amp;gt;]&amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;sitelimit_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFGT NAME=&amp;quot;PerSite&amp;quot; CONTENT=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;&lt;br /&gt;
              [&amp;lt;a href=&amp;quot;$(sitelimit_href)&amp;quot;&amp;gt;More results from this site ($(PerSite) total) &amp;lt;/a&amp;gt;]&lt;br /&gt;
	      &amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
             &amp;lt;/font&amp;gt;&lt;br /&gt;
           &amp;lt;/small&amp;gt;&lt;br /&gt;
           &amp;lt;BR&amp;gt;&lt;br /&gt;
           $(CL)&lt;br /&gt;
        &amp;lt;/UL&amp;gt;&lt;br /&gt;
        $(STORED)&lt;br /&gt;
	&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;/DL&amp;gt;&lt;br /&gt;
&amp;lt;!--/res--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--resbot--&amp;gt;&lt;br /&gt;
&amp;lt;table width=100% bgcolor=#FFFFFF&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td align=center&amp;gt;&lt;br /&gt;
      &amp;lt;TABLE BORDER=0&amp;gt;&lt;br /&gt;
        &amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;Ergebnis Seiten: &amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TD&amp;gt;&amp;lt;/TD&amp;gt;$(NL)$(NB)$(NR)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
      &amp;lt;/TABLE&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;!--/resbot--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--clone--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
  &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
  - $(Content-Length) bytes&lt;br /&gt;
  - $(Last-Modified) &lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!--/clone--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar1--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;$(NP)&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar0--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;$(NP)&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar0--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--notfound--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;WS&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Meinten Sie &amp;lt;b&amp;gt;&amp;lt;a href=&amp;quot;?q=$%(WS)&amp;quot;&amp;gt;$(WS)&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;?&lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100%&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suchergebnisse: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Sorry, Ihre Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt; hat kein Ergebnis.&amp;lt;br&amp;gt;&lt;br /&gt;
Es wurden keine Dokumente gefunden, die &amp;lt;b&amp;gt;&amp;quot;$&amp;amp;(q)&amp;quot; enthalten&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Hinweise:&lt;br /&gt;
&amp;lt;UL&amp;gt;&lt;br /&gt;
  &amp;lt;LI&amp;gt; Stellen Sie sicher, dass Ihre W&amp;amp;ouml;rter richtig geschrieben sind.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie andere Suchworte.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie allgemeinere Suchw&amp;amp;ouml;rter. &lt;br /&gt;
&amp;lt;/UL&amp;gt;&lt;br /&gt;
&amp;lt;!--/notfound--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--noquery--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;Bitte geben Sie eines oder mehrere W&amp;amp;ouml;rter ein und d&amp;amp;uuml;cken Sie Suche.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--/noquery--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--error--&amp;gt;&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&lt;br /&gt;
&amp;lt;FONT COLOR=&amp;quot;#FF0000&amp;quot;&amp;gt;Es ist ein Fehler aufgetreten!&amp;lt;/FONT&amp;gt;&lt;br /&gt;
&amp;lt;P&amp;gt;&amp;lt;B&amp;gt;$(E)&amp;lt;/B&amp;gt;&lt;br /&gt;
&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
&amp;lt;!--/error--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--bottom--&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!--/bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_top--&amp;gt;&lt;br /&gt;
&amp;lt;BASE HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Document ID:&amp;lt;/b&amp;gt; $(ID)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Last modified:&amp;lt;/b&amp;gt; $(Last-Modified)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Language:&amp;lt;/b&amp;gt; $(Content-Language)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Charset:&amp;lt;/b&amp;gt; $(Charset)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Size:&amp;lt;/b&amp;gt; $(Content-Length)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc--&amp;gt;&lt;br /&gt;
$^(document)&lt;br /&gt;
&amp;lt;!--/storedoc--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_bottom--&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== suche.zhtml sucht search.cgi ====&lt;br /&gt;
&lt;br /&gt;
Das Suchformular hat keine &amp;quot;action&amp;quot; definiert, es wird per .htaccess an &#039;&#039;&#039;search.cgi&#039;&#039;&#039; als Template übergeben:&lt;br /&gt;
&lt;br /&gt;
Wenn noch nicht vorhanden, im gleichen Verzeichnis, in dem das Suchformulat liegt (in diesem Fall ~/doms/example.com/subs/www), eine Datei .htaccess erstellen und editieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# touch .htaccess&lt;br /&gt;
# edit .htaccess&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und da folgendes reinschreiben (vorausgesetzt, das Formular heißt suche.zhtml):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AddType text/html .zhtml&lt;br /&gt;
AddHandler zhtml .zhtml&lt;br /&gt;
Action zhtml /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann das Suchformular im Browser angezeigt und verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;http://www.example.com/suche.zhtml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt etliche weitere Möglichkeiten, search.cgi zu benutzen, sie stehen in der Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Cronjob zum Update der Suchdatenbank in der Nacht ===&lt;br /&gt;
&lt;br /&gt;
Sollten sich die Webseiten öfter mal ändern, ist es sinnvoll, die Suchdatenbank nachts zu aktualisieren. Die Datei für die eigenen Cronjobs wird editiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und reingeschrieben wird das:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# suche mnogosearch indexer&lt;br /&gt;
19 23 * * *     nice indexer /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitte eine andere Uhrzeit wählen, damit nicht alle indexer-Jobs um 23:19 Uhr anlaufen!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Kompilieren der Mnogosearch aus den Sourcen ==&lt;br /&gt;
&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung ist sehr auf die Zusammenarbeit mit dem CMS TYPO3 ausgerichtet. So sind zum Beispiel die Konfigurationseinstellungen zum kompilieren aus dem Manual der TYPO3 Extension [http://typo3.org/documentation/document-library/extension-manuals/mnogosearch/2.2.2/view/1/3/ mnogosearch] entnommen.&lt;br /&gt;
Im Grunde bin ich einfach den Anweisungen dort gefolgt, mußte aber wegen HS-spezifischen Gründen an manchen Stellen einen anderen Weg gehen.&lt;br /&gt;
&lt;br /&gt;
Ich habe Mnogosearch mit einem Domainuser kompiliert. Ich denke das das grundsätzlich auch mit einem Paketadmin funktioniert, aber eventuell zu unsicher ist.&lt;br /&gt;
&lt;br /&gt;
=== Runterladen und auspacken === &lt;br /&gt;
Zuerst wechseln wir ins Homeverzeichnis (~) des Users, laden uns den Quellcode runter und entpacken das Archiv.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
// stets die neueste Version benutzen&lt;br /&gt;
wget http://www.mnogosearch.org/Download/mnogosearch-3.3.9.tar.gz&lt;br /&gt;
tar xvf mnogosearch-3.3.9.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anpassen der Dateien ===&lt;br /&gt;
&lt;br /&gt;
Sollte man ausschließend eine MySQL Datenbank verwenden, muß vor dem kompilieren die Dateien ./configure.in und ./configure bearbeiten.&lt;br /&gt;
In beiden Dateien suchen wir nach dem String &#039;&#039;HAVE_PGSQL&#039;&#039; und ändern die &#039;&#039;1&#039;&#039; in eine &#039;&#039;0&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor configure.in&lt;br /&gt;
AC_DEFINE([HAVE_PGSQL], [1], [Define if you want to use PostgreSQL])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Hier gibt es zwei wichtige Änderungen gegenüber des Manuals.&lt;br /&gt;
* der Installationpfad muss angepasst werden, da wir keine Schreibrechte für /opt/ besitzen&lt;br /&gt;
* der Pfad zu der Datei mysql.h muss angegeben werden   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure --prefix=/path/to/user/home/opt/mnogosearch --with-mysql=/usr --disable-mp3 --disable-news --without-debug --with-pgsql=no --with-freetds=no --with-oracle8=no --with-oracle8i=no --with-iodbc=no --with-unixODBC=no --with-db2=no --with-solid=no --with-openlink=no --with-easysoft=no --with-sapdb=no --with-ibase=no --with-ctlib=no --with-zlib --disable-syslog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der Suchengine ===&lt;br /&gt;
Bevor es zum kompilieren kommen, müssen wir noch eine erzeugte Datei bearbeiten und ändern dort den String &lt;br /&gt;
&#039;&#039;/* #undef HAVE_PGSQL */&#039;&#039; in &#039;&#039;#undef HAVE_PGSQL&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor include/udm_autoconf.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kompilieren und installieren wir Mnogosearch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der PHP Extension ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; &lt;br /&gt;
* der Pfad zur Suchengine muss angepasst werden (ist derselbe Pfad wie in dem --prefix Argument)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/mnogosearch-3.3.9/php&lt;br /&gt;
phpize&lt;br /&gt;
./configure --with-mnogosearch=/path/to/user/home/opt/mnogosearch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir die Datei &#039;&#039;php_mnogo.c&#039;&#039; editieren und den String &#039;&#039;#undef HAVE_PGSQL&#039;&#039; in eine neue Zeile unterhalb von &#039;&#039;#include &amp;quot;php.h&amp;quot;&#039;&#039; einfügen.&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir die Extension bauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die PHP Extension liegt jetzt in dem Ordner ~/mnogosearch-3.3.9/php/modules. Am Besten kopiert man sich die Extension in den CGI Ordner einer Domain oder ebenfalls nach ~/opt.&lt;br /&gt;
&lt;br /&gt;
Um die Extension nun nutzen zu können, editieren wir die eigene &#039;&#039;php-cgi-fcgi.ini&#039;&#039; und fügen am Ende &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extension=relativer/Pfad/vom/PHP-Extension/Verzeichnis/zu/mnogosearch.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Extension Dir erhält man so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -i | grep extension_dir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von diesem Verzeichnis ausgehend hangelt man sich bis zu dem Verzeichnis, in das man eben die PHP Extension kopiert hat.&lt;br /&gt;
Das ist notwendig, da in PHP 5.2 keine multiplen Extension Dirs in der php.ini eingetragen werden können. Eigene Extensions können nur relativ referenziert werden.&lt;br /&gt;
&lt;br /&gt;
Das Ergbnis sollte man noch in einer mittels phpinfo überprüfen. Wenn alles funktioniert hat, sollte in der Übersicht &#039;&#039;mnogosearch&#039;&#039; auftauchen. Ist dies nicht der Fall empfielt es sich das Errorlog von PHP anzuschalten und zu schauen, was schief läuft. Oft liegt das einfach an dem falschen relativen Pfad zur Extension.&lt;br /&gt;
 &lt;br /&gt;
Den weiteren Installationablauf entnimmt man am Besten dem Manual zur TYPO3 Extension. &lt;br /&gt;
nach dem Installieren der Extension in TYPO3 muss man den Pfad zu der Suchengine von /opt/mnogosearch entsprechend anpassen. In unserem Fall wäre das &#039;&#039;/path/to/user/home/opt/mnogosearch&#039;&#039;   &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>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5656</id>
		<title>Mnogosearch installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5656"/>
		<updated>2021-09-29T06:39:30Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Installation des Debian Pakets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Die Suchmaschine für die eigene Webseite ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mnogosearch.org/ Mnogosearch] ist eine Suchmaschine, die für die eigene Webseite verwendet werden kann. Sie ist für Webseiten bis einige tausend Seiten und Traffic, wie er auf einem Shared-Webserver vorkommt, gut geeignet. Die Software muss aus den Sourcen selbst [[#Kompilieren der Mnogosearch aus den Sourcen|kompiliert]] werden und kann mit Datenbanken wie Sqlite3, Mysql oder Postgresql eingesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Hier wird eine Grundinstallation beschrieben. Mnogosearch ist eine sehr umfangreiche Software mit mannigfaltigen Konfigurationsmöglichkeiten. Für die weitergehende Konfiguration muss auf die Dokumentation von [http://www.mnogosearch.org/ Mnogosearch] verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
Mnogosearch ist sehr mächtig und kann vor allen Dingen mit Unicode umgehen, es können viele Dinge eingestellt werden. In dieser Konfiguration funktioniert der indexer als &amp;quot;Crawler&amp;quot;, er surft die eigene Webseite ab und speichert die Einträge für spätere Suchergebnisse. Dabei beachtet er die /robots.txt.&lt;br /&gt;
&lt;br /&gt;
Es können aber auch das Dateisystem und verschiedene Dokumentarten durchsucht werden, es können Bereiche der Webseite ausgeschlossen werden und es können Sektionen in Webseiten definiert werden, die für die Auflistung der Suchergebnisse als wichtiger gewertet werden. Diese Dinge müssen zusätzlich konfiguriert werden. Dies ist nur eine Grundkonfiguration, die aber in den meisten Fällen ausreichen dürfte.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Für die Datenbank und die Konfigurationsdatei wird am besten pro Domain ein Verzeichnis &amp;quot;mnogosearch&amp;quot; eingerichtet und da die Konfigurationsdatei indexer.conf erstellt. Diese Datei kann auch von /etc/mnogosearch/indexer.conf kopiert werden und muss dann entsprechend geändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /home/doms/example.com&lt;br /&gt;
# mkdir mnogosearch&lt;br /&gt;
# cd mnogosearch&lt;br /&gt;
# touch indexer.conf&lt;br /&gt;
# edit indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inhalt von indexer.conf ===&lt;br /&gt;
&lt;br /&gt;
Dies ist die stark gekürzte und auf Notwendiges reduzierte Fassung. Ganz zu Beginn wird die Datenbankdatei und am Ende der zu indizierende Webserver definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########################################################################&lt;br /&gt;
# DBAddr &amp;lt;URL-style database description&amp;gt;&lt;br /&gt;
# Options (type, host, database name, port, user and password) &lt;br /&gt;
# to connect to SQL database.&lt;br /&gt;
# Should be used before any other commands.&lt;br /&gt;
# Has global effect for whole config file.&lt;br /&gt;
# Format:&lt;br /&gt;
#DBAddr &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Default LocalCharset is iso-8859-1 (latin1).&lt;br /&gt;
&lt;br /&gt;
# Full UNICODE&lt;br /&gt;
# Folgendes auskommentieren für iso-8859-1&lt;br /&gt;
LocalCharset UTF-8&lt;br /&gt;
&lt;br /&gt;
###########################################################################&lt;br /&gt;
# StopwordFile &amp;lt;filename&amp;gt;&lt;br /&gt;
# Load stop words from the given text file. You may specify either absolute &lt;br /&gt;
# file name or a name relative to mnoGoSearch /etc directory. You may use&lt;br /&gt;
# several StopwordFile commands.&lt;br /&gt;
#&lt;br /&gt;
StopwordFile stopwords/de.sl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# HTTPHeader &amp;lt;header&amp;gt;&lt;br /&gt;
# You may add your desired headers in indexer HTTP request.&lt;br /&gt;
# You should not use &amp;quot;If-Modified-Since&amp;quot;,&amp;quot;Accept-Charset&amp;quot; headers,&lt;br /&gt;
# these headers are composed by indexer itself.&lt;br /&gt;
# &amp;quot;User-Agent: mnoGoSearch/version&amp;quot; is sent too, but you may override it.&lt;br /&gt;
# Command has global effect for all configuration file.&lt;br /&gt;
#&lt;br /&gt;
HTTPHeader &amp;quot;User-Agent: example.com-indexer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
# Section 2.&lt;br /&gt;
# URL control configuration.&lt;br /&gt;
&lt;br /&gt;
# Allow Configuration&lt;br /&gt;
# Examples&lt;br /&gt;
#  Allow everything:&lt;br /&gt;
#Allow *&lt;br /&gt;
#  Allow everything but .php .cgi .pl extensions case insensitively using regex:&lt;br /&gt;
#Allow NoMatch Regex \.php$|\.cgi$|\.pl$&lt;br /&gt;
#  Allow .HTM extension case sensitively:&lt;br /&gt;
#Allow Case *.HTM&lt;br /&gt;
&lt;br /&gt;
Allow *.html&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
#Disallow [Match|NoMatch] [NoCase|Case] [String|Regex] &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt; ... ]&lt;br /&gt;
#&lt;br /&gt;
# Examples:&lt;br /&gt;
# Disallow URLs that are not in udm.net domains using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch *.udm.net/*&lt;br /&gt;
# Disallow any except known extensions and directory index using &amp;quot;regex&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch Regex \/$|\.htm$|\.html$|\.shtml$|\.phtml$|\.php$|\.txt$&lt;br /&gt;
# Exclude cgi-bin and non-parsed-headers using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow */cgi-bin/* *.cgi */nph-*&lt;br /&gt;
# Exclude anything with &#039;?&#039; sign in URL. Note that &#039;?&#039; sign has a &lt;br /&gt;
# special meaning in &amp;quot;string&amp;quot; match, so we have to use &amp;quot;regex&amp;quot; match here:&lt;br /&gt;
#Disallow Regex  \?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Exclude some known extensions using fast &amp;quot;String&amp;quot; match:&lt;br /&gt;
Disallow *.b    *.sh   *.md5  *.rpm&lt;br /&gt;
Disallow *.arj  *.tar  *.zip  *.tgz  *.gz   *.z     *.bz2 &lt;br /&gt;
Disallow *.lha  *.lzh  *.rar  *.zoo  *.ha   *.tar.Z&lt;br /&gt;
Disallow *.gif  *.jpg  *.jpeg *.bmp  *.tiff *.tif   *.xpm  *.xbm *.pcx&lt;br /&gt;
Disallow *.vdo  *.mpeg *.mpe  *.mpg  *.avi  *.movie *.mov  *.wmv&lt;br /&gt;
Disallow *.mid  *.mp3  *.rm   *.ram  *.wav  *.aiff  *.ra&lt;br /&gt;
Disallow *.vrml *.wrl  *.png  *.ico  *.psd  *.dat&lt;br /&gt;
Disallow *.exe  *.com  *.cab  *.dll  *.bin  *.class *.ex_&lt;br /&gt;
Disallow *.tex  *.texi *.xls  *.doc  *.texinfo&lt;br /&gt;
Disallow *.rtf  *.pdf  *.cdf  *.ps&lt;br /&gt;
Disallow *.ai   *.eps  *.ppt  *.hqx&lt;br /&gt;
Disallow *.cpt  *.bms  *.oda  *.tcl&lt;br /&gt;
Disallow *.o    *.a    *.la   *.so &lt;br /&gt;
Disallow *.pat  *.pm   *.m4   *.am   *.css&lt;br /&gt;
Disallow *.map  *.aif  *.sit  *.sea&lt;br /&gt;
Disallow *.m3u  *.qt&lt;br /&gt;
&lt;br /&gt;
# Exclude Apache directory list in different sort order using &amp;quot;string&amp;quot; match:&lt;br /&gt;
Disallow *D=A *D=D *M=A *M=D *N=A *N=D *S=A *S=D&lt;br /&gt;
&lt;br /&gt;
# More complicated case. RAR .r00-.r99, ARJ a00-a99 files &lt;br /&gt;
# and UNIX shared libraries. We use &amp;quot;Regex&amp;quot; match type here:&lt;br /&gt;
Disallow Regex \.r[0-9][0-9]$ \.a[0-9][0-9]$ \.so\.[0-9]$&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
# Section 3.&lt;br /&gt;
# Mime types and external parsers.&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
#AddType [String|Regex] [Case|NoCase] &amp;lt;mime type&amp;gt; &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt;...]&lt;br /&gt;
# This command associates filename extensions (for services&lt;br /&gt;
# that don&#039;t automatically include them) with their mime types.&lt;br /&gt;
# Currently &amp;quot;file:&amp;quot; protocol uses these commands.&lt;br /&gt;
# Use optional first two parameter to choose comparison type.&lt;br /&gt;
# Default type is &amp;quot;String&amp;quot; &amp;quot;NoCase&amp;quot; (case sensitive string match with&lt;br /&gt;
# &#039;?&#039; and &#039;*&#039; wildcards for one and several characters correspondingly).&lt;br /&gt;
#&lt;br /&gt;
AddType image/x-xpixmap	*.xpm&lt;br /&gt;
AddType image/x-xbitmap	*.xbm&lt;br /&gt;
AddType image/gif	*.gif&lt;br /&gt;
&lt;br /&gt;
AddType	text/plain			*.txt  *.pl *.js *.h *.c *.pm *.e&lt;br /&gt;
AddType	text/html			*.html *.htm&lt;br /&gt;
&lt;br /&gt;
AddType text/rtf			*.rtf&lt;br /&gt;
AddType application/pdf			*.pdf&lt;br /&gt;
AddType application/msword		*.doc&lt;br /&gt;
AddType application/vnd.ms-excel	*.xls&lt;br /&gt;
AddType text/x-postscript		*.ps&lt;br /&gt;
&lt;br /&gt;
# Default unknown type for other extensions:&lt;br /&gt;
AddType	application/unknown *.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Use ParserTimeOut to specify amount of time for parser execution&lt;br /&gt;
# to avoid possible indexer hang.&lt;br /&gt;
&lt;br /&gt;
ParserTimeOut 300&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Section 5.&lt;br /&gt;
# Servers configuration.&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Document sections.&lt;br /&gt;
#&lt;br /&gt;
# Format is:&lt;br /&gt;
#&lt;br /&gt;
#   Section &amp;lt;string&amp;gt; &amp;lt;number&amp;gt; &amp;lt;maxlen&amp;gt; [clone] [sep] [{expr} {repl}]&lt;br /&gt;
#&lt;br /&gt;
# where &amp;lt;string&amp;gt; is a section name and &amp;lt;number&amp;gt; is section ID&lt;br /&gt;
# between 0 and 255. Use 0 if you don&#039;t want to index some of &lt;br /&gt;
# these sections. It is better to use different sections IDs&lt;br /&gt;
# for different documents parts. In this case during search &lt;br /&gt;
# time you&#039;ll be able to give different weight to each part&lt;br /&gt;
# or even disallow some sections at a search time.&lt;br /&gt;
# &amp;lt;maxlen&amp;gt; argument contains a maximum length of section&lt;br /&gt;
# which will be stored in database.&lt;br /&gt;
# &amp;quot;clone&amp;quot; is an optional parameter describing whether this&lt;br /&gt;
# section should affect clone detection. It can &lt;br /&gt;
# be &amp;quot;DetectClone&amp;quot; or &amp;quot;cdon&amp;quot;, or &amp;quot;NoDetectClone&amp;quot; or &amp;quot;cdoff&amp;quot;.&lt;br /&gt;
# By default, url.* section values are not taken in account&lt;br /&gt;
# for clone detection, while any other sections take part&lt;br /&gt;
# in clone detection.&lt;br /&gt;
# &amp;quot;sep&amp;quot; is an optional argument to specify a separator between&lt;br /&gt;
# parts of the same section. It is a space character by default.&lt;br /&gt;
# &amp;quot;expr&amp;quot; and &amp;quot;repl&amp;quot; can be used to extract user defined sections,&lt;br /&gt;
# for example pieces of text between the given tags. &amp;quot;expr&amp;quot; is&lt;br /&gt;
# a regular expression, &amp;quot;repl&amp;quot; is a replacement with $1, $2, etc&lt;br /&gt;
# meta-characters designating matches &amp;quot;expr&amp;quot; matches.&lt;br /&gt;
&lt;br /&gt;
# Standard HTML sections: body, title&lt;br /&gt;
&lt;br /&gt;
Section	body			1	256&lt;br /&gt;
Section title			2	128&lt;br /&gt;
&lt;br /&gt;
# META tags&lt;br /&gt;
# For example &amp;lt;META NAME=&amp;quot;KEYWORDS&amp;quot; CONTENT=&amp;quot;xxxx&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
Section meta.keywords		3	128&lt;br /&gt;
Section	meta.description	4	128&lt;br /&gt;
&lt;br /&gt;
# HTTP headers example, let&#039;s store &amp;quot;Server&amp;quot; HTTP header&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#Section header.server		5	64&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Document&#039;s URL parts&lt;br /&gt;
&lt;br /&gt;
Section url.file		6	0&lt;br /&gt;
Section url.path		7	0&lt;br /&gt;
Section	url.host		8	0&lt;br /&gt;
Section url.proto		9	0&lt;br /&gt;
&lt;br /&gt;
# CrossWords&lt;br /&gt;
&lt;br /&gt;
Section crosswords		10	0&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# If you use CachedCopy for smart excerpts (see below), &lt;br /&gt;
# please keep Charset section active.&lt;br /&gt;
#&lt;br /&gt;
Section Charset 		11 	32&lt;br /&gt;
&lt;br /&gt;
Section Content-Type		12	64&lt;br /&gt;
Section Content-Language	13	16&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want tag attributes&lt;br /&gt;
# to be indexed&lt;br /&gt;
&lt;br /&gt;
#Section attribute.alt		14	128&lt;br /&gt;
#Section attribute.label	15	128&lt;br /&gt;
#Section attribute.summary	16	128&lt;br /&gt;
#Section attribute.title	17	128&lt;br /&gt;
#Section attribute.face		27	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want use NewsExtensions&lt;br /&gt;
# You may add any Newsgroups header to be indexed and stored in urlinfo table&lt;br /&gt;
&lt;br /&gt;
#Section References		18	0&lt;br /&gt;
#Section Message-ID		19	0&lt;br /&gt;
#Section Parent-ID		20	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want index MP3 tags.&lt;br /&gt;
#Section MP3.Song           	21    128&lt;br /&gt;
#Section MP3.Album          	22    128&lt;br /&gt;
#Section MP3.Artist         	23    128&lt;br /&gt;
#Section MP3.Year           	24    128&lt;br /&gt;
&lt;br /&gt;
# Comment this line out if you don&#039;t want to store &amp;quot;cached copies&amp;quot;&lt;br /&gt;
# to generate smart excerpts at search time.&lt;br /&gt;
# Don&#039;t forget to keep &amp;quot;Charset&amp;quot; section active if you use cached copies.&lt;br /&gt;
# NOTE: 3.2.18 has limits for CachedCopy size, 32000 for Ibase and&lt;br /&gt;
# 15000 for Mimer. Other databases do not have limits.&lt;br /&gt;
# If indexer fails with &#039;string too long&#039; error message then reduce&lt;br /&gt;
# this number. This will be fixed in the future versions.&lt;br /&gt;
#&lt;br /&gt;
Section CachedCopy		25 64000&lt;br /&gt;
&lt;br /&gt;
# A user defined section example.&lt;br /&gt;
# Extract text between &amp;lt;h1&amp;gt; and &amp;lt;/h1&amp;gt; tags:&lt;br /&gt;
#Section h1			26 128 &amp;quot;&amp;lt;h1&amp;gt;(.*)&amp;lt;/h1&amp;gt;&amp;quot; $1&lt;br /&gt;
&lt;br /&gt;
#########################################################################&lt;br /&gt;
#Server [Method] [SubSection] &amp;lt;URL&amp;gt; [alias]&lt;br /&gt;
# This is the main command of the indexer.conf file. It&#039;s used &lt;br /&gt;
# to describe web-space you want to index. It also inserts&lt;br /&gt;
# given URL into database to use it as a start point.&lt;br /&gt;
# You may use &amp;quot;Server&amp;quot; command as many times as a number of different&lt;br /&gt;
# servers or their parts you want to index.&lt;br /&gt;
&lt;br /&gt;
# To index whole server &amp;quot;www.example.com&amp;quot;:&lt;br /&gt;
Server http://www.example.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unbedingt im ganzen Dokument example.com durch den eigenen Domainnamen ersetzen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Datenbank erstellen ===&lt;br /&gt;
&lt;br /&gt;
Die Datenbank wird mit dem Programm &#039;&#039;&#039;indexer&#039;&#039;&#039; erstellt. Dabei muss indexer natürlich (und wie bei jedem Aufruf) der Pfad zur eigenen Konfiguration mitgeteilt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -Ecreate /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erster Indexlauf ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -a /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl wird die Datenbank gefüllt. Wir haben in der Konfigurationsdatei definiert, dass alle Seiten mit der Endung .html unter http://www.example.com/ durchsucht und indiziert werden.&lt;br /&gt;
&lt;br /&gt;
Die Option -a ersetzt alle vorhandenen Einträge.&lt;br /&gt;
&lt;br /&gt;
=== Die Suche auf der eigenen Webseite ===&lt;br /&gt;
&lt;br /&gt;
Damit die Suche funktionieren kann, legen wir einen symbolischen Link zu dem Suchprogramm /usr/lib/cgi-bin/search.cgi in das eigene cgi-Verzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ln -s /usr/lib/cgi-bin/search.cgi /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das zugehörige Suchformular kann entweder von /etc/mnogosearch/search.htm in das eigene Webverzeichnis kopiert (mit der Endung &amp;quot;zhtml&amp;quot; - siehe weiter unten) und anschließend editiert werden. Wichtig ist der Verweis auf die eigene Datenbankdatei in der Sektion &amp;quot;variables&amp;quot; ganz zu Beginn:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Minimales Suchformular in Deutsch ====&lt;br /&gt;
&lt;br /&gt;
Folgendes Formular ist bereits eingedeutscht und kann direkt als /home/doms/example.com/subs/www/suche.zhtml abgespeichert werden (man beachte die Endung &amp;quot;zhtml&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# start&lt;br /&gt;
&amp;lt;!--variables&lt;br /&gt;
# Database parameters&lt;br /&gt;
# Format: &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Use proper local and browser charsets&lt;br /&gt;
# Default charset is iso-8859-1 (latin1)&lt;br /&gt;
# which is suitable for the most Western European languages&lt;br /&gt;
&lt;br /&gt;
# Comment this for iso-8859-1&lt;br /&gt;
LocalCharset   utf-8&lt;br /&gt;
BrowserCharset utf-8&lt;br /&gt;
&lt;br /&gt;
# Minimum and maximum word lengths&lt;br /&gt;
#&lt;br /&gt;
#MinWordLength 1&lt;br /&gt;
#MaxWordLength 32&lt;br /&gt;
&lt;br /&gt;
# Number of pages in navigator bar&lt;br /&gt;
#&lt;br /&gt;
#PagesPerScreen 10&lt;br /&gt;
&lt;br /&gt;
# How to hilight searched words.&lt;br /&gt;
#&lt;br /&gt;
HlBeg	&#039;&amp;lt;span style=&amp;quot;background-color: #ff0; color: #f00; font-weight: bold;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
HlEnd	&#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
# Suche auf html-dokumente beschraenken&lt;br /&gt;
ReplaceVar type &amp;quot;text/html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Suche auf auf Wortanfang erweitern&lt;br /&gt;
# Suche nach &amp;quot;gut&amp;quot; findet auch &amp;quot;gute&amp;quot;&lt;br /&gt;
# wirkt wie suchwort*&lt;br /&gt;
ReplaceVar wm &amp;quot;beg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--top--&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=$&amp;amp;(BrowserCharset)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Suche: $&amp;amp;(q)&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color: #fff; }&lt;br /&gt;
a { color: #00c; }&lt;br /&gt;
div.center { text-align: center; }&lt;br /&gt;
table.grey { background-color: #eee; width: 100%; }&lt;br /&gt;
table.white { background-color: #fff; width: 100%; }&lt;br /&gt;
img.logo { border: none; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt; Suche nach:&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;text&amp;quot;   NAME=&amp;quot;q&amp;quot;    VALUE=&amp;quot;$&amp;amp;(q)&amp;quot; SIZE=50 /&amp;gt;&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;submit&amp;quot; NAME=&amp;quot;cmd&amp;quot; VALUE=&amp;quot;Suche!&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--restop--&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100% border=0&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Gefunden: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Ergebnisse &amp;lt;b&amp;gt;$(first)-$(last)&amp;lt;/b&amp;gt; von &amp;lt;B&amp;gt;$(total)&amp;lt;/B&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Die Suche dauerte &amp;lt;b&amp;gt;$(SearchTime)&amp;lt;/b&amp;gt; Sekunden&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
      Sortieren:&lt;br /&gt;
      &amp;lt;!IF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;DRP&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Datum&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSEIF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;SRPD&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Titel&amp;lt;/b&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSE&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Relevanz&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/restop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--res--&amp;gt;&lt;br /&gt;
&amp;lt;DL&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;!IF   NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSEIF NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;short&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSE&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
    &amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;!IFNOT NAME=&amp;quot;Pop_Rank&amp;quot; CONTENT=&amp;quot;0.00000&amp;quot;&amp;gt;Popularity: &amp;lt;b&amp;gt;$(Pop_Rank)&amp;lt;/b&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
   ]&lt;br /&gt;
  &amp;lt;/small&amp;gt;&lt;br /&gt;
  &amp;lt;DD&amp;gt;&lt;br /&gt;
  &amp;lt;table width=60%&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;small&amp;gt;$&amp;amp;(Body)...&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;UL&amp;gt;&lt;br /&gt;
         &amp;lt;li&amp;gt;&lt;br /&gt;
           &amp;lt;small&amp;gt;&lt;br /&gt;
             &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
              - $(Content-Length) bytes [$(Content-Type)] &lt;br /&gt;
              - $(Last-Modified) &lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;stored_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;[&amp;lt;a href=&amp;quot;$(stored_href)&amp;quot;&amp;gt;Cached copy&amp;lt;/a&amp;gt;]&amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;sitelimit_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFGT NAME=&amp;quot;PerSite&amp;quot; CONTENT=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;&lt;br /&gt;
              [&amp;lt;a href=&amp;quot;$(sitelimit_href)&amp;quot;&amp;gt;More results from this site ($(PerSite) total) &amp;lt;/a&amp;gt;]&lt;br /&gt;
	      &amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
             &amp;lt;/font&amp;gt;&lt;br /&gt;
           &amp;lt;/small&amp;gt;&lt;br /&gt;
           &amp;lt;BR&amp;gt;&lt;br /&gt;
           $(CL)&lt;br /&gt;
        &amp;lt;/UL&amp;gt;&lt;br /&gt;
        $(STORED)&lt;br /&gt;
	&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;/DL&amp;gt;&lt;br /&gt;
&amp;lt;!--/res--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--resbot--&amp;gt;&lt;br /&gt;
&amp;lt;table width=100% bgcolor=#FFFFFF&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td align=center&amp;gt;&lt;br /&gt;
      &amp;lt;TABLE BORDER=0&amp;gt;&lt;br /&gt;
        &amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;Ergebnis Seiten: &amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TD&amp;gt;&amp;lt;/TD&amp;gt;$(NL)$(NB)$(NR)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
      &amp;lt;/TABLE&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;!--/resbot--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--clone--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
  &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
  - $(Content-Length) bytes&lt;br /&gt;
  - $(Last-Modified) &lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!--/clone--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar1--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;$(NP)&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar0--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;$(NP)&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar0--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--notfound--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;WS&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Meinten Sie &amp;lt;b&amp;gt;&amp;lt;a href=&amp;quot;?q=$%(WS)&amp;quot;&amp;gt;$(WS)&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;?&lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100%&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suchergebnisse: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Sorry, Ihre Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt; hat kein Ergebnis.&amp;lt;br&amp;gt;&lt;br /&gt;
Es wurden keine Dokumente gefunden, die &amp;lt;b&amp;gt;&amp;quot;$&amp;amp;(q)&amp;quot; enthalten&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Hinweise:&lt;br /&gt;
&amp;lt;UL&amp;gt;&lt;br /&gt;
  &amp;lt;LI&amp;gt; Stellen Sie sicher, dass Ihre W&amp;amp;ouml;rter richtig geschrieben sind.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie andere Suchworte.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie allgemeinere Suchw&amp;amp;ouml;rter. &lt;br /&gt;
&amp;lt;/UL&amp;gt;&lt;br /&gt;
&amp;lt;!--/notfound--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--noquery--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;Bitte geben Sie eines oder mehrere W&amp;amp;ouml;rter ein und d&amp;amp;uuml;cken Sie Suche.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--/noquery--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--error--&amp;gt;&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&lt;br /&gt;
&amp;lt;FONT COLOR=&amp;quot;#FF0000&amp;quot;&amp;gt;Es ist ein Fehler aufgetreten!&amp;lt;/FONT&amp;gt;&lt;br /&gt;
&amp;lt;P&amp;gt;&amp;lt;B&amp;gt;$(E)&amp;lt;/B&amp;gt;&lt;br /&gt;
&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
&amp;lt;!--/error--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--bottom--&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!--/bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_top--&amp;gt;&lt;br /&gt;
&amp;lt;BASE HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Document ID:&amp;lt;/b&amp;gt; $(ID)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Last modified:&amp;lt;/b&amp;gt; $(Last-Modified)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Language:&amp;lt;/b&amp;gt; $(Content-Language)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Charset:&amp;lt;/b&amp;gt; $(Charset)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Size:&amp;lt;/b&amp;gt; $(Content-Length)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc--&amp;gt;&lt;br /&gt;
$^(document)&lt;br /&gt;
&amp;lt;!--/storedoc--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_bottom--&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== suche.zhtml sucht search.cgi ====&lt;br /&gt;
&lt;br /&gt;
Das Suchformular hat keine &amp;quot;action&amp;quot; definiert, es wird per .htaccess an &#039;&#039;&#039;search.cgi&#039;&#039;&#039; als Template übergeben:&lt;br /&gt;
&lt;br /&gt;
Wenn noch nicht vorhanden, im gleichen Verzeichnis, in dem das Suchformulat liegt (in diesem Fall ~/doms/example.com/subs/www), eine Datei .htaccess erstellen und editieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# touch .htaccess&lt;br /&gt;
# edit .htaccess&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und da folgendes reinschreiben (vorausgesetzt, das Formular heißt suche.zhtml):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AddType text/html .zhtml&lt;br /&gt;
AddHandler zhtml .zhtml&lt;br /&gt;
Action zhtml /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann das Suchformular im Browser angezeigt und verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;http://www.example.com/suche.zhtml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt etliche weitere Möglichkeiten, search.cgi zu benutzen, sie stehen in der Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Cronjob zum Update der Suchdatenbank in der Nacht ===&lt;br /&gt;
&lt;br /&gt;
Sollten sich die Webseiten öfter mal ändern, ist es sinnvoll, die Suchdatenbank nachts zu aktualisieren. Die Datei für die eigenen Cronjobs wird editiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und reingeschrieben wird das:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# suche mnogosearch indexer&lt;br /&gt;
19 23 * * *     nice indexer /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitte eine andere Uhrzeit wählen, damit nicht alle indexer-Jobs um 23:19 Uhr anlaufen!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Kompilieren der Mnogosearch aus den Sourcen ==&lt;br /&gt;
Diese Anleitung ist sehr auf die Zusammenarbeit mit dem CMS TYPO3 ausgerichtet. So sind zum Beispiel die Konfigurationseinstellungen zum kompilieren aus dem Manual der TYPO3 Extension [http://typo3.org/documentation/document-library/extension-manuals/mnogosearch/2.2.2/view/1/3/ mnogosearch] entnommen.&lt;br /&gt;
Im Grunde bin ich einfach den Anweisungen dort gefolgt, mußte aber wegen HS-spezifischen Gründen an manchen Stellen einen anderen Weg gehen.&lt;br /&gt;
&lt;br /&gt;
Ich habe Mnogosearch mit einem Domainuser kompiliert. Ich denke das das grundsätzlich auch mit einem Paketadmin funktioniert, aber eventuell zu unsicher ist.&lt;br /&gt;
&lt;br /&gt;
=== Runterladen und auspacken === &lt;br /&gt;
Zuerst wechseln wir ins Homeverzeichnis (~) des Users, laden uns den Quellcode runter und entpacken das Archiv.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
// stets die neueste Version benutzen&lt;br /&gt;
wget http://www.mnogosearch.org/Download/mnogosearch-3.3.9.tar.gz&lt;br /&gt;
tar xvf mnogosearch-3.3.9.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anpassen der Dateien ===&lt;br /&gt;
&lt;br /&gt;
Sollte man ausschließend eine MySQL Datenbank verwenden, muß vor dem kompilieren die Dateien ./configure.in und ./configure bearbeiten.&lt;br /&gt;
In beiden Dateien suchen wir nach dem String &#039;&#039;HAVE_PGSQL&#039;&#039; und ändern die &#039;&#039;1&#039;&#039; in eine &#039;&#039;0&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor configure.in&lt;br /&gt;
AC_DEFINE([HAVE_PGSQL], [1], [Define if you want to use PostgreSQL])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Hier gibt es zwei wichtige Änderungen gegenüber des Manuals.&lt;br /&gt;
* der Installationpfad muss angepasst werden, da wir keine Schreibrechte für /opt/ besitzen&lt;br /&gt;
* der Pfad zu der Datei mysql.h muss angegeben werden   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure --prefix=/path/to/user/home/opt/mnogosearch --with-mysql=/usr --disable-mp3 --disable-news --without-debug --with-pgsql=no --with-freetds=no --with-oracle8=no --with-oracle8i=no --with-iodbc=no --with-unixODBC=no --with-db2=no --with-solid=no --with-openlink=no --with-easysoft=no --with-sapdb=no --with-ibase=no --with-ctlib=no --with-zlib --disable-syslog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der Suchengine ===&lt;br /&gt;
Bevor es zum kompilieren kommen, müssen wir noch eine erzeugte Datei bearbeiten und ändern dort den String &lt;br /&gt;
&#039;&#039;/* #undef HAVE_PGSQL */&#039;&#039; in &#039;&#039;#undef HAVE_PGSQL&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor include/udm_autoconf.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kompilieren und installieren wir Mnogosearch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der PHP Extension ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; &lt;br /&gt;
* der Pfad zur Suchengine muss angepasst werden (ist derselbe Pfad wie in dem --prefix Argument)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/mnogosearch-3.3.9/php&lt;br /&gt;
phpize&lt;br /&gt;
./configure --with-mnogosearch=/path/to/user/home/opt/mnogosearch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir die Datei &#039;&#039;php_mnogo.c&#039;&#039; editieren und den String &#039;&#039;#undef HAVE_PGSQL&#039;&#039; in eine neue Zeile unterhalb von &#039;&#039;#include &amp;quot;php.h&amp;quot;&#039;&#039; einfügen.&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir die Extension bauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die PHP Extension liegt jetzt in dem Ordner ~/mnogosearch-3.3.9/php/modules. Am Besten kopiert man sich die Extension in den CGI Ordner einer Domain oder ebenfalls nach ~/opt.&lt;br /&gt;
&lt;br /&gt;
Um die Extension nun nutzen zu können, editieren wir die eigene &#039;&#039;php-cgi-fcgi.ini&#039;&#039; und fügen am Ende &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extension=relativer/Pfad/vom/PHP-Extension/Verzeichnis/zu/mnogosearch.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Extension Dir erhält man so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -i | grep extension_dir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von diesem Verzeichnis ausgehend hangelt man sich bis zu dem Verzeichnis, in das man eben die PHP Extension kopiert hat.&lt;br /&gt;
Das ist notwendig, da in PHP 5.2 keine multiplen Extension Dirs in der php.ini eingetragen werden können. Eigene Extensions können nur relativ referenziert werden.&lt;br /&gt;
&lt;br /&gt;
Das Ergbnis sollte man noch in einer mittels phpinfo überprüfen. Wenn alles funktioniert hat, sollte in der Übersicht &#039;&#039;mnogosearch&#039;&#039; auftauchen. Ist dies nicht der Fall empfielt es sich das Errorlog von PHP anzuschalten und zu schauen, was schief läuft. Oft liegt das einfach an dem falschen relativen Pfad zur Extension.&lt;br /&gt;
 &lt;br /&gt;
Den weiteren Installationablauf entnimmt man am Besten dem Manual zur TYPO3 Extension. &lt;br /&gt;
nach dem Installieren der Extension in TYPO3 muss man den Pfad zu der Suchengine von /opt/mnogosearch entsprechend anpassen. In unserem Fall wäre das &#039;&#039;/path/to/user/home/opt/mnogosearch&#039;&#039;   &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>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5655</id>
		<title>Mnogosearch installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=5655"/>
		<updated>2021-09-29T06:37:34Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Die Suchmaschine für die eigene Webseite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Die Suchmaschine für die eigene Webseite ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mnogosearch.org/ Mnogosearch] ist eine Suchmaschine, die für die eigene Webseite verwendet werden kann. Sie ist für Webseiten bis einige tausend Seiten und Traffic, wie er auf einem Shared-Webserver vorkommt, gut geeignet. Die Software muss aus den Sourcen selbst [[#Kompilieren der Mnogosearch aus den Sourcen|kompiliert]] werden und kann mit Datenbanken wie Sqlite3, Mysql oder Postgresql eingesetzt werden. &lt;br /&gt;
&lt;br /&gt;
Hier wird eine Grundinstallation beschrieben. Mnogosearch ist eine sehr umfangreiche Software mit mannigfaltigen Konfigurationsmöglichkeiten. Für die weitergehende Konfiguration muss auf die Dokumentation von [http://www.mnogosearch.org/ Mnogosearch] verwiesen werden.&lt;br /&gt;
&lt;br /&gt;
Mnogosearch ist sehr mächtig und kann vor allen Dingen mit Unicode umgehen, es können viele Dinge eingestellt werden. In dieser Konfiguration funktioniert der indexer als &amp;quot;Crawler&amp;quot;, er surft die eigene Webseite ab und speichert die Einträge für spätere Suchergebnisse. Dabei beachtet er die /robots.txt.&lt;br /&gt;
&lt;br /&gt;
Es können aber auch das Dateisystem und verschiedene Dokumentarten durchsucht werden, es können Bereiche der Webseite ausgeschlossen werden und es können Sektionen in Webseiten definiert werden, die für die Auflistung der Suchergebnisse als wichtiger gewertet werden. Diese Dinge müssen zusätzlich konfiguriert werden. Dies ist nur eine Grundkonfiguration, die aber in den meisten Fällen ausreichen dürfte.&lt;br /&gt;
&lt;br /&gt;
== Installation des Debian Pakets ==&lt;br /&gt;
&lt;br /&gt;
Für die Datenbank und die Konfigurationsdatei wird am besten pro Domain ein Verzeichnis &amp;quot;mnogosearch&amp;quot; eingerichtet und da die Konfigurationsdatei indexer.conf erstellt. Diese Datei kann auch von /etc/mnogosearch/indexer.conf kopiert werden und muss dann entsprechend geändert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /home/doms/example.com&lt;br /&gt;
# mkdir mnogosearch&lt;br /&gt;
# cd mnogosearch&lt;br /&gt;
# touch indexer.conf&lt;br /&gt;
# edit indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inhalt von indexer.conf ===&lt;br /&gt;
&lt;br /&gt;
Dies ist die stark gekürzte und auf Notwendiges reduzierte Fassung. Ganz zu Beginn wird die Datenbankdatei und am Ende der zu indizierende Webserver definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###########################################################################&lt;br /&gt;
# DBAddr &amp;lt;URL-style database description&amp;gt;&lt;br /&gt;
# Options (type, host, database name, port, user and password) &lt;br /&gt;
# to connect to SQL database.&lt;br /&gt;
# Should be used before any other commands.&lt;br /&gt;
# Has global effect for whole config file.&lt;br /&gt;
# Format:&lt;br /&gt;
#DBAddr &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Default LocalCharset is iso-8859-1 (latin1).&lt;br /&gt;
&lt;br /&gt;
# Full UNICODE&lt;br /&gt;
# Folgendes auskommentieren für iso-8859-1&lt;br /&gt;
LocalCharset UTF-8&lt;br /&gt;
&lt;br /&gt;
###########################################################################&lt;br /&gt;
# StopwordFile &amp;lt;filename&amp;gt;&lt;br /&gt;
# Load stop words from the given text file. You may specify either absolute &lt;br /&gt;
# file name or a name relative to mnoGoSearch /etc directory. You may use&lt;br /&gt;
# several StopwordFile commands.&lt;br /&gt;
#&lt;br /&gt;
StopwordFile stopwords/de.sl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# HTTPHeader &amp;lt;header&amp;gt;&lt;br /&gt;
# You may add your desired headers in indexer HTTP request.&lt;br /&gt;
# You should not use &amp;quot;If-Modified-Since&amp;quot;,&amp;quot;Accept-Charset&amp;quot; headers,&lt;br /&gt;
# these headers are composed by indexer itself.&lt;br /&gt;
# &amp;quot;User-Agent: mnoGoSearch/version&amp;quot; is sent too, but you may override it.&lt;br /&gt;
# Command has global effect for all configuration file.&lt;br /&gt;
#&lt;br /&gt;
HTTPHeader &amp;quot;User-Agent: example.com-indexer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
# Section 2.&lt;br /&gt;
# URL control configuration.&lt;br /&gt;
&lt;br /&gt;
# Allow Configuration&lt;br /&gt;
# Examples&lt;br /&gt;
#  Allow everything:&lt;br /&gt;
#Allow *&lt;br /&gt;
#  Allow everything but .php .cgi .pl extensions case insensitively using regex:&lt;br /&gt;
#Allow NoMatch Regex \.php$|\.cgi$|\.pl$&lt;br /&gt;
#  Allow .HTM extension case sensitively:&lt;br /&gt;
#Allow Case *.HTM&lt;br /&gt;
&lt;br /&gt;
Allow *.html&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
#Disallow [Match|NoMatch] [NoCase|Case] [String|Regex] &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt; ... ]&lt;br /&gt;
#&lt;br /&gt;
# Examples:&lt;br /&gt;
# Disallow URLs that are not in udm.net domains using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch *.udm.net/*&lt;br /&gt;
# Disallow any except known extensions and directory index using &amp;quot;regex&amp;quot; match:&lt;br /&gt;
#Disallow NoMatch Regex \/$|\.htm$|\.html$|\.shtml$|\.phtml$|\.php$|\.txt$&lt;br /&gt;
# Exclude cgi-bin and non-parsed-headers using &amp;quot;string&amp;quot; match:&lt;br /&gt;
#Disallow */cgi-bin/* *.cgi */nph-*&lt;br /&gt;
# Exclude anything with &#039;?&#039; sign in URL. Note that &#039;?&#039; sign has a &lt;br /&gt;
# special meaning in &amp;quot;string&amp;quot; match, so we have to use &amp;quot;regex&amp;quot; match here:&lt;br /&gt;
#Disallow Regex  \?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Exclude some known extensions using fast &amp;quot;String&amp;quot; match:&lt;br /&gt;
Disallow *.b    *.sh   *.md5  *.rpm&lt;br /&gt;
Disallow *.arj  *.tar  *.zip  *.tgz  *.gz   *.z     *.bz2 &lt;br /&gt;
Disallow *.lha  *.lzh  *.rar  *.zoo  *.ha   *.tar.Z&lt;br /&gt;
Disallow *.gif  *.jpg  *.jpeg *.bmp  *.tiff *.tif   *.xpm  *.xbm *.pcx&lt;br /&gt;
Disallow *.vdo  *.mpeg *.mpe  *.mpg  *.avi  *.movie *.mov  *.wmv&lt;br /&gt;
Disallow *.mid  *.mp3  *.rm   *.ram  *.wav  *.aiff  *.ra&lt;br /&gt;
Disallow *.vrml *.wrl  *.png  *.ico  *.psd  *.dat&lt;br /&gt;
Disallow *.exe  *.com  *.cab  *.dll  *.bin  *.class *.ex_&lt;br /&gt;
Disallow *.tex  *.texi *.xls  *.doc  *.texinfo&lt;br /&gt;
Disallow *.rtf  *.pdf  *.cdf  *.ps&lt;br /&gt;
Disallow *.ai   *.eps  *.ppt  *.hqx&lt;br /&gt;
Disallow *.cpt  *.bms  *.oda  *.tcl&lt;br /&gt;
Disallow *.o    *.a    *.la   *.so &lt;br /&gt;
Disallow *.pat  *.pm   *.m4   *.am   *.css&lt;br /&gt;
Disallow *.map  *.aif  *.sit  *.sea&lt;br /&gt;
Disallow *.m3u  *.qt&lt;br /&gt;
&lt;br /&gt;
# Exclude Apache directory list in different sort order using &amp;quot;string&amp;quot; match:&lt;br /&gt;
Disallow *D=A *D=D *M=A *M=D *N=A *N=D *S=A *S=D&lt;br /&gt;
&lt;br /&gt;
# More complicated case. RAR .r00-.r99, ARJ a00-a99 files &lt;br /&gt;
# and UNIX shared libraries. We use &amp;quot;Regex&amp;quot; match type here:&lt;br /&gt;
Disallow Regex \.r[0-9][0-9]$ \.a[0-9][0-9]$ \.so\.[0-9]$&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
# Section 3.&lt;br /&gt;
# Mime types and external parsers.&lt;br /&gt;
&lt;br /&gt;
################################################################&lt;br /&gt;
#AddType [String|Regex] [Case|NoCase] &amp;lt;mime type&amp;gt; &amp;lt;arg&amp;gt; [&amp;lt;arg&amp;gt;...]&lt;br /&gt;
# This command associates filename extensions (for services&lt;br /&gt;
# that don&#039;t automatically include them) with their mime types.&lt;br /&gt;
# Currently &amp;quot;file:&amp;quot; protocol uses these commands.&lt;br /&gt;
# Use optional first two parameter to choose comparison type.&lt;br /&gt;
# Default type is &amp;quot;String&amp;quot; &amp;quot;NoCase&amp;quot; (case sensitive string match with&lt;br /&gt;
# &#039;?&#039; and &#039;*&#039; wildcards for one and several characters correspondingly).&lt;br /&gt;
#&lt;br /&gt;
AddType image/x-xpixmap	*.xpm&lt;br /&gt;
AddType image/x-xbitmap	*.xbm&lt;br /&gt;
AddType image/gif	*.gif&lt;br /&gt;
&lt;br /&gt;
AddType	text/plain			*.txt  *.pl *.js *.h *.c *.pm *.e&lt;br /&gt;
AddType	text/html			*.html *.htm&lt;br /&gt;
&lt;br /&gt;
AddType text/rtf			*.rtf&lt;br /&gt;
AddType application/pdf			*.pdf&lt;br /&gt;
AddType application/msword		*.doc&lt;br /&gt;
AddType application/vnd.ms-excel	*.xls&lt;br /&gt;
AddType text/x-postscript		*.ps&lt;br /&gt;
&lt;br /&gt;
# Default unknown type for other extensions:&lt;br /&gt;
AddType	application/unknown *.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Use ParserTimeOut to specify amount of time for parser execution&lt;br /&gt;
# to avoid possible indexer hang.&lt;br /&gt;
&lt;br /&gt;
ParserTimeOut 300&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Section 5.&lt;br /&gt;
# Servers configuration.&lt;br /&gt;
&lt;br /&gt;
#######################################################################&lt;br /&gt;
# Document sections.&lt;br /&gt;
#&lt;br /&gt;
# Format is:&lt;br /&gt;
#&lt;br /&gt;
#   Section &amp;lt;string&amp;gt; &amp;lt;number&amp;gt; &amp;lt;maxlen&amp;gt; [clone] [sep] [{expr} {repl}]&lt;br /&gt;
#&lt;br /&gt;
# where &amp;lt;string&amp;gt; is a section name and &amp;lt;number&amp;gt; is section ID&lt;br /&gt;
# between 0 and 255. Use 0 if you don&#039;t want to index some of &lt;br /&gt;
# these sections. It is better to use different sections IDs&lt;br /&gt;
# for different documents parts. In this case during search &lt;br /&gt;
# time you&#039;ll be able to give different weight to each part&lt;br /&gt;
# or even disallow some sections at a search time.&lt;br /&gt;
# &amp;lt;maxlen&amp;gt; argument contains a maximum length of section&lt;br /&gt;
# which will be stored in database.&lt;br /&gt;
# &amp;quot;clone&amp;quot; is an optional parameter describing whether this&lt;br /&gt;
# section should affect clone detection. It can &lt;br /&gt;
# be &amp;quot;DetectClone&amp;quot; or &amp;quot;cdon&amp;quot;, or &amp;quot;NoDetectClone&amp;quot; or &amp;quot;cdoff&amp;quot;.&lt;br /&gt;
# By default, url.* section values are not taken in account&lt;br /&gt;
# for clone detection, while any other sections take part&lt;br /&gt;
# in clone detection.&lt;br /&gt;
# &amp;quot;sep&amp;quot; is an optional argument to specify a separator between&lt;br /&gt;
# parts of the same section. It is a space character by default.&lt;br /&gt;
# &amp;quot;expr&amp;quot; and &amp;quot;repl&amp;quot; can be used to extract user defined sections,&lt;br /&gt;
# for example pieces of text between the given tags. &amp;quot;expr&amp;quot; is&lt;br /&gt;
# a regular expression, &amp;quot;repl&amp;quot; is a replacement with $1, $2, etc&lt;br /&gt;
# meta-characters designating matches &amp;quot;expr&amp;quot; matches.&lt;br /&gt;
&lt;br /&gt;
# Standard HTML sections: body, title&lt;br /&gt;
&lt;br /&gt;
Section	body			1	256&lt;br /&gt;
Section title			2	128&lt;br /&gt;
&lt;br /&gt;
# META tags&lt;br /&gt;
# For example &amp;lt;META NAME=&amp;quot;KEYWORDS&amp;quot; CONTENT=&amp;quot;xxxx&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
Section meta.keywords		3	128&lt;br /&gt;
Section	meta.description	4	128&lt;br /&gt;
&lt;br /&gt;
# HTTP headers example, let&#039;s store &amp;quot;Server&amp;quot; HTTP header&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#Section header.server		5	64&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Document&#039;s URL parts&lt;br /&gt;
&lt;br /&gt;
Section url.file		6	0&lt;br /&gt;
Section url.path		7	0&lt;br /&gt;
Section	url.host		8	0&lt;br /&gt;
Section url.proto		9	0&lt;br /&gt;
&lt;br /&gt;
# CrossWords&lt;br /&gt;
&lt;br /&gt;
Section crosswords		10	0&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# If you use CachedCopy for smart excerpts (see below), &lt;br /&gt;
# please keep Charset section active.&lt;br /&gt;
#&lt;br /&gt;
Section Charset 		11 	32&lt;br /&gt;
&lt;br /&gt;
Section Content-Type		12	64&lt;br /&gt;
Section Content-Language	13	16&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want tag attributes&lt;br /&gt;
# to be indexed&lt;br /&gt;
&lt;br /&gt;
#Section attribute.alt		14	128&lt;br /&gt;
#Section attribute.label	15	128&lt;br /&gt;
#Section attribute.summary	16	128&lt;br /&gt;
#Section attribute.title	17	128&lt;br /&gt;
#Section attribute.face		27	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want use NewsExtensions&lt;br /&gt;
# You may add any Newsgroups header to be indexed and stored in urlinfo table&lt;br /&gt;
&lt;br /&gt;
#Section References		18	0&lt;br /&gt;
#Section Message-ID		19	0&lt;br /&gt;
#Section Parent-ID		20	0&lt;br /&gt;
&lt;br /&gt;
# Uncomment the following lines if you want index MP3 tags.&lt;br /&gt;
#Section MP3.Song           	21    128&lt;br /&gt;
#Section MP3.Album          	22    128&lt;br /&gt;
#Section MP3.Artist         	23    128&lt;br /&gt;
#Section MP3.Year           	24    128&lt;br /&gt;
&lt;br /&gt;
# Comment this line out if you don&#039;t want to store &amp;quot;cached copies&amp;quot;&lt;br /&gt;
# to generate smart excerpts at search time.&lt;br /&gt;
# Don&#039;t forget to keep &amp;quot;Charset&amp;quot; section active if you use cached copies.&lt;br /&gt;
# NOTE: 3.2.18 has limits for CachedCopy size, 32000 for Ibase and&lt;br /&gt;
# 15000 for Mimer. Other databases do not have limits.&lt;br /&gt;
# If indexer fails with &#039;string too long&#039; error message then reduce&lt;br /&gt;
# this number. This will be fixed in the future versions.&lt;br /&gt;
#&lt;br /&gt;
Section CachedCopy		25 64000&lt;br /&gt;
&lt;br /&gt;
# A user defined section example.&lt;br /&gt;
# Extract text between &amp;lt;h1&amp;gt; and &amp;lt;/h1&amp;gt; tags:&lt;br /&gt;
#Section h1			26 128 &amp;quot;&amp;lt;h1&amp;gt;(.*)&amp;lt;/h1&amp;gt;&amp;quot; $1&lt;br /&gt;
&lt;br /&gt;
#########################################################################&lt;br /&gt;
#Server [Method] [SubSection] &amp;lt;URL&amp;gt; [alias]&lt;br /&gt;
# This is the main command of the indexer.conf file. It&#039;s used &lt;br /&gt;
# to describe web-space you want to index. It also inserts&lt;br /&gt;
# given URL into database to use it as a start point.&lt;br /&gt;
# You may use &amp;quot;Server&amp;quot; command as many times as a number of different&lt;br /&gt;
# servers or their parts you want to index.&lt;br /&gt;
&lt;br /&gt;
# To index whole server &amp;quot;www.example.com&amp;quot;:&lt;br /&gt;
Server http://www.example.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unbedingt im ganzen Dokument example.com durch den eigenen Domainnamen ersetzen!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Datenbank erstellen ===&lt;br /&gt;
&lt;br /&gt;
Die Datenbank wird mit dem Programm &#039;&#039;&#039;indexer&#039;&#039;&#039; erstellt. Dabei muss indexer natürlich (und wie bei jedem Aufruf) der Pfad zur eigenen Konfiguration mitgeteilt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -Ecreate /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erster Indexlauf ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /usr/sbin/indexer -a /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl wird die Datenbank gefüllt. Wir haben in der Konfigurationsdatei definiert, dass alle Seiten mit der Endung .html unter http://www.example.com/ durchsucht und indiziert werden.&lt;br /&gt;
&lt;br /&gt;
Die Option -a ersetzt alle vorhandenen Einträge.&lt;br /&gt;
&lt;br /&gt;
=== Die Suche auf der eigenen Webseite ===&lt;br /&gt;
&lt;br /&gt;
Damit die Suche funktionieren kann, legen wir einen symbolischen Link zu dem Suchprogramm /usr/lib/cgi-bin/search.cgi in das eigene cgi-Verzeichnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ln -s /usr/lib/cgi-bin/search.cgi /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das zugehörige Suchformular kann entweder von /etc/mnogosearch/search.htm in das eigene Webverzeichnis kopiert (mit der Endung &amp;quot;zhtml&amp;quot; - siehe weiter unten) und anschließend editiert werden. Wichtig ist der Verweis auf die eigene Datenbankdatei in der Sektion &amp;quot;variables&amp;quot; ganz zu Beginn:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Minimales Suchformular in Deutsch ====&lt;br /&gt;
&lt;br /&gt;
Folgendes Formular ist bereits eingedeutscht und kann direkt als /home/doms/example.com/subs/www/suche.zhtml abgespeichert werden (man beachte die Endung &amp;quot;zhtml&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# start&lt;br /&gt;
&amp;lt;!--variables&lt;br /&gt;
# Database parameters&lt;br /&gt;
# Format: &amp;lt;DBType&amp;gt;:[//[DBUser[:DBPass]@]DBHost[:DBPort]]/DBName/[?dbmode=mode]&lt;br /&gt;
DBAddr sqlite://mnogo:@/home/doms/example.com/mnogosearch/mnogosearch.db/?dbmode=multi&lt;br /&gt;
&lt;br /&gt;
# Use proper local and browser charsets&lt;br /&gt;
# Default charset is iso-8859-1 (latin1)&lt;br /&gt;
# which is suitable for the most Western European languages&lt;br /&gt;
&lt;br /&gt;
# Comment this for iso-8859-1&lt;br /&gt;
LocalCharset   utf-8&lt;br /&gt;
BrowserCharset utf-8&lt;br /&gt;
&lt;br /&gt;
# Minimum and maximum word lengths&lt;br /&gt;
#&lt;br /&gt;
#MinWordLength 1&lt;br /&gt;
#MaxWordLength 32&lt;br /&gt;
&lt;br /&gt;
# Number of pages in navigator bar&lt;br /&gt;
#&lt;br /&gt;
#PagesPerScreen 10&lt;br /&gt;
&lt;br /&gt;
# How to hilight searched words.&lt;br /&gt;
#&lt;br /&gt;
HlBeg	&#039;&amp;lt;span style=&amp;quot;background-color: #ff0; color: #f00; font-weight: bold;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
HlEnd	&#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
# Suche auf html-dokumente beschraenken&lt;br /&gt;
ReplaceVar type &amp;quot;text/html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Suche auf auf Wortanfang erweitern&lt;br /&gt;
# Suche nach &amp;quot;gut&amp;quot; findet auch &amp;quot;gute&amp;quot;&lt;br /&gt;
# wirkt wie suchwort*&lt;br /&gt;
ReplaceVar wm &amp;quot;beg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--top--&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=$&amp;amp;(BrowserCharset)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Suche: $&amp;amp;(q)&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
body { background-color: #fff; }&lt;br /&gt;
a { color: #00c; }&lt;br /&gt;
div.center { text-align: center; }&lt;br /&gt;
table.grey { background-color: #eee; width: 100%; }&lt;br /&gt;
table.white { background-color: #fff; width: 100%; }&lt;br /&gt;
img.logo { border: none; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt; Suche nach:&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;text&amp;quot;   NAME=&amp;quot;q&amp;quot;    VALUE=&amp;quot;$&amp;amp;(q)&amp;quot; SIZE=50 /&amp;gt;&lt;br /&gt;
      &amp;lt;INPUT TYPE=&amp;quot;submit&amp;quot; NAME=&amp;quot;cmd&amp;quot; VALUE=&amp;quot;Suche!&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--restop--&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100% border=0&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Gefunden: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Ergebnisse &amp;lt;b&amp;gt;$(first)-$(last)&amp;lt;/b&amp;gt; von &amp;lt;B&amp;gt;$(total)&amp;lt;/B&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Die Suche dauerte &amp;lt;b&amp;gt;$(SearchTime)&amp;lt;/b&amp;gt; Sekunden&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
      Sortieren:&lt;br /&gt;
      &amp;lt;!IF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;DRP&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Datum&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSEIF NAME=&amp;quot;s&amp;quot; CONTENT=&amp;quot;SRPD&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=RPD&amp;quot;&amp;gt;Relevanz&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;b&amp;gt;Titel&amp;lt;/b&amp;gt;&lt;br /&gt;
      &amp;lt;!ELSE&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Relevanz&amp;lt;/b&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=DRP&amp;quot;&amp;gt;Datum&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href=&amp;quot;$(FirstPage)&amp;amp;s=SRPD&amp;amp;su=title&amp;quot;&amp;gt;Titel&amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--/restop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--res--&amp;gt;&lt;br /&gt;
&amp;lt;DL&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;!IF   NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSEIF NAME=&amp;quot;fmt&amp;quot; CONTENT=&amp;quot;short&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;[&amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;]&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!ELSE&amp;gt;&lt;br /&gt;
  &amp;lt;DT&amp;gt;$(Order).&lt;br /&gt;
  &amp;lt;a href=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!IF NAME=&amp;quot;Title&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;$(URL:40)&amp;lt;!ELSE&amp;gt;$&amp;amp;(Title)&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;small&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
    &amp;lt;b&amp;gt;$(Score)&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;!IFNOT NAME=&amp;quot;Pop_Rank&amp;quot; CONTENT=&amp;quot;0.00000&amp;quot;&amp;gt;Popularity: &amp;lt;b&amp;gt;$(Pop_Rank)&amp;lt;/b&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
   ]&lt;br /&gt;
  &amp;lt;/small&amp;gt;&lt;br /&gt;
  &amp;lt;DD&amp;gt;&lt;br /&gt;
  &amp;lt;table width=60%&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;small&amp;gt;$&amp;amp;(Body)...&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
        &amp;lt;UL&amp;gt;&lt;br /&gt;
         &amp;lt;li&amp;gt;&lt;br /&gt;
           &amp;lt;small&amp;gt;&lt;br /&gt;
             &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
              - $(Content-Length) bytes [$(Content-Type)] &lt;br /&gt;
              - $(Last-Modified) &lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;stored_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;[&amp;lt;a href=&amp;quot;$(stored_href)&amp;quot;&amp;gt;Cached copy&amp;lt;/a&amp;gt;]&amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFNOT NAME=&amp;quot;sitelimit_href&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;!IFGT NAME=&amp;quot;PerSite&amp;quot; CONTENT=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
	      &amp;lt;DD&amp;gt;&amp;lt;small&amp;gt;&lt;br /&gt;
              [&amp;lt;a href=&amp;quot;$(sitelimit_href)&amp;quot;&amp;gt;More results from this site ($(PerSite) total) &amp;lt;/a&amp;gt;]&lt;br /&gt;
	      &amp;lt;/small&amp;gt;&amp;lt;/DD&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
	      &amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
             &amp;lt;/font&amp;gt;&lt;br /&gt;
           &amp;lt;/small&amp;gt;&lt;br /&gt;
           &amp;lt;BR&amp;gt;&lt;br /&gt;
           $(CL)&lt;br /&gt;
        &amp;lt;/UL&amp;gt;&lt;br /&gt;
        $(STORED)&lt;br /&gt;
	&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;/DL&amp;gt;&lt;br /&gt;
&amp;lt;!--/res--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--resbot--&amp;gt;&lt;br /&gt;
&amp;lt;table width=100% bgcolor=#FFFFFF&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td align=center&amp;gt;&lt;br /&gt;
      &amp;lt;TABLE BORDER=0&amp;gt;&lt;br /&gt;
        &amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;Ergebnis Seiten: &amp;lt;TD&amp;gt;&amp;amp;nbsp;&amp;lt;/TD&amp;gt;&amp;lt;/TD&amp;gt;$(NL)$(NB)$(NR)&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&lt;br /&gt;
      &amp;lt;/TABLE&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;!--/resbot--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--clone--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;Alias&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&amp;lt;!COPY NAME=&amp;quot;URL&amp;quot; CONTENT=&amp;quot;Alias&amp;quot;&amp;gt;&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
  &amp;lt;A HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;$(URL:40)&amp;lt;/A&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#008800&amp;quot;&amp;gt;&lt;br /&gt;
  - $(Content-Length) bytes&lt;br /&gt;
  - $(Last-Modified) &lt;br /&gt;
  &amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;!--/clone--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navleft_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;&amp;amp;lt;&amp;amp;lt; Vorherige&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navleft_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar1--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;$(NP)&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navbar0--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;$(NP)&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navbar0--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;A HREF=&amp;quot;$(NH)&amp;quot;&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--navright_nop--&amp;gt;&lt;br /&gt;
&amp;lt;TD&amp;gt;&amp;lt;small&amp;gt;&amp;lt;FONT COLOR=gray&amp;gt;N&amp;amp;auml;chste &amp;amp;gt;&amp;amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;!--/navright_nop--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--notfound--&amp;gt;&lt;br /&gt;
&amp;lt;!IFNOT NAME=&amp;quot;WS&amp;quot; CONTENT=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Meinten Sie &amp;lt;b&amp;gt;&amp;lt;a href=&amp;quot;?q=$%(WS)&amp;quot;&amp;gt;$(WS)&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;?&lt;br /&gt;
&amp;lt;!ENDIF&amp;gt;&lt;br /&gt;
&amp;lt;table bgcolor=#EEEEEE width=100%&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
      &amp;lt;small&amp;gt;Suchergebnisse: &amp;lt;b&amp;gt;$&amp;amp;(WE)&amp;lt;/b&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Sorry, Ihre Suche nach &amp;lt;b&amp;gt;$&amp;amp;(q)&amp;lt;/b&amp;gt; hat kein Ergebnis.&amp;lt;br&amp;gt;&lt;br /&gt;
Es wurden keine Dokumente gefunden, die &amp;lt;b&amp;gt;&amp;quot;$&amp;amp;(q)&amp;quot; enthalten&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Hinweise:&lt;br /&gt;
&amp;lt;UL&amp;gt;&lt;br /&gt;
  &amp;lt;LI&amp;gt; Stellen Sie sicher, dass Ihre W&amp;amp;ouml;rter richtig geschrieben sind.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie andere Suchworte.&lt;br /&gt;
  &amp;lt;LI&amp;gt; Versuchen Sie allgemeinere Suchw&amp;amp;ouml;rter. &lt;br /&gt;
&amp;lt;/UL&amp;gt;&lt;br /&gt;
&amp;lt;!--/notfound--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--noquery--&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;Bitte geben Sie eines oder mehrere W&amp;amp;ouml;rter ein und d&amp;amp;uuml;cken Sie Suche.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--/noquery--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--error--&amp;gt;&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&lt;br /&gt;
&amp;lt;FONT COLOR=&amp;quot;#FF0000&amp;quot;&amp;gt;Es ist ein Fehler aufgetreten!&amp;lt;/FONT&amp;gt;&lt;br /&gt;
&amp;lt;P&amp;gt;&amp;lt;B&amp;gt;$(E)&amp;lt;/B&amp;gt;&lt;br /&gt;
&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
&amp;lt;!--/error--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--bottom--&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;grey&amp;quot; summary=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!--/bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_top--&amp;gt;&lt;br /&gt;
&amp;lt;BASE HREF=&amp;quot;$(URL)&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Document ID:&amp;lt;/b&amp;gt; $(ID)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Last modified:&amp;lt;/b&amp;gt; $(Last-Modified)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Language:&amp;lt;/b&amp;gt; $(Content-Language)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Charset:&amp;lt;/b&amp;gt; $(Charset)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Size:&amp;lt;/b&amp;gt; $(Content-Length)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_top--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc--&amp;gt;&lt;br /&gt;
$^(document)&lt;br /&gt;
&amp;lt;!--/storedoc--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--storedoc_bottom--&amp;gt;&lt;br /&gt;
&amp;lt;!--/storedoc_bottom--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== suche.zhtml sucht search.cgi ====&lt;br /&gt;
&lt;br /&gt;
Das Suchformular hat keine &amp;quot;action&amp;quot; definiert, es wird per .htaccess an &#039;&#039;&#039;search.cgi&#039;&#039;&#039; als Template übergeben:&lt;br /&gt;
&lt;br /&gt;
Wenn noch nicht vorhanden, im gleichen Verzeichnis, in dem das Suchformulat liegt (in diesem Fall ~/doms/example.com/subs/www), eine Datei .htaccess erstellen und editieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# touch .htaccess&lt;br /&gt;
# edit .htaccess&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und da folgendes reinschreiben (vorausgesetzt, das Formular heißt suche.zhtml):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AddType text/html .zhtml&lt;br /&gt;
AddHandler zhtml .zhtml&lt;br /&gt;
Action zhtml /home/doms/example.com/cgi/search.cgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann das Suchformular im Browser angezeigt und verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;http://www.example.com/suche.zhtml&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt etliche weitere Möglichkeiten, search.cgi zu benutzen, sie stehen in der Dokumentation.&lt;br /&gt;
&lt;br /&gt;
=== Cronjob zum Update der Suchdatenbank in der Nacht ===&lt;br /&gt;
&lt;br /&gt;
Sollten sich die Webseiten öfter mal ändern, ist es sinnvoll, die Suchdatenbank nachts zu aktualisieren. Die Datei für die eigenen Cronjobs wird editiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und reingeschrieben wird das:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# suche mnogosearch indexer&lt;br /&gt;
19 23 * * *     nice indexer /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitte eine andere Uhrzeit wählen, damit nicht alle indexer-Jobs um 23:19 Uhr anlaufen!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Kompilieren der Mnogosearch aus den Sourcen ==&lt;br /&gt;
Diese Anleitung ist sehr auf die Zusammenarbeit mit dem CMS TYPO3 ausgerichtet. So sind zum Beispiel die Konfigurationseinstellungen zum kompilieren aus dem Manual der TYPO3 Extension [http://typo3.org/documentation/document-library/extension-manuals/mnogosearch/2.2.2/view/1/3/ mnogosearch] entnommen.&lt;br /&gt;
Im Grunde bin ich einfach den Anweisungen dort gefolgt, mußte aber wegen HS-spezifischen Gründen an manchen Stellen einen anderen Weg gehen.&lt;br /&gt;
&lt;br /&gt;
Ich habe Mnogosearch mit einem Domainuser kompiliert. Ich denke das das grundsätzlich auch mit einem Paketadmin funktioniert, aber eventuell zu unsicher ist.&lt;br /&gt;
&lt;br /&gt;
=== Runterladen und auspacken === &lt;br /&gt;
Zuerst wechseln wir ins Homeverzeichnis (~) des Users, laden uns den Quellcode runter und entpacken das Archiv.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
// stets die neueste Version benutzen&lt;br /&gt;
wget http://www.mnogosearch.org/Download/mnogosearch-3.3.9.tar.gz&lt;br /&gt;
tar xvf mnogosearch-3.3.9.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anpassen der Dateien ===&lt;br /&gt;
&lt;br /&gt;
Sollte man ausschließend eine MySQL Datenbank verwenden, muß vor dem kompilieren die Dateien ./configure.in und ./configure bearbeiten.&lt;br /&gt;
In beiden Dateien suchen wir nach dem String &#039;&#039;HAVE_PGSQL&#039;&#039; und ändern die &#039;&#039;1&#039;&#039; in eine &#039;&#039;0&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor configure.in&lt;br /&gt;
AC_DEFINE([HAVE_PGSQL], [1], [Define if you want to use PostgreSQL])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Hier gibt es zwei wichtige Änderungen gegenüber des Manuals.&lt;br /&gt;
* der Installationpfad muss angepasst werden, da wir keine Schreibrechte für /opt/ besitzen&lt;br /&gt;
* der Pfad zu der Datei mysql.h muss angegeben werden   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure --prefix=/path/to/user/home/opt/mnogosearch --with-mysql=/usr --disable-mp3 --disable-news --without-debug --with-pgsql=no --with-freetds=no --with-oracle8=no --with-oracle8i=no --with-iodbc=no --with-unixODBC=no --with-db2=no --with-solid=no --with-openlink=no --with-easysoft=no --with-sapdb=no --with-ibase=no --with-ctlib=no --with-zlib --disable-syslog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der Suchengine ===&lt;br /&gt;
Bevor es zum kompilieren kommen, müssen wir noch eine erzeugte Datei bearbeiten und ändern dort den String &lt;br /&gt;
&#039;&#039;/* #undef HAVE_PGSQL */&#039;&#039; in &#039;&#039;#undef HAVE_PGSQL&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor include/udm_autoconf.h&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kompilieren und installieren wir Mnogosearch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kompilieren und Installation der PHP Extension ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; &lt;br /&gt;
* der Pfad zur Suchengine muss angepasst werden (ist derselbe Pfad wie in dem --prefix Argument)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/mnogosearch-3.3.9/php&lt;br /&gt;
phpize&lt;br /&gt;
./configure --with-mnogosearch=/path/to/user/home/opt/mnogosearch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir die Datei &#039;&#039;php_mnogo.c&#039;&#039; editieren und den String &#039;&#039;#undef HAVE_PGSQL&#039;&#039; in eine neue Zeile unterhalb von &#039;&#039;#include &amp;quot;php.h&amp;quot;&#039;&#039; einfügen.&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir die Extension bauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die PHP Extension liegt jetzt in dem Ordner ~/mnogosearch-3.3.9/php/modules. Am Besten kopiert man sich die Extension in den CGI Ordner einer Domain oder ebenfalls nach ~/opt.&lt;br /&gt;
&lt;br /&gt;
Um die Extension nun nutzen zu können, editieren wir die eigene &#039;&#039;php-cgi-fcgi.ini&#039;&#039; und fügen am Ende &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extension=relativer/Pfad/vom/PHP-Extension/Verzeichnis/zu/mnogosearch.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Extension Dir erhält man so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php -i | grep extension_dir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von diesem Verzeichnis ausgehend hangelt man sich bis zu dem Verzeichnis, in das man eben die PHP Extension kopiert hat.&lt;br /&gt;
Das ist notwendig, da in PHP 5.2 keine multiplen Extension Dirs in der php.ini eingetragen werden können. Eigene Extensions können nur relativ referenziert werden.&lt;br /&gt;
&lt;br /&gt;
Das Ergbnis sollte man noch in einer mittels phpinfo überprüfen. Wenn alles funktioniert hat, sollte in der Übersicht &#039;&#039;mnogosearch&#039;&#039; auftauchen. Ist dies nicht der Fall empfielt es sich das Errorlog von PHP anzuschalten und zu schauen, was schief läuft. Oft liegt das einfach an dem falschen relativen Pfad zur Extension.&lt;br /&gt;
 &lt;br /&gt;
Den weiteren Installationablauf entnimmt man am Besten dem Manual zur TYPO3 Extension. &lt;br /&gt;
nach dem Installieren der Extension in TYPO3 muss man den Pfad zu der Suchengine von /opt/mnogosearch entsprechend anpassen. In unserem Fall wäre das &#039;&#039;/path/to/user/home/opt/mnogosearch&#039;&#039;   &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>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Hostsharing_Wiki:Wunschliste_Installationsanleitungen&amp;diff=5654</id>
		<title>Hostsharing Wiki:Wunschliste Installationsanleitungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Hostsharing_Wiki:Wunschliste_Installationsanleitungen&amp;diff=5654"/>
		<updated>2021-09-24T12:57:44Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Anleitung Drupal existiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite listet Software auf, für die im Dokumentations-Wiki noch keine Installationsanleitung existiert, aber von den Nutzern gewünscht wurde.&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|blau|Hinweis für Dokumentations-Autoren:|Wenn du mit der Arbeit an einer der Anleitungen beginnst, dann notiere dies am besten hier bei dem entsprechenden Eintrag, damit sich nicht unnötig zwei Autoren gleichzeitig die Arbeit machen.}}&lt;br /&gt;
&lt;br /&gt;
bei php Staus Anzeige des [[uploadprogress]] anzeigen siehe:&lt;br /&gt;
&lt;br /&gt;
http://pecl.php.net/package/uploadprogress&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=5653</id>
		<title>Kategorie:Installationsanleitungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:Installationsanleitungen&amp;diff=5653"/>
		<updated>2021-09-24T12:56:40Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Kategorie:HSDoku&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HSDoku-Links}}&lt;br /&gt;
Manche Software wird von vielen unserer Mitglieder verwendet. Deshalb werden hier Installationen dokumentiert, wie sie bei anderen Mitgliedern funktionieren, um die Sache zu erleichtern.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine [[Hostsharing_Wiki:Wunschliste Installationsanleitungen|Wunschliste]], in der du Software eintragen kannst, für die du dir eine Installationsanleitung wünscht.&lt;br /&gt;
&lt;br /&gt;
=== Freie und datenschutzfreundliche Software-Alternativen  ===&lt;br /&gt;
&lt;br /&gt;
Linksammlungen, die helfen, alternative Software zu finden:&lt;br /&gt;
&lt;br /&gt;
* https://switching.software/&lt;br /&gt;
* https://prism-break.org/de/&lt;br /&gt;
&lt;br /&gt;
=== Tools ===&lt;br /&gt;
Liste mit Tools, die von Hostsharing Mitgliedern veröffentlicht wurden.&lt;br /&gt;
&lt;br /&gt;
* http://hs.andreasloesch.de&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=PHP_FPM&amp;diff=5626</id>
		<title>PHP FPM</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=PHP_FPM&amp;diff=5626"/>
		<updated>2021-09-10T18:40:21Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Start und Monitoring des FPM-Prozess */ Monit verlinkt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PHP als eigener Prozess =&lt;br /&gt;
&lt;br /&gt;
Normalerweise starten PHP-Prozesse im Managed Webspace als FastCGi-Prozess unter Kontrolle des Apache Webserver. Der Apache übernimmt die Skalierung und startet bei Bedarf weitere Prozesse nach.&lt;br /&gt;
&lt;br /&gt;
Nutzer:innen eines Managed Server können alternativ PHP-FPM Nutzen. Sie starten einen FPM-Prozess unter der eigenen Kontrolle. Dieser Hauptprozess übernimmt die Skalierung und Kontrolliert den Lifecycle von PHP-Prozessen nach den wünschen der Webseitenbetreiber:in.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration von FPM ==&lt;br /&gt;
&lt;br /&gt;
Hier nur ein minimales Beispiel. Für die Optimierung sein auf die entsprechende Originaldokumentation verwiesen.&lt;br /&gt;
&lt;br /&gt;
    ~/php-fpm$ cat ~/php-fpm/php-fpm.conf&lt;br /&gt;
    &lt;br /&gt;
    [global]&lt;br /&gt;
    pid = /home/pacs/xyz00/users/username/php-fpm/php-fpm.pid&lt;br /&gt;
    error_log = /home/pacs/xyz00/users/username/php-fpm/php-fpm.log&lt;br /&gt;
    &lt;br /&gt;
    [www]&lt;br /&gt;
    listen = 127.0.0.1:30080&lt;br /&gt;
    listen.allowed_clients = 127.0.0.1&lt;br /&gt;
    pm = dynamic&lt;br /&gt;
    pm.max_children = 5&lt;br /&gt;
    pm.start_servers = 2&lt;br /&gt;
    pm.min_spare_servers = 1&lt;br /&gt;
    pm.max_spare_servers = 3&lt;br /&gt;
    ;pm.process_idle_timeout = 10s;&lt;br /&gt;
    ;pm.max_requests = 500&lt;br /&gt;
&lt;br /&gt;
== Apache Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Der FPM-Server wird über das Apache Modul &amp;quot;mod_proxy_fcgi&amp;quot; angesteuert. Dazu legt man im Verzeichnis &lt;br /&gt;
~/doms/hs-example.de/ eine Datei .htaccess an.&lt;br /&gt;
&lt;br /&gt;
    $ cat doms/hs-example.de/.htaccess&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteRule ^(.*)\.php(/.*)? fcgi://127.0.0.1:30080/home/pacs/xyz00/users/username/doms/hs-example.de/htdocs-ssl/ [proxy,last]&lt;br /&gt;
&lt;br /&gt;
== Start und Monitoring des FPM-Prozess ==&lt;br /&gt;
&lt;br /&gt;
Der Prozess kann direkt oder indirekt über einen Eintrag &amp;quot;@reboot&amp;quot; in der Crontab des Website-User gestartet werden. Für das Monitoring bieten sich [[Monit_installieren|Monit]] oder &amp;quot;supervisord&amp;quot; an.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=PHP_FPM&amp;diff=5624</id>
		<title>PHP FPM</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=PHP_FPM&amp;diff=5624"/>
		<updated>2021-09-10T12:14:18Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* PHP als eigener Prozess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PHP als eigener Prozess =&lt;br /&gt;
&lt;br /&gt;
Normalerweise starten PHP-Prozesse im Managed Webspace als FastCGi-Prozess unter Kontrolle des Apache Webserver. Der Apache übernimmt die Skalierung und startet bei Bedarf weitere Prozesse nach.&lt;br /&gt;
&lt;br /&gt;
Nutzer:innen eines Managed Server können alternativ PHP-FPM Nutzen. Sie starten einen FPM-Prozess unter der eigenen Kontrolle. Dieser Hauptprozess übernimmt die Skalierung und Kontrolliert den Lifecycle von PHP-Prozessen nach den wünschen der Webseitenbetreiber:in.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration von FPM ==&lt;br /&gt;
&lt;br /&gt;
Hier nur ein minimales Beispiel. Für die Optimierung sein auf die entsprechende Originaldokumentation verwiesen.&lt;br /&gt;
&lt;br /&gt;
    ~/php-fpm$ cat ~/php-fpm/php-fpm.conf&lt;br /&gt;
    &lt;br /&gt;
    [global]&lt;br /&gt;
    pid = /home/pacs/xyz00/users/username/php-fpm/php-fpm.pid&lt;br /&gt;
    error_log = /home/pacs/xyz00/users/username/php-fpm/php-fpm.log&lt;br /&gt;
    &lt;br /&gt;
    [www]&lt;br /&gt;
    listen = 127.0.0.1:&amp;lt;30080&amp;gt;&lt;br /&gt;
    listen.allowed_clients = 127.0.0.1&lt;br /&gt;
    pm = dynamic&lt;br /&gt;
    pm.max_children = 5&lt;br /&gt;
    pm.start_servers = 2&lt;br /&gt;
    pm.min_spare_servers = 1&lt;br /&gt;
    pm.max_spare_servers = 3&lt;br /&gt;
    ;pm.process_idle_timeout = 10s;&lt;br /&gt;
    ;pm.max_requests = 500&lt;br /&gt;
&lt;br /&gt;
== Apache Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Der FPM-Server wird über das Apache Modul &amp;quot;mod_proxy_fcgi&amp;quot; angesteuert. Dazu legt man im Verzeichnis &lt;br /&gt;
~/doms/hs-example.de/ eine Datei .htaccess an.&lt;br /&gt;
&lt;br /&gt;
    $ cat doms/hs-example.de/.htaccess&lt;br /&gt;
    RewriteEngine on&lt;br /&gt;
    RewriteRule ^(.*)\.php(/.*)? fcgi://127.0.0.1:30080/home/pacs/xyz00/users/username/doms/hs-example.de/htdocs-ssl/ [proxy,last]&lt;br /&gt;
&lt;br /&gt;
== Start und Monitoring des FPM-Prozess ==&lt;br /&gt;
&lt;br /&gt;
Der Prozess kann direkt oder indirekt über einen Eintrag &amp;quot;@reboot&amp;quot; in der Crontab des Website-User gestartet werden. Für das Monitoring bieten sich &amp;quot;monit&amp;quot; oder &amp;quot;supervisord&amp;quot; an.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=5596</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=DKIM&amp;diff=5596"/>
		<updated>2021-08-21T09:41:04Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Kategorisiert&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;
{{Textkasten|gelb|Beta|Das Feature ist bei Hostsharing im Beta Test, bitte noch nicht für den produktiven Einsatz nutzen.}}&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Hostsharing ==&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 Einrichtungsschritte 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;
Zur Veröffentlichung des Domainkey muss das Zonefile der E-Mail-Domain erweitert werden. Dazu muss in einem individuell angepassten Zonefile die Zeile&lt;br /&gt;
&lt;br /&gt;
  {DKIM_RR}&lt;br /&gt;
&lt;br /&gt;
ergänzt werden. &lt;br /&gt;
&lt;br /&gt;
Diese Zeile ist in der Beta-Phase nicht Bestandteil des Default-Zonefile! Domain-Inhaber, die ihr Zonefile bisher nicht angepasst haben, müssen also ein minimales Zonefile der Form&lt;br /&gt;
&lt;br /&gt;
  {DEFAULT_ZONEFILE}&lt;br /&gt;
  {DKIM_RR}&lt;br /&gt;
&lt;br /&gt;
erstellen.&lt;br /&gt;
&lt;br /&gt;
Nach einer erfolgreichen Veröffentlichung des Domainkey liefert der Befehl&lt;br /&gt;
&lt;br /&gt;
  $ dig -t TXT +short default._domainkey.hs-example.de&lt;br /&gt;
&lt;br /&gt;
(&amp;quot;hs-example.de&amp;quot; durch die eigene Domain ersetzen) einen Schlüssel in der Form:&lt;br /&gt;
&lt;br /&gt;
  v=DKIM1; h=sha256; k=rsa; s=email; &amp;quot; &amp;quot;p=MIIBIjAN [...]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Domainoption DKIM setzen ==&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;. &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;
== Beta Test ==&lt;br /&gt;
&lt;br /&gt;
Mitglieder, die ihr Zonefile anpassen können, sind herzlich eingeladen am Test teilzunehmen. Das Wiederentfernen der DKIM-Option kann jedoch zu Schwierigkeiten bei der Zustellung ausgehender Mails führen. Das Abstellen 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;
Voraussichtlich ab 1. September 2021 werden wir den DNS-Record mit dem DKIM-Schlüssel per Voreinstellung in den Zonefile-Teil &amp;quot;{DEFAULT_ZONEFILE}&amp;quot; aufnehmen. Mitglieder, die keine Anpassungen am Zonefile vorgenommen haben oder die Variable &amp;quot;{DEFAULT_ZONEFILE}&amp;quot; im Zonefile inkludieren können ab diesem Zeitpunkt die Option setzen.&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://doc.hostsharing.net/referenz/zonefile/ Hostsharing-Dokumentation zur Anpassung des Zonefile]&lt;br /&gt;
* [https://doc.hostsharing.net/referenz/domain/domain-optionen.html Hostsharing-Dokumentation Domain-Optionen]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5591</id>
		<title>HDD Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5591"/>
		<updated>2021-08-17T09:41:53Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hostsharing bietet ab 1. September 2021 Festplattenspeicher auf klassischen, magnetischen HDD für größere Datenvolumina an. Der zusätzliche Speicher steht im Managed Hosting als zweite Partition unter dem Mountpoint&lt;br /&gt;
&lt;br /&gt;
    /home/storage&lt;br /&gt;
&lt;br /&gt;
zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Wenn für ein Paket (Beispiel &#039;&#039;xyz00&#039;&#039;) eine Storage-Quota gebucht ist, wird &lt;br /&gt;
unter diesem Mountpoint ein Verzeichnis &#039;&#039;/home/storage/xyz00&#039;&#039; angelegt. Darin werden auch Unterverzeichnisse für jeden User im Webspace &#039;&#039;xyz00&#039;&#039; angelegt, zum Beispiel&lt;br /&gt;
&#039;&#039;/home/storage/xyz00/users/brunobeispiel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In diesen Verzeichnissen hat der jeweilige User die Berechtigung Dateien anzulegen, zu lesen und zu löschen. Weiterhin kann der Systemuser &#039;&#039;httpd&#039;&#039; auf die Dateien lesend zugreifen, so dass sich einzelne Verzeichnisse in das htdocs-Verzeichnis von Domains verlinken lassen. Auf diesem Weg können größere Dateien zum Download angeboten werden.&lt;br /&gt;
&lt;br /&gt;
Nutzerinnen und Nutzer, die selbständig die Zugriffrechte im Unix-Dateisystem sinnvoll und sicher vergeben können, dürfen unter &#039;&#039;/home/storage/xyz00&#039;&#039; gern eigene Verzeichnisstrukturen organiseren. Der Paketadmin &#039;&#039;xyz00&#039;&#039; hat die notwendigen Rechte dazu.&lt;br /&gt;
&lt;br /&gt;
== Dateizugriffsrechte ==&lt;br /&gt;
&lt;br /&gt;
Die Rechteschleuse für den User &#039;&#039;httpd&#039;&#039; ist wie folgt realisiert:&lt;br /&gt;
&lt;br /&gt;
   drwxr-x--x   3 xyz00               httpd   19 Aug 13 14:47 /home/storage/xyz00/&lt;br /&gt;
   drwxr-xr-x  10 xyz00               xyz00  106 Aug 13 14:47 /home/storage/xyz00/users&lt;br /&gt;
   drwxr-x---   2 xyz00-brunobeispiel httpd    6 Aug 13 14:47 /home/storage/xyz00/users/brunobeispiel&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Storage]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5590</id>
		<title>HDD Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5590"/>
		<updated>2021-08-17T09:41:26Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Doppelten Titel weg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Storage]]&lt;br /&gt;
&lt;br /&gt;
Hostsharing bietet ab 1. September 2021 Festplattenspeicher auf klassischen, magnetischen HDD für größere Datenvolumina an. Der zusätzliche Speicher steht im Managed Hosting als zweite Partition unter dem Mountpoint&lt;br /&gt;
&lt;br /&gt;
    /home/storage&lt;br /&gt;
&lt;br /&gt;
zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Wenn für ein Paket (Beispiel &#039;&#039;xyz00&#039;&#039;) eine Storage-Quota gebucht ist, wird &lt;br /&gt;
unter diesem Mountpoint ein Verzeichnis &#039;&#039;/home/storage/xyz00&#039;&#039; angelegt. Darin werden auch Unterverzeichnisse für jeden User im Webspace &#039;&#039;xyz00&#039;&#039; angelegt, zum Beispiel&lt;br /&gt;
&#039;&#039;/home/storage/xyz00/users/brunobeispiel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In diesen Verzeichnissen hat der jeweilige User die Berechtigung Dateien anzulegen, zu lesen und zu löschen. Weiterhin kann der Systemuser &#039;&#039;httpd&#039;&#039; auf die Dateien lesend zugreifen, so dass sich einzelne Verzeichnisse in das htdocs-Verzeichnis von Domains verlinken lassen. Auf diesem Weg können größere Dateien zum Download angeboten werden.&lt;br /&gt;
&lt;br /&gt;
Nutzerinnen und Nutzer, die selbständig die Zugriffrechte im Unix-Dateisystem sinnvoll und sicher vergeben können, dürfen unter &#039;&#039;/home/storage/xyz00&#039;&#039; gern eigene Verzeichnisstrukturen organiseren. Der Paketadmin &#039;&#039;xyz00&#039;&#039; hat die notwendigen Rechte dazu.&lt;br /&gt;
&lt;br /&gt;
== Dateizugriffsrechte ==&lt;br /&gt;
&lt;br /&gt;
Die Rechteschleuse für den User &#039;&#039;httpd&#039;&#039; ist wie folgt realisiert:&lt;br /&gt;
&lt;br /&gt;
   drwxr-x--x   3 xyz00               httpd   19 Aug 13 14:47 /home/storage/xyz00/&lt;br /&gt;
   drwxr-xr-x  10 xyz00               xyz00  106 Aug 13 14:47 /home/storage/xyz00/users&lt;br /&gt;
   drwxr-x---   2 xyz00-brunobeispiel httpd    6 Aug 13 14:47 /home/storage/xyz00/users/brunobeispiel&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Kategorie:Storage&amp;diff=5589</id>
		<title>Kategorie:Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Kategorie:Storage&amp;diff=5589"/>
		<updated>2021-08-17T09:40:42Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Die Seite wurde neu angelegt: „Alle Seiten zum Thema &amp;#039;Storage&amp;#039;“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alle Seiten zum Thema &#039;Storage&#039;&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5588</id>
		<title>HDD Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=HDD_Storage&amp;diff=5588"/>
		<updated>2021-08-17T09:40:08Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Kategorien&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Storage]]&lt;br /&gt;
&lt;br /&gt;
= HDD Storage =&lt;br /&gt;
&lt;br /&gt;
Hostsharing bietet ab 1. September 2021 Festplattenspeicher auf klassischen, magnetischen HDD für größere Datenvolumina an. Der zusätzliche Speicher steht im Managed Hosting als zweite Partition unter dem Mountpoint&lt;br /&gt;
&lt;br /&gt;
    /home/storage&lt;br /&gt;
&lt;br /&gt;
zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Wenn für ein Paket (Beispiel &#039;&#039;xyz00&#039;&#039;) eine Storage-Quota gebucht ist, wird &lt;br /&gt;
unter diesem Mountpoint ein Verzeichnis &#039;&#039;/home/storage/xyz00&#039;&#039; angelegt. Darin werden auch Unterverzeichnisse für jeden User im Webspace &#039;&#039;xyz00&#039;&#039; angelegt, zum Beispiel&lt;br /&gt;
&#039;&#039;/home/storage/xyz00/users/brunobeispiel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In diesen Verzeichnissen hat der jeweilige User die Berechtigung Dateien anzulegen, zu lesen und zu löschen. Weiterhin kann der Systemuser &#039;&#039;httpd&#039;&#039; auf die Dateien lesend zugreifen, so dass sich einzelne Verzeichnisse in das htdocs-Verzeichnis von Domains verlinken lassen. Auf diesem Weg können größere Dateien zum Download angeboten werden.&lt;br /&gt;
&lt;br /&gt;
Nutzerinnen und Nutzer, die selbständig die Zugriffrechte im Unix-Dateisystem sinnvoll und sicher vergeben können, dürfen unter &#039;&#039;/home/storage/xyz00&#039;&#039; gern eigene Verzeichnisstrukturen organiseren. Der Paketadmin &#039;&#039;xyz00&#039;&#039; hat die notwendigen Rechte dazu.&lt;br /&gt;
&lt;br /&gt;
== Dateizugriffsrechte ==&lt;br /&gt;
&lt;br /&gt;
Die Rechteschleuse für den User &#039;&#039;httpd&#039;&#039; ist wie folgt realisiert:&lt;br /&gt;
&lt;br /&gt;
   drwxr-x--x   3 xyz00               httpd   19 Aug 13 14:47 /home/storage/xyz00/&lt;br /&gt;
   drwxr-xr-x  10 xyz00               xyz00  106 Aug 13 14:47 /home/storage/xyz00/users&lt;br /&gt;
   drwxr-x---   2 xyz00-brunobeispiel httpd    6 Aug 13 14:47 /home/storage/xyz00/users/brunobeispiel&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5555</id>
		<title>Mailman Installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5555"/>
		<updated>2021-07-07T06:37:22Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Mailman gegen Subscription Spam härten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorab: Die Wahl von Mailman 2 ==&lt;br /&gt;
&lt;br /&gt;
Mailman 2 hängt von Python 2.7 ab und wird damit voraussichtlich nur noch eine begrenzte Nutzungsdauer haben. Mailman 3 ist jetzt verfügbar (siehe [[Mailman_3_installieren]]), aber deutlich schwerer und komplexer im Betrieb. Es gibt auch weniger leistungsfähige Software, um E-Mail-Verteiler zu betreiben, wie beispielsweise [[mlmmj]]. Für eine Diskussion der Situation im Oktober 2019, siehe das HS-Support-Archiv ab [https://lists.hostsharing.net/archiv/support/2019-October/067243.html hier.]&lt;br /&gt;
&lt;br /&gt;
== Mailman 2 installieren == &lt;br /&gt;
&lt;br /&gt;
(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)&lt;br /&gt;
&lt;br /&gt;
Vielen Dank an alle Benutzer, die Verbesserungen beisteuern!&lt;br /&gt;
&lt;br /&gt;
=== Unter welchem Account installieren? ===&lt;br /&gt;
&lt;br /&gt;
Mailman kann vom Paketadmin (beipsielsweise &amp;quot;xyz00&amp;quot;) oder von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert werden. Letzteres ist dringend empfohlen, denn wenn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.&lt;br /&gt;
&lt;br /&gt;
Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.&lt;br /&gt;
&lt;br /&gt;
Vorteil der Installation als Paketuser ist, dass nur dieser direkten Zugriff auf die Mailmandaten hat und mailman ohne Paketadminrechte läuft. Während der Emailauslieferung gelten (wie immer bei der Mailweiterleitung durch .forward-Dateien oder durch procmail) die Rechte des Paketusers, dem die Mailman-Installation gehört.&lt;br /&gt;
&lt;br /&gt;
Nachteil der Installation als Paketuser ist lediglich, dass die Paketdomain mit dem SSL Zertifikat von Hostsharing nicht genutzt werden kann.&amp;lt;!-- Aktualisieren? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einen User und eine Domain anlegen ===&lt;br /&gt;
&lt;br /&gt;
Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit &amp;quot;Domain-User&amp;quot; xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.&lt;br /&gt;
&lt;br /&gt;
Mit [[Login_mit_SSH|SSH]] an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; löschen:&lt;br /&gt;
&lt;br /&gt;
 ~$ echo &amp;quot;&amp;quot; &amp;gt; ~/doms/listen.example.com/htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
Die Default-Subdomains www.* löschen:&lt;br /&gt;
&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs/www/&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs-ssl/www/&lt;br /&gt;
&lt;br /&gt;
=== Sourcen besorgen und entpacken ===&lt;br /&gt;
&lt;br /&gt;
Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den 2er-Versionen von Mailman (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...&lt;br /&gt;
&lt;br /&gt;
 ~$ wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
... und entpacken:&lt;br /&gt;
&lt;br /&gt;
 ~$ tar -xzvf mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
Ab diesem Augenblick gibt es ein Verzeichnis namens &amp;lt;tt&amp;gt;mailman-2.1.29/&amp;lt;/tt&amp;gt;. Darin liegt die nunmehr entpackte &#039;&#039;Quellcode&#039;&#039; der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis &amp;lt;tt&amp;gt;mailman/&amp;lt;/tt&amp;gt; liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als &amp;quot;prefix&amp;quot; angegeben.)&lt;br /&gt;
&lt;br /&gt;
=== var-Verzeichnis für Log-Dateien anlegen ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir -p mailman/var&lt;br /&gt;
 ~$ chmod 02775 mailman/var&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir var/mailman&lt;br /&gt;
 ~$ chmod 02775 var/mailman&lt;br /&gt;
&lt;br /&gt;
=== Mailman konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
In das Source-Verzeichnis wechseln:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd mailman-2.1.29&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketuser (xyz00-listen):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \&lt;br /&gt;
              --with-username=xyz00-listen \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=xyz00&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketadmin (xyz00):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \&lt;br /&gt;
              --with-username=xyz00 \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/var/mailman \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=nogroup&lt;br /&gt;
&lt;br /&gt;
(Die Rückwärtsschrägstriche &amp;quot;\&amp;quot; am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)&lt;br /&gt;
&lt;br /&gt;
=== Mailman kompilieren ===&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ make&lt;br /&gt;
 ~/mailman-2.1.29$ make install&lt;br /&gt;
&lt;br /&gt;
=== Datenrechte prüfen ===&lt;br /&gt;
&lt;br /&gt;
Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ cd ..      &lt;br /&gt;
 ~$ mailman/bin/check_perms -f&lt;br /&gt;
&lt;br /&gt;
== Die neue Mailman-Installation konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdatei &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; editieren ===&lt;br /&gt;
&lt;br /&gt;
 ~$ nano mailman/Mailman/mm_cfg.py&lt;br /&gt;
      &lt;br /&gt;
Eine Beispielkonfiguration für listen.example.com könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
 [...]&lt;br /&gt;
      ##################################################&lt;br /&gt;
      # Put YOUR site-specific settings below this line.&lt;br /&gt;
      # -*- python -*-&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_HOST_NAME = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_URL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)&lt;br /&gt;
      add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_SERVER_LANGUAGE = &#039;de&#039;&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_URL_PATTERN = &#039;http://%s/&#039;&lt;br /&gt;
  &lt;br /&gt;
      # Es wird der HS Mailversand für Bulkmail verwendet:&lt;br /&gt;
      SMTPHOST = &#039;localhost&#039;&lt;br /&gt;
      SMTPPORT = 4587 &lt;br /&gt;
      SMTP_AUTH = True&lt;br /&gt;
      SMTP_USER = &#039;xyz00-listen&#039;&lt;br /&gt;
      SMTP_PASSWD = &#039;das-passwort-des-o.-g.-users&#039;&lt;br /&gt;
      SMTP_USE_TLS = True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;tt&amp;gt;~/mailman/Mailman/Defaults.py&amp;lt;/tt&amp;gt; sieht man, was in mm_cfg.py alles angepasst werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Mailman gegen Subscription Spam härten ====&lt;br /&gt;
&lt;br /&gt;
Mailman wird gelegentlich von böswilligen Crackern benutzt, die damit sogenannten Subscription Spam erzeugen. Dabei wird eine Mailadresse von Bots an Mailman zur Eintragung übergeben. Diese Mailadresse wird daraufhin brav von Mailman angeschrieben. Wenn das tausende von Mailmans auf der ganzen Welt zugleich machen, wird die Mailadresse zugespammt. Hier ist die Abhilfe:&lt;br /&gt;
&lt;br /&gt;
Die Idee kommt von https://www.ralfj.de/blog/2018/06/02/mailman-subscription-spam.html&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile ein zufälliges Secret-String erstellen:&lt;br /&gt;
 openssl rand -base64 18&lt;br /&gt;
&lt;br /&gt;
Und dann in die Konfigurationsdatei den erzeugten String einfügen:&lt;br /&gt;
&lt;br /&gt;
 SUBSCRIBE_FORM_SECRET = &#039;&amp;lt;Secret-String&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
=== CGI-Programme in die Domain kopieren ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
&lt;br /&gt;
Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.&lt;br /&gt;
&lt;br /&gt;
 ~$ mkdir ~/doms/listen.example.com/cgi-ssl/mailman&lt;br /&gt;
 ~$ cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ chmod g-s ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00): &lt;br /&gt;
&lt;br /&gt;
Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt: &lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/cgi-ssl&lt;br /&gt;
 ~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman&lt;br /&gt;
&lt;br /&gt;
===  Mailman-Icons in die Domains kopieren ===&lt;br /&gt;
&lt;br /&gt;
Die Icons können wahlweise verlinkt oder kopiert werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/htdocs-ssl&lt;br /&gt;
 ~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 ~$ cp -R mailman/icons doms/listen.example.com/htdocs-ssl/&lt;br /&gt;
&lt;br /&gt;
=== Die Datei .htaccess bearbeiten ===&lt;br /&gt;
&lt;br /&gt;
Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, sondern auch unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;  erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Dazu werden in &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; folgende Rewrite-Anweisungen eintragen.&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule	^(.*)$			/cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule	^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
Beachte dabei die zweite Zeile: Anfragen für Icons sollen &#039;&#039;nicht&#039;&#039; umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; statt &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; erreichbar sein soll, hilft folgendes in der &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/example.com/subs-ssl/www/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule    ^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
(In diesem Fall kann die Zeile &amp;lt;tt&amp;gt;DEFAULT_URL_PATTERN...&amp;lt;/tt&amp;gt; in der &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; auskommentiert werden.)&lt;br /&gt;
&lt;br /&gt;
=== Hauptpasswort setzen ===&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;site password&amp;quot; ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das &amp;quot;site password&amp;quot; einrichten mit dem Befehl: &lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/mmsitepass&lt;br /&gt;
&lt;br /&gt;
=== Cronjobs einrichten ===&lt;br /&gt;
&lt;br /&gt;
In die [[Cron |Crontab]] werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:&lt;br /&gt;
&lt;br /&gt;
 # Warteschlange jede Minute bearbeiten:&lt;br /&gt;
 * * * * *	~/mailman/bin/qrunner -o -r All&lt;br /&gt;
 # Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:&lt;br /&gt;
 47 * * * *	rm -f ~/var/mailman/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.&lt;br /&gt;
&lt;br /&gt;
Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:&lt;br /&gt;
&lt;br /&gt;
 47 * * * * rm -f ~/mailman/var/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
... entsprechend dem beim Konfigurieren angegebenen &amp;lt;tt&amp;gt;var&amp;lt;/tt&amp;gt;-Verzeichnis, siehe oben.&lt;br /&gt;
&lt;br /&gt;
Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus &amp;lt;tt&amp;gt;~/mailman/cron/crontab.in&amp;lt;/tt&amp;gt; dem crontab des Users angehängt werden:&lt;br /&gt;
&lt;br /&gt;
 crontab -l &amp;gt; mycronjobs.tmp&lt;br /&gt;
 cat ~/mailman/cron/crontab.in &amp;gt;&amp;gt; mycronjobs.tmp&lt;br /&gt;
 crontab mycronjobs.tmp&lt;br /&gt;
&lt;br /&gt;
== Mailinglisten einrichten ==&lt;br /&gt;
&lt;br /&gt;
Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster &#039;&#039;&#039;muß&#039;&#039;&#039; ein Hauptverteiler (&amp;quot;site list&amp;quot;) eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen &amp;quot;mailman&amp;quot;. Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung &lt;br /&gt;
&lt;br /&gt;
 MAILMAN_SITE_LIST = &#039;sitelistname&#039;&lt;br /&gt;
&lt;br /&gt;
in der Konfigurationsdatei &amp;lt;tt&amp;gt;mailman/Mailman/mm_cfg.py&amp;lt;/tt&amp;gt; eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
=== Den Hauptverteiler &amp;quot;mailman&amp;quot; anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;site list&amp;quot; mit dem Namen &amp;quot;mailman&amp;quot; ist die Mailingliste der lokalen Mailman-Administratoren. Sie wird zur einwandfreien Funktion von Mailman benötigt.&lt;br /&gt;
&lt;br /&gt;
Mit dem Mailman-Befehl newlist den Verteiler anlegen:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist mailman&lt;br /&gt;
 Enter the email of the person running the list: admin@xyz00.hostsharing.net&lt;br /&gt;
 Initial mailman password:&lt;br /&gt;
&lt;br /&gt;
(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)&lt;br /&gt;
&lt;br /&gt;
Nur dieses eine Mal für die &amp;quot;site list&amp;quot; müssen wir die Konfigurationsvorgaben laden. (Gewöhnliche Mailinglisten werden später über die Weboberfläche konfiguriert.)&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketadmin (&amp;quot;xyz00&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Diese Konfigurationsdatei soll &#039;&#039;&#039;nicht&#039;&#039;&#039; auf gewöhnliche Mailinglisten anwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Adressen bei Mailman einrichten ===&lt;br /&gt;
&lt;br /&gt;
Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine E-Mail an den dabei eingetragenen Listenadministrator. Diese E-Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle E-Mails an Mailman werden an erweiterte &#039;&#039;E-Mail-Adressen&#039;&#039; des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form &amp;lt;tt&amp;gt;xyz00-listen&#039;&#039;&#039;+&#039;&#039;&#039;&amp;lt;liste&amp;gt;[_funktion]&amp;lt;/tt&amp;gt;. E-Mails an diese Adressen werden dann durch Pipe-Anweisungen in &#039;&#039;.forward-Dateien&#039;&#039; im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben. &lt;br /&gt;
&lt;br /&gt;
Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, werden  &#039;&#039;E-Mail-Adressen&#039;&#039; durch [https://doc.hostsharing.net/users/administration/hsadmin/index.html hsadmin (bzw. das Befehlszeilentool hsscript)] eingerichtet; die &#039;&#039;.forward-Dateien&#039;&#039; werden durch [[Login_mit_SSH|Shell-Befehle]] angelegt.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt.)&lt;br /&gt;
&lt;br /&gt;
   hsscript -u xyz00 -i&lt;br /&gt;
   [hsscript verlangt die Eingabe des Passworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman&#039;,target:&#039;xyz00-listen+mailman&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-admin&#039;,target:&#039;xyz00-listen+mailman-admin&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-bounces&#039;,target:&#039;xyz00-listen+mailman-bounces&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-confirm&#039;,target:&#039;xyz00-listen+mailman-confirm&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-join&#039;,target:&#039;xyz00-listen+mailman-join&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-leave&#039;,target:&#039;xyz00-listen+mailman-leave&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-owner&#039;,target:&#039;xyz00-listen+mailman-owner&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-request&#039;,target:&#039;xyz00-listen+mailman-request&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-subscribe&#039;,target:&#039;xyz00-listen+mailman-subscribe&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-unsubscribe&#039;,target:&#039;xyz00-listen+mailman-unsubscribe&#039;}})&lt;br /&gt;
&lt;br /&gt;
Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.&lt;br /&gt;
&lt;br /&gt;
Für jede der soeben eingerichteten Adressen wird nun eine &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge &amp;lt;tt&amp;gt;.forward+&amp;lt;/tt&amp;gt; gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel wird die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei .forward+mailman-subscribe verwendet, wenn eine E-Mail an die Adresse &amp;lt;tt&amp;gt;mailman-subscribe@listen.example.com&amp;lt;/tt&amp;gt; eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel &amp;lt;tt&amp;gt;xyz00-listen+mailman-subscribe&amp;lt;/tt&amp;gt; wertet der Mail-Transfer-Agent die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei &amp;lt;tt&amp;gt;.forward+mailman-subscribe&amp;lt;/tt&amp;gt; im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten &amp;quot;subscribe mailman&amp;quot; übergeben.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt, jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)&lt;br /&gt;
&lt;br /&gt;
 echo &#039;admin@xyz00.hostsharing.net&#039; &amp;gt; .forward # Weiterleitung von cron Fehlern etc an Paketadmin.&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman&amp;quot;&#039; &amp;gt; .forward+mailman&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman&amp;quot;&#039; &amp;gt; .forward+mailman-admin&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman&amp;quot;&#039; &amp;gt; .forward+mailman-bounces&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman&amp;quot;&#039; &amp;gt; .forward+mailman-confirm&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman&amp;quot;&#039; &amp;gt; .forward+mailman-join&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman&amp;quot;&#039; &amp;gt; .forward+mailman-leave&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman&amp;quot;&#039; &amp;gt; .forward+mailman-owner&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman&amp;quot;&#039; &amp;gt; .forward+mailman-request&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-subscribe&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-unsubscribe&lt;br /&gt;
&lt;br /&gt;
Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens &amp;lt;tt&amp;gt;~/bin/addforwards&amp;lt;/tt&amp;gt; mit folgendem Inhalt zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # .forward-Dateien für einen Verteiler unter Mailman einrichten.&lt;br /&gt;
 #&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;$2&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;`pwd`&amp;quot; != &amp;quot;`echo ~`&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Diesen Befehl vom Home-Verzeichnis aus aufrufen.\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-admin&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-bounces&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-confirm&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-join&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-leave&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-owner&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-request&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-subscribe&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-unsubscribe&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Der Skript muß natürlich als ausführbar gekennzeichnet werden:&lt;br /&gt;
&lt;br /&gt;
  ~$ chmod u+x bin/addforwards&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung dieses Skripts um die &amp;lt;tt&amp;gt;hsscript&amp;lt;/tt&amp;gt;-Befehle wird dem geneigten Leser als Aufgabe überlassen.&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
&lt;br /&gt;
Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste &amp;quot;mailman&amp;quot; selbst abonnieren. Die Liste &amp;quot;mailman&amp;quot; kann aber unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; verwaltet werden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei &amp;lt;tt&amp;gt;.htaccess&amp;lt;/tt&amp;gt;) &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer &amp;quot;mailman&amp;quot;) und einen Link, um neue Mailinglisten anzulegen (&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/create&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist &amp;lt;Listenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien wie bei dem Einrichten der Liste &amp;quot;mailman&amp;quot; nach Verfahren im obigen Abschnitt angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die [https://wiki.list.org/ Mailman-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Feintuning == &lt;br /&gt;
&lt;br /&gt;
Wer will, kann auch noch etwas Platz sparen. Die normale Mailmaninstallation schlägt mit über 20 MB zu Buche...&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Tips kann man das auf ca. 6 MB reduzieren :)&lt;br /&gt;
&lt;br /&gt;
Es kann natürlich sein, dass ich zuviel lösche, aber bei mir funktioniert&#039;s. Wenn ihr also sicher(er) sein wollt, dass euch der Mailman nicht um die Ohren fliegt, macht das nicht!&lt;br /&gt;
&lt;br /&gt;
*  ~/mailman/cgi-bin und ~/mailman/icons können gelöscht werden, falls sie an andere Stelle kopiert worden sind.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/messages löschen.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/templates löschen (bis auf englisch).&lt;br /&gt;
* ~/mailman/tests kann, soweit ich das sehe, komplett gelöscht werden.&lt;br /&gt;
* Falls man koreanisch und japanisch nicht braucht, kann man folgendes machen:&lt;br /&gt;
* in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:&lt;br /&gt;
&lt;br /&gt;
 # In a normal interactive Python environment, the japanese.pth and korean.pth&lt;br /&gt;
 # files would be imported automatically.  But because we inhibit the importing&lt;br /&gt;
 # of the site module, we need to be explicit about importing these codecs.&lt;br /&gt;
 if not jaok:&lt;br /&gt;
     import japanese&lt;br /&gt;
 # As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean&lt;br /&gt;
 # codecs installed, however leave the first import in there in case an upgrade&lt;br /&gt;
 # changes this.&lt;br /&gt;
 if not kook:&lt;br /&gt;
     import korean&lt;br /&gt;
     import korean.aliases&lt;br /&gt;
&lt;br /&gt;
auskommentieren.&lt;br /&gt;
&lt;br /&gt;
Dann kann man ~/mailman/pythonlib/japanese, ~/mailman/pythonlib/korean, ~/mailman/pythonlib/korean.pth sowie ~/mailman/pythonlib/lib löschen.&lt;br /&gt;
   &lt;br /&gt;
Man kann auch noch die Debug-Informationen aus den binaries strippen:&lt;br /&gt;
&lt;br /&gt;
 strip ~/mailman/mail/mailman&lt;br /&gt;
 strip ~/mailman/cgi-bin/*&lt;br /&gt;
&lt;br /&gt;
Falls die CGIs nicht gesymlinkt wurden:&lt;br /&gt;
&lt;br /&gt;
 strip ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
== Multidomainfähigkeit ==&lt;br /&gt;
&lt;br /&gt;
Seit Mailman 2.x kann eine Mailman-Installation unter gewissen Einschränkungen für mehrere Domains verwendet werden. Hier soll kurz gezeigt werden, was geht und wie es geht.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung ===&lt;br /&gt;
&lt;br /&gt;
Logischerweise muss das Webfrontend (die CGIs) auf allen Domains installiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist listenname@listen.example.com&lt;br /&gt;
&lt;br /&gt;
Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird listen.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für E-Mailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. listen.example.com gerade zutrifft.)&lt;br /&gt;
&lt;br /&gt;
Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:&lt;br /&gt;
&lt;br /&gt;
Also z.B.&lt;br /&gt;
 DEFAULT_URL_HOST = &#039;www.example.com&#039;&lt;br /&gt;
 DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
 add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
 add_virtualhost(&#039;www.zoopnet.de&#039;, &#039;lists.zoopnet.de&#039;)&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind.&lt;br /&gt;
Alle weiteren add_virtualhost-Direktiven ordnen einem Hostnamen für das Webfrontend (z.B. www.zoopnet.de) einen Hostpart für die Adresse der Mailinglisten (z.B. lists.zoopnet.de) zu.&lt;br /&gt;
&lt;br /&gt;
Tip von Raimund Specht: Lässt man den zweiten Parameter weg, also schreibt z.B. add_virtualhost(&#039;www.example.org&#039;), dann benutzt Mailman als Hostpart alles was nach dem ersten Punkt steht, hier also example.org als Maildomain.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prinzipiell war&#039;s das. Man muss die Listeneinträge natürlich immer in die richtige virtusertable eintragen, und für gleichnamige Mailinglisten auf verschiedenen Domains (mailman@*) verschidene +Ergänzungen bzw. aliase verwenden. :)&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&lt;br /&gt;
Verschiedene Listen mit gleichem Namen (also z.B. liste@example1.com und liste@example2.com) sind mit Mailman 2.1 leider nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tips und Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== URL Änderungen ===&lt;br /&gt;
Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt.&lt;br /&gt;
Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:&lt;br /&gt;
 ~/mailman/bin/withlist -l -r fix_url &amp;lt;Listen_Name&amp;gt; -v -u &amp;lt;Neue_Url&amp;gt;&lt;br /&gt;
&amp;lt;Listen_Name&amp;gt; steht für die Mailingliste, die bearbeitet werden soll. &amp;lt;Neue_Url&amp;gt; für die neue URL/Webadresse des Webinterfaces.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Cron-Jobs zur Mailinglisten Verwaltung ===&lt;br /&gt;
&lt;br /&gt;
Folgende Cronjobs helfen bei der Verwaltung und sind User freundlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt; In Arbeit &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
Lösung zur installation als Domainadmin (xyz00-listen) statt Paketadmin (xyz00): https://lists.hostsharing.net/archiv/support/2009-June/019414.html&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ältere Anleitung für Installation als Domain-Admin (xyz00-listen): &amp;lt;http://lists.hostsharing.net/archiv/support/2005-January/012426.html&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kleine Tools&amp;quot; auf http://hs.andreasloesch.de/, wobei das &#039;pac-mm-install&#039; wahrscheinlich nicht aktuell (genug) ist&amp;lt;br&amp;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:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5554</id>
		<title>Mailman Installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5554"/>
		<updated>2021-07-07T06:36:54Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Mailman gegen Subscription Spam härten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorab: Die Wahl von Mailman 2 ==&lt;br /&gt;
&lt;br /&gt;
Mailman 2 hängt von Python 2.7 ab und wird damit voraussichtlich nur noch eine begrenzte Nutzungsdauer haben. Mailman 3 ist jetzt verfügbar (siehe [[Mailman_3_installieren]]), aber deutlich schwerer und komplexer im Betrieb. Es gibt auch weniger leistungsfähige Software, um E-Mail-Verteiler zu betreiben, wie beispielsweise [[mlmmj]]. Für eine Diskussion der Situation im Oktober 2019, siehe das HS-Support-Archiv ab [https://lists.hostsharing.net/archiv/support/2019-October/067243.html hier.]&lt;br /&gt;
&lt;br /&gt;
== Mailman 2 installieren == &lt;br /&gt;
&lt;br /&gt;
(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)&lt;br /&gt;
&lt;br /&gt;
Vielen Dank an alle Benutzer, die Verbesserungen beisteuern!&lt;br /&gt;
&lt;br /&gt;
=== Unter welchem Account installieren? ===&lt;br /&gt;
&lt;br /&gt;
Mailman kann vom Paketadmin (beipsielsweise &amp;quot;xyz00&amp;quot;) oder von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert werden. Letzteres ist dringend empfohlen, denn wenn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.&lt;br /&gt;
&lt;br /&gt;
Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.&lt;br /&gt;
&lt;br /&gt;
Vorteil der Installation als Paketuser ist, dass nur dieser direkten Zugriff auf die Mailmandaten hat und mailman ohne Paketadminrechte läuft. Während der Emailauslieferung gelten (wie immer bei der Mailweiterleitung durch .forward-Dateien oder durch procmail) die Rechte des Paketusers, dem die Mailman-Installation gehört.&lt;br /&gt;
&lt;br /&gt;
Nachteil der Installation als Paketuser ist lediglich, dass die Paketdomain mit dem SSL Zertifikat von Hostsharing nicht genutzt werden kann.&amp;lt;!-- Aktualisieren? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einen User und eine Domain anlegen ===&lt;br /&gt;
&lt;br /&gt;
Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit &amp;quot;Domain-User&amp;quot; xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.&lt;br /&gt;
&lt;br /&gt;
Mit [[Login_mit_SSH|SSH]] an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; löschen:&lt;br /&gt;
&lt;br /&gt;
 ~$ echo &amp;quot;&amp;quot; &amp;gt; ~/doms/listen.example.com/htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
Die Default-Subdomains www.* löschen:&lt;br /&gt;
&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs/www/&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs-ssl/www/&lt;br /&gt;
&lt;br /&gt;
=== Sourcen besorgen und entpacken ===&lt;br /&gt;
&lt;br /&gt;
Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den 2er-Versionen von Mailman (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...&lt;br /&gt;
&lt;br /&gt;
 ~$ wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
... und entpacken:&lt;br /&gt;
&lt;br /&gt;
 ~$ tar -xzvf mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
Ab diesem Augenblick gibt es ein Verzeichnis namens &amp;lt;tt&amp;gt;mailman-2.1.29/&amp;lt;/tt&amp;gt;. Darin liegt die nunmehr entpackte &#039;&#039;Quellcode&#039;&#039; der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis &amp;lt;tt&amp;gt;mailman/&amp;lt;/tt&amp;gt; liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als &amp;quot;prefix&amp;quot; angegeben.)&lt;br /&gt;
&lt;br /&gt;
=== var-Verzeichnis für Log-Dateien anlegen ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir -p mailman/var&lt;br /&gt;
 ~$ chmod 02775 mailman/var&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir var/mailman&lt;br /&gt;
 ~$ chmod 02775 var/mailman&lt;br /&gt;
&lt;br /&gt;
=== Mailman konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
In das Source-Verzeichnis wechseln:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd mailman-2.1.29&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketuser (xyz00-listen):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \&lt;br /&gt;
              --with-username=xyz00-listen \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=xyz00&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketadmin (xyz00):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \&lt;br /&gt;
              --with-username=xyz00 \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/var/mailman \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=nogroup&lt;br /&gt;
&lt;br /&gt;
(Die Rückwärtsschrägstriche &amp;quot;\&amp;quot; am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)&lt;br /&gt;
&lt;br /&gt;
=== Mailman kompilieren ===&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ make&lt;br /&gt;
 ~/mailman-2.1.29$ make install&lt;br /&gt;
&lt;br /&gt;
=== Datenrechte prüfen ===&lt;br /&gt;
&lt;br /&gt;
Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ cd ..      &lt;br /&gt;
 ~$ mailman/bin/check_perms -f&lt;br /&gt;
&lt;br /&gt;
== Die neue Mailman-Installation konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdatei &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; editieren ===&lt;br /&gt;
&lt;br /&gt;
 ~$ nano mailman/Mailman/mm_cfg.py&lt;br /&gt;
      &lt;br /&gt;
Eine Beispielkonfiguration für listen.example.com könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
 [...]&lt;br /&gt;
      ##################################################&lt;br /&gt;
      # Put YOUR site-specific settings below this line.&lt;br /&gt;
      # -*- python -*-&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_HOST_NAME = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_URL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)&lt;br /&gt;
      add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_SERVER_LANGUAGE = &#039;de&#039;&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_URL_PATTERN = &#039;http://%s/&#039;&lt;br /&gt;
  &lt;br /&gt;
      # Es wird der HS Mailversand für Bulkmail verwendet:&lt;br /&gt;
      SMTPHOST = &#039;localhost&#039;&lt;br /&gt;
      SMTPPORT = 4587 &lt;br /&gt;
      SMTP_AUTH = True&lt;br /&gt;
      SMTP_USER = &#039;xyz00-listen&#039;&lt;br /&gt;
      SMTP_PASSWD = &#039;das-passwort-des-o.-g.-users&#039;&lt;br /&gt;
      SMTP_USE_TLS = True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;tt&amp;gt;~/mailman/Mailman/Defaults.py&amp;lt;/tt&amp;gt; sieht man, was in mm_cfg.py alles angepasst werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Mailman gegen Subscription Spam härten ====&lt;br /&gt;
&lt;br /&gt;
Mailman wird gelegentlich von böswilligen Crackern benutzt, die damit sogenannten Subscription Spam erzeugen. Dabei wird eine Mailadresse von Bots an Mailman zur Eintragung übergeben. Diese Mailadresse wird daraufhin brav von Mailman angeschrieben. Wenn das tausende von Mailmans auf der ganzen Welt zugleich machen, wird die Mailadresse zugespammt. Hier ist die Abhilfe:&lt;br /&gt;
&lt;br /&gt;
Die Idee kommt von https://www.ralfj.de/blog/2018/06/02/mailman-subscription-spam.html&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile ein zufälliges Secret-String erstellen:&lt;br /&gt;
 openssl rand -base64 18&lt;br /&gt;
&lt;br /&gt;
Und dann in die Konfigurationsdatei den erzeugten String einfügen:&lt;br /&gt;
&lt;br /&gt;
  SUBSCRIBE_FORM_SECRET = &#039;&amp;lt;Secret-String&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
=== CGI-Programme in die Domain kopieren ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
&lt;br /&gt;
Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.&lt;br /&gt;
&lt;br /&gt;
 ~$ mkdir ~/doms/listen.example.com/cgi-ssl/mailman&lt;br /&gt;
 ~$ cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ chmod g-s ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00): &lt;br /&gt;
&lt;br /&gt;
Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt: &lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/cgi-ssl&lt;br /&gt;
 ~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman&lt;br /&gt;
&lt;br /&gt;
===  Mailman-Icons in die Domains kopieren ===&lt;br /&gt;
&lt;br /&gt;
Die Icons können wahlweise verlinkt oder kopiert werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/htdocs-ssl&lt;br /&gt;
 ~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 ~$ cp -R mailman/icons doms/listen.example.com/htdocs-ssl/&lt;br /&gt;
&lt;br /&gt;
=== Die Datei .htaccess bearbeiten ===&lt;br /&gt;
&lt;br /&gt;
Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, sondern auch unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;  erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Dazu werden in &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; folgende Rewrite-Anweisungen eintragen.&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule	^(.*)$			/cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule	^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
Beachte dabei die zweite Zeile: Anfragen für Icons sollen &#039;&#039;nicht&#039;&#039; umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; statt &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; erreichbar sein soll, hilft folgendes in der &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/example.com/subs-ssl/www/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule    ^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
(In diesem Fall kann die Zeile &amp;lt;tt&amp;gt;DEFAULT_URL_PATTERN...&amp;lt;/tt&amp;gt; in der &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; auskommentiert werden.)&lt;br /&gt;
&lt;br /&gt;
=== Hauptpasswort setzen ===&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;site password&amp;quot; ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das &amp;quot;site password&amp;quot; einrichten mit dem Befehl: &lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/mmsitepass&lt;br /&gt;
&lt;br /&gt;
=== Cronjobs einrichten ===&lt;br /&gt;
&lt;br /&gt;
In die [[Cron |Crontab]] werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:&lt;br /&gt;
&lt;br /&gt;
 # Warteschlange jede Minute bearbeiten:&lt;br /&gt;
 * * * * *	~/mailman/bin/qrunner -o -r All&lt;br /&gt;
 # Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:&lt;br /&gt;
 47 * * * *	rm -f ~/var/mailman/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.&lt;br /&gt;
&lt;br /&gt;
Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:&lt;br /&gt;
&lt;br /&gt;
 47 * * * * rm -f ~/mailman/var/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
... entsprechend dem beim Konfigurieren angegebenen &amp;lt;tt&amp;gt;var&amp;lt;/tt&amp;gt;-Verzeichnis, siehe oben.&lt;br /&gt;
&lt;br /&gt;
Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus &amp;lt;tt&amp;gt;~/mailman/cron/crontab.in&amp;lt;/tt&amp;gt; dem crontab des Users angehängt werden:&lt;br /&gt;
&lt;br /&gt;
 crontab -l &amp;gt; mycronjobs.tmp&lt;br /&gt;
 cat ~/mailman/cron/crontab.in &amp;gt;&amp;gt; mycronjobs.tmp&lt;br /&gt;
 crontab mycronjobs.tmp&lt;br /&gt;
&lt;br /&gt;
== Mailinglisten einrichten ==&lt;br /&gt;
&lt;br /&gt;
Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster &#039;&#039;&#039;muß&#039;&#039;&#039; ein Hauptverteiler (&amp;quot;site list&amp;quot;) eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen &amp;quot;mailman&amp;quot;. Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung &lt;br /&gt;
&lt;br /&gt;
 MAILMAN_SITE_LIST = &#039;sitelistname&#039;&lt;br /&gt;
&lt;br /&gt;
in der Konfigurationsdatei &amp;lt;tt&amp;gt;mailman/Mailman/mm_cfg.py&amp;lt;/tt&amp;gt; eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
=== Den Hauptverteiler &amp;quot;mailman&amp;quot; anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;site list&amp;quot; mit dem Namen &amp;quot;mailman&amp;quot; ist die Mailingliste der lokalen Mailman-Administratoren. Sie wird zur einwandfreien Funktion von Mailman benötigt.&lt;br /&gt;
&lt;br /&gt;
Mit dem Mailman-Befehl newlist den Verteiler anlegen:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist mailman&lt;br /&gt;
 Enter the email of the person running the list: admin@xyz00.hostsharing.net&lt;br /&gt;
 Initial mailman password:&lt;br /&gt;
&lt;br /&gt;
(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)&lt;br /&gt;
&lt;br /&gt;
Nur dieses eine Mal für die &amp;quot;site list&amp;quot; müssen wir die Konfigurationsvorgaben laden. (Gewöhnliche Mailinglisten werden später über die Weboberfläche konfiguriert.)&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketadmin (&amp;quot;xyz00&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Diese Konfigurationsdatei soll &#039;&#039;&#039;nicht&#039;&#039;&#039; auf gewöhnliche Mailinglisten anwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Adressen bei Mailman einrichten ===&lt;br /&gt;
&lt;br /&gt;
Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine E-Mail an den dabei eingetragenen Listenadministrator. Diese E-Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle E-Mails an Mailman werden an erweiterte &#039;&#039;E-Mail-Adressen&#039;&#039; des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form &amp;lt;tt&amp;gt;xyz00-listen&#039;&#039;&#039;+&#039;&#039;&#039;&amp;lt;liste&amp;gt;[_funktion]&amp;lt;/tt&amp;gt;. E-Mails an diese Adressen werden dann durch Pipe-Anweisungen in &#039;&#039;.forward-Dateien&#039;&#039; im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben. &lt;br /&gt;
&lt;br /&gt;
Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, werden  &#039;&#039;E-Mail-Adressen&#039;&#039; durch [https://doc.hostsharing.net/users/administration/hsadmin/index.html hsadmin (bzw. das Befehlszeilentool hsscript)] eingerichtet; die &#039;&#039;.forward-Dateien&#039;&#039; werden durch [[Login_mit_SSH|Shell-Befehle]] angelegt.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt.)&lt;br /&gt;
&lt;br /&gt;
   hsscript -u xyz00 -i&lt;br /&gt;
   [hsscript verlangt die Eingabe des Passworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman&#039;,target:&#039;xyz00-listen+mailman&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-admin&#039;,target:&#039;xyz00-listen+mailman-admin&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-bounces&#039;,target:&#039;xyz00-listen+mailman-bounces&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-confirm&#039;,target:&#039;xyz00-listen+mailman-confirm&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-join&#039;,target:&#039;xyz00-listen+mailman-join&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-leave&#039;,target:&#039;xyz00-listen+mailman-leave&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-owner&#039;,target:&#039;xyz00-listen+mailman-owner&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-request&#039;,target:&#039;xyz00-listen+mailman-request&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-subscribe&#039;,target:&#039;xyz00-listen+mailman-subscribe&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-unsubscribe&#039;,target:&#039;xyz00-listen+mailman-unsubscribe&#039;}})&lt;br /&gt;
&lt;br /&gt;
Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.&lt;br /&gt;
&lt;br /&gt;
Für jede der soeben eingerichteten Adressen wird nun eine &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge &amp;lt;tt&amp;gt;.forward+&amp;lt;/tt&amp;gt; gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel wird die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei .forward+mailman-subscribe verwendet, wenn eine E-Mail an die Adresse &amp;lt;tt&amp;gt;mailman-subscribe@listen.example.com&amp;lt;/tt&amp;gt; eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel &amp;lt;tt&amp;gt;xyz00-listen+mailman-subscribe&amp;lt;/tt&amp;gt; wertet der Mail-Transfer-Agent die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei &amp;lt;tt&amp;gt;.forward+mailman-subscribe&amp;lt;/tt&amp;gt; im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten &amp;quot;subscribe mailman&amp;quot; übergeben.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt, jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)&lt;br /&gt;
&lt;br /&gt;
 echo &#039;admin@xyz00.hostsharing.net&#039; &amp;gt; .forward # Weiterleitung von cron Fehlern etc an Paketadmin.&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman&amp;quot;&#039; &amp;gt; .forward+mailman&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman&amp;quot;&#039; &amp;gt; .forward+mailman-admin&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman&amp;quot;&#039; &amp;gt; .forward+mailman-bounces&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman&amp;quot;&#039; &amp;gt; .forward+mailman-confirm&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman&amp;quot;&#039; &amp;gt; .forward+mailman-join&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman&amp;quot;&#039; &amp;gt; .forward+mailman-leave&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman&amp;quot;&#039; &amp;gt; .forward+mailman-owner&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman&amp;quot;&#039; &amp;gt; .forward+mailman-request&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-subscribe&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-unsubscribe&lt;br /&gt;
&lt;br /&gt;
Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens &amp;lt;tt&amp;gt;~/bin/addforwards&amp;lt;/tt&amp;gt; mit folgendem Inhalt zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # .forward-Dateien für einen Verteiler unter Mailman einrichten.&lt;br /&gt;
 #&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;$2&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;`pwd`&amp;quot; != &amp;quot;`echo ~`&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Diesen Befehl vom Home-Verzeichnis aus aufrufen.\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-admin&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-bounces&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-confirm&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-join&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-leave&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-owner&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-request&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-subscribe&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-unsubscribe&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Der Skript muß natürlich als ausführbar gekennzeichnet werden:&lt;br /&gt;
&lt;br /&gt;
  ~$ chmod u+x bin/addforwards&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung dieses Skripts um die &amp;lt;tt&amp;gt;hsscript&amp;lt;/tt&amp;gt;-Befehle wird dem geneigten Leser als Aufgabe überlassen.&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
&lt;br /&gt;
Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste &amp;quot;mailman&amp;quot; selbst abonnieren. Die Liste &amp;quot;mailman&amp;quot; kann aber unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; verwaltet werden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei &amp;lt;tt&amp;gt;.htaccess&amp;lt;/tt&amp;gt;) &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer &amp;quot;mailman&amp;quot;) und einen Link, um neue Mailinglisten anzulegen (&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/create&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist &amp;lt;Listenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien wie bei dem Einrichten der Liste &amp;quot;mailman&amp;quot; nach Verfahren im obigen Abschnitt angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die [https://wiki.list.org/ Mailman-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Feintuning == &lt;br /&gt;
&lt;br /&gt;
Wer will, kann auch noch etwas Platz sparen. Die normale Mailmaninstallation schlägt mit über 20 MB zu Buche...&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Tips kann man das auf ca. 6 MB reduzieren :)&lt;br /&gt;
&lt;br /&gt;
Es kann natürlich sein, dass ich zuviel lösche, aber bei mir funktioniert&#039;s. Wenn ihr also sicher(er) sein wollt, dass euch der Mailman nicht um die Ohren fliegt, macht das nicht!&lt;br /&gt;
&lt;br /&gt;
*  ~/mailman/cgi-bin und ~/mailman/icons können gelöscht werden, falls sie an andere Stelle kopiert worden sind.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/messages löschen.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/templates löschen (bis auf englisch).&lt;br /&gt;
* ~/mailman/tests kann, soweit ich das sehe, komplett gelöscht werden.&lt;br /&gt;
* Falls man koreanisch und japanisch nicht braucht, kann man folgendes machen:&lt;br /&gt;
* in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:&lt;br /&gt;
&lt;br /&gt;
 # In a normal interactive Python environment, the japanese.pth and korean.pth&lt;br /&gt;
 # files would be imported automatically.  But because we inhibit the importing&lt;br /&gt;
 # of the site module, we need to be explicit about importing these codecs.&lt;br /&gt;
 if not jaok:&lt;br /&gt;
     import japanese&lt;br /&gt;
 # As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean&lt;br /&gt;
 # codecs installed, however leave the first import in there in case an upgrade&lt;br /&gt;
 # changes this.&lt;br /&gt;
 if not kook:&lt;br /&gt;
     import korean&lt;br /&gt;
     import korean.aliases&lt;br /&gt;
&lt;br /&gt;
auskommentieren.&lt;br /&gt;
&lt;br /&gt;
Dann kann man ~/mailman/pythonlib/japanese, ~/mailman/pythonlib/korean, ~/mailman/pythonlib/korean.pth sowie ~/mailman/pythonlib/lib löschen.&lt;br /&gt;
   &lt;br /&gt;
Man kann auch noch die Debug-Informationen aus den binaries strippen:&lt;br /&gt;
&lt;br /&gt;
 strip ~/mailman/mail/mailman&lt;br /&gt;
 strip ~/mailman/cgi-bin/*&lt;br /&gt;
&lt;br /&gt;
Falls die CGIs nicht gesymlinkt wurden:&lt;br /&gt;
&lt;br /&gt;
 strip ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
== Multidomainfähigkeit ==&lt;br /&gt;
&lt;br /&gt;
Seit Mailman 2.x kann eine Mailman-Installation unter gewissen Einschränkungen für mehrere Domains verwendet werden. Hier soll kurz gezeigt werden, was geht und wie es geht.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung ===&lt;br /&gt;
&lt;br /&gt;
Logischerweise muss das Webfrontend (die CGIs) auf allen Domains installiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist listenname@listen.example.com&lt;br /&gt;
&lt;br /&gt;
Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird listen.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für E-Mailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. listen.example.com gerade zutrifft.)&lt;br /&gt;
&lt;br /&gt;
Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:&lt;br /&gt;
&lt;br /&gt;
Also z.B.&lt;br /&gt;
 DEFAULT_URL_HOST = &#039;www.example.com&#039;&lt;br /&gt;
 DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
 add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
 add_virtualhost(&#039;www.zoopnet.de&#039;, &#039;lists.zoopnet.de&#039;)&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind.&lt;br /&gt;
Alle weiteren add_virtualhost-Direktiven ordnen einem Hostnamen für das Webfrontend (z.B. www.zoopnet.de) einen Hostpart für die Adresse der Mailinglisten (z.B. lists.zoopnet.de) zu.&lt;br /&gt;
&lt;br /&gt;
Tip von Raimund Specht: Lässt man den zweiten Parameter weg, also schreibt z.B. add_virtualhost(&#039;www.example.org&#039;), dann benutzt Mailman als Hostpart alles was nach dem ersten Punkt steht, hier also example.org als Maildomain.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prinzipiell war&#039;s das. Man muss die Listeneinträge natürlich immer in die richtige virtusertable eintragen, und für gleichnamige Mailinglisten auf verschiedenen Domains (mailman@*) verschidene +Ergänzungen bzw. aliase verwenden. :)&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&lt;br /&gt;
Verschiedene Listen mit gleichem Namen (also z.B. liste@example1.com und liste@example2.com) sind mit Mailman 2.1 leider nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tips und Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== URL Änderungen ===&lt;br /&gt;
Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt.&lt;br /&gt;
Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:&lt;br /&gt;
 ~/mailman/bin/withlist -l -r fix_url &amp;lt;Listen_Name&amp;gt; -v -u &amp;lt;Neue_Url&amp;gt;&lt;br /&gt;
&amp;lt;Listen_Name&amp;gt; steht für die Mailingliste, die bearbeitet werden soll. &amp;lt;Neue_Url&amp;gt; für die neue URL/Webadresse des Webinterfaces.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Cron-Jobs zur Mailinglisten Verwaltung ===&lt;br /&gt;
&lt;br /&gt;
Folgende Cronjobs helfen bei der Verwaltung und sind User freundlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt; In Arbeit &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
Lösung zur installation als Domainadmin (xyz00-listen) statt Paketadmin (xyz00): https://lists.hostsharing.net/archiv/support/2009-June/019414.html&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ältere Anleitung für Installation als Domain-Admin (xyz00-listen): &amp;lt;http://lists.hostsharing.net/archiv/support/2005-January/012426.html&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kleine Tools&amp;quot; auf http://hs.andreasloesch.de/, wobei das &#039;pac-mm-install&#039; wahrscheinlich nicht aktuell (genug) ist&amp;lt;br&amp;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:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5553</id>
		<title>Mailman Installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_Installieren&amp;diff=5553"/>
		<updated>2021-07-07T06:33:09Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: /* Die neue Mailman-Installation konfigurieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorab: Die Wahl von Mailman 2 ==&lt;br /&gt;
&lt;br /&gt;
Mailman 2 hängt von Python 2.7 ab und wird damit voraussichtlich nur noch eine begrenzte Nutzungsdauer haben. Mailman 3 ist jetzt verfügbar (siehe [[Mailman_3_installieren]]), aber deutlich schwerer und komplexer im Betrieb. Es gibt auch weniger leistungsfähige Software, um E-Mail-Verteiler zu betreiben, wie beispielsweise [[mlmmj]]. Für eine Diskussion der Situation im Oktober 2019, siehe das HS-Support-Archiv ab [https://lists.hostsharing.net/archiv/support/2019-October/067243.html hier.]&lt;br /&gt;
&lt;br /&gt;
== Mailman 2 installieren == &lt;br /&gt;
&lt;br /&gt;
(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)&lt;br /&gt;
&lt;br /&gt;
Vielen Dank an alle Benutzer, die Verbesserungen beisteuern!&lt;br /&gt;
&lt;br /&gt;
=== Unter welchem Account installieren? ===&lt;br /&gt;
&lt;br /&gt;
Mailman kann vom Paketadmin (beipsielsweise &amp;quot;xyz00&amp;quot;) oder von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert werden. Letzteres ist dringend empfohlen, denn wenn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.&lt;br /&gt;
&lt;br /&gt;
Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.&lt;br /&gt;
&lt;br /&gt;
Vorteil der Installation als Paketuser ist, dass nur dieser direkten Zugriff auf die Mailmandaten hat und mailman ohne Paketadminrechte läuft. Während der Emailauslieferung gelten (wie immer bei der Mailweiterleitung durch .forward-Dateien oder durch procmail) die Rechte des Paketusers, dem die Mailman-Installation gehört.&lt;br /&gt;
&lt;br /&gt;
Nachteil der Installation als Paketuser ist lediglich, dass die Paketdomain mit dem SSL Zertifikat von Hostsharing nicht genutzt werden kann.&amp;lt;!-- Aktualisieren? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einen User und eine Domain anlegen ===&lt;br /&gt;
&lt;br /&gt;
Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit &amp;quot;Domain-User&amp;quot; xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.&lt;br /&gt;
&lt;br /&gt;
Mit [[Login_mit_SSH|SSH]] an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; löschen:&lt;br /&gt;
&lt;br /&gt;
 ~$ echo &amp;quot;&amp;quot; &amp;gt; ~/doms/listen.example.com/htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
Die Default-Subdomains www.* löschen:&lt;br /&gt;
&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs/www/&lt;br /&gt;
   ~$ rm -r doms/listen.example.com/subs-ssl/www/&lt;br /&gt;
&lt;br /&gt;
=== Sourcen besorgen und entpacken ===&lt;br /&gt;
&lt;br /&gt;
Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den 2er-Versionen von Mailman (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...&lt;br /&gt;
&lt;br /&gt;
 ~$ wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
... und entpacken:&lt;br /&gt;
&lt;br /&gt;
 ~$ tar -xzvf mailman-2.1.29.tgz&lt;br /&gt;
&lt;br /&gt;
Ab diesem Augenblick gibt es ein Verzeichnis namens &amp;lt;tt&amp;gt;mailman-2.1.29/&amp;lt;/tt&amp;gt;. Darin liegt die nunmehr entpackte &#039;&#039;Quellcode&#039;&#039; der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis &amp;lt;tt&amp;gt;mailman/&amp;lt;/tt&amp;gt; liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als &amp;quot;prefix&amp;quot; angegeben.)&lt;br /&gt;
&lt;br /&gt;
=== var-Verzeichnis für Log-Dateien anlegen ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir -p mailman/var&lt;br /&gt;
 ~$ chmod 02775 mailman/var&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00):&lt;br /&gt;
 ~$ cd &amp;amp;&amp;amp; mkdir var/mailman&lt;br /&gt;
 ~$ chmod 02775 var/mailman&lt;br /&gt;
&lt;br /&gt;
=== Mailman konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
In das Source-Verzeichnis wechseln:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd mailman-2.1.29&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketuser (xyz00-listen):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \&lt;br /&gt;
              --with-username=xyz00-listen \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=xyz00&lt;br /&gt;
&lt;br /&gt;
Bei der Installation durch den Paketadmin (xyz00):&lt;br /&gt;
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \&lt;br /&gt;
              --with-username=xyz00 \&lt;br /&gt;
              --with-groupname=xyz00 \&lt;br /&gt;
              --with-var-prefix=/home/pacs/xyz00/var/mailman \&lt;br /&gt;
              --with-cgi-gid=xyz00 \&lt;br /&gt;
              --with-mail-gid=nogroup&lt;br /&gt;
&lt;br /&gt;
(Die Rückwärtsschrägstriche &amp;quot;\&amp;quot; am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)&lt;br /&gt;
&lt;br /&gt;
=== Mailman kompilieren ===&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ make&lt;br /&gt;
 ~/mailman-2.1.29$ make install&lt;br /&gt;
&lt;br /&gt;
=== Datenrechte prüfen ===&lt;br /&gt;
&lt;br /&gt;
Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:&lt;br /&gt;
&lt;br /&gt;
 ~/mailman-2.1.29$ cd ..      &lt;br /&gt;
 ~$ mailman/bin/check_perms -f&lt;br /&gt;
&lt;br /&gt;
== Die neue Mailman-Installation konfigurieren ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdatei &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; editieren ===&lt;br /&gt;
&lt;br /&gt;
 ~$ nano mailman/Mailman/mm_cfg.py&lt;br /&gt;
      &lt;br /&gt;
Eine Beispielkonfiguration für listen.example.com könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
 [...]&lt;br /&gt;
      ##################################################&lt;br /&gt;
      # Put YOUR site-specific settings below this line.&lt;br /&gt;
      # -*- python -*-&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_HOST_NAME = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      DEFAULT_URL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
      add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)&lt;br /&gt;
      add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_SERVER_LANGUAGE = &#039;de&#039;&lt;br /&gt;
 &lt;br /&gt;
      DEFAULT_URL_PATTERN = &#039;http://%s/&#039;&lt;br /&gt;
  &lt;br /&gt;
      # Es wird der HS Mailversand für Bulkmail verwendet:&lt;br /&gt;
      SMTPHOST = &#039;localhost&#039;&lt;br /&gt;
      SMTPPORT = 4587 &lt;br /&gt;
      SMTP_AUTH = True&lt;br /&gt;
      SMTP_USER = &#039;xyz00-listen&#039;&lt;br /&gt;
      SMTP_PASSWD = &#039;das-passwort-des-o.-g.-users&#039;&lt;br /&gt;
      SMTP_USE_TLS = True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;tt&amp;gt;~/mailman/Mailman/Defaults.py&amp;lt;/tt&amp;gt; sieht man, was in mm_cfg.py alles angepasst werden kann.&lt;br /&gt;
&lt;br /&gt;
==== Mailman gegen Subscription Spam härten ====&lt;br /&gt;
&lt;br /&gt;
Die Idee kommt von https://www.ralfj.de/blog/2018/06/02/mailman-subscription-spam.html&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile ein zufälliges Secret-String erstellen:&lt;br /&gt;
 openssl rand -base64 18&lt;br /&gt;
&lt;br /&gt;
Und dann in die Konfigurationsdatei den erzeugten String einfügen:&lt;br /&gt;
&lt;br /&gt;
  SUBSCRIBE_FORM_SECRET = &#039;&amp;lt;Secret-String&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
=== CGI-Programme in die Domain kopieren ===&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketuser (xyz00-listen):&lt;br /&gt;
&lt;br /&gt;
Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.&lt;br /&gt;
&lt;br /&gt;
 ~$ mkdir ~/doms/listen.example.com/cgi-ssl/mailman&lt;br /&gt;
 ~$ cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ chmod g-s ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
Bei der Installation als Paketadmin (xyz00): &lt;br /&gt;
&lt;br /&gt;
Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt: &lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/cgi-ssl&lt;br /&gt;
 ~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman&lt;br /&gt;
&lt;br /&gt;
===  Mailman-Icons in die Domains kopieren ===&lt;br /&gt;
&lt;br /&gt;
Die Icons können wahlweise verlinkt oder kopiert werden:&lt;br /&gt;
&lt;br /&gt;
 ~$ cd doms/listen.example.com/htdocs-ssl&lt;br /&gt;
 ~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 ~$ cp -R mailman/icons doms/listen.example.com/htdocs-ssl/&lt;br /&gt;
&lt;br /&gt;
=== Die Datei .htaccess bearbeiten ===&lt;br /&gt;
&lt;br /&gt;
Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, sondern auch unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;  erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Dazu werden in &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/listen.example.com/htdocs-ssl/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; folgende Rewrite-Anweisungen eintragen.&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule	^(.*)$			/cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule	^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
Beachte dabei die zweite Zeile: Anfragen für Icons sollen &#039;&#039;nicht&#039;&#039; umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; statt &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://www.example.com/cgi-bin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; erreichbar sein soll, hilft folgendes in der &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~/doms/example.com/subs-ssl/www/.htaccess&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond	%{REQUEST_URI}		!^/icons/&lt;br /&gt;
 RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1&lt;br /&gt;
 RewriteRule    ^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo&lt;br /&gt;
&lt;br /&gt;
(In diesem Fall kann die Zeile &amp;lt;tt&amp;gt;DEFAULT_URL_PATTERN...&amp;lt;/tt&amp;gt; in der &amp;lt;tt&amp;gt;mm_cfg.py&amp;lt;/tt&amp;gt; auskommentiert werden.)&lt;br /&gt;
&lt;br /&gt;
=== Hauptpasswort setzen ===&lt;br /&gt;
&lt;br /&gt;
Das &amp;quot;site password&amp;quot; ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das &amp;quot;site password&amp;quot; einrichten mit dem Befehl: &lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/mmsitepass&lt;br /&gt;
&lt;br /&gt;
=== Cronjobs einrichten ===&lt;br /&gt;
&lt;br /&gt;
In die [[Cron |Crontab]] werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:&lt;br /&gt;
&lt;br /&gt;
 # Warteschlange jede Minute bearbeiten:&lt;br /&gt;
 * * * * *	~/mailman/bin/qrunner -o -r All&lt;br /&gt;
 # Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:&lt;br /&gt;
 47 * * * *	rm -f ~/var/mailman/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.&lt;br /&gt;
&lt;br /&gt;
Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:&lt;br /&gt;
&lt;br /&gt;
 47 * * * * rm -f ~/mailman/var/logs/qrunner&lt;br /&gt;
&lt;br /&gt;
... entsprechend dem beim Konfigurieren angegebenen &amp;lt;tt&amp;gt;var&amp;lt;/tt&amp;gt;-Verzeichnis, siehe oben.&lt;br /&gt;
&lt;br /&gt;
Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus &amp;lt;tt&amp;gt;~/mailman/cron/crontab.in&amp;lt;/tt&amp;gt; dem crontab des Users angehängt werden:&lt;br /&gt;
&lt;br /&gt;
 crontab -l &amp;gt; mycronjobs.tmp&lt;br /&gt;
 cat ~/mailman/cron/crontab.in &amp;gt;&amp;gt; mycronjobs.tmp&lt;br /&gt;
 crontab mycronjobs.tmp&lt;br /&gt;
&lt;br /&gt;
== Mailinglisten einrichten ==&lt;br /&gt;
&lt;br /&gt;
Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster &#039;&#039;&#039;muß&#039;&#039;&#039; ein Hauptverteiler (&amp;quot;site list&amp;quot;) eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen &amp;quot;mailman&amp;quot;. Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung &lt;br /&gt;
&lt;br /&gt;
 MAILMAN_SITE_LIST = &#039;sitelistname&#039;&lt;br /&gt;
&lt;br /&gt;
in der Konfigurationsdatei &amp;lt;tt&amp;gt;mailman/Mailman/mm_cfg.py&amp;lt;/tt&amp;gt; eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
=== Den Hauptverteiler &amp;quot;mailman&amp;quot; anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;site list&amp;quot; mit dem Namen &amp;quot;mailman&amp;quot; ist die Mailingliste der lokalen Mailman-Administratoren. Sie wird zur einwandfreien Funktion von Mailman benötigt.&lt;br /&gt;
&lt;br /&gt;
Mit dem Mailman-Befehl newlist den Verteiler anlegen:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist mailman&lt;br /&gt;
 Enter the email of the person running the list: admin@xyz00.hostsharing.net&lt;br /&gt;
 Initial mailman password:&lt;br /&gt;
&lt;br /&gt;
(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)&lt;br /&gt;
&lt;br /&gt;
Nur dieses eine Mal für die &amp;quot;site list&amp;quot; müssen wir die Konfigurationsvorgaben laden. (Gewöhnliche Mailinglisten werden später über die Weboberfläche konfiguriert.)&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Falls mailman vom Paketadmin (&amp;quot;xyz00&amp;quot;) installiert wurde:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman&lt;br /&gt;
&lt;br /&gt;
Diese Konfigurationsdatei soll &#039;&#039;&#039;nicht&#039;&#039;&#039; auf gewöhnliche Mailinglisten anwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Adressen bei Mailman einrichten ===&lt;br /&gt;
&lt;br /&gt;
Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine E-Mail an den dabei eingetragenen Listenadministrator. Diese E-Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle E-Mails an Mailman werden an erweiterte &#039;&#039;E-Mail-Adressen&#039;&#039; des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form &amp;lt;tt&amp;gt;xyz00-listen&#039;&#039;&#039;+&#039;&#039;&#039;&amp;lt;liste&amp;gt;[_funktion]&amp;lt;/tt&amp;gt;. E-Mails an diese Adressen werden dann durch Pipe-Anweisungen in &#039;&#039;.forward-Dateien&#039;&#039; im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben. &lt;br /&gt;
&lt;br /&gt;
Falls Mailman von einem Paketuser (bspw. &amp;quot;xyz00-listen&amp;quot;) installiert wurde, werden  &#039;&#039;E-Mail-Adressen&#039;&#039; durch [https://doc.hostsharing.net/users/administration/hsadmin/index.html hsadmin (bzw. das Befehlszeilentool hsscript)] eingerichtet; die &#039;&#039;.forward-Dateien&#039;&#039; werden durch [[Login_mit_SSH|Shell-Befehle]] angelegt.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt.)&lt;br /&gt;
&lt;br /&gt;
   hsscript -u xyz00 -i&lt;br /&gt;
   [hsscript verlangt die Eingabe des Passworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman&#039;,target:&#039;xyz00-listen+mailman&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-admin&#039;,target:&#039;xyz00-listen+mailman-admin&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-bounces&#039;,target:&#039;xyz00-listen+mailman-bounces&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-confirm&#039;,target:&#039;xyz00-listen+mailman-confirm&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-join&#039;,target:&#039;xyz00-listen+mailman-join&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-leave&#039;,target:&#039;xyz00-listen+mailman-leave&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-owner&#039;,target:&#039;xyz00-listen+mailman-owner&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-request&#039;,target:&#039;xyz00-listen+mailman-request&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-subscribe&#039;,target:&#039;xyz00-listen+mailman-subscribe&#039;}})&lt;br /&gt;
   emailaddress.add ({set:{domain:&#039;listen.example.com&#039;,localpart:&#039;mailman-unsubscribe&#039;,target:&#039;xyz00-listen+mailman-unsubscribe&#039;}})&lt;br /&gt;
&lt;br /&gt;
Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.&lt;br /&gt;
&lt;br /&gt;
Für jede der soeben eingerichteten Adressen wird nun eine &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge &amp;lt;tt&amp;gt;.forward+&amp;lt;/tt&amp;gt; gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel wird die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei .forward+mailman-subscribe verwendet, wenn eine E-Mail an die Adresse &amp;lt;tt&amp;gt;mailman-subscribe@listen.example.com&amp;lt;/tt&amp;gt; eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel &amp;lt;tt&amp;gt;xyz00-listen+mailman-subscribe&amp;lt;/tt&amp;gt; wertet der Mail-Transfer-Agent die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei &amp;lt;tt&amp;gt;.forward+mailman-subscribe&amp;lt;/tt&amp;gt; im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten &amp;quot;subscribe mailman&amp;quot; übergeben.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien für die Hauptliste &amp;quot;mailman&amp;quot; eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien &amp;quot;mailman&amp;quot; durch den Namen der Mailingliste ersetzt, jedoch &#039;&#039;&#039;nicht&#039;&#039;&#039; in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)&lt;br /&gt;
&lt;br /&gt;
 echo &#039;admin@xyz00.hostsharing.net&#039; &amp;gt; .forward # Weiterleitung von cron Fehlern etc an Paketadmin.&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman&amp;quot;&#039; &amp;gt; .forward+mailman&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman&amp;quot;&#039; &amp;gt; .forward+mailman-admin&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman&amp;quot;&#039; &amp;gt; .forward+mailman-bounces&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman&amp;quot;&#039; &amp;gt; .forward+mailman-confirm&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman&amp;quot;&#039; &amp;gt; .forward+mailman-join&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman&amp;quot;&#039; &amp;gt; .forward+mailman-leave&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman&amp;quot;&#039; &amp;gt; .forward+mailman-owner&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman&amp;quot;&#039; &amp;gt; .forward+mailman-request&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-subscribe&lt;br /&gt;
 echo &#039;&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman&amp;quot;&#039; &amp;gt; .forward+mailman-unsubscribe&lt;br /&gt;
&lt;br /&gt;
Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens &amp;lt;tt&amp;gt;~/bin/addforwards&amp;lt;/tt&amp;gt; mit folgendem Inhalt zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # .forward-Dateien für einen Verteiler unter Mailman einrichten.&lt;br /&gt;
 #&lt;br /&gt;
 if [ &amp;quot;$1&amp;quot; = &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;$2&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Aufruf: $0 Listenname\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 if [ &amp;quot;`pwd`&amp;quot; != &amp;quot;`echo ~`&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;Diesen Befehl vom Home-Verzeichnis aus aufrufen.\n&amp;quot; &lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman post $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-admin&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-bounces&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-confirm&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman join $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-join&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-leave&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-owner&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman request $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-request&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-subscribe&lt;br /&gt;
 echo &amp;quot;\&amp;quot;|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe $1\&amp;quot;&amp;quot; &amp;gt; .forward+$1-unsubscribe&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Der Skript muß natürlich als ausführbar gekennzeichnet werden:&lt;br /&gt;
&lt;br /&gt;
  ~$ chmod u+x bin/addforwards&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung dieses Skripts um die &amp;lt;tt&amp;gt;hsscript&amp;lt;/tt&amp;gt;-Befehle wird dem geneigten Leser als Aufgabe überlassen.&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
&lt;br /&gt;
Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste &amp;quot;mailman&amp;quot; selbst abonnieren. Die Liste &amp;quot;mailman&amp;quot; kann aber unter &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/mailman&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; verwaltet werden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei &amp;lt;tt&amp;gt;.htaccess&amp;lt;/tt&amp;gt;) &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/admin/&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer &amp;quot;mailman&amp;quot;) und einen Link, um neue Mailinglisten anzulegen (&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://listen.example.com/mailman/create&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist &amp;lt;Listenname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Dateien wie bei dem Einrichten der Liste &amp;quot;mailman&amp;quot; nach Verfahren im obigen Abschnitt angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die [https://wiki.list.org/ Mailman-Wiki].&lt;br /&gt;
&lt;br /&gt;
== Feintuning == &lt;br /&gt;
&lt;br /&gt;
Wer will, kann auch noch etwas Platz sparen. Die normale Mailmaninstallation schlägt mit über 20 MB zu Buche...&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Tips kann man das auf ca. 6 MB reduzieren :)&lt;br /&gt;
&lt;br /&gt;
Es kann natürlich sein, dass ich zuviel lösche, aber bei mir funktioniert&#039;s. Wenn ihr also sicher(er) sein wollt, dass euch der Mailman nicht um die Ohren fliegt, macht das nicht!&lt;br /&gt;
&lt;br /&gt;
*  ~/mailman/cgi-bin und ~/mailman/icons können gelöscht werden, falls sie an andere Stelle kopiert worden sind.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/messages löschen.&lt;br /&gt;
* Die nicht benötigten Sprachen in ~/mailman/templates löschen (bis auf englisch).&lt;br /&gt;
* ~/mailman/tests kann, soweit ich das sehe, komplett gelöscht werden.&lt;br /&gt;
* Falls man koreanisch und japanisch nicht braucht, kann man folgendes machen:&lt;br /&gt;
* in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:&lt;br /&gt;
&lt;br /&gt;
 # In a normal interactive Python environment, the japanese.pth and korean.pth&lt;br /&gt;
 # files would be imported automatically.  But because we inhibit the importing&lt;br /&gt;
 # of the site module, we need to be explicit about importing these codecs.&lt;br /&gt;
 if not jaok:&lt;br /&gt;
     import japanese&lt;br /&gt;
 # As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean&lt;br /&gt;
 # codecs installed, however leave the first import in there in case an upgrade&lt;br /&gt;
 # changes this.&lt;br /&gt;
 if not kook:&lt;br /&gt;
     import korean&lt;br /&gt;
     import korean.aliases&lt;br /&gt;
&lt;br /&gt;
auskommentieren.&lt;br /&gt;
&lt;br /&gt;
Dann kann man ~/mailman/pythonlib/japanese, ~/mailman/pythonlib/korean, ~/mailman/pythonlib/korean.pth sowie ~/mailman/pythonlib/lib löschen.&lt;br /&gt;
   &lt;br /&gt;
Man kann auch noch die Debug-Informationen aus den binaries strippen:&lt;br /&gt;
&lt;br /&gt;
 strip ~/mailman/mail/mailman&lt;br /&gt;
 strip ~/mailman/cgi-bin/*&lt;br /&gt;
&lt;br /&gt;
Falls die CGIs nicht gesymlinkt wurden:&lt;br /&gt;
&lt;br /&gt;
 strip ~/doms/listen.example.com/cgi/mailman/*&lt;br /&gt;
&lt;br /&gt;
== Multidomainfähigkeit ==&lt;br /&gt;
&lt;br /&gt;
Seit Mailman 2.x kann eine Mailman-Installation unter gewissen Einschränkungen für mehrere Domains verwendet werden. Hier soll kurz gezeigt werden, was geht und wie es geht.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung ===&lt;br /&gt;
&lt;br /&gt;
Logischerweise muss das Webfrontend (die CGIs) auf allen Domains installiert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:&lt;br /&gt;
&lt;br /&gt;
 ~$ mailman/bin/newlist listenname@listen.example.com&lt;br /&gt;
&lt;br /&gt;
Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird listen.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für E-Mailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. listen.example.com gerade zutrifft.)&lt;br /&gt;
&lt;br /&gt;
Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:&lt;br /&gt;
&lt;br /&gt;
Also z.B.&lt;br /&gt;
 DEFAULT_URL_HOST = &#039;www.example.com&#039;&lt;br /&gt;
 DEFAULT_EMAIL_HOST = &#039;listen.example.com&#039;&lt;br /&gt;
 add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
 add_virtualhost(&#039;www.zoopnet.de&#039;, &#039;lists.zoopnet.de&#039;)&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind.&lt;br /&gt;
Alle weiteren add_virtualhost-Direktiven ordnen einem Hostnamen für das Webfrontend (z.B. www.zoopnet.de) einen Hostpart für die Adresse der Mailinglisten (z.B. lists.zoopnet.de) zu.&lt;br /&gt;
&lt;br /&gt;
Tip von Raimund Specht: Lässt man den zweiten Parameter weg, also schreibt z.B. add_virtualhost(&#039;www.example.org&#039;), dann benutzt Mailman als Hostpart alles was nach dem ersten Punkt steht, hier also example.org als Maildomain.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prinzipiell war&#039;s das. Man muss die Listeneinträge natürlich immer in die richtige virtusertable eintragen, und für gleichnamige Mailinglisten auf verschiedenen Domains (mailman@*) verschidene +Ergänzungen bzw. aliase verwenden. :)&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&lt;br /&gt;
Verschiedene Listen mit gleichem Namen (also z.B. liste@example1.com und liste@example2.com) sind mit Mailman 2.1 leider nicht möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tips und Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== URL Änderungen ===&lt;br /&gt;
Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt.&lt;br /&gt;
Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:&lt;br /&gt;
 ~/mailman/bin/withlist -l -r fix_url &amp;lt;Listen_Name&amp;gt; -v -u &amp;lt;Neue_Url&amp;gt;&lt;br /&gt;
&amp;lt;Listen_Name&amp;gt; steht für die Mailingliste, die bearbeitet werden soll. &amp;lt;Neue_Url&amp;gt; für die neue URL/Webadresse des Webinterfaces.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Cron-Jobs zur Mailinglisten Verwaltung ===&lt;br /&gt;
&lt;br /&gt;
Folgende Cronjobs helfen bei der Verwaltung und sind User freundlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt; In Arbeit &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
Lösung zur installation als Domainadmin (xyz00-listen) statt Paketadmin (xyz00): https://lists.hostsharing.net/archiv/support/2009-June/019414.html&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ältere Anleitung für Installation als Domain-Admin (xyz00-listen): &amp;lt;http://lists.hostsharing.net/archiv/support/2005-January/012426.html&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Kleine Tools&amp;quot; auf http://hs.andreasloesch.de/, wobei das &#039;pac-mm-install&#039; wahrscheinlich nicht aktuell (genug) ist&amp;lt;br&amp;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:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Zonefile&amp;diff=5410</id>
		<title>Diskussion:Zonefile</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Zonefile&amp;diff=5410"/>
		<updated>2021-03-20T10:26:17Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Neuer Abschnitt /* Zonefile für Mailinglisten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zonefile für Mailinglisten ==&lt;br /&gt;
&lt;br /&gt;
Wer Schwierigkeiten hat, Mailinglisten bei Google einzuliefern (landet immer in Spam), hier ist ein angepasstes Zonefile, wie es für die Gambas Mailingliste funktioniert.&lt;br /&gt;
&lt;br /&gt;
Die Google site verification kriegt man in der Google Search Console.&lt;br /&gt;
&lt;br /&gt;
In &#039;~/doms/example.com/etc/pri.example.com&#039;&lt;br /&gt;
&lt;br /&gt;
  {DEFAULT_ZONEFILE}&lt;br /&gt;
  @ IN TXT   &amp;quot;google-site-verification=xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz&amp;quot;&lt;br /&gt;
  @ IN TXT   &amp;quot;v=spf1 a mx include:spf.hostsharing.net ~all&amp;quot;&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=HsadminWeb&amp;diff=5381</id>
		<title>HsadminWeb</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=HsadminWeb&amp;diff=5381"/>
		<updated>2021-01-24T09:06:05Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Löschkandidat}}&lt;br /&gt;
&lt;br /&gt;
= HSAdmin =&lt;br /&gt;
&lt;br /&gt;
Mit dieser Anwendung werden Hosting-Pakete und Domains bei der Hostsharing eG verwaltet.&lt;br /&gt;
&lt;br /&gt;
Die Anwendung ist zu finden unter: https://admin.hostsharing.net/&lt;br /&gt;
&lt;br /&gt;
Die Bedienung hat sich dahingehend verändert, dass es im linken Bereich&lt;br /&gt;
des Fensters Einstiegsobjekte gibt:&lt;br /&gt;
&lt;br /&gt;
== Kunde/Mitglied ==&lt;br /&gt;
&lt;br /&gt;
Mitglieder der Genossenschaft sehen hier Ihre Adress-Daten, Ihre&lt;br /&gt;
Bankverbindung und die gebuchten Pakete.&lt;br /&gt;
&lt;br /&gt;
Dieser Bereich ist nur für den Mitgliedsaccount sichtbar (Drei-Buchstaben-Login)&lt;br /&gt;
&lt;br /&gt;
== Web-Paket ==&lt;br /&gt;
&lt;br /&gt;
Die Hosting Pakete zur Administration von Benutzern (als&lt;br /&gt;
Postfächer oder Domain-Administratoren),&lt;br /&gt;
Administration von Domains und Datenbanken (MySQL, PostgreSQL)&lt;br /&gt;
&lt;br /&gt;
Dieser Bereich ist nur für den Mitgliedsaccount und den Paketadministrator sichtbar. Der Paketadministrator sieht jeweils nur sein eigenes Paket.&lt;br /&gt;
&lt;br /&gt;
== Domain ==&lt;br /&gt;
&lt;br /&gt;
Die Domains zur Verwaltung von E-Mail Adressen&lt;br /&gt;
&lt;br /&gt;
Benutzer ohne Rolle &amp;quot;Domain-Administrator&amp;quot; können lediglich über den&lt;br /&gt;
Link oben rechts, der mit der Nutzerkennung beschriftet ist, ihr Passwort ändern.&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Hsadmin&amp;diff=5380</id>
		<title>Hsadmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Hsadmin&amp;diff=5380"/>
		<updated>2021-01-24T09:05:10Z</updated>

		<summary type="html">&lt;p&gt;Deg00-m.website: Kerndoku Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kerndoku|https://doc.hostsharing.net/einstieg/index.html}}&lt;br /&gt;
&lt;br /&gt;
Am 25. Juli 2016 wurde eine neue Web-Oberfläche in Betrieb genommen.&lt;br /&gt;
&lt;br /&gt;
Eine Einführung in die Bedienung findet Ihr auf der Seite [[HsadminWeb]]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Deg00-m.website</name></author>
	</entry>
</feed>