<?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=Cds09</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=Cds09"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Cds09"/>
	<updated>2026-04-25T20:09:28Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=7163</id>
		<title>Mnogosearch installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mnogosearch_installieren&amp;diff=7163"/>
		<updated>2024-12-03T14:51:29Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Cronjob zum Update der Suchdatenbank in der Nacht */&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=bash line&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;/syntaxhighlight&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;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
/usr/sbin/indexer -Ecreate /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erster Indexlauf ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
/usr/sbin/indexer -a /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=html&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;/syntaxhighlight&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;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
touch .htaccess&lt;br /&gt;
edit .htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=apache&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;/syntaxhighlight&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;
=== Systemd Timer 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. Dafür wird ein systemd Timer eingerichtet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/mnogosearch_update.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=update mnogosearch database&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=nice indexer /home/doms/example.com/mnogosearch/indexer.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/mnogosearch_update.timer&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=update mnogosearch database&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=23:19&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user enable mnogosearch_update.timer&lt;br /&gt;
$ systemctl --user start mnogosearch_update.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
cd mnogosearch-3.3.9&lt;br /&gt;
$yourEditor include/udm_autoconf.h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt kompilieren und installieren wir Mnogosearch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=bash&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;/syntaxhighlight&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;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
extension=relativer/Pfad/vom/PHP-Extension/Verzeichnis/zu/mnogosearch.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
php -i | grep extension_dir&lt;br /&gt;
&amp;lt;/syntaxhighlight&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>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Taiga&amp;diff=7162</id>
		<title>Taiga</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Taiga&amp;diff=7162"/>
		<updated>2024-12-03T14:46:25Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Einrichtung der Benachrichtigungen per E-Mail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Taiga installieren =&lt;br /&gt;
&lt;br /&gt;
Taiga ist eine Software für die agile Projektverwaltung. Es werden Scrum- und einfache Kanban-Projekte unterstützt. Weitere Komponenten sind ein Issue-Tracker und ein Wiki pro Projekt. User Stories können optional zu Epics zugeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Bei Hostsharing kann Taiga im Managed Webspace mit dem Apache Passenger Modul betrieben werden. Es wird eine PostgreSQL Datenbank benötigt.&lt;br /&gt;
&lt;br /&gt;
Diese Installationsanleitung beschreibt ein minimales Setup und verzichtet auf die Komponenten &amp;quot;taiga-events&amp;quot; und &amp;quot;taiga-protected&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung in HSAdmin ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden angelegt:&lt;br /&gt;
&lt;br /&gt;
* ein User mit der Shell &#039;/bin/bash&#039;, im Beispiel &amp;quot;xyz00-taiga&amp;quot;&lt;br /&gt;
* beim User wird eine Domain aufgeschaltet, mein Beispiel ist: &amp;quot;projekte.hs-example.de&amp;quot;&lt;br /&gt;
* ein PostgreSQL-User und eine PostgreSQL-Datenbank, beide heißen hier: &amp;quot;xyz00_taiga&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Installation des Backend ==&lt;br /&gt;
&lt;br /&gt;
Das Backend ist eine Python-/Django-Anwendung. Die Sourcen werden aus dem Git-Repository bei Github ausgecheckt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
git clone https://github.com/kaleidos-ventures/taiga-back&lt;br /&gt;
cd taiga-back&lt;br /&gt;
git checkout stable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann wird im Projekt-Verzeichnis ein Python.Virtualenv angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/taiga-back&lt;br /&gt;
python3 -m venv .venv --prompt taiga-back&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
(taiga-back) pip install --upgrade pip wheel&lt;br /&gt;
(taiga-back) pip install -r requirements.txt&lt;br /&gt;
(taiga-back) pip install git+https://github.com/kaleidos-ventures/taiga-contrib-protected.git@6.7.0#egg=taiga-contrib-protected&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es folgt die Konfiguration der Django-Anwendung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/taiga-back&lt;br /&gt;
cp settings/config.py.prod.example settings/config.py&lt;br /&gt;
nano settings/config.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgende Einstellungen müssen angepasst werden:&lt;br /&gt;
&lt;br /&gt;
In der Struktur &amp;quot;DATABASES&amp;quot; wird die angelegte PostgreSQL-Datenbank eingetragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
DATABASES = {&lt;br /&gt;
    &#039;default&#039;: {&lt;br /&gt;
        &#039;ENGINE&#039;: &#039;django.db.backends.postgresql&#039;,&lt;br /&gt;
        &#039;NAME&#039;: &#039;xyz00_taiga&#039;,&lt;br /&gt;
        &#039;USER&#039;: &#039;xyz00_taiga&#039;,&lt;br /&gt;
        &#039;PASSWORD&#039;: &#039;das-passwort-von-xyz00_taiga&#039;,&lt;br /&gt;
        &#039;HOST&#039;: &#039;127.0.0.1&#039;,&lt;br /&gt;
        &#039;PORT&#039;: &#039;5432&#039;,&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Variablen &amp;quot;SITES&amp;quot; und TAIGA_URL muss die richtige Domain eingetragen werden, als &amp;quot;SECRET_KEY&amp;quot; wird ein zufällige Zeichenkette eingetragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
SECRET_KEY = &amp;quot;xxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;br /&gt;
TAIGA_URL = &amp;quot;https://projekte.hs-example.de&amp;quot;&lt;br /&gt;
SITES = {&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&amp;quot;domain&amp;quot;: &amp;quot;projekte.hs-example.de&amp;quot;, &amp;quot;scheme&amp;quot;: &amp;quot;https&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;api&amp;quot;},&lt;br /&gt;
    &amp;quot;front&amp;quot;: {&amp;quot;domain&amp;quot;: &amp;quot;projekte.hs-example.de&amp;quot;, &amp;quot;scheme&amp;quot;: &amp;quot;https&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;front&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Bereich &amp;quot;MEDIA AND STATIC&amp;quot; werden die bisher auskommentierten Variablen &amp;quot;MEDIA_ROOT&amp;quot; und &amp;quot;STATIC_ROOT&amp;quot; definiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
# MEDIA_ROOT = &#039;/home/taiga/media&#039;&lt;br /&gt;
MEDIA_ROOT = &#039;/home/pacs/xyz00/users/taiga/data/media&#039;&lt;br /&gt;
MEDIA_URL = f&amp;quot;{ TAIGA_URL }/media/&amp;quot;&lt;br /&gt;
DEFAULT_FILE_STORAGE = &amp;quot;taiga_contrib_protected.storage.ProtectedFileSystemStorage&amp;quot;&lt;br /&gt;
THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE&lt;br /&gt;
# STATIC_ROOT = &#039;/home/taiga/static&#039;&lt;br /&gt;
STATIC_ROOT = &#039;/home/pacs/xyz00/users/taiga/data/static&#039;&lt;br /&gt;
STATIC_URL = f&amp;quot;{ TAIGA_URL }/static/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Versenden von E-Mail ist der Bereich &amp;quot;EMAIL&amp;quot; anzupassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
DEFAULT_FROM_EMAIL = &#039;noreply@projekte.hs-example.de&#039;&lt;br /&gt;
EMAIL_USE_TLS = True&lt;br /&gt;
EMAIL_HOST = &#039;127.0.0.1&#039;&lt;br /&gt;
EMAIL_PORT = 4587&lt;br /&gt;
EMAIL_HOST_USER = &#039;xyz00-taiga&#039;&lt;br /&gt;
EMAIL_HOST_PASSWORD = &#039;passwort-von-xyz00-taiga&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Zeilen, die mit &amp;quot;EVENTS_PUSH&amp;quot; oder &amp;quot;CELERY&amp;quot; beginnen, können auskommentiert werden, lediglich &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
CELERY_ENABLED = False&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sollte gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss ist bei mir konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
PUBLIC_REGISTER_ENABLED = True&lt;br /&gt;
USER_EMAIL_ALLOWED_DOMAINS = &amp;quot;hs-example.de&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
ENABLE_TELEMETRY = False&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man aber auch Benutzer von anderen E-Mail Domains erlauben möchte, muss man diese in &amp;lt;code&amp;gt;USER_EMAIL_ALLOWED_DOMAINS&amp;lt;/code&amp;gt; hinzufügen, oder wenn man gar keine Beschränkung möchte, diese Zeile ganz auskommentieren. Das macht zum Beispiel Sinn, wenn &amp;lt;code&amp;gt;PUBLIC_REGISTER_ENABLED&amp;lt;/code&amp;gt; abgeschaltet ist.&lt;br /&gt;
&lt;br /&gt;
Nun werden mit den folgenden Kommandos die Datenverzeichnisse angelegt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir data&lt;br /&gt;
mkdir data/static&lt;br /&gt;
mkdir data/media&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und die initialen Daten in die Datenbank geladen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/taiga-back&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py migrate --noinput&lt;br /&gt;
(taiga-back) CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py createsuperuser&lt;br /&gt;
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py loaddata initial_project_templates&lt;br /&gt;
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py compilemessages&lt;br /&gt;
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py collectstatic --noinput&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle können wir den Server testweise starten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
DJANGO_SETTINGS_MODULE=settings.config python manage.py runserver&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und in einer anderen Shell die API abfragen. Das Kommando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
curl http://localhost:8000/api/v1/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
liefert eine JSON-Datenstruktur mit der API-Definition. Den Server kann man mit &amp;quot;Ctrl-C&amp;quot; wieder beenden.&lt;br /&gt;
&lt;br /&gt;
Nun wird die Anwendung im Apache Webserver konfiguriert. Im Domain-Verzeichnis &amp;quot;~/doms/projekte.hs-example.de/&amp;quot; wird eine Datei &amp;quot;.htaccess&amp;quot; mit der Passenger-Konfiguration abgelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
SetEnv PYTHONPATH /home/pacs/xyz00/users/taiga-back&lt;br /&gt;
SetEnv PATH /home/pacs/xyz00/users/taiga-back/.venv/bin:%{ENV:PATH}&lt;br /&gt;
SetEnv DJANGO_SETTINGS_MODULE settings.config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Verzeichnisse &amp;quot;subs/www&amp;quot;, &amp;quot;subs-ssl/www&amp;quot; und &amp;quot;htdocs-ssl&amp;quot; werden gelöscht.&lt;br /&gt;
In &amp;quot;app-ssl&amp;quot; wird eine Datei &amp;quot;passenger_wsgi.py&amp;quot; mit folgendem Inhalt abgelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
from taiga.wsgi import application&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle sollte sich die Backend-API auch im Browser unter der URL &amp;quot;https://projekte.hs-example.de/api/v1/&amp;quot; aufrufen lassen. Unter &amp;quot;https://projekte.hs-example.de/admin/&amp;quot; ist eine Anmeldung mit dem angelegten Admin-Account im Django-Backend möglich.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung der Benachrichtigungen per E-Mail ==&lt;br /&gt;
Es kann ein Systemd Timer eingerichtet werden, der alle paar Minuten prüft, ob Benachrichtigungen per E-Mail hinausgeschickt werden sollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/taiga_mails.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=send mails from taiga&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=/home/pacs/xyz00/users/taiga/taiga-back&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=.venv/bin/python3 manage.py send_notifications --settings=settings.config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/taiga_mails.timer&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=send mails from taiga&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/2&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ systemctl --user enable taiga_mails.timer&lt;br /&gt;
$ systemctl --user start taiga_mails.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Absenderadresse wird übrigens am besten in der Datei &amp;lt;code&amp;gt;taiga-back/settings/config.py&amp;lt;/code&amp;gt; in der Variable &amp;lt;code&amp;gt;DEFAULT_FROM_EMAIL&amp;lt;/code&amp;gt; eingetragen.&lt;br /&gt;
&lt;br /&gt;
== Installation des Frontend ==&lt;br /&gt;
&lt;br /&gt;
Auschecken von Github:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
git clone https://github.com/kaleidos-ventures/taiga-front-dist.git taiga-front-dist&lt;br /&gt;
cd ~/taiga-front-dist&lt;br /&gt;
git checkout stable&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konfiguration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/taiga-front-dist/dist&lt;br /&gt;
cp conf.example.json conf.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;conf.json&amp;quot; muss der Wert &amp;quot;api&amp;quot; angepasst werden, ggf. kann die Default-Sprache auf &amp;quot;de&amp;quot; geändert werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json&amp;gt;&lt;br /&gt;
&amp;quot;api&amp;quot;: &amp;quot;https://projekte.hs-example.de/api/v1/&amp;quot;,&lt;br /&gt;
&amp;quot;defaultLanguage&amp;quot;: &amp;quot;de&amp;quot;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Domainverzeichnis werden zum Abschluss Links für die statischen Inhalte gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/doms/projekte.hs-example.de/&lt;br /&gt;
ln -s $HOME/taiga-front-dist/dist htdocs-ssl&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
ln -s $HOME/data/media media&lt;br /&gt;
ln -s $HOME/data/static static&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss wird in diesem Verzeichnis &amp;quot;htdocs-ssl&amp;quot; noch eine Datei &amp;quot;.htaccess&amp;quot; mit dem folgenden Inhalt angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
 &lt;br /&gt;
RewriteCond %{REQUEST_URI} !^/api(.*) &lt;br /&gt;
RewriteCond %{REQUEST_URI} !^/admin(.*)&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule ^(.*) /index.html&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Theme anpassen ==&lt;br /&gt;
&lt;br /&gt;
Falls ein paar Sachen über CSS abgeschaltet oder anders dargestellt werden sollen, gibt es die Möglichkeit, eine eigene CSS einzubinden. Dazu muss in der Datei &amp;lt;code&amp;gt;~/taiga-front-dist/dist/index.html&amp;lt;/code&amp;gt; folgende Zeile eingefügt werden (diese Zeile muss nach einem Update von Taiga wieder erneut eingetragen werden):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/v-1618228552362/styles/mytheme.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;taiga-front-dist/dist/v-1618228552362/styles/mytheme.css&amp;lt;/code&amp;gt; kann z.B. folgenden Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=css&amp;gt;&lt;br /&gt;
/* disable the search bar, and the empty highlighted project div on the discover page, before login */&lt;br /&gt;
section.discover tg-discover-search-bar, div.empty-highlighted-project   {&lt;br /&gt;
   display: None;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* hide the &amp;quot;New Project Button&amp;quot; */&lt;br /&gt;
.navbar-dropdown a.create-project-btn, .project-list-wrapper .create-project-btn {&lt;br /&gt;
    display: None;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Optionen zur Einrichtung ==&lt;br /&gt;
Falls die Registrierung von neuen Benutzern nicht jedem offen stehen sollte, müssen 2 Änderungen vorgenommen werden:&lt;br /&gt;
* in der Datei &amp;lt;code&amp;gt;taiga-back/settings/config.py&amp;lt;/code&amp;gt; muss &amp;lt;code&amp;gt;PUBLIC_REGISTER_ENABLED = False&amp;lt;/code&amp;gt; eingetragen werden.&lt;br /&gt;
* in der Datei &amp;lt;code&amp;gt;taiga-front-dist/dist/conf.json&amp;lt;/code&amp;gt; muss &amp;lt;code&amp;gt;&amp;quot;publicRegisterEnabled&amp;quot;: false,&amp;lt;/code&amp;gt; eingetragen werden.&lt;br /&gt;
* siehe auch https://docs.taiga.io/setup-faqs.html#disable-registration&lt;br /&gt;
&lt;br /&gt;
== Import von Trello Boards ==&lt;br /&gt;
siehe die Anleitung hier: https://docs.taiga.io/importers.html#_trello&lt;br /&gt;
&lt;br /&gt;
In Kurzform:&lt;br /&gt;
* Bei Trello anmelden&lt;br /&gt;
* auf https://trello.com/power-ups/admin/ gehen&lt;br /&gt;
* dort eine neue Integration anlegen: https://trello.com/power-ups/admin/new&lt;br /&gt;
* die Namen sind nicht so wichtig, die Iframe-Konnektor-URL kann leer gelassen werden.&lt;br /&gt;
* Dann im Menü auf &amp;quot;API Schlüssel&amp;quot; gehen&lt;br /&gt;
* Dort den &amp;quot;API-Schlüssel&amp;quot; kopieren&lt;br /&gt;
* Dann bei &amp;quot;Erlaubte Ursprünge&amp;quot; die eigene URL (mit https://) von Taiga hinzufügen&lt;br /&gt;
* Und den Schlüssel unter &amp;quot;Geheim&amp;quot; kopieren&lt;br /&gt;
&lt;br /&gt;
Dann mit dem nano Editor die folgende Datei bearbeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
nano taiga-back/settings/config.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Zeilen einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
IMPORTERS[&amp;quot;trello&amp;quot;] = {&lt;br /&gt;
    &amp;quot;active&amp;quot;: True,&lt;br /&gt;
    &amp;quot;api_key&amp;quot;: &amp;quot;dein-API-schlüssel&amp;quot;,&lt;br /&gt;
    &amp;quot;secret_key&amp;quot;: &amp;quot;dein-geheimer-schlüssel&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann Taiga neustarten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
~/bin/restart.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch die folgende Datei bearbeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
nano taiga-front-dist/dist/conf.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und den Wert bei &amp;lt;code&amp;gt;enableTrelloImporter&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; setzen.&lt;br /&gt;
&lt;br /&gt;
= Taiga mit Ansible installieren =&lt;br /&gt;
&lt;br /&gt;
Alternativ lässt sich Taiga auch mit einem Ansible Skript bei Hostsharing installieren.&lt;br /&gt;
Damit lassen sich die Installationsschritte automatisiert durchführen.&lt;br /&gt;
&lt;br /&gt;
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/taiga&lt;br /&gt;
&lt;br /&gt;
Dort ist auch eine README Datei mit einer Anleitung.&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* [https://resources.taiga.io/ Taiga Support Seite]&lt;br /&gt;
* [https://www.taiga.io/ Taiga Homepage]&lt;br /&gt;
* [https://docs.taiga.io/setup-production.html#_introduction Installationsanleitung (from Source Code)]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/taiga Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Python]]&lt;br /&gt;
[[Kategorie:Django]]&lt;br /&gt;
[[Kategorie:Passenger]]&lt;br /&gt;
[[Kategorie:Projektmanagement]]&lt;br /&gt;
[[Kategorie:Projektverwaltung]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mastodon_bei_Hostsharing&amp;diff=7161</id>
		<title>Mastodon bei Hostsharing</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mastodon_bei_Hostsharing&amp;diff=7161"/>
		<updated>2024-12-03T14:37:45Z</updated>

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

		<summary type="html">&lt;p&gt;Cds09: /* Einrichten des systemd Timers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
[https://www.tryton.org/ Tryton] ist eine freie Software für das Enterprise-Resource-Planning (ERP).&lt;br /&gt;
&lt;br /&gt;
Tryton lässt sich über den Web-Browser bedienen, oder über einen Desktop Client (Windows, Linux, MacOS).&lt;br /&gt;
&lt;br /&gt;
Tryton läuft mit Python und PostgreSQL oder SQLite, und lässt sich auf Linux, MacOS und Windows betreiben. &lt;br /&gt;
&lt;br /&gt;
Tryton steht unter der GPLv3 Lizenz. Die Rechte an der Marke Tryton gehören der gemeinnützigen Tryton-Stiftung mit Sitz in Belgien.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
Diese Installationsanleitung beschreibt, wie Tryton in einer eigens dafür [[Domainverwaltung#Lokale_Subdomains_durch_Aufschalten.3B_Delegieren|aufgeschalteten Subdomain]] über SSL betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil einer Installation in einer aufgeschalteten Subdomain ist, daß die Installation leicht von anderen Domaininhalten, Passenger-Konfigurationen, oder sogar von anderen Domain-Administratoren, isoliert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Subdomain aufschalten ===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden folgende Domainkonfigurationsdaten als Beispiel verwendet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Subdomain || &amp;lt;tt&amp;gt;tryton.example.org&amp;lt;/tt&amp;gt;  || Die Subdomain, unter der eine Tryton-Instanz laufen soll&lt;br /&gt;
|-&lt;br /&gt;
| Domain-Admin || &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; || Der User, dem die Subdomain delegiert wurde&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL vorbereiten ===&lt;br /&gt;
&lt;br /&gt;
Tryton benötigt eine PostgreSQL-Datenbank sowie einen Datenbanknutzer.&lt;br /&gt;
&lt;br /&gt;
Die Tabellen werden später vom Installations-Werkzeug von Tryton eigenständig angelegt.&lt;br /&gt;
&lt;br /&gt;
==== Datenbank und Datenbanknutzer anlegen ====&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung werden folgende Namen für die Datenbank und deren Nutzer verwendet. Das Paket-Kürzel &amp;lt;tt&amp;gt;xyz00&amp;lt;/tt&amp;gt; ist natürlich durch das des betreffenden Pakets zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| DB-Nutzer || &amp;lt;tt&amp;gt;xyz00_tryton&amp;lt;/tt&amp;gt; || Der PostgreSQL-Nutzer, dem die Datenbank gehört und der administrative Tätigkeiten durchführt und dann auch im Betrieb genutzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Datenbank || &amp;lt;tt&amp;gt;xyz00_tryton&amp;lt;/tt&amp;gt;  || Die PostgreSQL-Datenbank, die die Daten von Tryton enthält.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Nutzer und die Datenbank können über die Weboberfläche auf [https://admin.hostsharing.net/ https://admin.hostsharing.net] oder über die Kommandozeile mit [[Hsadmin]] angelegt werden. Siehe dazu die Anleitungen auf der Seite [[PostgreSQL]] und [[Datenbanken]]. Diese Schritte müssen ggf. vom Paket-Admin vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Einrichtung über die Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
Mit dem Paketbenutzer (xyz00, nicht xyz00-hans) diese Befehle ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00$ hsscript -u xyz00 -e &amp;quot;postgresqluser.add ({set:{name:&#039;xyz00_tryton&#039;,password:&#039;TopSecret:@0815&#039;}})&amp;quot;&lt;br /&gt;
xyz00$ hsscript -u xyz00 -e &amp;quot;postgresqldb.add ({set:{name:&#039;xyz00_tryton&#039;,owner:&#039;xyz00_tryton&#039;}})&amp;quot;&lt;br /&gt;
xyz00$ exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das PostgreSQL Passwort muss später url-kodiert in die tryton.ini eingefügt werden, damit die Sonderzeichen keine Probleme machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ python&lt;br /&gt;
Python 3.7.3 (default, Jan 22 2021, 20:04:44) &lt;br /&gt;
[GCC 8.3.0] on linux&lt;br /&gt;
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import urllib.parse&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; query = &#039;TopSecret:@0815&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; urllib.parse.quote(query)&lt;br /&gt;
&#039;TopSecret%3A%400815&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von Tryton Core und ERP Modulen ===&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ mkdir ~/tryton&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ python3 -m venv .venv&lt;br /&gt;
xyz00-hans$ source .venv/bin/activate&lt;br /&gt;
(.venv) xyz00-hans$ pip install wheel&lt;br /&gt;
(.venv) xyz00-hans$ pip install trytond&lt;br /&gt;
(.venv) xyz00-hans$ # die Unterstützung für PostgreSQL installieren&lt;br /&gt;
(.venv) xyz00-hans$ pip install psycopg2&lt;br /&gt;
(.venv) xyz00-hans$ # ein ERP Module installieren&lt;br /&gt;
(.venv) xyz00-hans$ pip install trytond_sale&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere ERP Module sind hier zu finden: [http://hg.tryton.org/modules Tryton Module]&lt;br /&gt;
&lt;br /&gt;
=== Installation von Node ===&lt;br /&gt;
&lt;br /&gt;
Für die Installation des Web Clients wird Node benötigt.&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv&lt;br /&gt;
xyz00-hans$ echo &#039;export PATH=&amp;quot;$HOME/.nodenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-hans$ echo &#039;eval &amp;quot;$(nodenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-hans$ source ~/.profile&lt;br /&gt;
xyz00-hans$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build&lt;br /&gt;
xyz00-hans$ nodenv install 12.18.4&lt;br /&gt;
xyz00-hans$ nodenv rehash&lt;br /&gt;
xyz00-hans$ nodenv global 12.18.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Test mit &#039;&#039;node --version&#039;&#039; solte anzeigen: v12.18.4&lt;br /&gt;
&lt;br /&gt;
=== Installation des Web Clients ===&lt;br /&gt;
&lt;br /&gt;
Jetzt soll der Web Client eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ git clone --single-branch --branch 6.2 https://github.com/tryton/sao.git&lt;br /&gt;
xyz00-hans$ cd sao&lt;br /&gt;
xyz00-hans$ source ~/.profile&lt;br /&gt;
xyz00-hans$ npm install bower --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install po2json --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install grunt-po2json --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install --production --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install grunt --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ node_modules/grunt/bin/grunt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdateien einrichten ===&lt;br /&gt;
&lt;br /&gt;
Nun muss noch eine Konfigurationsdatei angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/tryton/tryton.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben. Hier muss das url-kodierte PostgreSQL Passwort von oben eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[database]&lt;br /&gt;
uri = postgresql://xyz00_tryton:TopSecret%3A%400815@localhost/&lt;br /&gt;
path = /home/pacs/xyz00/users/hans/tryton&lt;br /&gt;
&lt;br /&gt;
[web]&lt;br /&gt;
root = /home/pacs/xyz00/users/hans/tryton/sao&lt;br /&gt;
hostname = tryton.example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren sollte eine Konfigurationsdatei für das Logging angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/tryton/logging.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[formatters]&lt;br /&gt;
keys=simple&lt;br /&gt;
&lt;br /&gt;
[handlers]&lt;br /&gt;
keys=rotate,console&lt;br /&gt;
&lt;br /&gt;
[loggers]&lt;br /&gt;
keys=root&lt;br /&gt;
&lt;br /&gt;
[formatter_simple]&lt;br /&gt;
format=%(asctime)s] %(levelname)s:%(name)s:%(message)s&lt;br /&gt;
datefmt=%a %b %d %H:%M:%S %Y&lt;br /&gt;
&lt;br /&gt;
[handler_rotate]&lt;br /&gt;
class=handlers.TimedRotatingFileHandler&lt;br /&gt;
args=(&#039;/home/pacs/xyz00/users/hans/tryton/tryton.log&#039;, &#039;D&#039;, 1, 30)&lt;br /&gt;
formatter=simple&lt;br /&gt;
&lt;br /&gt;
[handler_console]&lt;br /&gt;
class=StreamHandler&lt;br /&gt;
formatter=simple&lt;br /&gt;
args=(sys.stdout,)&lt;br /&gt;
&lt;br /&gt;
[logger_root]&lt;br /&gt;
level=ERROR&lt;br /&gt;
handlers=rotate,console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Logging Levels sind hier zu finden: [https://docs.python.org/3/library/logging.html#logging-levels Tryton Logging Levels], z.B. CRITICAL, ERROR, WARNING, INFO, DEBUG&lt;br /&gt;
&lt;br /&gt;
=== Einrichten der Instanz ===&lt;br /&gt;
&lt;br /&gt;
Jetzt kann die Instanz eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Hier muss man interaktiv für den Benutzer admin eine E-Mail Adresse angeben und das Passwort setzen, und es werden automatisiert die Tabellen in der Datenbank eingerichtet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ source .venv/bin/activate&lt;br /&gt;
xyz00-hans$ python ./.venv/bin/trytond-admin -c tryton.ini -d xyz00_tryton --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichten des systemd Timers ===&lt;br /&gt;
&lt;br /&gt;
Falls geplante Aufgaben ausgeführt werden sollen, muss der systemd Timer folgendermaßen eingerichtet werden:&lt;br /&gt;
~/bin/tryton_planned.sh&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#! /usr/bin/env bash&lt;br /&gt;
&lt;br /&gt;
cd ~/tryton&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
python .venv/bin/trytond-cron -c tryton.ini -d xyz00_tryton --once&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/tryton_planned.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=tryton planned jobs&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/hans//bin/tryton_planned.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/tryton_planned.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=tryton planned jobs&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ chmod +x ~/bin/tryton_planned.sh&lt;br /&gt;
$ systemctl --user enable tryton_planned.timer&lt;br /&gt;
$ systemctl --user start tryton_planned.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das *:0/5 bedeutet, dass der Timer alle 5 Minuten ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
=== Einrichten der Webseite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/doms/tryton.example.org/&lt;br /&gt;
xyz00-hans$ rm -Rf htdocs-ssl&lt;br /&gt;
xyz00-hans$ ln -s ~/tryton/sao/ htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es muss diese Datei .htaccess angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/doms/tryton.example.org/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerPython /home/pacs/xyz00/users/hans/tryton/.venv/bin/python&lt;br /&gt;
SetEnv PYTHONPATH /home/pacs/xyz00/users/hans/tryton/.venv/lib/python3.7/site-packages/trytond&lt;br /&gt;
SetEnv TRYTOND_CONFIG /home/pacs/xyz00/users/hans/tryton/tryton.ini&lt;br /&gt;
SetEnv TRYTOND_LOGGING_CONFIG /home/pacs/xyz00/users/hans/tryton/logging.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch diese Datei anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/doms/tryton.example.org/app-ssl/passenger_wsgi.py&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=python&amp;gt;&lt;br /&gt;
from trytond.application import app as application&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Nun ist der Web Client von Tryton auf https://tryton.example.org erreichbar.&lt;br /&gt;
&lt;br /&gt;
Die Datenbank xyz00_tryton ist voreingestellt.&lt;br /&gt;
&lt;br /&gt;
Man meldet sich mit dem Benutzer &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; und dem vorhin konfigurierten Passwort an.&lt;br /&gt;
&lt;br /&gt;
Hier könnte noch beschrieben werden, wie man Benutzer anlegt, die Buchhaltung einrichtet usw. Aber das würde den Rahmen dieser Installationsanwendung sprengen...&lt;br /&gt;
&lt;br /&gt;
== Tryton Fat Client ==&lt;br /&gt;
&lt;br /&gt;
Neben dem Web Client gibt es auch den lokal laufenden Client (aka Fat Client). &lt;br /&gt;
&lt;br /&gt;
Für Windows oder MacOS kann der Fat Client über einen Installer installiert werden, siehe https://www.tryton.org/download#desktop-client&lt;br /&gt;
&lt;br /&gt;
Unter einem beliebigen Linux Desktop kann er über die folgenden Befehle installiert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python3 -m venv .venv&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
pip install tryton&lt;br /&gt;
python .venv/bin/tryton&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Fat Client muss man folgenden Wert beim Host angeben: &amp;lt;code&amp;gt;tryton.example.org:443&amp;lt;/code&amp;gt;&lt;br /&gt;
und dann noch die entsprechende Datenbank: &amp;lt;code&amp;gt;xyz00_tryton&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[https://www.tryton.org/ Tryton Webseite]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/tryton Ansible Playbook für Hostsharing]&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:ERP]]&lt;br /&gt;
[[Kategorie:CRM]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Tryton_installieren&amp;diff=7159</id>
		<title>Tryton installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Tryton_installieren&amp;diff=7159"/>
		<updated>2024-12-03T14:15:18Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Einrichten des Cronjobs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
[https://www.tryton.org/ Tryton] ist eine freie Software für das Enterprise-Resource-Planning (ERP).&lt;br /&gt;
&lt;br /&gt;
Tryton lässt sich über den Web-Browser bedienen, oder über einen Desktop Client (Windows, Linux, MacOS).&lt;br /&gt;
&lt;br /&gt;
Tryton läuft mit Python und PostgreSQL oder SQLite, und lässt sich auf Linux, MacOS und Windows betreiben. &lt;br /&gt;
&lt;br /&gt;
Tryton steht unter der GPLv3 Lizenz. Die Rechte an der Marke Tryton gehören der gemeinnützigen Tryton-Stiftung mit Sitz in Belgien.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
Diese Installationsanleitung beschreibt, wie Tryton in einer eigens dafür [[Domainverwaltung#Lokale_Subdomains_durch_Aufschalten.3B_Delegieren|aufgeschalteten Subdomain]] über SSL betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil einer Installation in einer aufgeschalteten Subdomain ist, daß die Installation leicht von anderen Domaininhalten, Passenger-Konfigurationen, oder sogar von anderen Domain-Administratoren, isoliert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Subdomain aufschalten ===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden folgende Domainkonfigurationsdaten als Beispiel verwendet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Subdomain || &amp;lt;tt&amp;gt;tryton.example.org&amp;lt;/tt&amp;gt;  || Die Subdomain, unter der eine Tryton-Instanz laufen soll&lt;br /&gt;
|-&lt;br /&gt;
| Domain-Admin || &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; || Der User, dem die Subdomain delegiert wurde&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL vorbereiten ===&lt;br /&gt;
&lt;br /&gt;
Tryton benötigt eine PostgreSQL-Datenbank sowie einen Datenbanknutzer.&lt;br /&gt;
&lt;br /&gt;
Die Tabellen werden später vom Installations-Werkzeug von Tryton eigenständig angelegt.&lt;br /&gt;
&lt;br /&gt;
==== Datenbank und Datenbanknutzer anlegen ====&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung werden folgende Namen für die Datenbank und deren Nutzer verwendet. Das Paket-Kürzel &amp;lt;tt&amp;gt;xyz00&amp;lt;/tt&amp;gt; ist natürlich durch das des betreffenden Pakets zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
! Typ                                          !! Wert                                !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| DB-Nutzer || &amp;lt;tt&amp;gt;xyz00_tryton&amp;lt;/tt&amp;gt; || Der PostgreSQL-Nutzer, dem die Datenbank gehört und der administrative Tätigkeiten durchführt und dann auch im Betrieb genutzt wird.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Datenbank || &amp;lt;tt&amp;gt;xyz00_tryton&amp;lt;/tt&amp;gt;  || Die PostgreSQL-Datenbank, die die Daten von Tryton enthält.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Nutzer und die Datenbank können über die Weboberfläche auf [https://admin.hostsharing.net/ https://admin.hostsharing.net] oder über die Kommandozeile mit [[Hsadmin]] angelegt werden. Siehe dazu die Anleitungen auf der Seite [[PostgreSQL]] und [[Datenbanken]]. Diese Schritte müssen ggf. vom Paket-Admin vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Einrichtung über die Kommandozeile:&lt;br /&gt;
&lt;br /&gt;
Mit dem Paketbenutzer (xyz00, nicht xyz00-hans) diese Befehle ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00$ hsscript -u xyz00 -e &amp;quot;postgresqluser.add ({set:{name:&#039;xyz00_tryton&#039;,password:&#039;TopSecret:@0815&#039;}})&amp;quot;&lt;br /&gt;
xyz00$ hsscript -u xyz00 -e &amp;quot;postgresqldb.add ({set:{name:&#039;xyz00_tryton&#039;,owner:&#039;xyz00_tryton&#039;}})&amp;quot;&lt;br /&gt;
xyz00$ exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das PostgreSQL Passwort muss später url-kodiert in die tryton.ini eingefügt werden, damit die Sonderzeichen keine Probleme machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ python&lt;br /&gt;
Python 3.7.3 (default, Jan 22 2021, 20:04:44) &lt;br /&gt;
[GCC 8.3.0] on linux&lt;br /&gt;
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import urllib.parse&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; query = &#039;TopSecret:@0815&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; urllib.parse.quote(query)&lt;br /&gt;
&#039;TopSecret%3A%400815&#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; exit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von Tryton Core und ERP Modulen ===&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ mkdir ~/tryton&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ python3 -m venv .venv&lt;br /&gt;
xyz00-hans$ source .venv/bin/activate&lt;br /&gt;
(.venv) xyz00-hans$ pip install wheel&lt;br /&gt;
(.venv) xyz00-hans$ pip install trytond&lt;br /&gt;
(.venv) xyz00-hans$ # die Unterstützung für PostgreSQL installieren&lt;br /&gt;
(.venv) xyz00-hans$ pip install psycopg2&lt;br /&gt;
(.venv) xyz00-hans$ # ein ERP Module installieren&lt;br /&gt;
(.venv) xyz00-hans$ pip install trytond_sale&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere ERP Module sind hier zu finden: [http://hg.tryton.org/modules Tryton Module]&lt;br /&gt;
&lt;br /&gt;
=== Installation von Node ===&lt;br /&gt;
&lt;br /&gt;
Für die Installation des Web Clients wird Node benötigt.&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv&lt;br /&gt;
xyz00-hans$ echo &#039;export PATH=&amp;quot;$HOME/.nodenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-hans$ echo &#039;eval &amp;quot;$(nodenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-hans$ source ~/.profile&lt;br /&gt;
xyz00-hans$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build&lt;br /&gt;
xyz00-hans$ nodenv install 12.18.4&lt;br /&gt;
xyz00-hans$ nodenv rehash&lt;br /&gt;
xyz00-hans$ nodenv global 12.18.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Test mit &#039;&#039;node --version&#039;&#039; solte anzeigen: v12.18.4&lt;br /&gt;
&lt;br /&gt;
=== Installation des Web Clients ===&lt;br /&gt;
&lt;br /&gt;
Jetzt soll der Web Client eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Als Domain-Admin &amp;lt;tt&amp;gt;xyz00-hans&amp;lt;/tt&amp;gt; folgende Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ git clone --single-branch --branch 6.2 https://github.com/tryton/sao.git&lt;br /&gt;
xyz00-hans$ cd sao&lt;br /&gt;
xyz00-hans$ source ~/.profile&lt;br /&gt;
xyz00-hans$ npm install bower --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install po2json --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install grunt-po2json --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install --production --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ npm install grunt --legacy-peer-deps&lt;br /&gt;
xyz00-hans$ node_modules/grunt/bin/grunt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdateien einrichten ===&lt;br /&gt;
&lt;br /&gt;
Nun muss noch eine Konfigurationsdatei angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/tryton/tryton.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben. Hier muss das url-kodierte PostgreSQL Passwort von oben eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[database]&lt;br /&gt;
uri = postgresql://xyz00_tryton:TopSecret%3A%400815@localhost/&lt;br /&gt;
path = /home/pacs/xyz00/users/hans/tryton&lt;br /&gt;
&lt;br /&gt;
[web]&lt;br /&gt;
root = /home/pacs/xyz00/users/hans/tryton/sao&lt;br /&gt;
hostname = tryton.example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des weiteren sollte eine Konfigurationsdatei für das Logging angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/tryton/logging.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[formatters]&lt;br /&gt;
keys=simple&lt;br /&gt;
&lt;br /&gt;
[handlers]&lt;br /&gt;
keys=rotate,console&lt;br /&gt;
&lt;br /&gt;
[loggers]&lt;br /&gt;
keys=root&lt;br /&gt;
&lt;br /&gt;
[formatter_simple]&lt;br /&gt;
format=%(asctime)s] %(levelname)s:%(name)s:%(message)s&lt;br /&gt;
datefmt=%a %b %d %H:%M:%S %Y&lt;br /&gt;
&lt;br /&gt;
[handler_rotate]&lt;br /&gt;
class=handlers.TimedRotatingFileHandler&lt;br /&gt;
args=(&#039;/home/pacs/xyz00/users/hans/tryton/tryton.log&#039;, &#039;D&#039;, 1, 30)&lt;br /&gt;
formatter=simple&lt;br /&gt;
&lt;br /&gt;
[handler_console]&lt;br /&gt;
class=StreamHandler&lt;br /&gt;
formatter=simple&lt;br /&gt;
args=(sys.stdout,)&lt;br /&gt;
&lt;br /&gt;
[logger_root]&lt;br /&gt;
level=ERROR&lt;br /&gt;
handlers=rotate,console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Logging Levels sind hier zu finden: [https://docs.python.org/3/library/logging.html#logging-levels Tryton Logging Levels], z.B. CRITICAL, ERROR, WARNING, INFO, DEBUG&lt;br /&gt;
&lt;br /&gt;
=== Einrichten der Instanz ===&lt;br /&gt;
&lt;br /&gt;
Jetzt kann die Instanz eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Hier muss man interaktiv für den Benutzer admin eine E-Mail Adresse angeben und das Passwort setzen, und es werden automatisiert die Tabellen in der Datenbank eingerichtet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/tryton&lt;br /&gt;
xyz00-hans$ source .venv/bin/activate&lt;br /&gt;
xyz00-hans$ python ./.venv/bin/trytond-admin -c tryton.ini -d xyz00_tryton --all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichten des systemd Timers ===&lt;br /&gt;
&lt;br /&gt;
Falls geplante Aufgaben ausgeführt werden sollen, muss der systemd Timer folgendermaßen eingerichtet werden:&lt;br /&gt;
~/bin/tryton_planned.sh&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#! /usr/bin/env bash&lt;br /&gt;
&lt;br /&gt;
cd ~/tryton&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
python .venv/bin/trytond-cron -c tryton.ini -d xyz00_tryton --once&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/tryton_planned.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=tryton planned jobs&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/hans//bin/tryton_planned.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/tryton_planned.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=tryton planned jobs&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ chmod +x ~/bin/tryton_planned.sh&lt;br /&gt;
$ systemctl --user enable tryton_planned.timer&lt;br /&gt;
$ systemctl --user start tryton_planned.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das *:0/5 bedeutet, dass der Cronjob alle 5 Minuten ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
=== Einrichten der Webseite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ cd ~/doms/tryton.example.org/&lt;br /&gt;
xyz00-hans$ rm -Rf htdocs-ssl&lt;br /&gt;
xyz00-hans$ ln -s ~/tryton/sao/ htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es muss diese Datei .htaccess angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/doms/tryton.example.org/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte diesen Inhalt haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerPython /home/pacs/xyz00/users/hans/tryton/.venv/bin/python&lt;br /&gt;
SetEnv PYTHONPATH /home/pacs/xyz00/users/hans/tryton/.venv/lib/python3.7/site-packages/trytond&lt;br /&gt;
SetEnv TRYTOND_CONFIG /home/pacs/xyz00/users/hans/tryton/tryton.ini&lt;br /&gt;
SetEnv TRYTOND_LOGGING_CONFIG /home/pacs/xyz00/users/hans/tryton/logging.ini&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann noch diese Datei anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-hans$ nano ~/doms/tryton.example.org/app-ssl/passenger_wsgi.py&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=python&amp;gt;&lt;br /&gt;
from trytond.application import app as application&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
Nun ist der Web Client von Tryton auf https://tryton.example.org erreichbar.&lt;br /&gt;
&lt;br /&gt;
Die Datenbank xyz00_tryton ist voreingestellt.&lt;br /&gt;
&lt;br /&gt;
Man meldet sich mit dem Benutzer &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; und dem vorhin konfigurierten Passwort an.&lt;br /&gt;
&lt;br /&gt;
Hier könnte noch beschrieben werden, wie man Benutzer anlegt, die Buchhaltung einrichtet usw. Aber das würde den Rahmen dieser Installationsanwendung sprengen...&lt;br /&gt;
&lt;br /&gt;
== Tryton Fat Client ==&lt;br /&gt;
&lt;br /&gt;
Neben dem Web Client gibt es auch den lokal laufenden Client (aka Fat Client). &lt;br /&gt;
&lt;br /&gt;
Für Windows oder MacOS kann der Fat Client über einen Installer installiert werden, siehe https://www.tryton.org/download#desktop-client&lt;br /&gt;
&lt;br /&gt;
Unter einem beliebigen Linux Desktop kann er über die folgenden Befehle installiert und gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python3 -m venv .venv&lt;br /&gt;
source .venv/bin/activate&lt;br /&gt;
pip install tryton&lt;br /&gt;
python .venv/bin/tryton&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim Fat Client muss man folgenden Wert beim Host angeben: &amp;lt;code&amp;gt;tryton.example.org:443&amp;lt;/code&amp;gt;&lt;br /&gt;
und dann noch die entsprechende Datenbank: &amp;lt;code&amp;gt;xyz00_tryton&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[https://www.tryton.org/ Tryton Webseite]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/tryton Ansible Playbook für Hostsharing]&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:ERP]]&lt;br /&gt;
[[Kategorie:CRM]]&lt;br /&gt;
[[Kategorie:Python]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7158</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7158"/>
		<updated>2024-12-03T14:06:12Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Service einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Gitea installieren ==&lt;br /&gt;
&lt;br /&gt;
[https://gitea.io/en-us/ Gitea] ist ein einfacher, selbst gehosteter Git-Service wie GitHub oder GitLab. Die Software ist ein Fork von Gogs und ebenfalls in der Programmiersprache Go geschrieben. Gitea benötigt wenig Ressourcen. Um Gitea auf der Hostsharing Plattform nutzen zu können, benötigt man entweder einen Managed Server oder man muss für seinen Managed Webspace einen Daemon hinzubuchen.&lt;br /&gt;
&lt;br /&gt;
Gitea unterstützt verschiedene Datenbanken. Wir gehen in dieser Anleitung davon aus, dass PostgreSQL benutzt wird.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung der Installation ===&lt;br /&gt;
&lt;br /&gt;
Um Gitea auf der Managed Operation Platform von Hostsharing zu installieren, ist folgende Vorbereitung erforderlich.&lt;br /&gt;
&lt;br /&gt;
# Anlegen eines Domain-Benutzers. In unserem Beispiel &amp;lt;code&amp;gt;xyz00-gitea&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen einer Domain. In unserem Beispiel &amp;lt;code&amp;gt;gitea.hs-example.de&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen eines Datenbank-Benutzers. Hier &amp;lt;code&amp;gt;xyz00_giteadbuser&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen einer Datenbank. Hier &amp;lt;code&amp;gt;xyz00_giteadb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile kann man dies folgendermaßen erledigen.&lt;br /&gt;
&lt;br /&gt;
Man loggt sich als Paketbenutzer ein und startet die Kommandozeilenversion von HSAdmin mit dem Befehl &amp;lt;code&amp;gt;hsscript&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann man die Vorbereitungsschritte 1 bis 4 erledigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-gitea&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;gitea.hs-example.de&#039;,user:&#039;xyz00-gitea&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_giteadbuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_giteadb&#039;,owner:&#039;xyz00_giteadbuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von Gitea ===&lt;br /&gt;
&lt;br /&gt;
Gitea wird als Binary zur Verfügung gestellt.&lt;br /&gt;
Wir installieren das Binary im Verzeichnis des Domain-Benutzers.&lt;br /&gt;
Wenn wir als Paketbenutzer eingeloggt sind, können wir den Benutzer folgendermaßen wechseln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
sudo -u xyz00-gitea -i&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Nun laden wir das passende Binary herunter.&lt;br /&gt;
Auf der Website https://dl.gitea.io/gitea/ finden Sie das jeweils aktuelle Binary (hier die 64-Bit-Version, &lt;br /&gt;
für die shared Server h01 bis h08 bitte die 32-Bit-Version gitea-1.7.0-linux-i386 herunterladen).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O gitea https://dl.gitea.io/gitea/1.7.0/gitea-1.7.0-linux-amd64&lt;br /&gt;
chmod +x gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir laden die GPG-Signatur herunter und überprüfen sie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget https://dl.gitea.io/gitea/1.7.0/gitea-1.7.0-linux-amd64.asc&lt;br /&gt;
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2&lt;br /&gt;
gpg --verify gitea-1.7.0-linux-amd64.asc gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können wir Gitea testweise starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
./gitea web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Webserver von Gitea startet auf dem Port 3000. Das werden wir später ändern.&lt;br /&gt;
&lt;br /&gt;
Der Server kann mit Ctrl-C beendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration der Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst wechseln wir in das Verzeichnis &amp;lt;code&amp;gt;doms/gitea.hs-example.de&amp;lt;/code&amp;gt; und löschen den Ordner für die Subdomain &#039;www&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm -rf subs/www&lt;br /&gt;
rm -rf subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend tragen wir die Umleitung auf HTTPS ein, falls dies nicht schon geschehen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
vi htdocs/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Der Eintrag muss lauten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
Redirect permanent / https://gitea.hs-example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Dann legen wir die Datei &amp;lt;code&amp;gt;htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^(.*) http://localhost:31580/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Merken Sie sich die Portnummer 31580.&lt;br /&gt;
Sie wird später bei der Konfiguration von Gitea gebraucht.&lt;br /&gt;
Die Portnummer bekommen Sie vom Hostmaster, wenn Sie für Ihren Webspace einen Serverdienst (Daemon) buchen.&lt;br /&gt;
Wenn Sie einen Managed Server haben, können Sie selbst die Portnummer auswählen.&lt;br /&gt;
&lt;br /&gt;
Damit ist die Konfiguration von Apache abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von Gitea ===&lt;br /&gt;
&lt;br /&gt;
Wir editieren nun die Konfigurationsdatei von Gitea &amp;lt;code&amp;gt;app.ini&amp;lt;/code&amp;gt;.&lt;br /&gt;
Sie befindet sich in dem Verzeichnis &amp;lt;code&amp;gt;~/custom/conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Sie können die Konfiguration teilweise auch über das Webinterface durchführen. Starten Sie dazu Gitea, wie oben beschrieben, und versuchen Sie einen Benutzer zu registrieren. Daraufhin öffnet sich der Konfigurationsdialog. Sie müssen den Gitea-Benutzer, den Namen der Datenbank, den Datenbank-Benutzer und sein Passwort parat haben.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei beginnt mit allgemeinen Einträgen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
APP_NAME = Gitea: Git with a cup of tea&lt;br /&gt;
RUN_USER = xyz00-gitea&lt;br /&gt;
RUN_MODE = prod&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt [database] folgen die Angaben zur Datenbank:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[database]&lt;br /&gt;
DB_TYPE  = postgres&lt;br /&gt;
HOST     = 127.0.0.1:5432&lt;br /&gt;
NAME     = xyz00_giteadb&lt;br /&gt;
USER     = xyz00_giteadbuser&lt;br /&gt;
PASSWD   = geheim&lt;br /&gt;
SSL_MODE = disable&lt;br /&gt;
PATH     = data/gitea.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es folgt der Pfad zu den Git-Repositorys und die Server-Konfiguration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[repository]&lt;br /&gt;
ROOT = /home/pacs/xyz00/users/gitea/gitea-repositories&lt;br /&gt;
    &lt;br /&gt;
[server]&lt;br /&gt;
PROTOCOL         = http&lt;br /&gt;
SSH_DOMAIN       = gitea.hs-example.de &lt;br /&gt;
DOMAIN           = gitea.hs-example.de&lt;br /&gt;
HTTP_ADDR        = localhost&lt;br /&gt;
HTTP_PORT        = 31580&lt;br /&gt;
ROOT_URL         = https://gitea.hs-example.de/&lt;br /&gt;
DISABLE_SSH      = false&lt;br /&gt;
SSH_PORT         = 22&lt;br /&gt;
LFS_START_SERVER = true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Schreiben der Log Datei können Sie folgendes konfigurieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[log]&lt;br /&gt;
MODE       = file&lt;br /&gt;
LEVEL      = info&lt;br /&gt;
ROOT_PATH  = /home/pacs/xyz00/users/gitea/custom/logs/&lt;br /&gt;
ROUTER     = file&lt;br /&gt;
LOG_ROTATE = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte prüfen Sie, ob der Ordner zum Speichern der Log-Dateien von Gitea vorhanden ist. Bei Bedarf erstellen Sie die Ordnerstruktur entsprechend.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p /home/pacs/xyz00/users/gitea/custom/logs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können nun Gitea starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
./gitea web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Der Git-Service ist dann im Browser unter der Adresse gitea.hs-example.de erreichbar.&lt;br /&gt;
&lt;br /&gt;
=== Service einrichten ===&lt;br /&gt;
&lt;br /&gt;
Zum Schluss müssen Sie noch den Service zum Starten von Gitea einrichten.&lt;br /&gt;
&lt;br /&gt;
Das Service Skript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/.config/systemd/user/gitea.service&amp;lt;/code&amp;gt; ab.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
Description=Gitea&lt;br /&gt;
    &lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=on-abort&lt;br /&gt;
WorkingDirectory=%h&lt;br /&gt;
ExecStart=%h/gitea web&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;
Nun können Sie noch die Rotation der Logfiles konfigurieren.&lt;br /&gt;
Dies geschieht in der Datei &amp;lt;code&amp;gt;~/.logrotate&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
/home/pacs/xyz00/users/gitea/custom/logs/gitea.log {&lt;br /&gt;
  copytruncate&lt;br /&gt;
  daily&lt;br /&gt;
  rotate 7&lt;br /&gt;
  compress&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit logrotate regelmäßig ausgeführt wird, müssen Sie folgenden systemd Timer für denv Domain-Benutzers einrichten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/gitea_logrotate.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate gittea logs&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/sbin/logrotate -s /home/pacs/xyz00/users/gitea/.logrotate.state /home/pacs/xyz00/users/gitea/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/gitea_logrotate.timer&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate gittea logs&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:51&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user enable gitea_logrotate.timer&lt;br /&gt;
$ systemctl --user start gitea_logrotate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit für die Logrotation können Sie beliebig einstellen.&lt;br /&gt;
&lt;br /&gt;
Abschließend können Sie Ihre Gitea-Instanz starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
systemctl --user start gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte beachten Sie, dass für die Ausführung von Benutzerskripten mit systemctl für den aktuellen Benutzer im hsadmin die Shell &amp;quot;/bin/bash&amp;quot; konfiguriert sein muss.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung über LDAP einrichten ===&lt;br /&gt;
&lt;br /&gt;
Ohne weitere Konfiguration, können nun lokale Benutzer angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Falls Sie die Benutzerverwaltung noch an ein LDAP Verzeichnis anschließen wollen, können Sie diese Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
Sie finden hier die Informationen zum Einrichten eines OpenLDAP Dienstes: [[OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
Gehen Sie in der Weboberfläche von Git in die Administration, und dort in den Reiter &amp;quot;Authentifizierungsquellen&amp;quot;, oder direkt auf dem Link https://git.hs-example.de/admin/auths&lt;br /&gt;
&lt;br /&gt;
Dort sollten dann folgende Werte eingetragen werden:&lt;br /&gt;
* Authentifizierungstyp: LDAP (via BindDN)&lt;br /&gt;
* Host: &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (bzw. der Name des Servers, auf dem OpenLDAP erreichbar ist)&lt;br /&gt;
* Port: &amp;lt;code&amp;gt;30389&amp;lt;/code&amp;gt; (bzw. der Port auf dem OpenLDAP erreichbar ist)&lt;br /&gt;
* DN binden: &amp;lt;code&amp;gt;cn=admin,dc=hs-example,dc=de&amp;lt;/code&amp;gt; (Der Benutzer der Zugriff auf alle Benutzer hat)&lt;br /&gt;
* Passwort binden: Das Passwort von dem DN Benutzer&lt;br /&gt;
* Basis für Benutzersuche: &amp;lt;code&amp;gt;ou=users,dc=hs-example,dc=de&amp;lt;/code&amp;gt;&lt;br /&gt;
* Benutzerfilter: &amp;lt;code&amp;gt;(&amp;amp;(objectClass=inetOrgPerson)(uid=%s))&amp;lt;/code&amp;gt;&lt;br /&gt;
* Admin-Filter: &amp;lt;code&amp;gt;(memberof=cn=admins,ou=groups,dc=hs-example,dc=de)&amp;lt;/code&amp;gt; (diese Benutzer haben Admin Rechte in Gitea)&lt;br /&gt;
* Benutzernamens-Attribute: &amp;lt;code&amp;gt;DN&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vornamensattribut: &amp;lt;code&amp;gt;givenName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nachnamensattribut: &amp;lt;code&amp;gt;sn&amp;lt;/code&amp;gt;&lt;br /&gt;
* E-Mail-Attribut: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Screenshot:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Gitea_LDAP_Einrichtung.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitea.io/ Gitea Webseite]&lt;br /&gt;
* [https://docs.gitea.io/ Dokumentation von Gitea]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/gitea Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Projektmanagement]]&lt;br /&gt;
[[Kategorie:Projektverwaltung]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7157</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7157"/>
		<updated>2024-12-03T14:05:40Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Service einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Gitea installieren ==&lt;br /&gt;
&lt;br /&gt;
[https://gitea.io/en-us/ Gitea] ist ein einfacher, selbst gehosteter Git-Service wie GitHub oder GitLab. Die Software ist ein Fork von Gogs und ebenfalls in der Programmiersprache Go geschrieben. Gitea benötigt wenig Ressourcen. Um Gitea auf der Hostsharing Plattform nutzen zu können, benötigt man entweder einen Managed Server oder man muss für seinen Managed Webspace einen Daemon hinzubuchen.&lt;br /&gt;
&lt;br /&gt;
Gitea unterstützt verschiedene Datenbanken. Wir gehen in dieser Anleitung davon aus, dass PostgreSQL benutzt wird.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung der Installation ===&lt;br /&gt;
&lt;br /&gt;
Um Gitea auf der Managed Operation Platform von Hostsharing zu installieren, ist folgende Vorbereitung erforderlich.&lt;br /&gt;
&lt;br /&gt;
# Anlegen eines Domain-Benutzers. In unserem Beispiel &amp;lt;code&amp;gt;xyz00-gitea&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen einer Domain. In unserem Beispiel &amp;lt;code&amp;gt;gitea.hs-example.de&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen eines Datenbank-Benutzers. Hier &amp;lt;code&amp;gt;xyz00_giteadbuser&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Anlegen einer Datenbank. Hier &amp;lt;code&amp;gt;xyz00_giteadb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Auf der Kommandozeile kann man dies folgendermaßen erledigen.&lt;br /&gt;
&lt;br /&gt;
Man loggt sich als Paketbenutzer ein und startet die Kommandozeilenversion von HSAdmin mit dem Befehl &amp;lt;code&amp;gt;hsscript&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann man die Vorbereitungsschritte 1 bis 4 erledigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-gitea&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;gitea.hs-example.de&#039;,user:&#039;xyz00-gitea&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_giteadbuser&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_giteadb&#039;,owner:&#039;xyz00_giteadbuser&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von Gitea ===&lt;br /&gt;
&lt;br /&gt;
Gitea wird als Binary zur Verfügung gestellt.&lt;br /&gt;
Wir installieren das Binary im Verzeichnis des Domain-Benutzers.&lt;br /&gt;
Wenn wir als Paketbenutzer eingeloggt sind, können wir den Benutzer folgendermaßen wechseln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
sudo -u xyz00-gitea -i&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Nun laden wir das passende Binary herunter.&lt;br /&gt;
Auf der Website https://dl.gitea.io/gitea/ finden Sie das jeweils aktuelle Binary (hier die 64-Bit-Version, &lt;br /&gt;
für die shared Server h01 bis h08 bitte die 32-Bit-Version gitea-1.7.0-linux-i386 herunterladen).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O gitea https://dl.gitea.io/gitea/1.7.0/gitea-1.7.0-linux-amd64&lt;br /&gt;
chmod +x gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir laden die GPG-Signatur herunter und überprüfen sie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget https://dl.gitea.io/gitea/1.7.0/gitea-1.7.0-linux-amd64.asc&lt;br /&gt;
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2&lt;br /&gt;
gpg --verify gitea-1.7.0-linux-amd64.asc gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können wir Gitea testweise starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
./gitea web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Webserver von Gitea startet auf dem Port 3000. Das werden wir später ändern.&lt;br /&gt;
&lt;br /&gt;
Der Server kann mit Ctrl-C beendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration der Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst wechseln wir in das Verzeichnis &amp;lt;code&amp;gt;doms/gitea.hs-example.de&amp;lt;/code&amp;gt; und löschen den Ordner für die Subdomain &#039;www&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm -rf subs/www&lt;br /&gt;
rm -rf subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend tragen wir die Umleitung auf HTTPS ein, falls dies nicht schon geschehen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
vi htdocs/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Der Eintrag muss lauten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
Redirect permanent / https://gitea.hs-example.com/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Dann legen wir die Datei &amp;lt;code&amp;gt;htdocs-ssl/.htaccess&amp;lt;/code&amp;gt; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^(.*) http://localhost:31580/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Merken Sie sich die Portnummer 31580.&lt;br /&gt;
Sie wird später bei der Konfiguration von Gitea gebraucht.&lt;br /&gt;
Die Portnummer bekommen Sie vom Hostmaster, wenn Sie für Ihren Webspace einen Serverdienst (Daemon) buchen.&lt;br /&gt;
Wenn Sie einen Managed Server haben, können Sie selbst die Portnummer auswählen.&lt;br /&gt;
&lt;br /&gt;
Damit ist die Konfiguration von Apache abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von Gitea ===&lt;br /&gt;
&lt;br /&gt;
Wir editieren nun die Konfigurationsdatei von Gitea &amp;lt;code&amp;gt;app.ini&amp;lt;/code&amp;gt;.&lt;br /&gt;
Sie befindet sich in dem Verzeichnis &amp;lt;code&amp;gt;~/custom/conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Sie können die Konfiguration teilweise auch über das Webinterface durchführen. Starten Sie dazu Gitea, wie oben beschrieben, und versuchen Sie einen Benutzer zu registrieren. Daraufhin öffnet sich der Konfigurationsdialog. Sie müssen den Gitea-Benutzer, den Namen der Datenbank, den Datenbank-Benutzer und sein Passwort parat haben.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdatei beginnt mit allgemeinen Einträgen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
APP_NAME = Gitea: Git with a cup of tea&lt;br /&gt;
RUN_USER = xyz00-gitea&lt;br /&gt;
RUN_MODE = prod&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt [database] folgen die Angaben zur Datenbank:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[database]&lt;br /&gt;
DB_TYPE  = postgres&lt;br /&gt;
HOST     = 127.0.0.1:5432&lt;br /&gt;
NAME     = xyz00_giteadb&lt;br /&gt;
USER     = xyz00_giteadbuser&lt;br /&gt;
PASSWD   = geheim&lt;br /&gt;
SSL_MODE = disable&lt;br /&gt;
PATH     = data/gitea.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es folgt der Pfad zu den Git-Repositorys und die Server-Konfiguration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[repository]&lt;br /&gt;
ROOT = /home/pacs/xyz00/users/gitea/gitea-repositories&lt;br /&gt;
    &lt;br /&gt;
[server]&lt;br /&gt;
PROTOCOL         = http&lt;br /&gt;
SSH_DOMAIN       = gitea.hs-example.de &lt;br /&gt;
DOMAIN           = gitea.hs-example.de&lt;br /&gt;
HTTP_ADDR        = localhost&lt;br /&gt;
HTTP_PORT        = 31580&lt;br /&gt;
ROOT_URL         = https://gitea.hs-example.de/&lt;br /&gt;
DISABLE_SSH      = false&lt;br /&gt;
SSH_PORT         = 22&lt;br /&gt;
LFS_START_SERVER = true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Schreiben der Log Datei können Sie folgendes konfigurieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[log]&lt;br /&gt;
MODE       = file&lt;br /&gt;
LEVEL      = info&lt;br /&gt;
ROOT_PATH  = /home/pacs/xyz00/users/gitea/custom/logs/&lt;br /&gt;
ROUTER     = file&lt;br /&gt;
LOG_ROTATE = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte prüfen Sie, ob der Ordner zum Speichern der Log-Dateien von Gitea vorhanden ist. Bei Bedarf erstellen Sie die Ordnerstruktur entsprechend.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p /home/pacs/xyz00/users/gitea/custom/logs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie können nun Gitea starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
./gitea web&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Der Git-Service ist dann im Browser unter der Adresse gitea.hs-example.de erreichbar.&lt;br /&gt;
&lt;br /&gt;
=== Service einrichten ===&lt;br /&gt;
&lt;br /&gt;
Zum Schluss müssen Sie noch den Service zum Starten von Gitea einrichten.&lt;br /&gt;
&lt;br /&gt;
Das Service Skript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/.config/systemd/user/gitea.service&amp;lt;/code&amp;gt; ab.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
Description=Gitea&lt;br /&gt;
    &lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=on-abort&lt;br /&gt;
WorkingDirectory=%h&lt;br /&gt;
ExecStart=%h/gitea web&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;
Nun können Sie noch die Rotation der Logfiles konfigurieren.&lt;br /&gt;
Dies geschieht in der Datei &amp;lt;code&amp;gt;~/.logrotate&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
/home/pacs/xyz00/users/gitea/custom/logs/gitea.log {&lt;br /&gt;
  copytruncate&lt;br /&gt;
  daily&lt;br /&gt;
  rotate 7&lt;br /&gt;
  compress&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit logrotate regelmäßig ausgeführt wird, müssen Sie folgenden systemd Timer für denv Domain-Benutzers einrichten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/gitea_logrotate.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail from remote server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/sbin/logrotate -s /home/pacs/xyz00/users/gitea/.logrotate.state /home/pacs/xyz00/users/gitea/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;~/.config/systemd/user/gitea_logrotate.timer&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail every five minutes&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:51&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user enable gitea_logrotate.timer&lt;br /&gt;
$ systemctl --user start gitea_logrotate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit für die Logrotation können Sie beliebig einstellen.&lt;br /&gt;
&lt;br /&gt;
Abschließend können Sie Ihre Gitea-Instanz starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
systemctl --user start gitea&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte beachten Sie, dass für die Ausführung von Benutzerskripten mit systemctl für den aktuellen Benutzer im hsadmin die Shell &amp;quot;/bin/bash&amp;quot; konfiguriert sein muss.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung über LDAP einrichten ===&lt;br /&gt;
&lt;br /&gt;
Ohne weitere Konfiguration, können nun lokale Benutzer angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Falls Sie die Benutzerverwaltung noch an ein LDAP Verzeichnis anschließen wollen, können Sie diese Schritte ausführen:&lt;br /&gt;
&lt;br /&gt;
Sie finden hier die Informationen zum Einrichten eines OpenLDAP Dienstes: [[OpenLDAP]]&lt;br /&gt;
&lt;br /&gt;
Gehen Sie in der Weboberfläche von Git in die Administration, und dort in den Reiter &amp;quot;Authentifizierungsquellen&amp;quot;, oder direkt auf dem Link https://git.hs-example.de/admin/auths&lt;br /&gt;
&lt;br /&gt;
Dort sollten dann folgende Werte eingetragen werden:&lt;br /&gt;
* Authentifizierungstyp: LDAP (via BindDN)&lt;br /&gt;
* Host: &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; (bzw. der Name des Servers, auf dem OpenLDAP erreichbar ist)&lt;br /&gt;
* Port: &amp;lt;code&amp;gt;30389&amp;lt;/code&amp;gt; (bzw. der Port auf dem OpenLDAP erreichbar ist)&lt;br /&gt;
* DN binden: &amp;lt;code&amp;gt;cn=admin,dc=hs-example,dc=de&amp;lt;/code&amp;gt; (Der Benutzer der Zugriff auf alle Benutzer hat)&lt;br /&gt;
* Passwort binden: Das Passwort von dem DN Benutzer&lt;br /&gt;
* Basis für Benutzersuche: &amp;lt;code&amp;gt;ou=users,dc=hs-example,dc=de&amp;lt;/code&amp;gt;&lt;br /&gt;
* Benutzerfilter: &amp;lt;code&amp;gt;(&amp;amp;(objectClass=inetOrgPerson)(uid=%s))&amp;lt;/code&amp;gt;&lt;br /&gt;
* Admin-Filter: &amp;lt;code&amp;gt;(memberof=cn=admins,ou=groups,dc=hs-example,dc=de)&amp;lt;/code&amp;gt; (diese Benutzer haben Admin Rechte in Gitea)&lt;br /&gt;
* Benutzernamens-Attribute: &amp;lt;code&amp;gt;DN&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vornamensattribut: &amp;lt;code&amp;gt;givenName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nachnamensattribut: &amp;lt;code&amp;gt;sn&amp;lt;/code&amp;gt;&lt;br /&gt;
* E-Mail-Attribut: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Screenshot:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Gitea_LDAP_Einrichtung.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitea.io/ Gitea Webseite]&lt;br /&gt;
* [https://docs.gitea.io/ Dokumentation von Gitea]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/gitea Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Projektmanagement]]&lt;br /&gt;
[[Kategorie:Projektverwaltung]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7156</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7156"/>
		<updated>2024-12-03T14:00:17Z</updated>

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

		<summary type="html">&lt;p&gt;Cds09: /* Start des Tomcat Servers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Apache Tomcat installieren&lt;br /&gt;
&lt;br /&gt;
== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
[http://tomcat.apache.org/ Apache Tomcat] ist ein Webserver (HTTP-Server), der in der Programmiersprache Java entwickelt ist. Er dient in erster Linie dazu, dynamische Web-Anwendungen zu betreiben, die ebenfalls in Java programmiert sind. Basis-Technologien sind [http://de.wikipedia.org/wiki/Servlet Java-Servlets] und [http://de.wikipedia.org/wiki/JSP Java Server Pages (JSP)].&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von Apache Tomcat ist bei Hostsharing das Hosting von komplexen Java Web-Applikationen problemlos möglich.&lt;br /&gt;
&lt;br /&gt;
== Spezielle Installation bei Hostsharing ==&lt;br /&gt;
&lt;br /&gt;
In jedem dynamischen Webhosting-Paket der Hostsharing eG können einer (oder mehrere) Tomcat-Webserver betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Dazu muss für jede Tomcat-Instanz die Option &amp;quot;Betrieb eines eigenen Serverdienstes&amp;quot; gebucht werden. Im Bereich des Shared Hosting ist die Option kostenpflichtig. &lt;br /&gt;
&lt;br /&gt;
Diese Anleitung dokumentiert die Installation des Apache Tomcat Servers als Service-User in einem WEB-Paket bei Hostsharing.  Mit der Einrichtung der Option &amp;quot;eigener Serverdienst&amp;quot; werden für die Paket-IP-Adresse einer oder mehrere IP-Ports reserviert. An diese Ports wird der eigene Serverdienst (also der Tomcat-Server) am Localhost-Interface gebunden.&lt;br /&gt;
&lt;br /&gt;
Geben Sie bei der Bestellung der Option &amp;quot;Eigener Serverdienst&amp;quot; an:&lt;br /&gt;
&lt;br /&gt;
# den Service User, mit dessen Rechten der Tomcat-Dienst laufen soll (also zum Beispiel &amp;quot;xyz00-tomcat&amp;quot;)&lt;br /&gt;
# wieviele IP-Ports reserviert werden sollen (in der folgenden Anleitung verwenden wir drei nicht-privilegierte Ports: &lt;br /&gt;
* 38005 als &amp;quot;Shutdown&amp;quot;-Schnittstelle&lt;br /&gt;
* 38006 für eine AJP-Listener&lt;br /&gt;
&lt;br /&gt;
== Installation == &lt;br /&gt;
&lt;br /&gt;
Vorbemerkung: Mit Debian 12 (&#039;Bookworm&#039;) wird Tomcat 10 von der Distribution mitgeliefert. &lt;br /&gt;
&lt;br /&gt;
Auf den Hostsharing-Servern ist das Debian-Paket &amp;quot;tomcat10-user&amp;quot; installiert. Es stellt den &lt;br /&gt;
Apache Tomcat Server in der Version 10.1.x für den Betrieb als normaler (nicht privilegierter) User bereit.&lt;br /&gt;
Dabei wird die zentral installierte Tomcat-Software benutzt, die über Betriebssystem-Updates mit Sicherheits-Updates versorgt wird.&lt;br /&gt;
&lt;br /&gt;
Für die Installation der Konfigurations-Dateien in Heimat-Verzeichnis des Benutzers wird folgender Befehl&lt;br /&gt;
mit den Rechten des Service-Users aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-tomcat@h00:~$ tomcat10-instance-create tomcat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich bevorzuge das catalina.sh-Startskript zum Testen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-tomcat@h00:~$ cp /usr/share/tomcat10/bin/catalina.sh tomcat/bin/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl legt ein Verzeichnis &amp;quot;tomcat&amp;quot; mit der üblichen Dateistruktur für einen Tomcat-Server an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bin&lt;br /&gt;
bin/catalina.sh&lt;br /&gt;
bin/setenv.sh&lt;br /&gt;
bin/shutdown.sh&lt;br /&gt;
bin/startup.sh&lt;br /&gt;
conf&lt;br /&gt;
conf/catalina.properties&lt;br /&gt;
conf/context.xml&lt;br /&gt;
conf/jaspic-providers.xml&lt;br /&gt;
conf/logging.properties&lt;br /&gt;
conf/server.xml&lt;br /&gt;
conf/tomcat-users.xml&lt;br /&gt;
conf/web.xml&lt;br /&gt;
logs&lt;br /&gt;
policy&lt;br /&gt;
policy/catalina.policy&lt;br /&gt;
temp&lt;br /&gt;
webapps&lt;br /&gt;
work&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Hauptsache muss die Konfigurationsdatei &amp;quot;server.xml&amp;quot; im Verzeichnis &amp;quot;~/tomcat/conf/&amp;quot; angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel für eine minimale &amp;quot;server.xml&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Server port=&amp;quot;38005&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Listener className=&amp;quot;org.apache.catalina.startup.VersionLoggerListener&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Listener className=&amp;quot;org.apache.catalina.core.AprLifecycleListener&amp;quot; SSLEngine=&amp;quot;on&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Listener className=&amp;quot;org.apache.catalina.core.JreMemoryLeakPreventionListener&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Listener className=&amp;quot;org.apache.catalina.mbeans.GlobalResourcesLifecycleListener&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;Listener className=&amp;quot;org.apache.catalina.core.ThreadLocalLeakPreventionListener&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;GlobalNamingResources&amp;gt;&lt;br /&gt;
    &amp;lt;Resource name=&amp;quot;UserDatabase&amp;quot; auth=&amp;quot;Container&amp;quot;&lt;br /&gt;
              type=&amp;quot;org.apache.catalina.UserDatabase&amp;quot;&lt;br /&gt;
              description=&amp;quot;User database that can be updated and saved&amp;quot;&lt;br /&gt;
              factory=&amp;quot;org.apache.catalina.users.MemoryUserDatabaseFactory&amp;quot;&lt;br /&gt;
              pathname=&amp;quot;conf/tomcat-users.xml&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/GlobalNamingResources&amp;gt;&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector protocol=&amp;quot;AJP/1.3&amp;quot; address=&amp;quot;127.0.0.1&amp;quot; port=&amp;quot;38006&amp;quot; redirectPort=&amp;quot;443&amp;quot; secretRequired=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Engine name=&amp;quot;Catalina&amp;quot; defaultHost=&amp;quot;localhost&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Realm className=&amp;quot;org.apache.catalina.realm.LockOutRealm&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Realm className=&amp;quot;org.apache.catalina.realm.UserDatabaseRealm&amp;quot; resourceName=&amp;quot;UserDatabase&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/Realm&amp;gt;&lt;br /&gt;
      &amp;lt;Host name=&amp;quot;localhost&amp;quot;  appBase=&amp;quot;../webapps&amp;quot; unpackWARs=&amp;quot;true&amp;quot; autoDeploy=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/Host&amp;gt;&lt;br /&gt;
    &amp;lt;/Engine&amp;gt;&lt;br /&gt;
  &amp;lt;/Service&amp;gt;&lt;br /&gt;
&amp;lt;/Server&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Angepasst werden müssen:&lt;br /&gt;
* die beiden IP-Ports (im Beispiel 38005 und 38006 am Localhost-Interface)&lt;br /&gt;
&lt;br /&gt;
== Deployment einer Anwendung ==&lt;br /&gt;
&lt;br /&gt;
In der Beispiel-Konfiguration wurde das Verzeichnis &#039;&#039;$HOME/webapps/&#039;&#039; für die Anwendungen konfiguriert. Wir legen dieses Verzeichnis an und kopieren eine minimale Anwendung hinein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/webapps/hello/WEB-INF/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort legen wir die Datei ~/webapps/hello/WEB-INF/web.xml mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app &lt;br /&gt;
	xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
	xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot;&lt;br /&gt;
	xmlns:web=&amp;quot;http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&amp;quot;&lt;br /&gt;
	xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&amp;quot; &lt;br /&gt;
	id=&amp;quot;WebApp_ID&amp;quot; version=&amp;quot;3.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu eine einfache JSP-Datei ~/webapps/hello/index.jsp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;%@ page language=&amp;quot;java&amp;quot; contentType=&amp;quot;text/html; charset=UTF-8&amp;quot; pageEncoding=&amp;quot;UTF-8&amp;quot;%&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de-de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Hallo Welt&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Java Version: &amp;lt;%= System.getProperty(&amp;quot;java.version&amp;quot;)  %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können wir die HTTP-Requests, die an eine Domain im Paket gesendet werden, an den Tomcat weiterleiten.&lt;br /&gt;
Das funktioniert über eine &#039;&#039;.htaccess&#039;&#039;-Datei, zum Beispiel im Verzeichnis &#039;&#039;~/doms/hs-example.de/htdocs-ssl&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot; line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule ^(.*) ajp://127.0.0.1:38006/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung der IP-Port 38006 muss hier wieder angepasst werden!&lt;br /&gt;
&lt;br /&gt;
Dadurch ist die Mini-Anwendung unter der URL &amp;quot;https://hs-example.de/hello/&amp;quot; erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Start des Tomcat Servers ==&lt;br /&gt;
&lt;br /&gt;
Der Tomcat kann über die Skripte in &amp;quot;~/tomcat/bin/&amp;quot; gestartet und gestoppt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/tomcat&lt;br /&gt;
./bin/startup.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Log-Ausgaben des Servers sind in &amp;quot;~/tomcat/logs/catalina.out&amp;quot; zu finden.&lt;br /&gt;
&lt;br /&gt;
Damit der Tomcat bei einem Reboot der Hostsharing-Server automatisch gestartet wird,&lt;br /&gt;
konfigurieren wir den Prozessmonitor &#039;&#039;systemd&#039;&#039; entsprechend.&lt;br /&gt;
&lt;br /&gt;
Wir legen ein Verzeichnis für die Konfiguration des &#039;&#039;systemd&#039;&#039; an und legen eine Unit-Konfiguration für einen Service dort ab:&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;
Die Unit-Datei &#039;&#039;~/.config/systemd/user/tomcat.service&#039;&#039;&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=Tomcat User Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/tomcat&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64&amp;quot;&lt;br /&gt;
Environment=&amp;quot;JAVA_OPTS=-Xms256M -Xmx512M&amp;quot;&lt;br /&gt;
ExecStart=%h/tomcat/bin/catalina.sh run&lt;br /&gt;
StandardOutput=append:%h/tomcat/logs/catalina.log&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
Restart=always&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Wunsch kann &#039;&#039;SystemD&#039;&#039; RAM- und CPU-Ressourcen begrenzen. Dazu wird der Abschnitt &#039;&#039;Service&#039;&#039; ergänzt:&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;
Die letzte Aufgabe ist das Einrichten der Bereinigung für die Log-Dateien.&lt;br /&gt;
&lt;br /&gt;
Dazu lege ich die Konfigurationsdatei &#039;&#039;.logrotate&#039;&#039; im $HOME-Verzeichnis an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
/home/pacs/xyz00/users/tomcat/tomcat/logs/catalina.log {&lt;br /&gt;
   copytruncate&lt;br /&gt;
   compress&lt;br /&gt;
   rotate 5&lt;br /&gt;
   daily&lt;br /&gt;
   missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Bereinigung der Log-Dateien noch zwei systemd-Timer:&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/logrotate.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate tomcat logs&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/sbin/logrotate -s /home/pacs/xyz00/users/tomcat/.logrotate.state /home/pacs/xyz00/users/tomcat/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/logrotate.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate tomcat logs&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:1&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/delete_old_logs.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=delete old log files&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/find /home/pacs/xyz00/users/tomcat/tomcat/logs -type f -mmin +10080 -delete&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/delete_old_logs.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=delete old log files&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=14:3&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;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ systemctl --user enable logrotate.timer&lt;br /&gt;
$ systemctl --user start logrotate.timer&lt;br /&gt;
$ systemctl --user enable delete_old_logs.timer&lt;br /&gt;
$ systemctl --user start delete_old_logs.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[http://tomcat.apache.org/ Apache Tomcat Homepage (Englisch)]&lt;br /&gt;
*[http://tomcat.apache.org/tomcat-9.0-doc/index.html Apache Tomcat Dokumentation (Version 9.0, Englisch)]&lt;br /&gt;
*[http://wiki.apache.org/tomcat/FrontPage Apache Tomcat Wiki (Englisch)]&lt;br /&gt;
*[https://github.com/tpokorra/Hostsharing-Ansible-Tomcat Ansible Playbook für Hostsharing]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Grouprise&amp;diff=7154</id>
		<title>Grouprise</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Grouprise&amp;diff=7154"/>
		<updated>2024-12-03T13:46:50Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Suchfunktion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation von Grouprise ==&lt;br /&gt;
&lt;br /&gt;
Grouprise / Stadtgestalten ist eine Software für die Menschen in einer Stadt oder Region. Sie ermöglicht es, dass einzelne Personen sich in Gruppen engagieren und austauschen. Grouprise ist freie Software (FOSS), die Lizenz ist die AGPL.&lt;br /&gt;
&lt;br /&gt;
Die Software beinhaltet eine Mailinglisten-ähnliche Funktionalität in Kombination mit der Diskussion über die HTML-Oberfläche. Für Die Mailfunktionalität nutzen wir hier die Subdomain, unter der auch die Anwendung läuft. Im Beispiel ist das &amp;quot;groups.hs-example.de&amp;quot;. Für diese Domain wird hier eine Catch-All-Mailadresse eingerichtet.&lt;br /&gt;
&lt;br /&gt;
==== Vorbereitungen in HSAdmin ====&lt;br /&gt;
&lt;br /&gt;
In HSAdmin werden angelegt:&lt;br /&gt;
* ein Service-User,&lt;br /&gt;
* eine Domain,&lt;br /&gt;
* ein Postgres-User und eine Datenbank,&lt;br /&gt;
* eine Catch-All E-Mail Adresse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h00:~$ hsscript -i&lt;br /&gt;
Password: *********************&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({ set: { name:&#039;xyz00-groups&#039;, password:&#039;******&#039;, shell:&#039;/bin/bash&#039; } })&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({ set: { name:&#039;groups.hs-example.de&#039;, user:&#039;xyz00-groups&#039; } })&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({ set: { name:&#039;xyz00_groups&#039;, password:&#039;******&#039; } })&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({ set: { name:&#039;xyz00_groups&#039;, owner:&#039;xyz00_groups&#039; } })&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({ set: { localpart:&#039;&#039;, domain:&#039;groups.hs-example.de&#039;, target:&#039;xyz00-groups&#039; } })&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
xyz00@h00:~$ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notizen zur Installation ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-groups@h00:~$ git clone https://git.hack-hro.de/grouprise/grouprise.git&lt;br /&gt;
xyz00-groups@h00:~$ cd grouprise/&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ git tag&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ git checkout v5.5.1&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ make virtualenv-update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Secret_Key kann man wie folgt erzeugen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python3 -c &amp;quot;import secrets; print(secrets.token_urlsafe(32))&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen einer Datei &#039;&#039;$HOME/.config/grouprise/conf.d/grouprise.yaml&#039;&#039; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
domain: groups.hs-example.de&lt;br /&gt;
log_recipient_emails:&lt;br /&gt;
        - webmaster@groups.hs-example.de&lt;br /&gt;
database:&lt;br /&gt;
        engine: postgresql&lt;br /&gt;
        host: localhost&lt;br /&gt;
        name: xyz00_groups&lt;br /&gt;
        user: xyz00_groups&lt;br /&gt;
        password: &amp;quot;*****&amp;quot;&lt;br /&gt;
secret_key: &amp;quot;XXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;quot;&lt;br /&gt;
feed_importer_gestalt_id: 1&lt;br /&gt;
operator_group_id: 1&lt;br /&gt;
unknown_gestalt_id: 32&lt;br /&gt;
&lt;br /&gt;
mailinglist_enabled: True&lt;br /&gt;
&lt;br /&gt;
branding:&lt;br /&gt;
        logo_backdrop: /-/site/logo_backdrop.svg&lt;br /&gt;
        logo_favicon: /-/site/favicon.ico&lt;br /&gt;
        logo_square: /-/site/logo_large.svg&lt;br /&gt;
        logo_text: /-/site/logo_text.svg&lt;br /&gt;
&lt;br /&gt;
backup_path: /home/storage/xyz00/users/groups/backup&lt;br /&gt;
&lt;br /&gt;
extra_django_settings_filenames:&lt;br /&gt;
        - /home/pacs/xyz00/users/groups/etc/settings.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenbankmigration und statische Assets erzeugen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ mkdir -p $HOME/var&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ mkdir -p $HOME/etc&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ . build/venv/bin/activate&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ python manage.py migrate&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ make&lt;br /&gt;
xyz00-groups@h00:~/grouprise$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Integration in den Apache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h00:~$ hsscript -i&lt;br /&gt;
Password: *********************&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.update({where:{name:&#039;groups.hs-example.de&#039;},set:{passengerpython:&#039;/home/pacs/xyz00/users/groups/grouprise/build/venv/bin/python&#039;,domainoptions:[&#039;htdocsfallback&#039;,&#039;indexes&#039;,&#039;dkim&#039;,&#039;passenger&#039;,&#039;autoconfig&#039;,&#039;greylisting&#039;,&#039;letsencrypt&#039;]}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
xyz00@h00:~$ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-groups@h00:~/grouprise$ cd $HOME/doms/groups.hs-example.de/&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de$ rm -rf subs/www/ subs-ssl/www/ htdocs-ssl/.htaccess &lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de$ cd htdocs-ssl/&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/htdocs-ssl$ mkdir stadt&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/htdocs-ssl$ cd stadt/&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/htdocs-ssl/stadt$ ln -s $HOME/grouprise/static .&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/htdocs-ssl/stadt$ ln -s $HOME/grouprise/media .&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/htdocs-ssl/stadt$ cd $HOME/doms/groups.hs-example.de/app-ssl&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/app-ssl$ vi passenger_wsgi.py&lt;br /&gt;
xyz00-groups@h00:~/doms/groups.hs-example.de/app-ssl$ cat passenger_wsgi.py&lt;br /&gt;
import sys, os&lt;br /&gt;
sys.path.append(&amp;quot;/home/pacs/xyz00/users/groups/grouprise&amp;quot;)&lt;br /&gt;
from django.conf import settings&lt;br /&gt;
from django.core.wsgi import get_wsgi_application&lt;br /&gt;
os.environ.setdefault(&amp;quot;DJANGO_SETTINGS_MODULE&amp;quot;, &amp;quot;grouprise.settings&amp;quot;)&lt;br /&gt;
application = get_wsgi_application()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;$HOME/doms/groups.hs-example.de/app-ssl/passenger_wsgi.py&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
import sys, os&lt;br /&gt;
sys.path.append(&amp;quot;/home/pacs/xyz00/users/groups/grouprise&amp;quot;)&lt;br /&gt;
from django.conf import settings&lt;br /&gt;
from django.core.wsgi import get_wsgi_application&lt;br /&gt;
os.environ.setdefault(&amp;quot;DJANGO_SETTINGS_MODULE&amp;quot;, &amp;quot;grouprise.settings&amp;quot;)&lt;br /&gt;
application = get_wsgi_application()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Senden von E-Mail ====&lt;br /&gt;
&lt;br /&gt;
Der Versand auf E-Mail erfolgt asynchron durch einen eigenen Prozess. Das Starten des Prozess erfolgt von Hand wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd $HOME/grouprise&lt;br /&gt;
. build/venv/bin/activate&lt;br /&gt;
python manage.py run_huey --logfile $HOME/var/huey_consumer.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist sinnvoll ein kleines Start- und Stopskript zu schreiben und den Prozess zum Beispiel mit &amp;quot;monit&amp;quot; zu kontrollieren.&lt;br /&gt;
&lt;br /&gt;
==== Empfang von E-Mail ====&lt;br /&gt;
&lt;br /&gt;
Ankommmende E-Mail an ein Grouprise-Forum werden über die Datei &amp;quot;.forward&amp;quot; im $HOME des Service-Users in ein Skript &amp;quot;~/bin/mailin&amp;quot; geleitet.&lt;br /&gt;
&lt;br /&gt;
Inhalt des Skriptes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xyz00-groups@h00:~$ cat bin/mailin&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
umask 0022&lt;br /&gt;
export LANG=de_DE.ISO-8859-1&lt;br /&gt;
(cd /home/pacs/xyz00/users/groups/stadtgestalten &amp;amp;&amp;amp; /home/pacs/xyz00/users/groups/stadtgestalten/build/venv/bin/python manage.py processincomingmessage)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;quot;.forward&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xyz00-groups@h00:~$ cat .forward &lt;br /&gt;
|/home/pacs/xyz00/users/groups/bin/mailin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Suchfunktion ====&lt;br /&gt;
&lt;br /&gt;
Aufbau des Suchindex für Artikel in Grouprise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/stadtgestalten&lt;br /&gt;
. build/venv/bin/activate&lt;br /&gt;
python manage.py clear_index &lt;br /&gt;
python manage.py rebuild_index&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regelmäßige Updates des Suchindex per Systemd Timer:&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/grouprise.env&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOME=/home/pacs/xyz00/users/groups&lt;br /&gt;
VIRTUAL_ENV=/home/pacs/xyz00/users/stadt/stadtgestalten/build/venv&lt;br /&gt;
PATH=/home/pacs/xyz00/users/groups/stadtgestalten/build/venv/bin:/home/pacs/xyz00/users/groups/.nvm/versions/node/v10.21.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
MAILTO=webmaster@groups.hs-example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/grouprise.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rebuild grouprise search index&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/home/pacs/xyz00/users/groups/.config/systemd/user/grouprise.env&lt;br /&gt;
WorkingDirectory=/home/pacs/xyz00/users/groups/stadtgestalten&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/stadt/stadtgestalten/build/venv/bin/python manage.py update_index&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/grouprise.timer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rebuild grouprise search index&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=0/5:0&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ systemctl --user enable grouprise.timer&lt;br /&gt;
$ systemctl --user start grouprise.timer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Webseite ===&lt;br /&gt;
&lt;br /&gt;
* https://grouprise.org&lt;br /&gt;
* https://git.hack-hro.de/grouprise/grouprise/ (Git Repository)&lt;br /&gt;
&lt;br /&gt;
=== Grouprise Installationen ===&lt;br /&gt;
&lt;br /&gt;
* https://stadtgestalten.org/ Rostock&lt;br /&gt;
* https://stadtimpuls.org/ Greifswald&lt;br /&gt;
* https://schwerin-aktiv.org/ Schwerin&lt;br /&gt;
&lt;br /&gt;
=== Handbuch für Nutzer:innen ===&lt;br /&gt;
&lt;br /&gt;
* https://stadtgestalten.org/stadtgestalten/tools/&lt;br /&gt;
* https://stadtgestalten.org/stadtgestalten/tools-print/ (als PDF)&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=AWStats_installieren&amp;diff=7153</id>
		<title>AWStats installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=AWStats_installieren&amp;diff=7153"/>
		<updated>2024-12-03T13:34:45Z</updated>

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

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

		<summary type="html">&lt;p&gt;Cds09: /* Start des Servers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Über Mattermost ==&lt;br /&gt;
&lt;br /&gt;
Mattermost ist ein Chat-Server unter einer freien MIT Lizenz. Der Server ist in der Programmiersprache [https://de.wikipedia.org/wiki/Go_%28Programmiersprache%29 go] implementiert.&lt;br /&gt;
&lt;br /&gt;
Mattermost ist eine selbst-gehostete Alternative zum Cloud-Dienst [https://de.wikipedia.org/wiki/Slack_(Software) Slack] oder zum proprietären [https://en.wikipedia.org/wiki/HipChat HipChat].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;individuelle Serverdienste (1 Daemon)&amp;quot;. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/&lt;br /&gt;
&lt;br /&gt;
Auf einem Managed Server melden Sie einfach die kostenlose Option &amp;quot;Eigener Daemon&amp;quot; an. Bei der Anmeldung geben Sie einen User an (dient als Admin/Service-User). Unter dieser User-Kennung läuft später der Mattermost-Server. Der User sollte vor der Anmeldung mit HSAdmin angelegt werden. Als User-Beispiel nutzen wir im Folgenden &amp;quot;xyz00-chat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls mit HSAdmin muss eine (Sub-)Domain für den Chat-Dienst aufgeschaltet/angelegt werden. Die Domain muss dem User &amp;quot;xyz00-chat&amp;quot; zugeordnet werden. In dieser Anleitung nutze ich die Domain &amp;quot;beispiel-chat.de&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Weiterhin benötigt Mattermost eine MariaDB- oder eine PostgreSQL-Datenbank. Wir empfehlen PostgreSQL und legen also mit Hilfe von HSAdmin einen PostgreSQL-User (&amp;quot;xyz00_mm_user&amp;quot; mit Passwort &amp;quot;geheim&amp;quot;) und eine Datenbank (&amp;quot;xyz00_mm_db&amp;quot; mit dem Eigentümer &amp;quot;xyz00_mm_user&amp;quot;) an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Als User &amp;quot;xyz00-chat&amp;quot; lade ich die Software herunter (aktuelle Version siehe [https://github.com/mattermost/mattermost-server/releases]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget https://releases.mattermost.com/7.9.2/mattermost-7.9.2-linux-amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die tar.gz-Datei wird ausgepackt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tar xzf mattermost-7.9.2-linux-amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann finden wir im $HOME des Users &amp;quot;xyz00-chat&amp;quot; ein Unterverzeichnis &amp;quot;$HOME/mattermost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Mattermost nehmen wir in der Datei $&amp;quot;HOME/mattermost/config/config.json&amp;quot; vor:&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt &amp;quot;ServiceSettings&amp;quot; definieren wir die Parameter &amp;quot;SiteURL&amp;quot;, &amp;quot;WebsocketURL&amp;quot; und &amp;quot;ListenAddress&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;ServiceSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;SiteURL&amp;quot;: &amp;quot;https://beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;WebsocketURL&amp;quot;: &amp;quot;wss://beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;ListenAddress&amp;quot;: &amp;quot;127.0.0.1:34567&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sei &amp;quot;https://beispiel-chat.de&amp;quot; die Domain, unter der der Chat betrieben werden soll und &amp;quot;34567&amp;quot; der Port,&lt;br /&gt;
der vom Hostsharing-Service für den &amp;quot;Eigenen Daemon&amp;quot; zugewiesen wurde.&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt &amp;quot;TeamSettings&amp;quot; kann für den Chat ein Name vergeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;TeamSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;SiteName&amp;quot;: &amp;quot;Beispiel-Chat&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Im Abschnitt &amp;quot;SqlSettings&amp;quot; wird die PostgreSQL Datenbank konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;SqlSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;DriverName&amp;quot;: &amp;quot;postgres&amp;quot;,&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: &amp;quot;postgres://xyz00_mm_user:geheim@127.0.0.1:5432/xyz00_mm_db?sslmode=disable\u0026connect_timeout=10&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiter noch unter &amp;quot;FileSettings&amp;quot; und &amp;quot;EMailSettings&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;FileSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;MaxFileSize&amp;quot;: 4096000,&lt;br /&gt;
    &amp;quot;DriverName&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
    &amp;quot;Directory&amp;quot;: &amp;quot;./data/&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;EmailSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;EnableSignUpWithEmail&amp;quot;: true,&lt;br /&gt;
    &amp;quot;EnableSignInWithEmail&amp;quot;: true,&lt;br /&gt;
    &amp;quot;EnableSignInWithUsername&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SendEmailNotifications&amp;quot;: true,&lt;br /&gt;
    &amp;quot;RequireEmailVerification&amp;quot;: true,&lt;br /&gt;
    &amp;quot;FeedbackName&amp;quot;: &amp;quot;Beispiel-Chat&amp;quot;,&lt;br /&gt;
    &amp;quot;FeedbackEmail&amp;quot;: &amp;quot;mattermost@beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;FeedbackOrganization&amp;quot;: &amp;quot;Beispiel&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPUsername&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPServer&amp;quot;: &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPPort&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;htdocs-ssl&amp;quot; unter &amp;quot;$HOME/doms/beispiel-chat.de&amp;quot; wird eine &amp;quot;.htaccess&amp;quot;-Datei abgelegt, &lt;br /&gt;
die dafür sorgt, dass alle Requests an den Mattermost-Server weitergegeben werden. Dabei verwendet Mattermost&lt;br /&gt;
auch Websocket-Verbindungen (&amp;quot;ws://&amp;quot;). Inhalt der &amp;quot;.htaccess&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/api/v1/websocket    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:34567%{REQUEST_URI}  [proxy]&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:34567%{REQUEST_URI} [proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;htdocs&amp;quot; wird eine &amp;quot;.htaccess&amp;quot;-Datei abgelegt, die für eine &lt;br /&gt;
Weiterleitung auf das https-Protokoll sorgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://beispiel-chat.de/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start des Servers ==&lt;br /&gt;
&lt;br /&gt;
Der Chat-Server lässt sich starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd $HOME/mattermost&lt;br /&gt;
./bin/mattermost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Start-Skript könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/chat&lt;br /&gt;
cd $HOME/mattermost&lt;br /&gt;
rm -f running.pid&lt;br /&gt;
nohup ./bin/mattermost 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
echo $! &amp;gt; running.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum automatischen Start des Servers bei einem Reboot sollte &lt;br /&gt;
man einen systemd service einrichten:&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/mattermost.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=mattermost chat server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=exec&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/chat/bin/mattermost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Service aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ systemctl --user enable mattermost.service&lt;br /&gt;
$ systemctl --user start mattermost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[https://about.mattermost.com/ Mattermost Homepage (Englisch)]&lt;br /&gt;
*[https://github.com/mattermost/platform git Repository bei Github]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mattermost Ansible Playbook für Hostsharing]&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Messenger]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mattermost_Installieren&amp;diff=7150</id>
		<title>Mattermost Installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mattermost_Installieren&amp;diff=7150"/>
		<updated>2024-12-03T13:15:04Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Start des Servers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Über Mattermost ==&lt;br /&gt;
&lt;br /&gt;
Mattermost ist ein Chat-Server unter einer freien MIT Lizenz. Der Server ist in der Programmiersprache [https://de.wikipedia.org/wiki/Go_%28Programmiersprache%29 go] implementiert.&lt;br /&gt;
&lt;br /&gt;
Mattermost ist eine selbst-gehostete Alternative zum Cloud-Dienst [https://de.wikipedia.org/wiki/Slack_(Software) Slack] oder zum proprietären [https://en.wikipedia.org/wiki/HipChat HipChat].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Die hier beschriebene Installation benötigt bei Hostsharing die Paket-Option &amp;quot;individuelle Serverdienste (1 Daemon)&amp;quot;. Im Managed Webspace ist diese Option kostenpflichtig: https://www.hostsharing.net/angebote/managed-webspace/&lt;br /&gt;
&lt;br /&gt;
Auf einem Managed Server melden Sie einfach die kostenlose Option &amp;quot;Eigener Daemon&amp;quot; an. Bei der Anmeldung geben Sie einen User an (dient als Admin/Service-User). Unter dieser User-Kennung läuft später der Mattermost-Server. Der User sollte vor der Anmeldung mit HSAdmin angelegt werden. Als User-Beispiel nutzen wir im Folgenden &amp;quot;xyz00-chat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls mit HSAdmin muss eine (Sub-)Domain für den Chat-Dienst aufgeschaltet/angelegt werden. Die Domain muss dem User &amp;quot;xyz00-chat&amp;quot; zugeordnet werden. In dieser Anleitung nutze ich die Domain &amp;quot;beispiel-chat.de&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Weiterhin benötigt Mattermost eine MariaDB- oder eine PostgreSQL-Datenbank. Wir empfehlen PostgreSQL und legen also mit Hilfe von HSAdmin einen PostgreSQL-User (&amp;quot;xyz00_mm_user&amp;quot; mit Passwort &amp;quot;geheim&amp;quot;) und eine Datenbank (&amp;quot;xyz00_mm_db&amp;quot; mit dem Eigentümer &amp;quot;xyz00_mm_user&amp;quot;) an.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Als User &amp;quot;xyz00-chat&amp;quot; lade ich die Software herunter (aktuelle Version siehe [https://github.com/mattermost/mattermost-server/releases]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget https://releases.mattermost.com/7.9.2/mattermost-7.9.2-linux-amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die tar.gz-Datei wird ausgepackt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
tar xzf mattermost-7.9.2-linux-amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann finden wir im $HOME des Users &amp;quot;xyz00-chat&amp;quot; ein Unterverzeichnis &amp;quot;$HOME/mattermost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Mattermost nehmen wir in der Datei $&amp;quot;HOME/mattermost/config/config.json&amp;quot; vor:&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt &amp;quot;ServiceSettings&amp;quot; definieren wir die Parameter &amp;quot;SiteURL&amp;quot;, &amp;quot;WebsocketURL&amp;quot; und &amp;quot;ListenAddress&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;ServiceSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;SiteURL&amp;quot;: &amp;quot;https://beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;WebsocketURL&amp;quot;: &amp;quot;wss://beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;ListenAddress&amp;quot;: &amp;quot;127.0.0.1:34567&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sei &amp;quot;https://beispiel-chat.de&amp;quot; die Domain, unter der der Chat betrieben werden soll und &amp;quot;34567&amp;quot; der Port,&lt;br /&gt;
der vom Hostsharing-Service für den &amp;quot;Eigenen Daemon&amp;quot; zugewiesen wurde.&lt;br /&gt;
&lt;br /&gt;
Im Abschnitt &amp;quot;TeamSettings&amp;quot; kann für den Chat ein Name vergeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;TeamSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;SiteName&amp;quot;: &amp;quot;Beispiel-Chat&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Im Abschnitt &amp;quot;SqlSettings&amp;quot; wird die PostgreSQL Datenbank konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;SqlSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;DriverName&amp;quot;: &amp;quot;postgres&amp;quot;,&lt;br /&gt;
    &amp;quot;DataSource&amp;quot;: &amp;quot;postgres://xyz00_mm_user:geheim@127.0.0.1:5432/xyz00_mm_db?sslmode=disable\u0026connect_timeout=10&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiter noch unter &amp;quot;FileSettings&amp;quot; und &amp;quot;EMailSettings&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=json line&amp;gt;&lt;br /&gt;
&amp;quot;FileSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;MaxFileSize&amp;quot;: 4096000,&lt;br /&gt;
    &amp;quot;DriverName&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
    &amp;quot;Directory&amp;quot;: &amp;quot;./data/&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
&amp;quot;EmailSettings&amp;quot;: {&lt;br /&gt;
    &amp;quot;EnableSignUpWithEmail&amp;quot;: true,&lt;br /&gt;
    &amp;quot;EnableSignInWithEmail&amp;quot;: true,&lt;br /&gt;
    &amp;quot;EnableSignInWithUsername&amp;quot;: true,&lt;br /&gt;
    &amp;quot;SendEmailNotifications&amp;quot;: true,&lt;br /&gt;
    &amp;quot;RequireEmailVerification&amp;quot;: true,&lt;br /&gt;
    &amp;quot;FeedbackName&amp;quot;: &amp;quot;Beispiel-Chat&amp;quot;,&lt;br /&gt;
    &amp;quot;FeedbackEmail&amp;quot;: &amp;quot;mattermost@beispiel-chat.de&amp;quot;,&lt;br /&gt;
    &amp;quot;FeedbackOrganization&amp;quot;: &amp;quot;Beispiel&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPUsername&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPPassword&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPServer&amp;quot;: &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    &amp;quot;SMTPPort&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;htdocs-ssl&amp;quot; unter &amp;quot;$HOME/doms/beispiel-chat.de&amp;quot; wird eine &amp;quot;.htaccess&amp;quot;-Datei abgelegt, &lt;br /&gt;
die dafür sorgt, dass alle Requests an den Mattermost-Server weitergegeben werden. Dabei verwendet Mattermost&lt;br /&gt;
auch Websocket-Verbindungen (&amp;quot;ws://&amp;quot;). Inhalt der &amp;quot;.htaccess&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{REQUEST_URI}  ^/api/v1/websocket    [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:34567%{REQUEST_URI}  [proxy]&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:34567%{REQUEST_URI} [proxy]&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;htdocs&amp;quot; wird eine &amp;quot;.htaccess&amp;quot;-Datei abgelegt, die für eine &lt;br /&gt;
Weiterleitung auf das https-Protokoll sorgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Redirect permanent / https://beispiel-chat.de/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start des Servers ==&lt;br /&gt;
&lt;br /&gt;
Der Chat-Server lässt sich starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd $HOME/mattermost&lt;br /&gt;
./bin/mattermost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Start-Skript könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/home/pacs/xyz00/users/matter/bin/runmattermost.sh&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/chat&lt;br /&gt;
cd $HOME/mattermost&lt;br /&gt;
rm -f running.pid&lt;br /&gt;
nohup ./bin/mattermost 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
echo $! &amp;gt; running.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum automatischen Start des Servers bei einem Reboot sollte &lt;br /&gt;
man einen systemd service einrichten:&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/mattermost.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=mattermost chat server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=exec&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/matter/bin/runmattermost.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Service aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ systemctl --user enable mattermost.service&lt;br /&gt;
$ systemctl --user start mattermost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
*[https://about.mattermost.com/ Mattermost Homepage (Englisch)]&lt;br /&gt;
*[https://github.com/mattermost/platform git Repository bei Github]&lt;br /&gt;
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mattermost Ansible Playbook für Hostsharing]&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Messenger]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=OpenProject_installieren&amp;diff=7149</id>
		<title>OpenProject installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=OpenProject_installieren&amp;diff=7149"/>
		<updated>2024-12-03T13:10:43Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Aufsetzen des Cronjobs für Hintergrundprozesse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
OpenProject ist eine umfangreiche Projektmanagement-Software.  Die Software ist multiprojektfähig;  für jedes Projekt stehen unter anderem folgende Werkzeuge zur Verfügung:&lt;br /&gt;
* Wiki&lt;br /&gt;
* Vorgangsverfolgung (Ticketsystem, Issue Tracker)&lt;br /&gt;
* Zeiterfassung&lt;br /&gt;
* Dokument- und Dateiverwaltung&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt, wie man OpenProject auf der Managed Hosting Plattform von Hostsharing installieren kann. OpenProject lässt sich in jedem Managed Webspace betreiben.&lt;br /&gt;
&lt;br /&gt;
Die Anleitung wurde für OpenProject Version 11 erstellt.&lt;br /&gt;
&lt;br /&gt;
== Ansible Skript ==&lt;br /&gt;
&lt;br /&gt;
Alternativ zur manuellen Installation, die in diesem Wiki Artikel beschrieben wird, gibt es ein&lt;br /&gt;
Ansible Skript, das die Installationsschritte für OpenProject automatisiert durchführt.&lt;br /&gt;
&lt;br /&gt;
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/openproject&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
=== Service-User, Domain und Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-project&amp;quot;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-project&#039;&#039; als Domain-Administrator, zum Beispiel &amp;quot;prj.example.com&amp;quot;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_dbuser&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_prjdb&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_dbuser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung des Webspace ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;leichtgewichtige&amp;quot; Subdomain &amp;quot;www&amp;quot; wird gelöscht. Ebenso die &#039;&#039;.htaccess&#039;&#039;-Datei mit der Weiterleitung dorthin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h20 $ sudo -u xyz00-project -i&lt;br /&gt;
xyz00-project@h20:~$ cd ~/doms/projekt.example.com/&lt;br /&gt;
xyz00-project@h20:~/doms/projekt.example.com$ rm -rf subs/www/ subs-ssl/www/ htdocs-ssl/.htaccess &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation von Ruby ===&lt;br /&gt;
&lt;br /&gt;
Weiterhin benötigt OpenProject eine geeignete Version der Programmiersprache Ruby.&lt;br /&gt;
&lt;br /&gt;
Die gewünschte Version kann hier abgelesen werden: https://github.com/opf/openproject/blob/stable/11/.ruby-version&lt;br /&gt;
&lt;br /&gt;
Die Installation-Anleitung für OpenProject schlägt für die Installation &#039;&#039;rbenv&#039;&#039; vor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-project@h20:~/doms/projekt.example.com$ cd&lt;br /&gt;
xyz00-project@h20:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv&lt;br /&gt;
xyz00-project@h20:~$ touch .profile&lt;br /&gt;
xyz00-project@h20:~$ chmod u+x .profile&lt;br /&gt;
xyz00-project@h20:~$ echo &#039;export PATH=&amp;quot;$HOME/.rbenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ echo &#039;eval &amp;quot;$(rbenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;br /&gt;
xyz00-project@h20:~$ rbenv install 2.7.4&lt;br /&gt;
xyz00-project@h20:~$ rbenv rehash&lt;br /&gt;
xyz00-project@h20:~$ rbenv global 2.7.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Test bitte aufrufen: &#039;&#039;ruby -v&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anzeige sollte etwa das Folgende enthalten:&lt;br /&gt;
ruby 2.7.4pXYZ (....) [x86_64-linux]&lt;br /&gt;
&lt;br /&gt;
=== Installation von Node ===&lt;br /&gt;
&lt;br /&gt;
Die Installation-Anleitung für OpenProject schlägt für die Installation &#039;&#039;nodenv&#039;&#039; vor. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ git clone https://github.com/OiNutter/nodenv.git ~/.nodenv&lt;br /&gt;
xyz00-project@h20:~$ echo &#039;export PATH=&amp;quot;$HOME/.nodenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ echo &#039;eval &amp;quot;$(nodenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~$ git clone git://github.com/OiNutter/node-build.git ~/.nodenv/plugins/node-build&lt;br /&gt;
xyz00-project@h20:~$ nodenv install 12.18.4&lt;br /&gt;
xyz00-project@h20:~$ nodenv rehash&lt;br /&gt;
xyz00-project@h20:~$ nodenv global 12.18.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Test mit &#039;&#039;node --version&#039;&#039; solte anzeigen: v12.18.4&lt;br /&gt;
&lt;br /&gt;
== Installation und Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Installation von OpenProject ===&lt;br /&gt;
&lt;br /&gt;
Wir installieren die OpenProject Community Edition. siehe https://github.com/opf/openproject&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ git clone https://github.com/opf/openproject.git --branch stable/11 --depth 1&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~$ gem update --system&lt;br /&gt;
xyz00-project@h20:~$ gem install bundler&lt;br /&gt;
xyz00-project@h20:~$ bundle update --bundler&lt;br /&gt;
xyz00-project@h20:~$ bundle config set deployment &#039;true&#039;&lt;br /&gt;
xyz00-project@h20:~$ bundle config set without &#039;mysql2 sqlite development test therubyracer docker&#039;&lt;br /&gt;
xyz00-project@h20:~$ bundle install&lt;br /&gt;
xyz00-project@h20:~$ npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von OpenProject ===&lt;br /&gt;
&lt;br /&gt;
Erstelle eine Konfiguration für den Datenbank-Zugriff in der Datei &#039;&#039;config/database.yml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ cp config/database.yml.example config/database.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der neuen Datei &#039;&#039;database.yml&#039;&#039; wird die mit HSAdmin angelegte PostgreSQL-Datenbank eingetragen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
production:&lt;br /&gt;
  adapter: postgresql&lt;br /&gt;
  encoding: unicode&lt;br /&gt;
  host: localhost&lt;br /&gt;
  database: xyz00_prjdb (wie oben angegeben)&lt;br /&gt;
  pool: 10&lt;br /&gt;
  username: xyz00_dbuser (wie oben angegeben)&lt;br /&gt;
  password: meinPasswort (wie oben angegeben)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Einträge für &#039;&#039;development&#039;&#039; und &#039;&#039;test&#039;&#039; können gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Dann wird die Datei &#039;&#039;configuration.yml&#039;&#039; angelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ cp config/configuration.yml.example config/configuration.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dort erfolgen die Einstellungen für ausgehende E-Mails:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
  log_level: info&lt;br /&gt;
  email_delivery_method: :smtp&lt;br /&gt;
  smtp_address: localhost&lt;br /&gt;
  smtp_port: 25&lt;br /&gt;
  smtp_domain: example.com&lt;br /&gt;
  #smtp_authentication: :login&lt;br /&gt;
  #smtp_user_name: &amp;quot;openproject@example.net&amp;quot;&lt;br /&gt;
  #smtp_password: &amp;quot;my_openproject_password&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zeilen mit smtp_authentication, smtp_user_name und smtp_password können auskommentiert werden, sie werden in unserem Setup nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
Es muss außerdem vermieden werden, dass beim Hochladen von Dateien in /tmp geschrieben wird. Dazu wird das Verzeichnis $HOME/var/tmp angelegt, und die Datei &amp;lt;code&amp;gt;openproject/config/initializers/tmpdir.rb&amp;lt;/code&amp;gt; mit folgendem Inhalt erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot; line&amp;gt;&lt;br /&gt;
class Dir&lt;br /&gt;
  def self.tmpdir&lt;br /&gt;
    &amp;quot;/home/pacs/xyz00/users/project/var/tmp/&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einen geheimen Schlüssel erzeugen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ EDITOR=cat ./bin/rails credentials:edit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialisiere Datenbank und erzeuge Web-Ressourcen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ ./bin/rails db:prepare&lt;br /&gt;
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anlegen des Administrators ===&lt;br /&gt;
&lt;br /&gt;
Es kann eine Demo Installation installiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ LOCALE=en ./bin/rake db:seed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird ein Beispiel-Projekt angelegt, das man wieder löschen kann.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist aber, dass der Benutzer &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; mit dem Passwort &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; angelegt wird. Das Passwort muss bei der ersten Anmeldung geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration in Passenger ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/doms/prj.example.com&lt;br /&gt;
xyz00-project@h20:~/doms/prj.example.com$ rm -rf app-ssl htdocs-ssl&lt;br /&gt;
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject app-ssl&lt;br /&gt;
xyz00-project@h20:~/doms/prj.example.com$ ln -s $HOME/openproject/public htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin muss in einer .htaccess-Datei in diesem Verzeichnis die richtige Umgebung gesetzt sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
# xyz00-project@h20:~/doms/prj.example.com$ cat .htaccess&lt;br /&gt;
&lt;br /&gt;
SetEnv OPENPROJECT_STORAGE_TMP__PATH /home/pacs/xyz00/users/project/var/tmp/&lt;br /&gt;
SetEnv TMPDIR /home/pacs/xyz00/users/project/var/tmp/&lt;br /&gt;
PassengerRuby /home/pacs/xyz00/users/project/.rbenv/shims/ruby&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufsetzen des systemd Timers für Hintergrundprozesse ==&lt;br /&gt;
&lt;br /&gt;
Es werden Benachrichtigungs-E-Mails im Hintergrund verschickt. Dazu muss ein Prozess im Hintergrund gestartet werden. Um Probleme zu vermeiden, dass source nicht zur Verfügung steht, kann der Aufruf in einer eigenen Skriptdatei geschehen, die zwingend mit Bash ausgeführt wird, wo source verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Datei &#039;&#039;/home/pacs/xyz00/users/project/emailjob.sh&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd ~/openproject&lt;br /&gt;
RAILS_ENV=&amp;quot;production&amp;quot; ./bin/rake jobs:workoff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei &#039;&#039;/home/pacs/xyz00/users/project/jobrestart.sh&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd ~/openproject&lt;br /&gt;
RAILS_ENV=&amp;quot;production&amp;quot;  ./bin/delayed_job restart&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können die Timer eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/openproject_emails.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=openproject mails&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/project/emailjob.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/openproject_emails.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=openproject mails&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/2&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;
Damit wird der Hintergrundprozess alle 2 Minuten gestartet.&lt;br /&gt;
&lt;br /&gt;
Es gibt noch einen Hintergrundjob, den ich einmal in der Stunde neu starte:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/openproject_jobrestart.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=openproject restart job&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/home/pacs/xyz00/users/project/jobrestart.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/openproject_jobrestart.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=openproject restart job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:22&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;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
$ systemctl --user enable openproject_emails.timer&lt;br /&gt;
$ systemctl --user start openproject_emails.timer&lt;br /&gt;
$ systemctl --user enable openproject_jobrestart.timer&lt;br /&gt;
$ systemctl --user start openproject_jobrestart.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upgrade durchführen ==&lt;br /&gt;
&lt;br /&gt;
Die gewünschte Ruby Version kann hier abgelesen werden: https://github.com/opf/openproject/blob/stable/11/.ruby-version&lt;br /&gt;
&lt;br /&gt;
Für das Upgrade von OpenProject 11.2.4 auf 11.3.4, musste eine neue Version von Ruby installiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd ~/openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ git -C $HOME/.rbenv/plugins/ruby-build pull&lt;br /&gt;
xyz00-project@h20:~/openproject$ rbenv install 2.7.4&lt;br /&gt;
xyz00-project@h20:~/openproject$ rbenv rehash&lt;br /&gt;
xyz00-project@h20:~/openproject$ rbenv global 2.7.4&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ rm -Rf $HOME/.rbenv/versions/2.7.3/  # alte Version kann gelöscht werden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weil das Git Repository bei der Erstinstallation nur einen Branch enthielt, muss nun das Repository vollständig geladen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*&lt;br /&gt;
xyz00-project@h20:~/openproject$ git fetch --unshallow&lt;br /&gt;
xyz00-project@h20:~/openproject$ git checkout --track remotes/origin/stable/11&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generell müssen diese Schritte durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
xyz00-project@h20:~$ cd openproject&lt;br /&gt;
xyz00-project@h20:~/openproject$ source ~/.profile&lt;br /&gt;
xyz00-project@h20:~/openproject$ git fetch&lt;br /&gt;
xyz00-project@h20:~/openproject$ git pull&lt;br /&gt;
xyz00-project@h20:~/openproject$ gem update --system&lt;br /&gt;
xyz00-project@h20:~/openproject$ bundle install&lt;br /&gt;
xyz00-project@h20:~/openproject$ npm install&lt;br /&gt;
xyz00-project@h20:~/openproject$ export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
xyz00-project@h20:~/openproject$ ./bin/rake db:migrate&lt;br /&gt;
xyz00-project@h20:~/openproject$ ./bin/rake assets:precompile&lt;br /&gt;
xyz00-project@h20:~/openproject$ touch ~/doms/prj.example.com/app-ssl/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referenzen ==&lt;br /&gt;
&lt;br /&gt;
* [https://docs.openproject.org/installation-and-operations/installation/manual/ Anleitung für die manuelle Installation]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/openproject Ansible Playbook für Hostsharing]&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:RubyOnRails]]&lt;br /&gt;
[[Kategorie:Passenger]]&lt;br /&gt;
[[Kategorie:Projektmanagement]]&lt;br /&gt;
[[Kategorie:Projektverwaltung]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Loomio_installieren&amp;diff=7148</id>
		<title>Loomio installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Loomio_installieren&amp;diff=7148"/>
		<updated>2024-12-03T13:01:26Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Cronjobs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Textkasten|gelb|Für Managed Server|Ein funktionierender Loomio-Server erfordert mehrere laufende Server-Dienste. Für den Betrieb ist ein Managed Server sinnvoll.}}&lt;br /&gt;
&lt;br /&gt;
== Über ==&lt;br /&gt;
Loomio (https://www.loomio.com/) ist laut Wikipedia eine freie Software, geeignet um Gruppen im kollaborativen Entscheidungsfindungsprozess zu unterstützen.&lt;br /&gt;
&lt;br /&gt;
Ein kurzes 2 Minuten Video auf Englisch beschreibt es ganz gut: What is Loomio? https://www.youtube.com/embed/Zlzuqsunpxc&lt;br /&gt;
&lt;br /&gt;
Es ist in Ruby on Rails geschrieben.&lt;br /&gt;
&lt;br /&gt;
Die von den Entwicklern empfohlene Installation von Loomio funktioniert mit Docker. Die Konzepte von Docker passen aber nicht zu Hostsharing.&lt;br /&gt;
Daher wird hier mit supervisor gearbeitet.&lt;br /&gt;
&lt;br /&gt;
Weitere Links und Hinweise zur Entstehung dieser Anleitung siehe auf der [[Diskussion:Loomio_installieren|Diskussionsseite]].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
=== Service-User, Domain und Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden angelegt:&lt;br /&gt;
# Ein User als Service-User mit &#039;&#039;/bin/bash&#039;&#039; als Shell, zum Beispiel Beispiel: &#039;&#039;xyz00-loomio&amp;quot;&lt;br /&gt;
# Eine Domain mit &#039;&#039;xyz00-loomio&#039;&#039; als Domain-Administrator, zum Beispiel &amp;quot;loomio.example.org&amp;quot;&lt;br /&gt;
# Einen Postgresql-User &#039;&#039;xyz00_loomio&#039;&#039; mit Passwort &#039;&#039;meinPasswort&#039;&#039;&lt;br /&gt;
# Eine Postgresql-Datenbank &#039;&#039;xyz00_loomio&#039;&#039; mit Datenbank-Owner &#039;&#039;xyz00_loomio&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Textkasten|gelb|PostgreSQL Extensions|Die PostgreSQL-Datenbank braucht die [https://github.com/loomio/loomio/blob/master/db/schema.rb#L15 folgenden Extensions]: citext, hstore, pg_stat_statements, pgcrypto und plpgsql.&lt;br /&gt;
Diese müssen vom Hostsharing-Support installiert werden. Dazu einfach eine E-Mail an die service@ Adresse schreiben. }}&lt;br /&gt;
&lt;br /&gt;
=== Installation von Ruby ===&lt;br /&gt;
&lt;br /&gt;
Loomio benötigt eine geeignete Version der Programmiersprache Ruby:&lt;br /&gt;
&lt;br /&gt;
Die Version ist in https://github.com/loomio/loomio/blob/master/.ruby-version zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv&lt;br /&gt;
touch ~/.profile&lt;br /&gt;
chmod u+x ~/.profile&lt;br /&gt;
echo &#039;export PATH=&amp;quot;$HOME/.rbenv/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
echo &#039;eval &amp;quot;$(rbenv init -)&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
source ~/.profile&lt;br /&gt;
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build&lt;br /&gt;
rbenv install 2.7.3&lt;br /&gt;
rbenv rehash&lt;br /&gt;
rbenv global 2.7.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Test bitte aufrufen: &#039;&#039;ruby -v&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anzeige sollte etwa das Folgende enthalten:&lt;br /&gt;
ruby 2.7.3pXYZ (....) [x86_64-linux]&lt;br /&gt;
&lt;br /&gt;
=== Installation von Node ===&lt;br /&gt;
&lt;br /&gt;
Loomio benötigt eine geeignete Version von Node:&lt;br /&gt;
&lt;br /&gt;
Die Version ist in https://github.com/loomio/loomio/blob/master/Dockerfile#L28 zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash&lt;br /&gt;
export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;&lt;br /&gt;
source $NVM_DIR/nvm.sh&lt;br /&gt;
nvm install 14.0.0&lt;br /&gt;
nvm alias default 14.0.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Installation der Anwendung === &lt;br /&gt;
&lt;br /&gt;
Wir benutzen nicht die [https://github.com/loomio/loomio/releases neueste Version von Loomio], &lt;br /&gt;
sondern die aktuelle Version aus dem stable Branch, genau wie die Docker Container. &lt;br /&gt;
Momentan ist das Version Loomio 2.7.5, siehe auf [https://github.com/loomio/loomio/blob/stable/lib/version.rb Github].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
source ~/.profile&lt;br /&gt;
export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;&lt;br /&gt;
source $NVM_DIR/nvm.sh&lt;br /&gt;
git clone https://github.com/loomio/loomio.git&lt;br /&gt;
cd loomio&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ git checkout --track remotes/origin/stable&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ gem update --system&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ bundle install&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ cd vue &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; npm run build &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von Loomio ===&lt;br /&gt;
&lt;br /&gt;
Erstelle eine Konfiguration für den Datenbank-Zugriff in der Datei &#039;&#039;config/database.yml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/loomio&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ cp config/database.example.yml config/database.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der neuen Datei &#039;&#039;database.yml&#039;&#039; wird die mit HSAdmin angelegte PostgreSQL-Datenbank eingetragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=yaml line&amp;gt;&lt;br /&gt;
production:&lt;br /&gt;
  adapter: postgresql&lt;br /&gt;
  encoding: unicode&lt;br /&gt;
  host: localhost&lt;br /&gt;
  database: xyz00_loomio (wie oben angegeben)&lt;br /&gt;
  pool: 10&lt;br /&gt;
  username: xyz00_dbuser (wie oben angegeben)&lt;br /&gt;
  password: meinPasswort (wie oben angegeben)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeite die Datei &#039;&#039;config/environments/production.rb&#039;&#039; und ergänze am Ende, vor dem &#039;&#039;end&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ruby line&amp;gt;&lt;br /&gt;
config.force_ssl = false&lt;br /&gt;
config.action_mailer.default_url_options = { :host =&amp;gt; &#039;loomio.example.org&#039; }&lt;br /&gt;
config.action_mailer.raise_delivery_errors = true&lt;br /&gt;
config.action_mailer.perform_deliveries = true&lt;br /&gt;
config.action_mailer.delivery_method = :smtp&lt;br /&gt;
config.action_mailer.logger = ActiveSupport::Logger.new(&amp;quot;/home/pacs/xyz00/users/loomio/supervisor/log/mailer.log&amp;quot;)&lt;br /&gt;
config.action_mailer.logger.level = ActiveSupport::Logger::Severity::INFO&lt;br /&gt;
config.action_mailer.smtp_settings = {&lt;br /&gt;
    :domain =&amp;gt; &#039;example.org&#039;,&lt;br /&gt;
    :authentication =&amp;gt; nil,&lt;br /&gt;
    :address =&amp;gt; &#039;localhost&#039;,&lt;br /&gt;
    :port =&amp;gt; 25,&lt;br /&gt;
    :openssl_verify_mode =&amp;gt; :none,&lt;br /&gt;
    :enable_starttls_auto =&amp;gt; false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einen geheimen Schlüssel erzeugen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/loomio&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ EDITOR=vim ./script/rails credentials:edit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Editor vim mit Speichern verlassen: &amp;lt;code&amp;gt;Esc&amp;lt;/code&amp;gt; Taste drücken, dann eingeben: &amp;lt;code&amp;gt;:wq&amp;lt;/code&amp;gt; und Enter drücken&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ echo &amp;quot;export SECRET_KEY_BASE=$(rake secret)&amp;quot; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Initialisieren der Datenbank ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/loomio&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ source ~/.profile&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ rake db:schema:load&lt;br /&gt;
xyz00-loomio@h20:~/loomio$ rake db:migrate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redis Service konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p redis/etc redis/lib redis/log redis/run&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Anlegen einer Datei &#039;&#039;/home/pacs/xyz00/users/loomio/redis/etc/redis.conf&#039;&#039; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
daemonize no&lt;br /&gt;
pidfile /home/pacs/xyz00/users/loomio/redis/run/redis-server.pid&lt;br /&gt;
port 6379&lt;br /&gt;
tcp-backlog 128&lt;br /&gt;
bind 127.0.0.1&lt;br /&gt;
timeout 300&lt;br /&gt;
loglevel notice&lt;br /&gt;
logfile /home/pacs/xyz00/users/loomio/redis/log/redis.log&lt;br /&gt;
databases 16&lt;br /&gt;
save 900 1&lt;br /&gt;
save 300 10&lt;br /&gt;
save 60 10000&lt;br /&gt;
slave-serve-stale-data yes&lt;br /&gt;
appendonly no&lt;br /&gt;
dbfilename dump.rdb&lt;br /&gt;
dir /home/pacs/xyz00/users/loomio/redis/lib&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Supervisor konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
Zum Start aller notwendigen Dienste wird in dieser Anleitung supervisor benutzt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p ~/supervisor/log ~/supervisor/run ~/supervisor/etc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für die Datei ~/supervisor/etc/supervisord.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[supervisord]&lt;br /&gt;
logfile=/home/pacs/xyz00/users/loomio/supervisor/log/supervisord.log&lt;br /&gt;
logfile_maxbytes=50MB&lt;br /&gt;
logfile_backups=10&lt;br /&gt;
loglevel=error&lt;br /&gt;
pidfile=/home/pacs/xyz00/users/loomio/supervisor/run/supervisord.pid&lt;br /&gt;
minfds=1024&lt;br /&gt;
minprocs=200&lt;br /&gt;
childlogdir=/home/pacs/xyz00/users/loomio/supervisor/log/&lt;br /&gt;
&lt;br /&gt;
[unix_http_server]&lt;br /&gt;
file=/home/pacs/xyz00/users/loomio/supervisor/run/supervisord.sock&lt;br /&gt;
&lt;br /&gt;
[rpcinterface:supervisor]&lt;br /&gt;
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface&lt;br /&gt;
&lt;br /&gt;
[supervisorctl]&lt;br /&gt;
serverurl=unix:///home/pacs/xyz00/users/loomio/supervisor/run/supervisord.sock&lt;br /&gt;
&lt;br /&gt;
[program:redis]&lt;br /&gt;
command=/usr/bin/redis-server /home/pacs/xyz00/users/loomio/redis/etc/redis.conf&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/redis-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/redis-stdout.log&lt;br /&gt;
&lt;br /&gt;
[program:loomio-web]&lt;br /&gt;
directory=/home/pacs/xyz00/users/loomio/loomio&lt;br /&gt;
environment=RAILS_ENV=&amp;quot;production&amp;quot;,NOTIFICATIONS_EMAIL_ADDRESS=&amp;quot;no-reply@example.org&amp;quot;&lt;br /&gt;
command=/home/pacs/xyz00/users/loomio/.rbenv/shims/bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3000&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/loomio-web-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/loomio-web-stdout.log&lt;br /&gt;
&lt;br /&gt;
[program:loomio-sidekiq]&lt;br /&gt;
directory=/home/pacs/xyz00/users/loomio/loomio&lt;br /&gt;
environment=RAILS_ENV=&amp;quot;production&amp;quot;,NOTIFICATIONS_EMAIL_ADDRESS=&amp;quot;no-reply@example.org&amp;quot;&lt;br /&gt;
command=/home/pacs/xyz00/users/loomio/.rbenv/shims/bundle exec sidekiq&lt;br /&gt;
stderr_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/loomio-sidekiq-stderr.log&lt;br /&gt;
stdout_logfile = /home/pacs/xyz00/users/loomio/supervisor/log/loomio-sidekiq-stdout.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgenden Skripte können zum Starten und zum Neustarten der Dienste verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/start.sh&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
export RAILS_ENV=&amp;quot;production&amp;quot;&lt;br /&gt;
source ~/.profile&lt;br /&gt;
cd ~/loomio&lt;br /&gt;
/usr/bin/supervisord -c $HOME/supervisor/etc/supervisord.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/restart.sh&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [ -f $HOME/supervisor/run/supervisord.pid ]&lt;br /&gt;
then&lt;br /&gt;
    /bin/kill $( cat $HOME/supervisor/run/supervisord.pid )&lt;br /&gt;
fi&lt;br /&gt;
sleep 3&lt;br /&gt;
~/start.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Systemd Serice und Timer ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Systemd&#039;&#039; wird genutzt, um nach dem Server reboot &#039;&#039;supervisord&#039;&#039; zu starten, und um regelmäßige Aufgaben von Loomio auszuführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/supervisord.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=supervisord&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=exec&lt;br /&gt;
ExecStart=/usr/bin/supervisord -c /home/pacs/xyz00/users/loomio/supervisor/etc/supervisord.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Service aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable supervisord.service&lt;br /&gt;
$ systemctl --user start supervisord.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/loomio.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=loomio recuring activities&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=cd /home/pacs/xyz00/users/loomio/loomio &amp;amp;&amp;amp; /home/pacs/xyz00/users/loomio/.rbenv/shims/bundle exec rake loomio:hourly_tasks&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/loomio.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=loomio recuring activities&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:55&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable loomio.timer&lt;br /&gt;
$ systemctl --user start loomio.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Log Dateien ===&lt;br /&gt;
&lt;br /&gt;
Zum Debuggen können folgende Log Dateien hilfreich sein:&lt;br /&gt;
&lt;br /&gt;
* ~/supervisor/log/loomio-web-stdout.log&lt;br /&gt;
* ~/supervisor/log/loomio-web-stderr.log&lt;br /&gt;
* ~/supervisor/log/loomio-sidekiq-stdout.log&lt;br /&gt;
* ~/supervisor/log/loomio-sidekiq-stderr.log&lt;br /&gt;
* ~/supervisor/log/mailer.log&lt;br /&gt;
* ~/supervisor/log/redis-stdout.log&lt;br /&gt;
* ~/supervisor/log/redis-stderr.log&lt;br /&gt;
&lt;br /&gt;
=== Einrichten des Apache ===&lt;br /&gt;
&lt;br /&gt;
Die originale .htaccess Datei zuerst löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm ~/doms/loomio.example.org/htdocs-ssl/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Neue Datei &#039;&#039;~/doms/loomio.example.org/htdocs-ssl/.htaccess&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^(.*) http://localhost:3000/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:RubyOnRails]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mono_bei_Hostsharing&amp;diff=7147</id>
		<title>Mono bei Hostsharing</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mono_bei_Hostsharing&amp;diff=7147"/>
		<updated>2024-12-03T12:50:16Z</updated>

		<summary type="html">&lt;p&gt;Cds09: /* Mono und fastcgi Server im Produktiveinsatz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemein ==&lt;br /&gt;
&lt;br /&gt;
Mono [https://www.mono-project.com/] ist ein Open Source .NET Framework und ermöglicht es, .NET Anwendungen in C# unter Linux auszuführen.&lt;br /&gt;
&lt;br /&gt;
== Mono bei Hostsharing ==&lt;br /&gt;
&lt;br /&gt;
Momentan ist Mono nicht zentral auf den Hostsharing Servern installiert. &lt;br /&gt;
&lt;br /&gt;
Mono wird als Debian Paket bereitgestellt, siehe https://packages.debian.org/de/buster/mono-complete&lt;br /&gt;
&lt;br /&gt;
Das könnten wir bei Bedarf einrichten, allerdings ist die Version von Mono in unserem aktuell verwendeten Debian 10 (Buster) schon ziemlich alt (Mono 5.18).&lt;br /&gt;
&lt;br /&gt;
Das ist ganz normal, bei nodejs/npm sieht es ähnlich aus, weil die Entwicklung solcher Projekte etwas schneller fortschreitet als die Debian Releases, die auf Stabilität bedacht sind.&lt;br /&gt;
&lt;br /&gt;
== Mono lokal im Benutzer installieren ==&lt;br /&gt;
&lt;br /&gt;
Es gibt aber einen Weg, ein binäres Paket im eigenen Benutzerverzeichnis zu installieren,&lt;br /&gt;
welches die gewünschte Funktionalität einer ziemlich aktuellen Mono Version (Mono 6.8) bietet.&lt;br /&gt;
&lt;br /&gt;
Das binäre Paket kann hier heruntergeladen werden: https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz&lt;br /&gt;
&lt;br /&gt;
Es enthält eine env.sh Datei, die ausgeführt werden muss, um die entsprechenden Pfade zu aktivieren.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Prüfen der Hash Summe sollte OK zeigen:&amp;quot;&lt;br /&gt;
echo &amp;quot;f2c27f11141f81a131b6417084c31ab3ae9d050aab8f13d75b406b377a7a1c670bdfc386f276317115e791af0ad34842 *mono-6.8.0.105.bin.debian10.tar.gz&amp;quot; | sha384sum --check&lt;br /&gt;
&lt;br /&gt;
tar xzf mono-6.8.0.105.bin.debian10.tar.gz&lt;br /&gt;
ln -s mono-6.8.0.105 mono&lt;br /&gt;
source mono/env.sh&lt;br /&gt;
mono --version&lt;br /&gt;
	Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3 Sun Dec 13 21:52:01 CET 2020)&lt;br /&gt;
	Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com&lt;br /&gt;
		TLS:           __thread&lt;br /&gt;
		SIGSEGV:       altstack&lt;br /&gt;
		Notifications: epoll&lt;br /&gt;
		Architecture:  amd64&lt;br /&gt;
		Disabled:      none&lt;br /&gt;
		Misc:          softdebug &lt;br /&gt;
		Interpreter:   yes&lt;br /&gt;
		LLVM:          supported, not enabled.&lt;br /&gt;
		Suspend:       hybrid&lt;br /&gt;
		GC:            sgen (concurrent by default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung zur Erstellung des binären Pakets ===&lt;br /&gt;
&lt;br /&gt;
Natürlich muss man immer hinterfragen, ob man fremden binären Paketen vertraut. Alternativ kann man anhand der folgenden Anleitung das binäre Paket gegebenenfalls selber herstellen:&lt;br /&gt;
&lt;br /&gt;
Zuerst werden aktuelle Mono Pakete für Debian Buster benötigt. Diese können aus den Quellen der Mono Pakete von Debian Bullseye für Debian Buster gebaut werden.&lt;br /&gt;
Die entsprechenden Skripte liegen hier: https://github.com/tpokorra/lbs-mono/tree/master/mono und https://github.com/tpokorra/lbs-mono/tree/master/xsp&lt;br /&gt;
Beim XSP wurde allerdings eine neuere Version verwendet (4.7.1) als momentan von Debian bereitgestellt wird (4.2, siehe https://packages.debian.org/de/bullseye/mono-xsp).&lt;br /&gt;
&lt;br /&gt;
Es gibt ein Bash Skript [https://github.com/tpokorra/lbs-mono/blob/master/mono2bintarball/setup.sh] und ein Python Skript [https://github.com/tpokorra/lbs-mono/blob/master/mono2bintarball/mono2bintarball.py].&lt;br /&gt;
Diese werden auf einem Build Server ausgeführt, und es werden die folgenden Schritte ausgeführt:&lt;br /&gt;
&lt;br /&gt;
* Es werden die Namen der aktuell installierten Pakete auf dem Hostsharing Server heruntergeladen.&lt;br /&gt;
* Dann wird eine Liste angefertigt von Paketen, die wir lokal installieren wollen für Mono.&lt;br /&gt;
* Dann werden lokal die gewünschten Mono Pakete installiert.&lt;br /&gt;
* Dann werden die Pakete, die installiert worden sind, mit den Paketen auf dem Hostsharing Server abgeglichen. Die Inhalte der zusätzlichen Pakete werden in das binäre Paket gepackt.&lt;br /&gt;
* Auch einige spezifische Mono Dateien, die teilweise erst mit den Installationsskripten installiert wurden (z.B. aot Cache, config Dateien), werden in das binäre Paket gepackt.&lt;br /&gt;
* Die Pfade in den bash Skripten zum Starten von Mono werden angepasst, damit es im Benutzerverzeichnis ausgeführt werden kann.&lt;br /&gt;
* Es wird eine env.sh Datei dazu gepackt.&lt;br /&gt;
&lt;br /&gt;
== Mono Anwendung mit xsp debuggen ==&lt;br /&gt;
&lt;br /&gt;
Man kann eine Mono Anwendung direkt mit xsp ausführen, ohne den Umweg über den Apache. Das kann beim Debuggen nützlich sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
index.aspx&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;%@ Import Namespace=&amp;quot;System&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;%&lt;br /&gt;
            Response.Write( &amp;quot;Hello World&amp;lt;br/&amp;gt;&amp;quot;);&lt;br /&gt;
            Response.Write( String.Format(&amp;quot;Current Time is {0}&amp;lt;br/&amp;gt;&amp;quot;, DateTime.Now));&lt;br /&gt;
        %&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Kompilierfehler im Browser zu sehen, diese Datei anlegen:&lt;br /&gt;
&lt;br /&gt;
web.config&lt;br /&gt;
&amp;lt;syntaxhighlight lang=html&amp;gt;&lt;br /&gt;
&amp;lt;configuration&amp;gt;&lt;br /&gt;
    &amp;lt;system.web&amp;gt;&lt;br /&gt;
        &amp;lt;customErrors mode=&amp;quot;Off&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/system.web&amp;gt;&lt;br /&gt;
&amp;lt;/configuration&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigene IP Adresse herausfinden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ping -4 xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun kann der Server mit dieser IP Adresse gestartet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xsp4 --port=8080 --address=aa.bbb.cc.ddd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Seite ist nun über http://xyz00.hostsharing.net:8080 erreichbar.&lt;br /&gt;
&lt;br /&gt;
== Mono und fastcgi Server im Produktiveinsatz ==&lt;br /&gt;
&lt;br /&gt;
Für den produktiven Einsatz benutzt man den fastcgi Server.&lt;br /&gt;
&lt;br /&gt;
Dazu muss man im Shared Hosting den zusätzlichen Dienst für den fastcgi Server buchen, und beim Service um einen freien Port bitten. Wir benutzen im Beispiel den Port 4001.&lt;br /&gt;
&lt;br /&gt;
bin/start-mono.sh&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd $HOME/aspnetapp&lt;br /&gt;
. $HOME/mono/env.sh&lt;br /&gt;
exec fastcgi-mono-server4 \&lt;br /&gt;
  /socket=tcp:127.0.0.1:4001 \&lt;br /&gt;
  /applications=/:$HOME/aspnetapp \&lt;br /&gt;
  --logfile=$HOME/var/log/monoserver.log \&lt;br /&gt;
  --loglevels=All \&lt;br /&gt;
  --verbose \&lt;br /&gt;
  &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
echo $! &amp;gt; $HOME/var/run/mono.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bin/stop-mono.sh&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
kill -QUIT $( cat $HOME/var/run/mono.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.monitrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
set daemon 60 with start delay 10&lt;br /&gt;
set logfile /home/pacs/xyz00/users/meinuser/var/log/monit.log&lt;br /&gt;
set idfile /home/pacs/xyz00/users/meinuser/var/run/monit.id&lt;br /&gt;
set statefile /home/pacs/xyz00/users/meinuser/var/run/monit.state&lt;br /&gt;
set mailserver localhost&lt;br /&gt;
set mail-format { from: monit@xyz00.hostsharing.net }&lt;br /&gt;
check process mono with pidfile /home/pacs/xyz00/users/meinuser/var/run/mono.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/meinuser/bin/start-mono.sh&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/meinuser/bin/stop-mono.sh&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sollten die entsprechenden leeren Verzeichnisse erstellt werden, und die Rechte für .monitrc geändert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir -p $HOME/var/log&lt;br /&gt;
mkdir -p $HOME/var/run&lt;br /&gt;
chmod 600 .monitrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann noch einen systemd service für Monit anlegen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/monit.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=monit&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=exec&lt;br /&gt;
ExecStart=rm -f $HOME/var/run/monit.id &amp;amp;&amp;amp; /usr/bin/monit -c &amp;quot;$HOME/.monitrc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Service aktivieren und starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ systemctl --user enable monit.service&lt;br /&gt;
$ systemctl --user start monit.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss noch dem Apache mitgeteilt werden, wie er auf den fastcgi Server zugreift:&lt;br /&gt;
&lt;br /&gt;
doms/meine-domain.de/subs-ssl/www/.htaccess&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
DirectoryIndex index.aspx&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteRule ^(.*) fcgi://127.0.0.1:4001/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann sollte unter https://www.meinedomain.de/ die Mono Applikation erreichbar sein!&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:Mono]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7146</id>
		<title>TLS Zertifikat mit LEGO</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=TLS_Zertifikat_mit_LEGO&amp;diff=7146"/>
		<updated>2024-12-03T12:38:12Z</updated>

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

		<summary type="html">&lt;p&gt;Cds09: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die [[Freie Software]] &#039;&#039;&#039;fetchmail&#039;&#039;&#039; ist ein [[Mail Retrieval Agent]] (MRA) und holt in dieser Eigenschaft [[E-Mail]]s von [[Post Office Protocol|POP]]-, [[Internet Message Access Protocol|IMAP]]-, [[ETRN]]-, oder [[On-Demand Mail Relay|ODMR]]-fähigen [[Mailserver]]n und leitet sie an [[Simple Mail Transfer Protocol|(E)SMTP]]- oder [[LMTP]]-fähige [[Mailserver]] oder ein [[Mail Delivery Agent|lokales Zustellprogramm]] weiter. &lt;br /&gt;
&lt;br /&gt;
== Installierte Version ==&lt;br /&gt;
Auf den Hostsharing-Servern wurde fetchmail als Bestandteil der [[Debian]]-Distribution installiert.&lt;br /&gt;
Die aktuelle Version kann von jedem Benutzer abgefragt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
fetchmail -V&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausführung ==&lt;br /&gt;
&lt;br /&gt;
Fetchmail kann als systemd timer regelmäßig ausgeführt werden, z.B. alle 5 Minuten:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/fetchmail.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail from remote server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=fetchmail -s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/fetchmail.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fetch mail every five minutes&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:0/5&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ systemctl --user enable fetchmail.timer&lt;br /&gt;
$ systemctl --user start fetchmail.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Cds09</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7144</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7144"/>
		<updated>2024-12-03T12:05:53Z</updated>

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