<?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=Sib</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=Sib"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Sib"/>
	<updated>2026-04-25T22:43:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Phusion_Passenger&amp;diff=7540</id>
		<title>Phusion Passenger</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Phusion_Passenger&amp;diff=7540"/>
		<updated>2026-03-28T10:21:19Z</updated>

		<summary type="html">&lt;p&gt;Sib: kleine Anpassungen an der Beschreibung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Phusion Passenger ist ein Apache-Plugin zur Integration von Apps auf Domain (vhost) Ebene.&lt;br /&gt;
Dabei kann es sich z.B. um [[NodeJS]], [[RubyOnRails]], [[Django|Django]] oder weitere Laufzeitumgebungen handeln.&lt;br /&gt;
&lt;br /&gt;
== Aktivierung / Deaktivierung ==&lt;br /&gt;
&lt;br /&gt;
Das Passenger-Modul wird über eine Domain-Option in HSAdmin aktiviert. Nach der Aktivierung werden Anwendungen im Verzeichnis &amp;quot;app&amp;quot; bzw. &amp;quot;app-ssl&amp;quot; unter der aufgeschalteten Domain im Phusion Passenger ausgeführt&lt;br /&gt;
&lt;br /&gt;
Phusion Passenger ist immer für die gesamte aufgeschaltete Domain aktiviert,&lt;br /&gt;
die Bereitstellung einer App wirkt also auch auf Subdomains im Verzeichnis &#039;subs&#039;.&lt;br /&gt;
Insbesondere wird damit PHP für die jeweilige Domain deaktiviert.&lt;br /&gt;
Statische Dateien (z.B. index.html) aus htdocs* und subs* sind davon nicht betroffen.&lt;br /&gt;
Idealerweise wird für jede App eine eigene Subdomain mit HSAdmin aufgeschaltet.&lt;br /&gt;
&lt;br /&gt;
Sobald eine App einmal geladen ist, sind die Settings und Mappings Bestandteil der transienten Apache vhost-Konfiguration. Änderungen an .htaccess-Settings bzgl. Passenger kommen dann nicht mehr direkt zum Tragen, weil die .htaccess zu Gunsten der Effizienz nicht mehr ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
Zum Deaktivieren einer App muss diese im app und app-ssl Verzeichnis gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
Die Auswahl des Interpreters für die Skriptsprachen Python, Ruby und JavaScript (NodeJS) für die Ausführung Apache-Passenger-Modul erfolgt über Variablen &amp;quot;PassengerPython&amp;quot;, &amp;quot;PassengerRuby&amp;quot; und &amp;quot;PassengerNodejs&amp;quot; in der Apache-VHost-Definition für die Domain. Der Inhalt dieser Variablen wird über HSAdmin im Dialog &amp;quot;Domain ändern&amp;quot; gesteuert.&lt;br /&gt;
&lt;br /&gt;
Die Voreinstellungen sind:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerPython /usr/bin/python3&lt;br /&gt;
&lt;br /&gt;
PassengerRuby /usr/bin/ruby&lt;br /&gt;
&lt;br /&gt;
PassengerNodejs /usr/bin/node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eigene Konfigurationen wären zum Beipiel (Für den Webspace &amp;quot;xyz00&amp;quot; und den User &amp;quot;xyz00-example&amp;quot;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerNodejs /home/pacs/xyz00/users/example/.nvm/versions/node/v20.11.0/bin/node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerRuby /home/pacs/xyz00/users/example/.rbenv/shims/ruby&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache&amp;gt;&lt;br /&gt;
PassengerPython /home/pacs/xyz00/users/example/my_venv/bin/python&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Nähere Informationen bitte den jeweiligen Wiki-Seiten über die spezifischen Laufzeitumgebungen entnehmen.)&lt;br /&gt;
&lt;br /&gt;
Die Einstellung &amp;quot;PassengerFriendlyErrorPages on&amp;quot; kann ebenfall in HSAdmin als Domain-Option aktiviert werden. Nach dem Abschluss des Debugging sollte die Option wieder abgeschaltet werden!&lt;br /&gt;
&lt;br /&gt;
== Neueinlesen der Konfiguration / Restart der App ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Über den &amp;lt;code&amp;gt;passenger-config&amp;lt;/code&amp;gt;-Befehl:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
⚠️ &amp;lt;strong&amp;gt;Hinweis:&amp;lt;/strong&amp;gt; sudo -u reicht hier nicht aus. Beispielsweise su - xyz00-anwendung verwenden damit die App erkannt wird. ⚠️&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output&amp;gt;&lt;br /&gt;
xyz00-anwendung@host:~$ passenger-config restart-app&lt;br /&gt;
Please select the application to restart.&lt;br /&gt;
Tip: re-run this command with --help to learn how to automate it.&lt;br /&gt;
If the menu doesn&#039;t display correctly, press &#039;!&#039;&lt;br /&gt;
&lt;br /&gt;
 ‣   /home/doms/anwendung.domain/app-ssl/ (production)&lt;br /&gt;
     Cancel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die gewünschte Anwendung jetzt nurnoch mit &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; bestätigen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Über eine Trigger-Datei:&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Passenger Apps werden wir folgt neu gestartet oder neu geladen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;	&lt;br /&gt;
mkdir app(-ssl)/tmp&lt;br /&gt;
touch app(-ssl)/tmp/restart.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das führt nach einer Weile zu einem graceful Restart der App. &lt;br /&gt;
D.h., die einzelnen Prozesse werden sukzessive zwischen der Bedienung von HTTP-Requests neu gestartet. &lt;br /&gt;
Im Rahmen dieses Restarts sollten geänderte .htaccess Direktiven ihre Wirkung entfalten. &lt;br /&gt;
Entsprechendes gilt für Änderungen an der Applikation selbst.&lt;br /&gt;
&lt;br /&gt;
== Minimale Programme für Tests von Passenger ==&lt;br /&gt;
* Python: siehe [[Eigenes_Python_installieren#Python_Web_Applikation_mit_Passenger]]&lt;br /&gt;
* Node: siehe [[NodeJS#NodeJS_Web-Applikation]]&lt;br /&gt;
* Ruby: siehe [[RubyRBEnv#Ruby_Web_Applikation_mit_Passenger]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* weitere Tipps und Beispiel für die Programmiersprachen Python und Ruby in der Support Mailingliste: [https://lists.hostsharing.net/archiv/support/2015-January/066080.html]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Passenger]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7491</id>
		<title>Mitglieder-Quellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7491"/>
		<updated>2026-01-22T11:36:48Z</updated>

		<summary type="html">&lt;p&gt;Sib: refactor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Aktivitäten-Sammlung der Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage&#039;&#039;&#039;: Hast du dich schon mal gefragt, ob du in der &#039;&#039;&#039;Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
(etwa 300 Mitglieder Stand Januar 2026)&lt;br /&gt;
das einzige Mitglied bist,&lt;br /&gt;
welches sich mit Software XYZ befasst?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antwort&#039;&#039;&#039;: Hier findest du es heraus! Diese Aktivitäten-Sammlung,&lt;br /&gt;
aus der Mitglieder-Gemeinschaft der&lt;br /&gt;
[https://www.hostsharing.net Hostsharing eG],&lt;br /&gt;
bieten Interessenten die Möglichkeit,&lt;br /&gt;
in kooperativer Anstrengung,&lt;br /&gt;
die gemeinsame IT-Infrastruktur von &#039;&#039;&#039;Hostsharing&#039;&#039;&#039; weiterzuentwickeln.&lt;br /&gt;
&lt;br /&gt;
Diese Sammlung stammt aus der gemeinschaftlich betriebenen IT-Infrastruktur von &#039;&#039;&#039;Hostsharing&#039;&#039;&#039;. An dieser Stelle ist es nicht von Bedeutung, ob sie auch mit anderer Infrastruktur kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Möchtest du mit deiner Aktivität zu dieser Sammlung beitragen? Keine falsche Bescheidenheit! Bitte bearbeite diese Seite direkt selbst oder bitte ein anderes Mitglied um Unterstützung. Danke!&lt;br /&gt;
&lt;br /&gt;
==  Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
==  Erfahrung ==&lt;br /&gt;
&lt;br /&gt;
* [[Anwendungen_mit_Ansible_installieren|Ansible]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[CiviCRM_installieren|CiviCRM]]: [[User:tim00|tim00]]&lt;br /&gt;
* [[Gitea]]: [[User:sib|sib]]&lt;br /&gt;
* [[Mlmmj]]: [[User:sib|sib]]&lt;br /&gt;
* [[Nextcloud]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[Eigenes_Python_installieren|Python]]: [[User:tim00|tim00]]&lt;br /&gt;
* OpenPetra: [[User:tim00|tim00]]&lt;br /&gt;
* [[Roundcube]]: [[User:sib|sib]]&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/seb-schulz/cert-manager-webhook-hostsharing ACME Webhook für Cert Manager]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible Automatisierung mit Ansible]&lt;br /&gt;
* [https://github.com/sebatec-eu/config-mate Sebatec: Go-Konfiguration]&lt;br /&gt;
* [https://github.com/sebatec-eu/ssh-deploy-action Sebatec: Wiederverwendbar GitHub Action für SSH-Installation]&lt;br /&gt;
* [https://github.com/seb-schulz/hostsharing-dyndns Service-Konfiguratin für DynDNS]&lt;br /&gt;
&lt;br /&gt;
== Plattform ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
&lt;br /&gt;
* [https://solidevereine.de/organisation/nextcloud/#highperf Solidevereine: Nextcloud High Performance Backend (HPB) für Nextcloud Talk]&lt;br /&gt;
* [https://nextcloud.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): Nextcloud]&lt;br /&gt;
* [https://openpetra.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): OpenPetra]&lt;br /&gt;
* [https://www.swingbe.de/service/engineering SwIngBe: Full-Service-IT-Dienstleistungen]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Benutzer:Sib&amp;diff=7490</id>
		<title>Benutzer:Sib</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Benutzer:Sib&amp;diff=7490"/>
		<updated>2026-01-22T11:28:05Z</updated>

		<summary type="html">&lt;p&gt;Sib: refactor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das ist die Wiki-Seite vom Mitglied &#039;&#039;&#039;[https://swingbe.de Software Ingenieur Begerad(SiB)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Was &#039;&#039;&#039;SiB&#039;&#039;&#039; im Allgemeinen den Kunden anbietet,&lt;br /&gt;
wird&lt;br /&gt;
(aus unterschiedlichen Perspektiven)&lt;br /&gt;
auf der &#039;&#039;&#039;[https://www.swingbe.de/offer Angebot]&#039;&#039;&#039;&lt;br /&gt;
-Seite präsentiert.&lt;br /&gt;
&lt;br /&gt;
Dienstleistungen hat &#039;&#039;&#039;SiB&#039;&#039;&#039; auf der &#039;&#039;&#039;[https://www.swingbe.de/service Leistungen]&#039;&#039;&#039;&lt;br /&gt;
-Seite zusammengefasst.&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Benutzer:Sib&amp;diff=7489</id>
		<title>Benutzer:Sib</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Benutzer:Sib&amp;diff=7489"/>
		<updated>2026-01-22T11:27:47Z</updated>

		<summary type="html">&lt;p&gt;Sib: initial commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das ist die Wiki-Seite vom Mitglied &#039;&#039;&#039;[https://swingbe.de Software Ingenieur Begerad(SiB)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Was &#039;&#039;&#039;SiB&#039;&#039;&#039; im Allgemeinen den Kunden anbietet,&lt;br /&gt;
wird&lt;br /&gt;
(aus unterschiedlichen Perspektiven)&lt;br /&gt;
auf der &#039;&#039;&#039;[https://www.swingbe.de/offer Angebot]&#039;&#039;&#039;&lt;br /&gt;
-Seite präsentiert.&lt;br /&gt;
&lt;br /&gt;
Dienstleistungen hat &#039;&#039;&#039;SiB&#039;&#039;&#039; auf der &#039;&#039;&#039;[https://www.swingbe.de/service Leistungen]&#039;&#039;&#039;&lt;br /&gt;
-Seite zusammengefasst.&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7488</id>
		<title>Mitglieder-Quellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7488"/>
		<updated>2026-01-22T10:20:41Z</updated>

		<summary type="html">&lt;p&gt;Sib: refactor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Quellen der Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frage&#039;&#039;&#039;: Hast du dich schon mal gefragt, ob du in der &#039;&#039;&#039;Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
(etwa 300 Mitglieder Stand Januar 2026)&lt;br /&gt;
das einzige Mitglied bist,&lt;br /&gt;
welches sich mit Software XYZ befasst?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antwort&#039;&#039;&#039;: Hier findest du es heraus! Diese Quellen,&lt;br /&gt;
aus der Mitglieder-Gemeinschaft der [https://www.hostsharing.net Hostsharing eG],&lt;br /&gt;
bieten Interessenten die Möglichkeit,&lt;br /&gt;
in kooperativer Anstrengung,&lt;br /&gt;
das gemeinsame IT-Infrastruktor von &#039;&#039;&#039;Hostsharing&#039;&#039;&#039; weiterzuentwickeln.&lt;br /&gt;
&lt;br /&gt;
Diese Sammlung stammt aus der gemeinschaftlich betriebenen IT-Infrastruktur von &#039;&#039;&#039;Hostsharing&#039;&#039;&#039;. An dieser Stelle ist es nicht von Bedeutung, ob sie auch mit anderer Infrastruktur kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Diese Quellen beinhalten unter anderem:&lt;br /&gt;
&lt;br /&gt;
* Erfahrung&lt;br /&gt;
* Konfiguration&lt;br /&gt;
* Service&lt;br /&gt;
&lt;br /&gt;
Hast du einen Beitrag zu dieser Seite? Keine falsche Bescheidenheit! Bitte bearbeite diese Seite direkt selbst. Danke!&lt;br /&gt;
&lt;br /&gt;
==  Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
==  Erfahrung ==&lt;br /&gt;
&lt;br /&gt;
* [[Anwendungen_mit_Ansible_installieren|Ansible]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[CiviCRM_installieren|CiviCRM]]: [[User:tim00|tim00]]&lt;br /&gt;
* [[Gitea]]: [[User:sib|sib]]&lt;br /&gt;
* [[Mlmmj]]: [[User:sib|sib]]&lt;br /&gt;
* [[Nextcloud]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[Eigenes_Python_installieren|Python]]: [[User:tim00|tim00]]&lt;br /&gt;
* OpenPetra: [[User:tim00|tim00]]&lt;br /&gt;
* [[Roundcube]]: [[User:sib|sib]]&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/seb-schulz/cert-manager-webhook-hostsharing ACME Webhook für Cert Manager]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible Automatisierung mit Ansible]&lt;br /&gt;
* [https://github.com/sebatec-eu/config-mate Sebatec: Go-Konfiguration]&lt;br /&gt;
* [https://github.com/sebatec-eu/ssh-deploy-action Sebatec: Wiederverwendbar GitHub Action für SSH-Installation]&lt;br /&gt;
* [https://github.com/seb-schulz/hostsharing-dyndns Service-Konfiguratin für DynDNS]&lt;br /&gt;
&lt;br /&gt;
== Plattform ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
&lt;br /&gt;
* [https://solidevereine.de/organisation/nextcloud/#highperf Solidevereine: Nextcloud High Performance Backend (HPB) für Nextcloud Talk]&lt;br /&gt;
* [https://nextcloud.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): Nextcloud]&lt;br /&gt;
* [https://openpetra.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): OpenPetra]&lt;br /&gt;
* [https://www.swingbe.de/service/engineering SwIngBe: Full-Service-IT-Dienstleistungen]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7487</id>
		<title>Mitglieder-Quellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7487"/>
		<updated>2026-01-21T15:10:11Z</updated>

		<summary type="html">&lt;p&gt;Sib: Liste der Erfahrungen erweitert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Quellen der Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese Quellen,&lt;br /&gt;
aus der Mitglieder-Gemeinschaft der [https://www.hostsharing.net Hostsharing eG],&lt;br /&gt;
bieten Interessenten die Möglichkeit,&lt;br /&gt;
in kooperativer Anstrengung,&lt;br /&gt;
das gemeinsame IT und Hosting zu verbessern&lt;br /&gt;
(Alias: &#039;&#039;&#039;[https://en.wikipedia.org/wiki/Community_building Community Building]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Diese Quellen beinhalten unter anderem:&lt;br /&gt;
&lt;br /&gt;
* Plattform&lt;br /&gt;
* Service&lt;br /&gt;
* Software&lt;br /&gt;
&lt;br /&gt;
Diese Sammlung richtet sich an die Hosting- und IT-Umgebung von Hostsharing.&lt;br /&gt;
&lt;br /&gt;
Möchtest du etwas dazugeben oder anpassen? Zögere bitte nicht diese Seite direkt zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==  Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Mitglieder-Quellen|Quellen der Hostsharing Mitglieder-Gemeinschaft]]&lt;br /&gt;
&lt;br /&gt;
==  Erfahrung ==&lt;br /&gt;
&lt;br /&gt;
* [[Anwendungen_mit_Ansible_installieren|Ansible]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[CiviCRM_installieren|CiviCRM]]: [[User:tim00|tim00]]&lt;br /&gt;
* [[Gitea]]: [[User:sib|sib]]&lt;br /&gt;
* [[Mlmmj]]: [[User:sib|sib]]&lt;br /&gt;
* [[Nextcloud]]: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* [[Eigenes_Python_installieren|Python]]: [[User:tim00|tim00]]&lt;br /&gt;
* OpenPetra: [[User:tim00|tim00]]&lt;br /&gt;
* [[Roundcube]]: [[User:sib|sib]]&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/seb-schulz/cert-manager-webhook-hostsharing ACME Webhook für Cert Manager]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible Automatisierung mit Ansible]&lt;br /&gt;
* [https://github.com/sebatec-eu/config-mate Sebatec: Go-Konfiguration]&lt;br /&gt;
* [https://github.com/sebatec-eu/ssh-deploy-action Sebatec: Wiederverwendbar GitHub Action für SSH-Installation]&lt;br /&gt;
* [https://github.com/seb-schulz/hostsharing-dyndns Service-Konfiguratin für DynDNS]&lt;br /&gt;
&lt;br /&gt;
== Plattform ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
&lt;br /&gt;
* [https://solidevereine.de/organisation/nextcloud/#highperf Solidevereine: Nextcloud High Performance Backend (HPB) für Nextcloud Talk]&lt;br /&gt;
* [https://nextcloud.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): Nextcloud]&lt;br /&gt;
* [https://openpetra.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): OpenPetra]&lt;br /&gt;
* [https://www.swingbe.de/service/engineering SwIngBe: Full-Service-IT-Dienstleistungen]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7486</id>
		<title>Mitglieder-Quellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7486"/>
		<updated>2026-01-21T14:47:52Z</updated>

		<summary type="html">&lt;p&gt;Sib: refactor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Quellen der Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese Quellen,&lt;br /&gt;
aus der Mitglieder-Gemeinschaft der [https://www.hostsharing.net Hostsharing eG],&lt;br /&gt;
bieten Interessenten die Möglichkeit,&lt;br /&gt;
in kooperativer Anstrengung,&lt;br /&gt;
das gemeinsame IT und Hosting zu verbessern&lt;br /&gt;
(Alias: &#039;&#039;&#039;[https://en.wikipedia.org/wiki/Community_building Community Building]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Diese Quellen beinhalten unter anderem:&lt;br /&gt;
&lt;br /&gt;
* Plattform&lt;br /&gt;
* Service&lt;br /&gt;
* Software&lt;br /&gt;
&lt;br /&gt;
Diese Sammlung richtet sich an die Hosting- und IT-Umgebung von Hostsharing.&lt;br /&gt;
&lt;br /&gt;
Möchtest du etwas dazugeben oder anpassen? Zögere bitte nicht diese Seite direkt zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==  Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Mitglieder-Quellen|Quellen der Hostsharing Mitglieder-Gemeinschaft]]&lt;br /&gt;
&lt;br /&gt;
==  Erfahrung ==&lt;br /&gt;
&lt;br /&gt;
* Ansible: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* CiviCRM: [[User:tim00|tim00]]&lt;br /&gt;
* Nextcloud: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* Python: [[User:tim00|tim00]]&lt;br /&gt;
* OpenPetra: [[User:tim00|tim00]]&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/seb-schulz/cert-manager-webhook-hostsharing ACME Webhook für Cert Manager]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible Automatisierung mit Ansible]&lt;br /&gt;
* [https://github.com/sebatec-eu/config-mate Sebatec: Go-Konfiguration]&lt;br /&gt;
* [https://github.com/sebatec-eu/ssh-deploy-action Sebatec: Wiederverwendbar GitHub Action für SSH-Installation]&lt;br /&gt;
* [https://github.com/seb-schulz/hostsharing-dyndns Service-Konfiguratin für DynDNS]&lt;br /&gt;
&lt;br /&gt;
== Plattform ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
&lt;br /&gt;
* [https://solidevereine.de/organisation/nextcloud/#highperf Solidevereine: Nextcloud High Performance Backend (HPB) für Nextcloud Talk]&lt;br /&gt;
* [https://nextcloud.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): Nextcloud]&lt;br /&gt;
* [https://openpetra.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): OpenPetra]&lt;br /&gt;
* [https://www.swingbe.de/service/engineering SwIngBe: Full-Service-IT-Dienstleistungen]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7485</id>
		<title>Mitglieder-Quellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mitglieder-Quellen&amp;diff=7485"/>
		<updated>2026-01-21T14:44:40Z</updated>

		<summary type="html">&lt;p&gt;Sib: initial commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Quellen der Hostsharing Mitglieder-Gemeinschaft&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Diese Quellen,&lt;br /&gt;
aus der Mitglieder-Gemeinschaft der [https://www.hostsharing.net Hostsharing eG],&lt;br /&gt;
bieten Interessenten die Möglichkeit,&lt;br /&gt;
in kooperativer Anstrengung,&lt;br /&gt;
das gemeinsame IT und Hosting zu verbessern&lt;br /&gt;
(&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Community_building Community Building]&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Diese Quellen beinhalten unter anderem:&lt;br /&gt;
&lt;br /&gt;
* Plattform&lt;br /&gt;
* Service&lt;br /&gt;
* Software&lt;br /&gt;
&lt;br /&gt;
Diese Sammlung richtet sich an die Hosting- und IT-Umgebung von Hostsharing.&lt;br /&gt;
&lt;br /&gt;
Möchtest du etwas dazugeben oder anpassen? Zögere bitte nicht diese Seite direkt zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==  Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Mitglieder-Quellen|Quellen der Hostsharing Mitglieder-Gemeinschaft]]&lt;br /&gt;
&lt;br /&gt;
==  Erfahrung ==&lt;br /&gt;
&lt;br /&gt;
* Ansible: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* CiviCRM: [[User:tim00|tim00]]&lt;br /&gt;
* Nextcloud: [[User:sib|sib]], [[User:tim00|tim00]]&lt;br /&gt;
* Python: [[User:tim00|tim00]]&lt;br /&gt;
* OpenPetra: [[User:tim00|tim00]]&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/seb-schulz/cert-manager-webhook-hostsharing ACME Webhook für Cert Manager]&lt;br /&gt;
* [https://codeberg.org/tpokorra/hs.ansible Automatisierung mit Ansible]&lt;br /&gt;
* [https://github.com/sebatec-eu/config-mate Sebatec: Go-Konfiguration]&lt;br /&gt;
* [https://github.com/sebatec-eu/ssh-deploy-action Sebatec: Wiederverwendbar GitHub Action für SSH-Installation]&lt;br /&gt;
* [https://github.com/seb-schulz/hostsharing-dyndns Service-Konfiguratin für DynDNS]&lt;br /&gt;
&lt;br /&gt;
== Plattform ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;br /&gt;
&lt;br /&gt;
== Service ==&lt;br /&gt;
&lt;br /&gt;
* [https://solidevereine.de/organisation/nextcloud/#highperf Solidevereine: Nextcloud High Performance Backend (HPB) für Nextcloud Talk]&lt;br /&gt;
* [https://nextcloud.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): Nextcloud]&lt;br /&gt;
* [https://openpetra.ossaas.de Solidevereine: OS SaaS (Open Source Software as a Service): OpenPetra]&lt;br /&gt;
* [https://www.swingbe.de/service/engineering SwIngBe: Full-Service-IT-Dienstleistungen]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
WiP&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Roundcube&amp;diff=7446</id>
		<title>Roundcube</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Roundcube&amp;diff=7446"/>
		<updated>2025-11-14T13:52:58Z</updated>

		<summary type="html">&lt;p&gt;Sib: update address of Roundcube Wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für alle Hostsharing-Mitglieder und ihre Kunden gibt es eine zentrale Webmail-Installation, die unter https://webmail.hostsharing.net erreichbar ist.&lt;br /&gt;
&lt;br /&gt;
Diese Dokumentation beschreibt lediglich die wichtigsten Funktionen zum Einstieg. Weitere allgemeine Dokumentation gibt es im Wiki des Roundcube-Projekts [https://github.com/roundcube/roundcubemail/wiki]&lt;br /&gt;
&lt;br /&gt;
== Einrichten - Der erste Aufruf ==&lt;br /&gt;
[[Bild:Roundcube-031-login.png‎|miniatur|200px|right|Screenshot Webmail Einloggen]]&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt behandelt das erstmalige Einloggen eines neuen Nutzers. Hatte dieser Nutzer bereits vorher die alte Webmail-Installation [[IlohaMail]] benutzt, sind die Grundeinstellungen bereits übernommen.&lt;br /&gt;
&lt;br /&gt;
Auf dem Startbildschirm erscheinen Eingabefelder für Benutzernamen und Passwort. Beides Eingeben und &#039;Anmelden&#039; klicken oder Return-Taste drücken.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
Benutzer: xyz00-otto&lt;br /&gt;
Passwort: ganzgeheimespasswort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Maildir anlegen für neu angelegten Nutzer ===&lt;br /&gt;
Frisch angelegte Nutzer können sich nur einloggen, wenn in ihrem Account bereits der IMAP-Account durch Anlage des Verzeichnisses ~/Maildir erfolgt ist. Andernfalls findet das System keinen gültigen IMAP-Email-Account. Die Fehlermeldung &amp;quot;Keine Verbindung zum IMAP-Server&amp;quot; erscheint:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-errormessage-noconnection.png‎|none]]&lt;br /&gt;
&lt;br /&gt;
Diese Initialisierung kann wahlweise erfolgen durch&lt;br /&gt;
&lt;br /&gt;
# Versand einer Email von anderem Mail-Account an den neu erstellten Account (hierzu eine Email-Adresse mit dem Account verknüpfen)&lt;br /&gt;
# Einloggen über die Shell in den Account des neuen Nutzers und dort Aufruf von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
maildirmake ~/Maildir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Angabe von Namen und Email-Adresse ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-firstlogin-userinfo1.png‎|right|300px|miniatur|Aufforderung Eingabe Name/Email-Adresse]]&lt;br /&gt;
&lt;br /&gt;
Beim erstmaligen Einloggen in Roundcube müssen im Webmail-System der Name des Nutzers und seine Email-Adresse hinterlegt werden. Dazu erscheint beim Einloggen ein Fenster, das zur Eingabe dieser Informationen auffordert.&lt;br /&gt;
&lt;br /&gt;
Die eingegebenen Daten werden beim Versand von Emails als Absendername und Absender-Email-Adresse benutzt. Dies hat keinen Einfluß auf den &#039;&#039;Empfang&#039;&#039; von Emails. Weitere Namen/Adressen zum Versenden können als [[#Identit.C3.A4ten|Identitäten]] angelegt werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-firstlogin-userinfo2.png‎|right|300px|miniatur|Angabe von Namen und Email-Adresse]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel für Default-Werte&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
Name: xyz00-otto&lt;br /&gt;
Email-Adresse: xyz-otto@h01.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eingabe der nutzerspezifischen Angaben &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
Name: Otto Musterer&lt;br /&gt;
Email-Adresse: otto@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spezialordner ===&lt;br /&gt;
[[Bild:Roundcube-special-folders.png‎|right|Ordnerliste]]&lt;br /&gt;
&lt;br /&gt;
Roundcube zeigt die Ordner für Posteingang, Entwürfe, Gesendete Emails, Papierkorb und Spam gesondert am Anfang der Ordnerliste an. Dabei ist die Bezeichnung des Ordners analog der eingestellten Sprache unabhängig vom echten Namen der Ordner.&lt;br /&gt;
&lt;br /&gt;
Die folgende Tabelle zeigt die Funktion der Ordner, ihren deutschen Namen in der Ordnerliste und den Default-Wert für den echten Ordnernamen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;color:#e76700;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
!Text&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Ordnername&lt;br /&gt;
!Automatisch erstellt&lt;br /&gt;
|-&lt;br /&gt;
|Posteingang&lt;br /&gt;
|Posteingang&lt;br /&gt;
|INBOX&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
|Gesendet&lt;br /&gt;
|Gesendete Emails&lt;br /&gt;
|INBOX.Sent&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
|Entwürfe&lt;br /&gt;
|noch nicht versandte Emails im Entwurfsstadium&lt;br /&gt;
|INBOX.Drafts&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
|Gelöscht&lt;br /&gt;
|Papierkorb - Emails, die zum Löschen in den Papierkorb verschoben wurden&lt;br /&gt;
|INBOX.Trash&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | X&lt;br /&gt;
|-&lt;br /&gt;
|Spam&lt;br /&gt;
|Emails, die als Spam markiert und verschoben wurden&lt;br /&gt;
|INBOX.Junk&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
[[Bild:Roundcube-special-folders-settings.png‎|right|300px|miniatur|Setzen der Spezialordner]]&lt;br /&gt;
&lt;br /&gt;
Sind die Ordner beim ersten Einloggen schon vorhanden, werden sie automatisch mit ihrer Spezialfunktion verknüpft. Sind sie noch nicht vorhanden, werden sie automatisch durch Roundcube erstellt.&lt;br /&gt;
&lt;br /&gt;
Hat man andere Ordnernamen für die Spezialordner, wie z.B. &amp;lt;tt&amp;gt;INBOX.Gesendet&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;INBOX.sent-mail&amp;lt;/tt&amp;gt; für gesendete Email kann die Zuordnung zu den Spezialordnern unter Einstellungen &amp;amp;rarr; Spezialordner geändert werden.&lt;br /&gt;
&lt;br /&gt;
Siehe Beispiel rechts: Für die gesendeten Emails wird der Ordner &amp;lt;tt&amp;gt;INBOX.versendet&amp;lt;/tt&amp;gt; benutzt. Ein Ordner für Spams ist im Beispiel nicht verknüpft, die anderen Ordner haben ihre Standardwerte. Der Ordner für den Posteingang kann nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
Für Weiteres zu Ordnern siehe den entsprechenden Abschnitt &lt;br /&gt;
&#039;[[#Ordner|Ordner]]&#039;.&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliche Email-Funktionen ==&lt;br /&gt;
Nach dem Einloggen erscheint im Hauptfenster eine Liste der Emails im Posteingang. Eine kurze Erklärung der einzelnen Funktionen ist in der Tabelle unterhalb des Screenshots zu sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-mainscreen.png|none|700px|miniatur]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;color:#e76700;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
!Feld&lt;br /&gt;
!Kurztext&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A&lt;br /&gt;
|Ordnerliste&lt;br /&gt;
|Liste der abonnierten Ordner. [[#Spezialordner|Spezialordner]] werden oben gezeigt. Ordner mit ungelesenen Mails erscheinen &#039;&#039;&#039;fett&#039;&#039;&#039; mit der Anzahl der ungelsenen Mails dahinter. Siehe separaten Abschnitt wie weitere [[#Ordner abonnieren|Ordner abonniert]] werden können.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | B&lt;br /&gt;
|Email-Liste Sortierungsleiste&lt;br /&gt;
|Standardmäßig werden Emails absteigend nach Eingangsdatum sortiert. Durch Klicken auf &#039;Betreff&#039;, &#039;Absender&#039;, &#039;Datum&#039; oder &#039;Größe&#039; kann nach diesen sortiert werden und durch nochmaliges Klicken die Sortierreihenfolge geändert werden.&lt;br /&gt;
&lt;br /&gt;
Es ist derzeit nicht möglich die angezeigten Spalten zu verändern oder zu verschieben. Auch ist eine Thread-Darstellung nicht möglich. Beides wird ggf. mit späteren Versionen von Roundcube implementiert.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | C&lt;br /&gt;
|Emails Listenansicht&lt;br /&gt;
|Wichtigste Infos zu Emails wie Absender, Subject, Datum. Ungelesene Emails sind &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt und sind am Anfang der Zeile durch einen blauen Stern markiert. Durch anklicken einer Email erscheint diese im Vorschaufenster&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | D&lt;br /&gt;
|Vorschaufenster&lt;br /&gt;
|Im unteren Teil des Bildschirms werden ausgewählte Emails angezeigt. Innerhalb des Fensters kann gescrollt werden. Auch bei Text-Emails werden rudimentäre Formatierungen angezeigt, wie beispielsweise farbiges Hervorheben von Zitierungen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | E&lt;br /&gt;
|Email-Header&lt;br /&gt;
|Anzeige der wichtigsten Email-Header. Zusätzliche Header können angezeigt werden, in dem auf den Pfeil am unteren Ende der Header geklickt wird. Durch Klicken auf die Figur neben Namen/Email-Adresse, kann diese in das Adressbuch übernommen werden.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | F&lt;br /&gt;
|Neues Fenster&lt;br /&gt;
|Öffnen der Email in einem neuen Fenster&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | G&lt;br /&gt;
|Seitenauswahl&lt;br /&gt;
|Standardmäßig werden bis zu 40 Emails in der Übersicht je Seite angezeigt. In diesem Bereich kann durch die Seiten gescrollt werden. Die maximale Anzahl der Emails in der Listenansicht kann über die Einstellungen verändert werden, ist systemseitig allerdings auf 80 beschränkt.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | H&lt;br /&gt;
| Email-Auswahl&lt;br /&gt;
|Buttons zur Auwahl von Emails in der Listenansicht. Von links nach rechts: a) alle Auswählen b) ungelesene Mails auswählen c) Auswahl invertieren d) keine Mails auswählen.&lt;br /&gt;
&lt;br /&gt;
Diese Auswahl kann dann auf andere Funktionen (wie z.B. Löschen) angewandt werden.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | a&lt;br /&gt;
|Auf neue Nachrichten überprüfen&lt;br /&gt;
|Ausgewählter Ordner wird neu gelesen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | b&lt;br /&gt;
|Neue Nachricht schreiben&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | c&lt;br /&gt;
|Antwort verfassen&lt;br /&gt;
|Nur an Sender antworten&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | d&lt;br /&gt;
|Antwort an Versender und alle Empfänger verfassen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | e&lt;br /&gt;
|Nachricht weiterleiten&lt;br /&gt;
|Original-Nachricht wird in der neuen Email als Text eingefügt. Anhänge der Original-Nachricht werden als Anhang weitergeleitet.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | f&lt;br /&gt;
|Als Anhang weiterleiten&lt;br /&gt;
|Original-Nachricht wird als Anhang weitergeleitet&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | g&lt;br /&gt;
|Nachricht in den Papierkorb verschieben&lt;br /&gt;
|Nachricht wird zunächst nicht gelöscht sondern nur verschoben. Je nach Einstellung wird der Papierkorb beim Ausloggen geleert oder bleibt erhalten (Default: kein Löschen)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | h&lt;br /&gt;
|Mark as Junk&lt;br /&gt;
|Email wird in den Spam-Ordner verschoben, sofern ein solcher in den Einstellungen als Spezialornder markiert wurde. Andernfalls keine Funktion.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | i&lt;br /&gt;
|Nachrichten markieren&lt;br /&gt;
|Ausgewählte Nachrichten können als gelesen/ungelesen markiert werden, oder zur Hervorhebung mit einem Stern markiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | j&lt;br /&gt;
|Weiter Aktionen...&lt;br /&gt;
|Ausgewählte Nachricht drucken, speichern, Quelltext anzeigen, in neuem Fenster öffnen.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | k&lt;br /&gt;
|Filter&lt;br /&gt;
|Im Textfeld kann eine Zeichenkette eingegeben werden nach der im Subject gesucht wird. Nur diese Emails werden in der Liste angezeigt. Über die Drop-Down-Box links vom Textfeld kann die Suche eingeschränkt werden auf alle / ungelesene / unbeantwortete / markierte / gelöschte Emails. (Gelöschte nur, sofern diese nicht im Papierkorb sind, sondern mit dem IMAP-Status gelöscht versehen werden. Diese werden aber standardmäßig nicht angezeigt.)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einstellungen ==&lt;br /&gt;
&lt;br /&gt;
Jeder Nutzer kann gewisse Einstellungen vornehmen, die das Aussehen oder Verhalten von Roundcube verändern:&lt;br /&gt;
&lt;br /&gt;
Einstellungen, die auf der linken Seite des Einstellungsmenu zu erreichen sind:&lt;br /&gt;
&lt;br /&gt;
* Benutzeroberfläche: Sprache, Datumsanzeige, Zeitzone, Listenansicht&lt;br /&gt;
* Mailbox-Ansicht: Nachrichtenvorschau, Lesebestätigung, Prüfen auf neue Nachrichten, ...&lt;br /&gt;
* Nachrichtenerstellung: HTML-Nachrichten verfassen, Speichern von Entwürfen, ...&lt;br /&gt;
* Nachrichtendarstellung: Anzeige von HTML und externen Bildern festlegen, ...&lt;br /&gt;
* Spezialordner: Zuordnung von Ordnernamen zu Spezialordnern, siehe [[#Spezialordner|Spezialordner]]&lt;br /&gt;
* Server-Einstellungen: Löschverhalten&lt;br /&gt;
* Konto-Einstellungen: (keine Einstellungen)&lt;br /&gt;
&lt;br /&gt;
Einstellungen über separate Reiter:&lt;br /&gt;
&lt;br /&gt;
* Ordner: siehe gesonderte Dokumentation im Abschnitt [[#Ordner|Ordner]]&lt;br /&gt;
* Identitäten: siehe gesonderte Dokumentation im Abschnitt [[#Identit.C3.A4ten|Identitäten]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-addressbook.png‎|right|miniatur|350px|Adressbuchansicht]]&lt;br /&gt;
== Kontakte - Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
Das Adressbuch kann lediglich folgende Felder Speichern&lt;br /&gt;
&lt;br /&gt;
* Angezeigter Name: Freitext, kann aus Vor- und Nachnamen bestehen, aber auch andere Angaben wie Firma. Dieser Text erscheint in der Liste der Adressbuch-Einträge.&lt;br /&gt;
* Vorname&lt;br /&gt;
* Nachname&lt;br /&gt;
* Email-Adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-compose-selectaddress.png‎|right|miniatur|350px|Erstellen von Mails: Auswahl aus Adressbuch]]&lt;br /&gt;
Beim Verfassen von Emails wird bei der Eingabe von Adressen in den Feldern &#039;An&#039; und &#039;Kopie&#039; das Adressbuch nach Einträgen durchsucht, die die getippten Buchstaben enthalten. Beim Tippen von &#039;ing&#039; wird gefunden: &#039;Ingo&#039; aber auch &#039;Hostsharing&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
Beim Empfang von Emails können VCards des Senders in das Adressbuch übernommen werden, allerdings gibt es noch keine Funktion in Roundcube um diese auszulesen oder zu benutzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
== Identitäten ==&lt;br /&gt;
&lt;br /&gt;
Jeder Nutzer kann die Absenderangaben von zu versendenden Emails mit verschiedenen Identitäten variabel gestalten, z.B.:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-identities-newmail.png‎|right]]&lt;br /&gt;
* verschiedene Absendernamen für die einzelnen Familienmitglieder&lt;br /&gt;
* verschiedene Email-Adressen, die dem selben Account zugeordnet sind (Privat/Büro)&lt;br /&gt;
* verschiedene Signaturen&lt;br /&gt;
* ....&lt;br /&gt;
&lt;br /&gt;
Die Identitäten können beim Schreiben von neuen Emails über ein Drop-Down-Menü ausgewählt werden (siehe nebenstehendes Bild). Bei der Beantwortung von Emails versucht Roundcube die am besten passende Identität anhand des ursprünglichen Empfängernamens herauszufinden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Roundcube-identities-list.png‎|right]]&lt;br /&gt;
Unter Einstellungen &amp;amp;rarr; Identitäten (Reiter) wird im linken Teil eine Liste der erstellten Identitäten angezeigt, die sich per Klick zum Verändern auswählen lassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Roundcube-identities-edit-text.png‎|right]]&lt;br /&gt;
Je Identität können angegeben werden:&lt;br /&gt;
&lt;br /&gt;
* Der angezeigte Name&lt;br /&gt;
* Die Email-Adresse des Absenders&lt;br /&gt;
* Das Feld Organisation (wird wenig benutzt)&lt;br /&gt;
* Eine Adresse, an die geantwortet werden soll, sofern verschieden von der Absender-Email-Adresse&lt;br /&gt;
* Eine Email-Adresse an die standardmäßig beim Versand eine Blindkopie (Bcc) mitverschickt wird.&lt;br /&gt;
* Eine Signatur, die automatisch angehängt wird. Bei Emails im Textformat wird der Signaturtrenner &amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt; automatisch von Roundcube eingefügt.&lt;br /&gt;
* Eine Angabe, ob die Signatur in HTML verfasst werden soll (siehe Beipiel unten)&lt;br /&gt;
* Ein Häkchen, das festsetzt, ob diese Signatur die Standardsignatur ist und bei neuen Emails benutzt wird (sofern keine andere vom Nutzer ausgewählt wird.)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-identities-edit-html.png‎|left|miniatur|350px|HTML-Signatur]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
== Ordner ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Roundcube-folders.png‎|right]]&lt;br /&gt;
&lt;br /&gt;
Roundcube zeigt in der Ordnerliste nur die abonnierten Ordner an. In diesem Menu kann ausgewählt werden, welche Ordner abonniert werden sollen. Auch können neue Ordner angelegt oder vorhandene gelöscht werden. Die Abonnements, die durch andere Email-Programme (z.B. Thunderbird) vorgenommen wurden, werden automatisch berücksichtigt, wenn das Email-Programm, diese auf dem Email-Server ablegt.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;color:#e76700;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
!Feld&lt;br /&gt;
!Kurztext&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A&lt;br /&gt;
|Spezialordner&lt;br /&gt;
|Spezialordner können nicht aus dem Abo genommen werden oder gelöscht werden, solange sie als Spezialordner zugewiesen sind. (siehe [[#Spezialordner|Spezialordner].&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | B&lt;br /&gt;
|Normale Ordner&lt;br /&gt;
|Es werden alle weiteren Ordner für dieses Email-Konto angezeigt. Diese können abonniert, umbenannt oder gelöscht werden. Außerdem wird für jeden Ordner die Zahl der enthaltenen Emails angezeigt.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | C&lt;br /&gt;
|Abonnement&lt;br /&gt;
|Durch Setzen eines Hakens wird der Ordner für künftige Benutzung abonniert.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | D&lt;br /&gt;
|Umbenennen/Löschen&lt;br /&gt;
|Ausgewählte Ordner können gelöscht oder umbenannt werden.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Anlegen neuer Ordner ==== &lt;br /&gt;
Am unteren Ende des Ordnerfensters können über ein Textfeld neue Ordner angelegt werden. Diese werden automatisch abonniert.&lt;br /&gt;
&lt;br /&gt;
== Nutzung weiterer Features ==&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation zu weiteren ggf. weniger häufig benutzten Funktionen sind auf separaten Wiki-Seiten dokumentiert:&lt;br /&gt;
&lt;br /&gt;
* [[Roundcube - Filter|Filter]]: Automatisches Filtern von E-Mails mit Managesieve, z.B. Verschieben in andere Ordner, Abwesenheitsmeldung etc.&lt;br /&gt;
* [[Roundcube - Threads|Thread-Anzeige]]: Gruppieren von Emails nach Themen&lt;br /&gt;
* [[Roundcube - Adressgruppen|Adressgruppen]]: Erstellen von Verteilerlisten im Adressbuch&lt;br /&gt;
* [[Roundcube - Emailhervorhebung|Hervorhebung von Emails]]: Markieren von Emails durch Farben abhängig vom Versender, Subject, etc.&lt;br /&gt;
&lt;br /&gt;
== Sicherheit und Datenschutz ==&lt;br /&gt;
&lt;br /&gt;
Zugriff auf das Webmail-Programm erfolgt ausschließlich SSL-verschlüsselt über &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nutzerdaten wie Kontakte oder Identitäten werden in einer PostgreSQL-Datenbank abgespeichert. Das Passwort des Users wird temporär verschlüsselt zwischengespeichert. Außerdem werden von den Emails in den Ordner die Kopfzeilen - Absender, Empfänger, Thema, Datum, ... - für die schnellere Bearbeitung zwischengespeichert. Passwort und Kopfzeilen werden nach dem Ausloggen gelöscht.&lt;br /&gt;
&lt;br /&gt;
Auf die Datenbank können nur Hostmaster und Maintainer zugreifen, die jeweils eine Datenschutzerklärung unterschrieben haben müssen.&lt;br /&gt;
&lt;br /&gt;
== Weiteres == &lt;br /&gt;
&lt;br /&gt;
Die für den Webmailer benutzte Software ist [http://roundcube.net Roundcube]&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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Roundcube_-_Filter&amp;diff=7443</id>
		<title>Roundcube - Filter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Roundcube_-_Filter&amp;diff=7443"/>
		<updated>2025-11-12T05:03:14Z</updated>

		<summary type="html">&lt;p&gt;Sib: Abschnitt Quellen entfernt, weil diese nicht mehr existieren&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Roundcube - Filter ==&lt;br /&gt;
&lt;br /&gt;
Das Webmailprogramm [[Roundcube]] erlaubt Emails automatisch zu Filtern. Dieser Artikel beschreibt, wie mit der Erweiterung sieverules solche Filter definiert werden können.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeines zum Filtern ===&lt;br /&gt;
&lt;br /&gt;
Über das Mailzustellungsprogramm Deliver ist es mit der Erweiterung [[Managesieve]] möglich Emails beim Eintreffen in der Mailbox zu Filtern. Die Filterung findet hierbei bereits auf dem Server statt, so daß der User nicht mit seinem Mailprogramm oder Webmailer eingeloggt sein muß.&lt;br /&gt;
&lt;br /&gt;
Hierbei ist es möglich u.a. folgende Aktionen durchzuführen&lt;br /&gt;
&lt;br /&gt;
* Mails in einen bestimmten Ordner abzuspeichern&lt;br /&gt;
* Mails an einen anderen Empfänger weiterzuleiten&lt;br /&gt;
* eine Abwesenheitsmeldung zu verschicken&lt;br /&gt;
* den Empfang einer Email abzulehnen&lt;br /&gt;
* eine Mail zu löschen&lt;br /&gt;
&lt;br /&gt;
Die Ausführung dieser Filteraktionen kann gesteuert werden z.B. basierend auf&lt;br /&gt;
&lt;br /&gt;
* dem Absender der eintreffenden Email&lt;br /&gt;
* des Titels oder Teilen hiervon&lt;br /&gt;
* dem Vorhandensein oder Nichtvorhandensein bestimmter Wörter im Text der Nachricht&lt;br /&gt;
* die Auswertung von zusätzlichen Mail-Headern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-01-einstellungen.png|miniatur|250px|right|Einstellungen]]&lt;br /&gt;
Detaillierte Informationen können z.B. der [http://de.wikipedia.org/wiki/Sieve Wikipedia] oder unter [http://www.sieve.info sieve.info] entnommen werden. Im Hostsharing-Wiki unter [[Managesieve]] sind ebenfalls weitere Grundlageninformationen zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung ===&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn der Nutzer schon eine .forward mit z.b. procmail nutzt muss wie unter &lt;br /&gt;
[https://wiki.hostsharing.net/index.php?title=Managesieve#Zusammenarbeit_mit_Procmail Zusammenarbeit_mit_Procmail]&lt;br /&gt;
beschrieben ist beachtet werden.&lt;br /&gt;
&lt;br /&gt;
Filter können unter &amp;lt;tt&amp;gt;Einstellungen&amp;lt;/tt&amp;gt; eingerichtet und verändert werden. Hierzu im Menu Einstellungen den Reiter ganz rechts &amp;lt;tt&amp;gt;Filter&amp;lt;/tt&amp;gt; auswählen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Sieve-02-mailuebersicht.png|center|none|frame|Ungefilterter Posteingang]]&lt;br /&gt;
Für die folgenden Beispiele wird davon ausgegangen, daß der Nutzer in seinem Posteingang ohne Filter die Situation, wie im Bild oben angezeigt vorfindet: Viele Emails aus (drei) Mailinglisten und eine private Email. Alle Mails sind in einem Ordner und erschweren das Finden der ggf. wichtigen privaten Email.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-03-neuer-filter.png|miniatur|250px|right|Neuen Filter anlegen]]&lt;br /&gt;
Zunächst soll ein neuer Filter angelegt werden, der die Emails der Mailingliste &amp;lt;tt&amp;gt;otrs-de&amp;lt;/tt&amp;gt; [http://doc.otrs.org/2.2/de/html/additional-resources-mailinglists.html] in einen eigenen Ordner verschiebt.&lt;br /&gt;
&lt;br /&gt;
Hierzu unter der (leeren) Filterliste auf das &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; zum Anlegen eines Neuen Filters klicken.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Sieve-04-OTRS-filter.png|miniatur|600px|right|Anlegen eines Filters für eine Mailingliste]]&lt;br /&gt;
Im neu geöffneten Formular kann der neue Filter definiert werden.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Filternamen&#039;&#039;&#039; vergeben: zum Beispiel OTRS für die entsprechende Maillingliste (oder zur besseren späteren Erinnerung: &amp;quot;Mailingliste otrs-de&amp;quot;). &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;OTRS&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Filterregel&#039;&#039;&#039;: Hier wird definiert unter welchen Bedingungen der Filter angewandt werden soll.&amp;lt;br&amp;gt;Drei Optionen stehen zur Auswahl&lt;br /&gt;
** Irgendeine Bedingung muß erfüllt sein (ODER)&lt;br /&gt;
** Alle Bedingungen müssen erfüllt sein (UND) &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;Auswählen&amp;lt;/span&amp;gt;&lt;br /&gt;
** Die Bedingung ist für alle Emails gültig (keine Bedingung notwendig)&lt;br /&gt;
* Die Definition der Filterregel beinhaltet das Auswahl eines Teils der Nachricht (z.B. Absender, Datum, Betreff, Text) und einem Wert, mit dem verglichen werden soll. In unserem Beispiel: &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;BETREFF enthält &amp;lt;nowiki&amp;gt;[otrs-de]&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Filteraktion&#039;&#039;&#039;: Die Aktion, die ausgeführt werden soll. &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;Verschiebe Nachricht nach OTRS&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Aktionen, die Nachrichten in andere Ordner verschieben oder kopieren werden die möglichen Ordner die zum Zeitpunkt der Filteranlage existieren in einem Drop-Down-Menu angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Speichern&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-05-hostsharing-filter.png|miniatur|600px|right|Filter für Mailingliste über Mail-Header und Ausnahme]]&lt;br /&gt;
=== Weitere Beispiele ===&lt;br /&gt;
&lt;br /&gt;
==== Maillinglisten Filter ====&lt;br /&gt;
&lt;br /&gt;
Im Beispiel rechts werden wieder die Emails einer Mailinglliste gefiltert. Hier handelt es sich um die &amp;lt;tt&amp;gt;Technik&amp;lt;/tt&amp;gt;-Liste von Hostsharing.&lt;br /&gt;
&lt;br /&gt;
Der Filter erhält folgende Kriterien:&lt;br /&gt;
* &#039;&#039;&#039;Filterregel&#039;&#039;&#039;: Der Filter wird &#039;&#039;&#039;nicht&#039;&#039;&#039; angewandt, wenn der Text der Nachricht das Wort &amp;quot;Festplattencrash&amp;quot; enthält, der Empfänger, solche Emails also in seinem Posteingang behalten möchte.&amp;lt;br&amp;gt;Darüber hinaus wird die Mailingliste identifiziert über den Mail-Header &amp;lt;tt&amp;gt;List-Id&amp;lt;/tt&amp;gt;. Solche zusätzlichen Mail-Header können über die Auswahl &amp;quot;Anderer Header&amp;quot; ausgewählt werden.&amp;lt;br&amp;gt;Beide Bedingungen müssen erfüllt sein (UND), also &amp;quot;trifft alle folgenden Regeln&amp;quot; auswählen.&lt;br /&gt;
* &#039;&#039;&#039;Filteraktion&#039;&#039;&#039;: Wie im ersten Beispiele wieder das Verschieben in einen Ordner, hier &amp;lt;tt&amp;gt;hostsharing&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Sieve-06-abwesenheitsmeldung-filter.png|miniatur|600px|right|Abwesenheitsmeldung]]&lt;br /&gt;
==== Abwesenheitsmeldung ====&lt;br /&gt;
&lt;br /&gt;
Nutzer möchten oft bei längerer Abwesenheit dem Absender einer Email mitteilen, daß sie die empfangene Email z.B. wegen Urlaubs nicht lesen können. Hierzu kann eine Abwesenheitsmeldung definiert werden, die automatisch eine Antwort-Email generiert mit einem vordefinierten Text.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel sollen die Absender &amp;quot;peter.lustig&amp;quot; und &amp;quot;Wickie&amp;quot; keine Abwesenheitsmeldung erhalten, sowie bei Emails, die das Wort &amp;quot;Werbung&amp;quot; im Betreff enthalten auch keine Abwesenheitsmeldung verschickt werden.&lt;br /&gt;
* &amp;quot;Absender enthält nicht &#039;peter.lustig&#039;&amp;quot; - Ein Vergleich mit der Email-&#039;&#039;Adresse&#039;&#039; wird durchgeführt.&amp;lt;br&amp;gt;Peter &amp;lt;peter.lustig@example.org&amp;gt; - Hier ist peter.lustig in der Adresse enthalten&amp;lt;br&amp;gt;Peter.Lustig &amp;lt;peter@example.org&amp;gt; - Hier ist peter.lustig &#039;&#039;nicht&#039;&#039; in der &#039;&#039;Adresse&#039;&#039; enthalten.&lt;br /&gt;
* &amp;quot;Anderer Header &amp;quot;From&amp;quot; enthält nicht &#039;Wickie&#039;&amp;quot; - Ein Vergleich mit der &#039;&#039;kompletten Absender-Angabe&#039;&#039; wird durchgeführt&amp;lt;br&amp;gt;&#039;&#039;Susanne &amp;lt;wickie@example.org&amp;gt;&#039;&#039; aber auch &#039;&#039;Wickie &amp;lt;susanne@example.org&amp;gt;&#039;&#039; werden gefunden&lt;br /&gt;
* &amp;quot;Betreff enthält nicht &#039;Werbung&#039; - Das Wort Werbung darf nicht im Betreff enthalten sein.&lt;br /&gt;
&lt;br /&gt;
In den &#039;&#039;&#039;Filteraktionen&#039;&#039;&#039; wird die Aktion &amp;quot;Abwesenheitsmeldung&amp;quot; ausgewählt.&lt;br /&gt;
* &#039;&#039;&#039;Absender&#039;&#039;&#039;: Hat man mehrere Identitäten in Webmail angelegt, kann man hier aussuchen unter welchem Absender die Abwesenheitsmeldung geschickt werden soll.&lt;br /&gt;
* &#039;&#039;&#039;Alias&#039;&#039;&#039;: Die Vacation-Extension schickt Abwesenheitsmeldungen &#039;&#039;&#039;nur&#039;&#039;&#039; wenn die Mail an eine dem System für &#039;&#039;diesen&#039;&#039; Account bekannte Email-Adresse geschickt wurde. Im konkreten Fall bei der Erstellung über Roundcube müssen also für jede Email-Adresse Identitäten angelegt werden, also z.B. sowohl max.mustermann@example.org und maexchen@example.org. Diese müssen dann auch unter &amp;quot;Alias&amp;quot; explizit ausgewählt werden. Werden Emails an den Account mit einer anderen Empfänger-Adresse geschickt, erhalten diese &#039;&#039;&#039;keine&#039;&#039;&#039; Abwesenheitsmeldung. siehe auch [http://tools.ietf.org/html/rfc5230#section-4.5 RFC5230] Abschnitt 4.5&lt;br /&gt;
* &#039;&#039;&#039;Zeitraum&#039;&#039;&#039;: Sagt aus, nach wieviel Tagen ein Absender eine erneute Abwesenheitsmeldung erhält. Im Beispiel also z.B. nur einmal alle 3 Tage. Wenn der Absender dazwischen neue Emails versendet, erhält er keine neue Abwesenheitsmeldung. Nach 3 Tagen wird bei erneuten Emails wieder eine Abwesenheitsmeldung verschickt. Hierz speichert sich &amp;lt;tt&amp;gt;deliver&amp;lt;/tt&amp;gt; eine Liste der Empfänger.&lt;br /&gt;
* &#039;&#039;&#039;Betreff&#039;&#039;&#039;: Der Betreff der Abwesenheitsmeldung, z.B. &amp;quot;Abwesenheit - Urlaub&amp;quot;; der originale Betreff der Email kann zur Identifizierung angehängt werden.&amp;lt;br&amp;gt;Wird also automatisch auf eine Mail &amp;quot;Geburtstagseinladung&amp;quot; geantwortet, wäre der Betreff der Abwesenheitsmeldung &amp;quot;Abwesenheit - Urlaub Geburtstagseinladung&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Nachricht&#039;&#039;&#039;: Der eigentliche Text der Abwesenheitsmeldung, z.B. Dauer der Abwesenheitsmeldung, Vertretungsregelung, Erreichbarkeit.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-07-reihenfolge-a.png|miniatur|300px|left|Reihenfolge Filter ändern über Pfeile]]&lt;br /&gt;
[[Bild:Sieve-07-reihenfolge-b.png|miniatur|300px|right|Nach Änderung der Reihenfolge]]&lt;br /&gt;
===== Reihenfolge von Filtern =====&lt;br /&gt;
&lt;br /&gt;
Insbesondere bei Abwesenheitsmeldungen ist die Reihenfolge der Filter wichtig. Im Beispiel links wird der Filter &amp;quot;osm&amp;quot; erst nach der Abwesenheitsmeldung angewandt, Mails, die durch diesen Filter nicht schon wegsortiert wurden, erhalten also eine Abwesenheitsmeldung. Wenn dies unerwünscht ist, muß der Filter &#039;&#039;&#039;vor&#039;&#039;&#039; den Filter der Abwesenheitsmeldung verschoben werden (über die Pfeile rechts neben des Filterliste).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
In (u.a.) folgenden Fällen werden &#039;&#039;&#039;Abwesenheitsmeldungen vom System nicht verschickt&#039;&#039;&#039;:&lt;br /&gt;
* Die Absenderadresse deutet auf eine Mailingliste hin, z.B. beginnt mit: &#039;&#039;mailer-daemon&#039;&#039;, &#039;&#039;listserv&#039;&#039;, &#039;&#039;majordomo&#039;&#039;, &#039;&#039;owner-&#039;&#039; oder enthält &#039;&#039;-request&#039;&#039;&lt;br /&gt;
* Es existiert ein Header &amp;quot;Precedence&amp;quot; der &#039;&#039;junk&#039;&#039;, &#039;&#039;bulk&#039;&#039; oder &#039;&#039;list&#039;&#039; enthält.&lt;br /&gt;
* Der Empfänger der Nachricht steht nicht in &#039;&#039;To&#039;&#039; oder &#039;&#039;Cc&#039;&#039;.&lt;br /&gt;
* Sender und Empfänger haben dieselbe Email-Adresse.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-08-kopiesenden.png|miniatur|600px|right|TEXT]]&lt;br /&gt;
&lt;br /&gt;
==== Kopie an anderen Empfänger versenden. ====&lt;br /&gt;
&lt;br /&gt;
Eine erhaltene Email soll an eine andere Email-Adresse (in Kopie) weitergeleitet werden, z.B. von der Privatadresse an die Geschäftsadresse.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Filterregel&#039;&#039;&#039;: In diesem Beispiel soll der lokale Teil der Absender-Adresse verglichen werden. &amp;quot;Absender&amp;quot; wählen, dann &amp;quot;weitere Optionen&amp;quot; &#039;&#039;&#039;(1)&#039;&#039;&#039; und unter &#039;&#039;Operatoren&#039;&#039; &#039;&#039;User-Teil gleich&#039;&#039;. &#039;&#039;&#039;(2)&#039;&#039;&#039;&amp;lt;br&amp;gt; Im Beispiel wurde der User-Teil mit &#039;&#039;susanne.musterfrau&#039;&#039; &#039;&#039;&#039;(3)&#039;&#039;&#039; angegeben. Zur Email-Adresse &#039;&#039;susanne.musterfrau@example.de&#039;&#039; wird ein Match gefunden für &#039;&#039;sara-susanne.musterfrau@example.org&#039;&#039; hingegen nicht, weil der lokale Teil der Email-Adresse nicht übereinstimmt.&lt;br /&gt;
* &#039;&#039;&#039;Filteraktionen&#039;&#039;&#039;: &amp;quot;Sende eine Kopie an&amp;quot; wählen &#039;&#039;&#039;(4)&#039;&#039;&#039; und eine Ziel-Adresse angeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sieve-09-filter-abschalten-a.png|miniatur|400px|left|Filter abschalten]]&lt;br /&gt;
[[Bild:Sieve-09-filter-abschalten-b.png|miniatur|300px|right|Filterübersicht im inaktivem Filter]]&lt;br /&gt;
==== Filter deaktivieren/aktivieren ====&lt;br /&gt;
&lt;br /&gt;
Soll ein Filter temporär deaktivitert werden, kann in der Filterbearbeitung &#039;&#039;&#039;Filterregel abschalten&#039;&#039;&#039; angeklickt werden. In der Filterübersicht ist der Filter dann als &#039;&#039;&amp;quot;(abgeschaltet)&amp;quot;&#039;&#039; markiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
[[Bild:Sieve-10-nach-anwendung-filter.png|miniatur|600px|right|Nach dem Filtern]]&lt;br /&gt;
==== Nach dem Filtern ====&lt;br /&gt;
&lt;br /&gt;
Die im obigen Beispiel gezeigte Inbox mit über 200 Emails sieht nach Anwendung der Filter wie im nebenstehenden Bild aus.&lt;br /&gt;
&lt;br /&gt;
* Im Posteingang &#039;&#039;&#039;(1)&#039;&#039;&#039; ist nur noch eine private Email vorhanden&lt;br /&gt;
* Die Emails and die Mailinglisten wurden in die jeweiligen Ordner &#039;&#039;&#039;(2)&#039;&#039;&#039; einsortiert.&lt;br /&gt;
&lt;br /&gt;
=== Technisches ===&lt;br /&gt;
&lt;br /&gt;
==== Speicherort ====&lt;br /&gt;
&lt;br /&gt;
Roundcube speichert die erstellten Regeln unter &lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
~/Maildir/sieve/roundcube.sieve&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und verlinkt diese Filterdatei automatisch für die Benutzung mit dovecot:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h01:~$ ls -al &lt;br /&gt;
drwxr-xr-x  5 xyz00-max xyz00  4096 Nov 16 07:28 .&lt;br /&gt;
drwxr-xr-x 28 xyz00-max xyz00  4096 Oct 22 23:06 ..&lt;br /&gt;
lrwxrwxrwx  1 xyz00-max xyz00    29 Nov 16 07:28 .dovecot.sieve -&amp;gt; Maildir/sieve/roundcube.sieve&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wurden von anderen Programmen -- oder manuell -- andere Filtersets angelegt, werden diese vom Plugin deaktiviert. Die ursprüngliche Filterdatei bleibt erhalten, aber obiger Symlink verweist dann auf die Roundcube-Filter.&lt;br /&gt;
&lt;br /&gt;
==== Manuelles Editieren ====&lt;br /&gt;
&lt;br /&gt;
Vom manuellen Bearbeiten der Filterdatei &amp;lt;tt&amp;gt;roundcube.sieve&amp;lt;/tt&amp;gt; wird abgeraten, da bei erneutem Einlesen durch das Roundcube-Plugin diese Regeln mit großer Wahrscheinlichkeit wieder automatisch umgeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Für komplexeres Filtern kann eine komplett manuelle Datei angelegt werden und entsprechend verlinkt werden. Siehe auch den Artikel zu [[Managesieve]].&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
&lt;br /&gt;
Einige Sieve-relevante Links, sind im entsprechenden [https://wiki.hostsharing.net/index.php?title=Managesieve#Links Managesieve Wiki-Artikel] angegeben: &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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=LTB-SSP&amp;diff=7379</id>
		<title>LTB-SSP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=LTB-SSP&amp;diff=7379"/>
		<updated>2025-06-05T12:09:16Z</updated>

		<summary type="html">&lt;p&gt;Sib: Installation von LTB-SSP dokumentieren&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= LTB Self Service Password (SSP) =&lt;br /&gt;
&lt;br /&gt;
[https://ltb-project.org/documentation/self-service-password.html LTB Self Service Password] ist ein Dienst zur Kennwort-Zuruecksetzung (Password Reset) fuer Verzeichnis-Dienste wie bspw. [[OpenLDAP]], welcher vom [https://ltb-project.org/documentation/index.html LDAP Tool Box Projekt] stammt.&lt;br /&gt;
&lt;br /&gt;
= LTB SSP Installation =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
&lt;br /&gt;
Wir fragen den [[HS-Service]], ob das [https://packages.debian.org/bookworm/all/smarty3/download Smarty] Paket auf dem entsprechenden Managed Server installiert werden kann und warten auf Antwort.&lt;br /&gt;
&lt;br /&gt;
Nach positiver Antwort legen wir mit Hilfe von HSAdmin die folgende Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
* Einen Domain User mit der Shell &#039;/bin/bash&#039; erstellen; bspw. &amp;quot;xyz00-ltb_ssp&amp;quot;&lt;br /&gt;
* Beim User schalten wir eine Domain auf; bspw. &amp;quot;pwreset.example.com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Per SSH verbinden wir uns mit dem entsprechenden Domain User und fuehren die folgenden Instruktionen aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh xyz03-ltb_ssp@xyz03.hostsharing.net&lt;br /&gt;
wget https://ltb-project.org/archives/ltb-project-self-service-password-1.7.3.tar.gz&lt;br /&gt;
tar -xzf ltb-project-self-service-password-1.7.3.tar.gz&lt;br /&gt;
rm ltb-project-self-service-password-1.7.3.tar.gz&lt;br /&gt;
ln -s ltb-project-self-service-password-1.7.3 ltb_ssp&lt;br /&gt;
cd ~/doms/pwreset.example.com&lt;br /&gt;
rm -r subs subs-ssl htdocs-ssl&lt;br /&gt;
ln -s /home/pacs/xyz03/users/ltb_ssp/ltb_ssp/htdocs htdocs-ssl&lt;br /&gt;
cd htdocs-ssl&lt;br /&gt;
ln -s /home/pacs/xyz03/users/ltb_ssp/ltb_ssp/rest&lt;br /&gt;
cd ..&lt;br /&gt;
vi fastcgi-ssl/php.ini&lt;br /&gt;
[PHP]&lt;br /&gt;
display_errors = Off&lt;br /&gt;
log_errors = On&lt;br /&gt;
error_log = /home/pacs/xyz03/users/ltb_ssp/logs/php_errors.log&lt;br /&gt;
:wq&lt;br /&gt;
mkdir -p /home/pacs/xyz03/users/ltb_ssp/ltb_ssp/cache&lt;br /&gt;
mkdir -p /home/pacs/xyz03/users/ltb_ssp/ltb_ssp/templates_c&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:LDAP]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Guter_Stil&amp;diff=7378</id>
		<title>Guter Stil</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Guter_Stil&amp;diff=7378"/>
		<updated>2025-06-05T12:05:57Z</updated>

		<summary type="html">&lt;p&gt;Sib: Kategorie angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine gute Seite im HS-Wiki hat einen passenden Namen, der auf das Einfachste reduziert ist. Wenn andere Worte mit der gleichen Bedeutung (Synonyme) auf die gleiche Seite linken sollen, dann kann eine Weiterleitung angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine gute Seite enthält Fakten. Sie ist wenn möglich in der zweiten oder dritten Person geschrieben, damit andere leichter an der Seite weiterarbeiten können. In der ersten Person wird nur geschrieben, wenn über Erfahrungen berichtet wird, die sich nicht auf Fakten oder Ratschläge reduzieren lassen. Auf den Diskussionsseiten wird immer in der ersten Person geschrieben. Am Ende des eigenen Beitrages auf den Diskussionsseiten kann unterschrieben werden. Das Wichtigste steht da, wo es leicht zu lesen ist: am Anfang, nicht am Ende. Das Ändern der Seiten erfolgt so, dass der Fluß der Ideen herausgestrichen wird, nicht die zeitliche Aufeinanderfolge der Beiträge. Erst dann, wenn eine Seite zu groß und damit unübersichtlich wird, sollte sie mit Links in weitere Seiten aufgeteilt werden. &lt;br /&gt;
&lt;br /&gt;
Das Wiki hat einfache TextFormatierungsRegeln. Jede Zeile beginnt ohne Leerzeichen und jeder Absatz endet mit einer leeren Zeile. Wörter in eckigen &amp;lt;nowiki&amp;gt;[[Klammern]]&amp;lt;/nowiki&amp;gt; werden zu Links auf andere Seiten. Die richtigen Wörter für einen Link zu finden braucht Kreativität. &lt;br /&gt;
&lt;br /&gt;
Kontrolliere das Ergebnis Deiner Eingaben mit der Vorschau, bevor Du die Seite endgültig speicherst.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie: Hilfe]]&lt;br /&gt;
[[Kategorie:Hostsharing Wiki]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=LLDAP&amp;diff=7377</id>
		<title>LLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=LLDAP&amp;diff=7377"/>
		<updated>2025-06-05T09:44:58Z</updated>

		<summary type="html">&lt;p&gt;Sib: added link to page LTB-SSP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LDAP Kontoverwaltung mit LLDAP ==&lt;br /&gt;
&lt;br /&gt;
LLDAP ist ein LDAP Server, der in der Programmiersprache Rust implementiert ist. LLDAP verwendet eine relationale Datenbank zum Speichern der Accounts und Gruppen. LLDAP läßt sich als eigener Daemon betreiben. Er bringt ein einfaches Webfrontend für die Verwaltung der Konten und Gruppen und eine Funktion zum Passwort-Rücksetzen mit.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in HSAdmin ===&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von HSAdmin werden im ersten Schritt ein Service-User, eine Domain und ein PostgreSQL-User mit PostgreSQL-Datenbank angelegt. Der Service-User heißt im folgenden &amp;quot;&#039;&#039;xyz00-lldap&#039;&#039;&amp;quot;, die Domain &amp;quot;&#039;&#039;account.hs-example.de&#039;&#039;&amp;quot;, PostgreSQL-User und -Datenbank heißen beide &amp;quot;&#039;&#039;xyz00_lldap&#039;&#039;&amp;quot;. Das PostgreSQL-Passwort sei &amp;quot;&#039;&#039;pg_password_99&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Download und entpacken ===&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Version von LLDAP ist v0.6.1.&lt;br /&gt;
&lt;br /&gt;
Ich melde mich als User &amp;quot;&#039;&#039;xyz00-lldap&#039;&#039;&amp;quot; und lade das Binärpaket mit wget:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://github.com/lldap/lldap/releases/download/v0.6.1/amd64-lldap.tar.gz&lt;br /&gt;
tar xzf amd64-lldap.tar.gz&lt;br /&gt;
mv amd64-lldap lldap &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration erfolgt über eine Datei &amp;quot;&#039;&#039;lldap_config.toml&#039;&#039;&amp;quot; im Verzeichnis &amp;quot;&#039;&#039;~/lldap&#039;&#039;&amp;quot;. die Datei erstelle ich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/lldap&lt;br /&gt;
touch lldap_config.toml&lt;br /&gt;
vim lldap_config.toml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
der Inhalt nach dem Bearbeiten ist zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
verbose=true&lt;br /&gt;
ldap_host = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
ldap_port = 33891&lt;br /&gt;
http_host = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
http_port= 33881&lt;br /&gt;
http_url = &amp;quot;https://account.hs-example.de&amp;quot;&lt;br /&gt;
jwt_secret = &amp;quot;generierte-zufallszeichenkett-als-secret&amp;quot;&lt;br /&gt;
ldap_base_dn = &amp;quot;dc=hs-example,dc=de&amp;quot;&lt;br /&gt;
ldap_user_dn = &amp;quot;admin&amp;quot;&lt;br /&gt;
ldap_user_email = &amp;quot;webmaster@hs-example.de&amp;quot;&lt;br /&gt;
ldap_user_pass = &amp;quot;ldap-admin-password-generieren&amp;quot;&lt;br /&gt;
force_ldap_user_pass_reset = false&lt;br /&gt;
database_url = &amp;quot;postgres://xyz00_lldap:pg_password_99@localhost/xyz00_lldap&amp;quot;&lt;br /&gt;
key_seed = &amp;quot;generierte-zufallszeichenkette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[smtp_options]&lt;br /&gt;
enable_password_reset = true&lt;br /&gt;
server = &amp;quot;localhost&amp;quot;&lt;br /&gt;
port = 4025&lt;br /&gt;
smtp_encryption = &amp;quot;NONE&amp;quot;&lt;br /&gt;
from=&amp;quot;LLDAP Admin &amp;lt;webmaster@hs-example.de&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[ldaps_options]&lt;br /&gt;
enabled = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Installation sollten folgende Einstellungen angepasst werden:&lt;br /&gt;
* die Ports für LDAP und HTTP&lt;br /&gt;
* Die Domain &amp;quot;&#039;&#039;hs-example.de&#039;&#039;&amp;quot; bzw. &amp;quot;&#039;&#039;account.hs-example.de&#039;&#039;&amp;quot;&lt;br /&gt;
* Der Account-Präfix &amp;quot;&#039;&#039;xyz00&#039;&#039;&amp;quot;&lt;br /&gt;
* Die Passworte und Secret-Zeichenketten&lt;br /&gt;
* &amp;quot;&#039;&#039;verbose&#039;&#039;&amp;quot; soltle auf &amp;quot;&#039;&#039;false&#039;&#039;&amp;quot; geändert werden, wenn alles läuft.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen der Datenbank-Tabellen erfolgt und ein ersten Start des Servers erfolgt mit den Befehlen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/lldap&lt;br /&gt;
./lldap create_schema&lt;br /&gt;
./lldap run&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Proxy-Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf das Admin-Frontend über den Browser konfiguriere ich die Domain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/account.hs-example.de&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/lldap/app htdocs-ssl&lt;br /&gt;
touch htdocs-ssl/.htaccess&lt;br /&gt;
vim htdocs-ssl/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
DirectoryIndex disabled&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
    &lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:33881%{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;
Achtung: Port 33881 wie in der Konfig-Datei anpassen!&lt;br /&gt;
&lt;br /&gt;
=== LLDAP als Service einrichten ===&lt;br /&gt;
&lt;br /&gt;
LLDAP soll als Service unter Kontrolle von SystemD laufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
mkdir var&lt;br /&gt;
vim .config/systemd/user/lldap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhalt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=LLDAP Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
WorkingDirectory=%h/lldap&lt;br /&gt;
Environment=&amp;quot;PATH=/usr/local/bin:/usr/bin:/bin&amp;quot;&lt;br /&gt;
ExecStart=%h/lldap/lldap run&lt;br /&gt;
StandardOutput=append:%h/var/lldap.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;
Aktivieren und Starten des Dienstes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
systemctl --user daemon-reload&lt;br /&gt;
systemctl --user enable lldap.service&lt;br /&gt;
systemctl --user start lldap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn alles gut gegangen ist, kann mann sich als &amp;quot;&#039;&#039;admin&#039;&#039;&amp;quot; mit dem Passwort aus der Zeile &amp;quot;&#039;&#039;ldap_user_pass&#039;&#039;&amp;quot; unter https://account.hs-exampel.de anmelden.&lt;br /&gt;
&lt;br /&gt;
=== weitere Verbesserungen ===&lt;br /&gt;
&lt;br /&gt;
Bisher ging es darum, schnell einen LDAP-Dienst aufzusetzen. Leider lädt die fertig kompilierte Distribution, die wir hier benutzt haben, ihre Fonts, das CSS und JavaScript aus CDN-Netzwerken und von Google Servern. Das wollte ihr vermutlich nicht. Ich habe dazu den folgenden Issue im Github-Tracker gefunden: https://github.com/lldap/lldap/issues/93 Wenn ich richtig verstehe, kann man selbst eine Distribution erstellen, die die entsprechenden Ressourcen lokal hostet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/lldap/lldap Github Projekt LLDAP]&lt;br /&gt;
* [https://github.com/lldap/lldap/tree/main?tab=readme-ov-file#client-configuration Client-Konfigurationsbeispiele]&lt;br /&gt;
* [[LTB-SSP]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:LDAP]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=OpenLDAP&amp;diff=7358</id>
		<title>OpenLDAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=OpenLDAP&amp;diff=7358"/>
		<updated>2025-05-18T04:43:02Z</updated>

		<summary type="html">&lt;p&gt;Sib: fix broken Systemd syntax of Openldap service file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
== OpenLDAP installieren ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: Das Debian-Paket &amp;quot;slapd&amp;quot; ist auf dem Managed Server vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
BASE_DIR=&amp;quot;${HOME}/slapd2&amp;quot;&lt;br /&gt;
BASE_DN=&amp;quot;dc=example,dc=com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
INITIAL_PASSWORD=&amp;quot;myInitialPassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BIND_IP_ADDR=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
BIND_IP_PORT=&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fail, if base directory already exists&lt;br /&gt;
&lt;br /&gt;
if test -e ${BASE_DIR}; then&lt;br /&gt;
    echo &amp;quot;Initialization failed.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    echo &amp;quot;Base directory already exists.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Create directory&lt;br /&gt;
&lt;br /&gt;
mkdir -p -m 700 ${BASE_DIR}&lt;br /&gt;
cd ${BASE_DIR}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Unpack initital configuration&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |base64 -d |tar -xz&lt;br /&gt;
H4sIALShi2IAA+w9a3PjNpLzGb8Cm0yVPXexI74ky1v5oNhOynse22vZqWS/XFEkZHOHIhWKmrE3&lt;br /&gt;
Nf/9GgDx4AMQZWtcud1R1ZQloUV0o5/obmBIGX3/5gu/BvAaDQZvBp47CgKXfXZ8n/2tXm8c3/Xd&lt;br /&gt;
kTvwAvjeGQSe+wYHXxox+lqvyrDAGP6Swg5HitVrIPS6LwL8j7IfojybJ/dfSBIY/4OgB/+d0Wg0&lt;br /&gt;
BP67vh985f9rvOr8h3eLPF6n5I/B58M0TuY7mYMyeEj5beD/aDAU/HdhBPgfDD3vDR7sZPYNr/9w&lt;br /&gt;
/n+LJ3e3Vwc/n12e3Uxuz07xT+cXZ/gAn17hy6tbfHZ6fvuXv+C7FcFpHC5BOJL50yH6Fp/cnHgu&lt;br /&gt;
PgpmQw9sNoqzY6wLD8pn/yRReZKGq9UxztPoPRu5SFYligBWAxRj12H5cIy/X6+K79Nk9j2dTg1e&lt;br /&gt;
5GF8jAF+FkYf/ncRz9CqLNZRuS7C9Mo8FcnK4unu7vz0GA+CURw5w8GB74/JgTPwooNxPHcPxl4c&lt;br /&gt;
+t7Q8QYDgqKChGVerC7DBWEEhfEiyb6TCsIByG2yICA2i+UxdgcuOC1v4IwCzxn+g894Mr1sjhwG&lt;br /&gt;
7tGRH/zjWy7y31b/4IXYoibEMitfdsusz+e/Sf+dXeu/xf+PvFFb/wdf9f81Xi/Tfy8gThDMnIb+&lt;br /&gt;
O33139la/wsyT7KyNeB8XpDFjBT5fGvD4M1H/nw0PzoYetG8MgxzMj84GgcgrkdzMBDz5xqGYDCG&lt;br /&gt;
B3qg903DIEcOnaE/9rxdGgZt1o38r+s/LNKPYGBJFv8Aaw1mdidGYJP/H3q6/4dxZxj4X/X/VV4v&lt;br /&gt;
0/8oHgy80YDrf0t4WkagGj7hwqu+YJptd+r1nzb8ehzPorpf917Rr4+D0eBP59f7vlr+fxU9kEW4&lt;br /&gt;
O+f/pof+O35D/wPHC77q/2u8Xqb/o9j3ZiEobuX/ufC09H7Kvq50l7r/Cs6s7rVfNLTdI6Fb03YS&lt;br /&gt;
v6K2B/54/P9W29uvlv8/DctwFq7ID38cOJ/nRZ6VYHZfZg426L/juk5d/13qVb7q/2u8Xqb/8/nw&lt;br /&gt;
aDw6CoX/7xSeljkQUCIOaAz/VP1OhQniBxAn1J6bRpMoIvRnED+UOf4vPHvCcXZIHsOo/OE+iS/X&lt;br /&gt;
dFPww+C/1+o91cglIQUYgZi+J48lKTKEw5R+CtflA16EWXhP6MPgiWArPtSmcuhUcpZvvuFwAFbH&lt;br /&gt;
yK3A2Hp8A4+ermfc7jV+MU3+BZuSRVIe4wAMidkoNtataRYH82HdLM42mMVdWEPHP+pnDf/MRvA/&lt;br /&gt;
+GWI/3ZaCdgi/1/Ff/DW/5r/f42Xif/wDmxqlBfk5VsBu//3hrTmV+f/yBl+jf9f5fVC/z87In7s&lt;br /&gt;
+CL+r0Rm8wZAAoLDLMsima3BAz0tCXfl+9g9DA79QxdfTt6f4b0PWf4pJfE9Oc/mebEIyyTP9vDp&lt;br /&gt;
2fQE7938dOK6wfAYf0BYgOFEhzv7+93k4vz2NxyB7zy/z2De92EZPeDpb5e3k1+xc+gdDg8dmM85&lt;br /&gt;
dPwhvHWCQ4Qd16FfBH+A1A6PPuN3ncg6ElmfI7uP91Yw6d5qXWTg+/bwuyaisColRnh/Hi6S9Okd&lt;br /&gt;
pmD7q3cYUMafHhJArHwgGJxuUj7hZIUp9RmEDHt4enfNoA24uBKXoFo4kNkkTHnk01owPoizNcJ0&lt;br /&gt;
HOdzbWLbst39OL290b6mgQ2gkt2vAADhDSvL19X3/xj6pkX1JCFDuagRrGmUr2koctlcVz9wxse4&lt;br /&gt;
/IRwfpCSEuI5fD69OoB4Yoir38DfmGgruBlDkAAHT88vf744O/hlcnF3ZkDWl8iOJLIpIJvmUZjC&lt;br /&gt;
SrawraQAkOUAkunAa644EBqukpisQI43Mj2Q0x8pASypAJYQ1V0V10X+Mcki0kQDYSEGFA6D7C0r&lt;br /&gt;
yJfhM5T4jDV8CkI4TvTNJI7hgav6oiBcYUMhcMhBuExKPHoLJaxtQyx7CSUou+MaVX0kKXMGkrQc&lt;br /&gt;
qMqL+zBL/sXMTQe3EaaE6UC1tZ2RNAcccZlvXNsjhYGjMFg3UAjTuywpdUQQ1gSvDorXAPtcfMYK&lt;br /&gt;
H2GqwXakpGVq2LcYvEEeJSBtCMf4U1I+1OzNhrkc5RYcX5q3sIgefobNXXtKPobvEabD3+GYLAsS&lt;br /&gt;
weQx3X2R7CEEUY+n+hP62AQ3MOGnPIEjzO9svUoyEOMTmPY+L55aSAIAwgwERxLmmYaXAiD8Qhl3&lt;br /&gt;
lA9xKtu7t8zBRKRSaRsk8FGQsFAAdOBPa24GGuhQgw54WA8H4phIUN7DGdVIOMk75IQPgXsAoSQv&lt;br /&gt;
WnwdZXAehsX3B8a1V57EOdIQv5rPk4j8mD+2cL+GUXyFMAPADOKl+MPa24XHgr9yRc5Y4P/wtErA&lt;br /&gt;
zZ2SNPlIiidOC7dNLU90XQFjAY05OObwvUhDeDNznqMXyq25A2HqSEqWD3lGDPHVLYwjzCCwAJE0&lt;br /&gt;
NH5cI6QxJmlBuDc1wQDCViMxypO5jkbMo4WQRyCBx4l97GTgmqZWLsx1talL8nhLikUCHuk8ph6B&lt;br /&gt;
Jo80RMDwSlQAFgtgrEP3wMtoNJQrcz3pWudhtEogSCe3TVbD0CP1rqi5Vj+Jn+D9n8LHd1j+UoqA&lt;br /&gt;
GUsIFCo8XdP6udrmSHjBR/iNyTr/Sh+IJzEYt4ZxztYLiP+jKZOsmvjVRroUCWH7KntDagtMFCg/&lt;br /&gt;
6Qo/mWQ0BVtFJMn09LJDEHkUVYOEIP/0kqJbV60elCFsom0zZUMjZcp3usJ3FuQe/BspSGziEGyC&lt;br /&gt;
sYARzki6UhoT1dzvRhyZ4zFJuatcoytcI4T1ZcJX9DyLwfyWecsCgFPQwIAJEu4Z7mYLKwabRItN&lt;br /&gt;
dpW/dKW/LMicFLCUwoW8J+VDHndIkoQE0ipvs6hgezgLX+wMEbbtDV3lEt2xQnEFNostpUkoENah&lt;br /&gt;
OkKrjocYFxVEorGsXp99ratcnidc3mq9XOYFxNCT5TKlMgDTn9BqzGMpaUBYhuACGocKHCKtCl4S&lt;br /&gt;
wzceypJrlCBs18cjE/LKxXnCxfEOsdZa86/pTjOku4UiXy+54sUJFfn7dbJ6IPGlJe2ifJonfFr+&lt;br /&gt;
KeuYin2L96tEC6oIf7fldMpVeZ4wM3lKrqJovQyzsj0rH0C4pERS0O0m9JTP8YRdo9nQE1JQftGN&lt;br /&gt;
S4ffCQYIjzGFw5EC/I5+g/86A1NS3+ookDNaVmsJM8IGETBJgKf8jCdsXTTZhPMYuHIy2QnGQ6Z6&lt;br /&gt;
22Cs/Icn7BktR+YF7I9vyMecKxDdMHXYM469hAe/In6AU/hFgwyjiQNjIfAcm/BUXsQTRk1bDSOm&lt;br /&gt;
IobjmGq/eA6uIA/6mhpxVT7CF0YsKnLYkqvpr8Oky+NVaFLgGrJLAO+7mhw/hOkXAxOKykf4rgw9&lt;br /&gt;
78ElVcmkvfusI384RzgpYPu3s+yxp+y978nALCmTMG07KDEAFgWWapUvWAYxTFNqYugkq+8wPBxn&lt;br /&gt;
ecnwqbLhgOjhZkSU7fZFjHtPwHIyCfn7GkLExu5AOE320N8FgIhTwMZR0y6fsBkBZdB9EaI+BoPB&lt;br /&gt;
XZb8viad+xNdaAY0pwaAONEgpd2YJWUtMu2hiEMTnsoT+MIwx5YFgmCZLQ7CDZyawdvVzenZDUQI&lt;br /&gt;
2sBVEZNWPE2HEe6RDjFEd6aMunI4vjDdnQm7lgAIKJn965vYc00hs68VeFSQmZd5lKe2ahSN4DiU&lt;br /&gt;
oRjV8ZAtIjjT/tDXakDC3nFpfN8d/VSiiuphEA+CJK76E3pwFww9C86M/FUOJBDB2UMOFtWsWpiO&lt;br /&gt;
A3+7deo5uS6ENyeErJU/X7mWwG3Fx+k9dcMPi67YXouLNbAeCmPycr5yIYEn93VpGVqiBo4Kg2r6&lt;br /&gt;
379u5d0s3tdXLiUQljxexPX0X4ULs8cgfafvT/doAthuon3lI4bCRC9XZB3n2dNCPBuMsTvY98uH&lt;br /&gt;
d7Dd44MIPy2Yq6ROSRSVNs1F3cHgcHzoer576Ixpd+JgAA59QIVceuxFmNCyXzGPjlz3PXxAeJY/&lt;br /&gt;
1jy34478YwxvAAJTEAaAuwT5fBJwUcVcmhG+qY82RbpPztwdwo50+Bn4bqB0bKFUZGuA1JgWY+Mc&lt;br /&gt;
KIbd32KZg+cldOPRIPV71/VHx5gDwr4PIDmcjd4pwk3t7aC2D610k4vwpm1uMLBxV7gfWbqKTxk1&lt;br /&gt;
e3rmj7O1IlNB8hKXpXL5JWg2EEm9GIwfHvlAluMF/piq7aGqIpJKfNlfmZZAoFUfotW4GtX467lH&lt;br /&gt;
g2OckvswesKhmI+pFgMWOQtWNIbIgz3MugbbrYBxPwgyrnJGWgdlrbVkKFtLqvaAljkKsRyh5gE2&lt;br /&gt;
z/kSA4J3J7d3N5ML/P5ueosj/H7yG6yeVofEb2mqLCqSJTOn77rxcCQewlyLboEORNTQ9A7h6xYm&lt;br /&gt;
HAVeN38LuJBJusrZOx2rFR1Ma+iB2poQdCWCwm7rZeM2kpkoKyOsxdhda5ZXCNPMwDVM9ykv4jay&lt;br /&gt;
nAjwA29xs4gKX2kZb/jUyrFyIptZTYQLGDAkCGFEq4BUnzqLEnwMQhGtHgDfGVLYMIJNVQTGFMo1&lt;br /&gt;
Rmat0ld95iVL+UGRZy6rgaR28trIaU9yOujgNO8l6OQ3rGerkcDC9rWV77xKXxPf5/OdbgRr+eyX&lt;br /&gt;
8B3hOud7872L7VWn1Vulri9gOzBAZ/x2bPcl22WZnxSrLtXGYoCzFjY2LeaC+clg2ojO1snl9rpx&lt;br /&gt;
PiOc90M3kOiOOqX02oA8BHzNhhedHP6+bU15v0pL4EAWepmaXgInZWGDqeklcNy4bTY1vSQO4X6m&lt;br /&gt;
5i3Vail2Bs4NJeeOOjl3k3f0C3XZF5W47nTFWcW6bhsBnNsBy6qlRDthWWUjYDto4pg0hXp634on&lt;br /&gt;
2olhqZgMa9bB5l7qOpJMFwlillK4mtMHtrfEVcaBJxNZ9hDvQ8j4zszufZGvqFmdhsuAzV5tGXn5&lt;br /&gt;
pSKnp+E5kpSIpr893gyZ0fyn0ewwWyHBNtkcSlHaTQN3ezSjsnXAYxJphJ8R8JhEGix4H8dXDZkl&lt;br /&gt;
l8ktLVHtLBJiUZXdNo0Vc0UeSqtUXhd51FWcBe6iWkVzKQA3GidNFtdSm0BpN+4X1MZFdlpqGJxV&lt;br /&gt;
LZSbENVbLbu1qqOurFQMYUaDuQZc1zahZT1thqM2RY5MYk0nHcYiTgr4JdWN1dOKdpMucHgPWOP9&lt;br /&gt;
kDa1gxhUlqO1RE1P3z5YQOXZgJ/aE8kG1Jh8BGnrQrEasOwdlUyoHn27uUqZhe+zlCqol72ooGB5&lt;br /&gt;
dj9Zlw9UCvii3K06m2xCzIFZNVFBs6BOCc/k7tfzi/PJzW+cnkZF2ICYCjtle6mqrVGZE/XLxpoi&lt;br /&gt;
zLbk2vNDBWnAaB8bqqfMMhgrlnRsUqOEMaqramggUgWrsgG1cn+8gmRygki6QZGWl74QdDnG/Nda&lt;br /&gt;
y5vNQQKRetre6ig3usk+JkoFerJ7lcrElERrygJjsQRhRjzrFFhVwPWaSQd/J3VLJNPoQLUJv5Em&lt;br /&gt;
eir90yl8B7+4fFY6jHAboIVKR7bdiIgWUsjy+c3FabLiSTTqefIka++lEdYMtcZMmyQbNAC/ZS1d&lt;br /&gt;
/XFWnlK2v8aL2OZJeJ6flmwMe8LOjI9134/wbgIgFnHAAuwkAGLhD8I9A6A+4TnaLuGzXWTuailQ&lt;br /&gt;
EfMsPyRNTxAcjahSXv/PubD6CHdqYS+z7yrXLrt+YdKTSWtKOqEmz/RYgdXOM8EyCnldNRC2mvm3&lt;br /&gt;
BhNvIElFA26t5HZyc9FJlXCeIoNbJ6JTFzvn9VgmX5UA3GAAn6SbT8MZCF18d3N+VRUe9La8wWh8&lt;br /&gt;
LM75lA9hyZrxwiRbsXoY/EhL5ZdPSwhg+Aqrp8J6ABuo8tRo6MbVN5ZWtCMCoCrLlAg3wZ4BEdNe&lt;br /&gt;
s7zCwZSH0It3hnCEGxuwGrEBv6CxlqyU4MmmkzhqrCH1V7SihVo1rU3oxJEBhaGGAv0rdBLMYnty&lt;br /&gt;
bwSTwwjMhrCd/ITS/Lz7dQLHbVwkQV7zfp3xyP03ul/nz/6ynf93Pkc59cUvvQHAfv7fHdLD/o3z&lt;br /&gt;
/4Hz9fz/q7xeeP+X77qjeTCQ5/+FyPS4AUCBGu4AMDYiyHNDj+VZRs91x1c3VaiE8M6O8Bm6d52A&lt;br /&gt;
91CYrwMw4S3cCt3bNN0bOFTeoGhqF9uGFlqD7XvmzR345gMWFmK0ZhCY9AM7EfUxp66ZnLLTNR86&lt;br /&gt;
Ol8oCIXA1W/6UPf8/kI7pzwLcfL0Tp4vmkeREK6IoYPtw0df5LIEOyXmKMuR1TLYhZRNoaM5FfY9&lt;br /&gt;
3v/ZA948vuvVKekBLmC2TdgEFmz0vAAzDbXucL6s4hw0y4Ksnrm2W5wxsq/t0EKNCGAf8lUrXAV9&lt;br /&gt;
pl+zABEe97JmxX6nui1UjCxUyLIGv/RM3wXSsgNlyeklZYYcl5S0DpBY15x2wSt8TQ2stl47maSP&lt;br /&gt;
82i9gBhS6xeFBW8Ym1YTNiVC/NLOD4S38hNb88PWZifz+wLVW3WjQnWPA6eP16h709SiiNUKd0eT&lt;br /&gt;
Y3PZKqFf4foLBFM8E4hwnW0f+cjzCKMZol0zy7H5dFUJqHDlKULKLhAinS6uRDxVYSDOok+bjtwa&lt;br /&gt;
9cmxOXGZNRDIXFT5h472xlR0CGu4Y/Dm9zRZtoFDCH9RdXJsvtxVd7U85AtyTdNxe/w9wq1z3a2Q&lt;br /&gt;
hcKp9F/b38shhLc4yb+JcO3wR2A6N+TY/L7M7a0IbMbLUOtwpIkgXSQ1iO0tOzXqfSXRFhnItGBe&lt;br /&gt;
PtA1rFqje502N3WfOzbnLU9ohzckyotYIx51tqc+v/nWsblfeQ57cdpEBKz9jhGxOVd5hHrx65dH&lt;br /&gt;
xNpnLuKqbPrFEXGtzd/y1PPVpIEJrYTvGBObl5FHmCP6p4YLbI8M/dQvwMXmM9TRVNnoLs5zdHo8&lt;br /&gt;
luprdcXHVRe92eIg3Ns5GC/LsPkFT4Xv4BVqVxy1Y0nmBZqXM/S75wjCLPNNRy+558iSXXfUYVfe&lt;br /&gt;
bRSmKoqEDaxGmRjH1cVdW25T+EUaO/Ljrs1D+OqswiKfJRTX6g1o40Y3ziH7OHLa9bYzR07vENzo&lt;br /&gt;
yF2bn9KOBC/59ov/vW32oHcQzQB7BS+iG3UnwYsT0KhgA802n+irQ1URvV9vXiQki9OnkxzQ7LwA&lt;br /&gt;
skovVXDyzsfMfm8U2joj2CnStmshjCSKfcO6daa4FXnXN7L2XEITXXodzHY6aHPNfvcRgWlJM1nr&lt;br /&gt;
Vatm1+i8pjdNrrsNZ93GIPzF9gqezePLU9T/DDNSyii0tfX+Gx3GCzG+9bEmWKztj3ZZqbLmnWWI&lt;br /&gt;
CQhfs34IkkXkasm73VpcY8e3lhIO58uqDafH1UMQzloutzBiKGKK2TpJY1gWdUK0tu7ijKgA29Zd&lt;br /&gt;
IbxTUbKFF74IL+LphJ3IVy1tCKsQaTrBcrQHPuM+F/d4tsBAngpfwUKk5IJ8JGmFAa2dNERhyoAw&lt;br /&gt;
g9oKUY8e4e2Bqs3jy7Phq/WMts28T7JksV5QNBCutwhW2HI4TAHB1/VFmNlImqLqg7DNV2vHwDnC&lt;br /&gt;
4WNPhBlg9kUQtjlaeVhcRIHT5D4DG12Qjhj4WkSKEqh33YAj7Hq2+zaMOMoM2/ntDeGtv9VCIn2z&lt;br /&gt;
cX6L1fAzUtStOxaM2wrP5iID4SLDdZzUKy4IU0TZ93h/fZCGn3oVXHx7vcW3ObRg2EjwXa9nKV2L&lt;br /&gt;
roT5Uoxtn3t9SZHOfFLX1DqkblpfJmleikMYexn5dA0uTfvqnfWUFy0vJfwkRLuSTNsM5wiLw/wz&lt;br /&gt;
1qWnapy0gMlO5ogKIXyQZS14T3eMjewiaztu7TZZ72OVgaONfvp+zdK/iLo7JfXAhXbvatk0+Fjt&lt;br /&gt;
l1pdiQiLPUVjoB3nrSnC7UAizyTu9H/SUSbCcgDaxF6pQRGL4+tNprB71dpMKw6KHlzV/ag3lOoX&lt;br /&gt;
sddpgt1E+0vt/mzGL3NXrDmkkRfX7yk90qhAuNYs2y5nic7efLHIBYom8pCFwI3k1YpM/HhBvUKj&lt;br /&gt;
wfDShvaFqBZoX0n7YjtubFozEadSpbJ1P2vLwteppoWmddK3swjPzCjauhbHDbZOQf6IOPkD0XTH&lt;br /&gt;
OY8mshvxy5S1eDZnLcdojQ2ZqkbHc3NmtdOu/mDNj1Ubbi0h2I0uIx6CIUG+9SBCvUO80T4ulgZh&lt;br /&gt;
2QXd+v8OZMN1z0bqJXCw0XfdPHum92w3n93o+6abK0PD+LneLt5uLu9oRYeti96M/tjjSJ2hI74g&lt;br /&gt;
98CAZvu8fmzWcpLXKDwiSuOX2zDmXIcFN3v0rAHvl2254JqFqy6Js+tw6+YFO0ft/KQ18C04aucn&lt;br /&gt;
7Oq34aidn/TA8hYctfOTnooxHdM1clTWhi+np5pFYJykN4e0eFkVSWDy96fq7a/y7eVUvp1eKWDY&lt;br /&gt;
4quqhu0YrhHTUc1w3ZCU2qCqe7od5tKz5eJ/NWGQYOTol02z1+ioptYNwkHtDiDzmVIjpiLPoWU0&lt;br /&gt;
5R0ztLhV5S2bPqQBru5q7TwnappdntxhUfNV7T4XxMjer/8vJV3ehYbUdcbrORvLyU4jVo6O1Sk9&lt;br /&gt;
8MnEbBVi1jegT6VyKZYjmsaJxO78d/6IC3qmIQVmhvTGA3Pn/ioUc4pTZ81sBB17K7+Hhz3qI++e&lt;br /&gt;
3Yg/mgf1/9aazF+xEX/kBP7XRvx/95et/9/9nCWrHfxP4Pb+f8cPhk6z/3/g+l/7/1/j9bL+fz/0&lt;br /&gt;
B8NZOJf9/0xkejT//197V9vcKI6E77N/hao2H672sglgMDhX88GbZOZ8N3Fcca5mv21hwA43DrC2&lt;br /&gt;
s5Nc1fz365aEkBBgkjjeqw3aqh2H19YLT7e6W4/4dTWZ/8WCKOo3FBzAQSpiTLd3Efl0eX49Qy7b&lt;br /&gt;
Vfh3XGUPh5g9WR/4a0k31z75gNEM7vLCmlql8skW+oMucj4DuXL+fJOCsftAGadxq6yUVpBmIoTF&lt;br /&gt;
DUodKRF5bQYIo6F+ifiWJn5u7q/SZZzM7kCRyrLnArM+odeQDbvoGfKWpKXit5O3r8krWBDu/DD9&lt;br /&gt;
9tnfbM/v/GQpDxIw6JHfqRXDLWs7t+32gKosA0WWKyUNBmcVTISWSwPaCeFoQriqEP7j2wsx0ITw&lt;br /&gt;
FCG++OtEDeoxQXpkz13iaoIMFUHGCQxLmHmVJYHhsWdJPE0SkY7PRLl8zOBbf/smGeqCmIogH1e+&lt;br /&gt;
3jPr9kuN2olh6ugv8uEZ4dO/47ACRABoqpA9x5fnhSV4tKo2eVEHc+E6YzJO4s0k2pZJtHtVkPdS&lt;br /&gt;
WSn9aYtESx25hacmKaS8XcdZwcI2QYooxkSy5SdKQuB/xkltYrIOv8KZEGezaI3UONN0vS2NJ3jp&lt;br /&gt;
vr8vU0dfwTtTiMKZ2CUi6DqCZFMHUuF9iLP8Qdpmb+gv2e5ftZg6ogoPQ5oEN1mgS/I2OGbqkCrW&lt;br /&gt;
98fZP9LNVl1GN56yNMoeqUmkfFYaa+PGfTrECj9InMFQ/5auv2rCYTo/PbMf4Xrke6tW1FFYeEeo&lt;br /&gt;
rPf+pkZWPHNQWa0KO10gtR+UNra6Gp3zvFno8bftcEuHZ0HQMU/T7dRfwxe+LZpwnQUncAIaMcNT&lt;br /&gt;
IcmKKypxrzYhVwdbsUcfvvljXGDsz/A3ie/9ZUQwYKrNVp5lGTdpAEsHY7H0ATTAlZ+xXKtdW4vr&lt;br /&gt;
QCpWLrDHXDJHZqkWULd9qLuBsic7DgADJKoYp1VpBLLY1olwgqab+HGUh5hZr4xQFrT9Usobu0C3&lt;br /&gt;
MI9Cs7T16fVs/EvBkbKp9RpSgqYjSsMB/++ROBQO/qX0W5n91RElFXMsvBu+dpgGtyP7KX8K1olq&lt;br /&gt;
1JWrH4Yx8/Qi746oJCV1ZzfAt8HEqq/5g4jH59XokZzxqTT5EodgDlT89h/Fbz4jEH+DYQ61R9Nc&lt;br /&gt;
HGIGsvgTzdSWREha21jyyPjErDdtXCAv7UIiLM3HRwP7Ix8LRb9L/QyGvNTTwsRtV4Xyp20Jr4Kw&lt;br /&gt;
bapqQEmRxzR8FW1JbrRQ5kTBWdhQD8WEoykDmiXFa6hUoS7SrlbA1oyp+j5ICGi/TDHeGsVWzbOi&lt;br /&gt;
iTG0miZtZS5bgFbBm05Nrkp5F6zRryfnpzfTczLHnalwprtDZtmIU4cE5blrJW/ZRrROBophVicv&lt;br /&gt;
6dHcl2PezjKhZT3eybaeGOY6beVRvpi8iT9YFdot22zVciNwUXmT/Kqdw0KxAYXQeJzbVaL9yxRr&lt;br /&gt;
O6tRtj0t4fFI5CmiXpEe64JEXLKTWVabzQk4mWC0Pz/XDljKdqglHCRM1wuRGWlJHKC3EoXnnxIV&lt;br /&gt;
fjKeQfs0yF6YH+1GsuYcsApvCTxLpcsaJXzlWUxJcHdLw8eDZMyIv3hGDRNSocKsjXaWxBRWfBRF&lt;br /&gt;
nmFdKLSxI/5xwdilRoZPCnO5Ws+CIIWN3RAKLUlhScaoP19FlWIgYyMVA68qbOFaQf5KctsW03lk&lt;br /&gt;
A5tuj/3S2OdwMVRJyBbGIWOfQ894H7HPpvhf/3sMCJSulyyx88WRwOb4n+HYbl+N/1mm2e/ifwcp&lt;br /&gt;
r4v/RRH0mD0fiPhfaci0iARqd9TEBC2k7aXbV+EGVm6fsl6K+Uzgrz8DliUbhYy7R+BDRkqRuzgA&lt;br /&gt;
fFqxK3CnUpYyteb87Su6HfCORHdl8fke1wmatZUTTDARwPAW001l5w9fGWXRKgqWmw0lH8+vp0iO&lt;br /&gt;
m5IlRN2/qVxXMDheypKm1xUjdbWrIutrawt6n3gDXfKkbBNI6UtpVYuN26m/YpuSeYRTqZB8u4sS&lt;br /&gt;
wm/GaSMCPM3OPUBtW0Ylq6ueT9ui+2yVPkWR6uOj68VY3ZOHezS3/NXqSelyMHb4rbt6XGUueGUb&lt;br /&gt;
yMub27WBXdsGdqkNbin9rMS6xloAWWkprQC9jI5xdE8UuxS1WK4CJs7ev+KmhWyD3Er9TxYtpyoT&lt;br /&gt;
m6iYT/45vfzEfIKteNjqthEf1A+z3IoXn9BnP1k+0BdK7A3lz+zbOt5uIxxPZJOlX+HXit9W3/QF&lt;br /&gt;
68EePrPc79duiLn1Q0zsiIu89Ffjq0t5O3g5U5Q1wfRf57MfXLrejaUJMpgBxOHM82R2ik+p6K6K&lt;br /&gt;
ddd1I8erR0QRq6KuNJDGtCpGjqBwYIigsucfUxbv8xn5Acz/6cdf2m2n3rAoq0rUwneGuvx6vSzv&lt;br /&gt;
iyNkFW6na3Vp+FTaIKdqZy95utYTtN+4kq5yDUFhDtAJr6o+8ZDQMDjdOSIq8EoHsJOo747vxp6v&lt;br /&gt;
4KJ8CtpqLgxn0dRwvjn6ERFfPLoPChJttoRKciDka7MI23EBl2Px/Qr5zcoSF3nBGHcxl2jYjwhu&lt;br /&gt;
WF6QC0jLB7SPn99e/iDyJRd02L0ii3XuDi11JmcecCbnOcP++5jJvayo8z/oSsS5OcA0cvneh/PT&lt;br /&gt;
PbwDG9x1jLr5H5ZS/ufAgNPE2cO7d5Z3Pv/b2f+oBn6P1oCWHwD/ATviZPtMTwCd/xu1/W8atlua&lt;br /&gt;
/1uu63bz/0OUV87/B2DhLsIhnf9XjRTNAcB1RPkwv7Hm7A19VtXJbZr1itupiZK/OL9NGFxn3CGO&lt;br /&gt;
XLZsT6Rc+7Idj+Ttkhp0nSKMpOsczw78uRP9NOgHC67rFgvjJ2/owLD3FqDzFi/VdY4xhAfalq7r&lt;br /&gt;
xBmwyfre0NunrpPe+kcP0668UXkW/sMR/gU9SwPswn/LLq3/sNDK6vD/EOV1+L9wHC/wbUfD/2Kk&lt;br /&gt;
aGDOAPZaP9GsA1qhv/za4k0XMNFZxcnyjMC8J13LpwDMYUp6husML+XjNP3j+vyM6Bv3NV2mXcD+&lt;br /&gt;
HV2cqdpFu+J6gdfc501Tr31E60maZ+B5QRAGnqp5zH1qHseu0zyOfWIaLnzXb6B58K1/9AfyJy8N&lt;br /&gt;
+G98Z0dfvQJwR/wPhk+/vP7PNrv430HK6/B/2F94RmC4Of7rg0fD8fySHM+LI9R6D8ThUYCbKtOD&lt;br /&gt;
25T8SOZPJExOIswb/SBy6T4Yf3sofiOuZFG0BigL8Xf0iN5GJCTCv5B7n5v8+DB4IiDeVzpRSNPt&lt;br /&gt;
xaQSn/jZ6ZczMp6Mb8ejz79OR7PZl+ubiwaULlWy5BHrDy1fXdcd7PCI7WNftb7TcnLwrvxf773s&lt;br /&gt;
sv/3sPx7J/4PAPM5/ruuO0D/n9vv/D8HKa/D/8Fi6Iem4+j4TwfPTvAvG7fhvFIt8IfBsbnIlj8j&lt;br /&gt;
P49ml79ejG9Of/epRT17WCzix/z4RNchmNK++aBk14Me2ESrBY1xUq3gJ2nydJ8+bOhWLUxPJJQV&lt;br /&gt;
XHmeWTxPy2rXnvkjAdwOlfstodOKk/iIqzQsJiOaWpJqVquUaCud30XB1wx3kT4jjmmRvsGOj5Mw&lt;br /&gt;
esx3gGVUhdFvyqkgOcaIUumo0LHHRRZ76RI2dzkuUtjz81f+4yz+L3Qj2nlg2HmW3TS/EUNAVZoR&lt;br /&gt;
KDBPDSPZhwsj9U3b+HMmBCr4vw+wryg78B+GRY7/0DAOHDfhws7/c5DySvyfz10vKPg/amz+T6t0&lt;br /&gt;
7q9ovp9k36+XG0wbloB8/ZCcblZ+Fp74cJJiYrqk5NNnCMIUgqdxWHtXFlMgvU3T1e0dwiq83mwA&lt;br /&gt;
Gy5XyTy33EXJPPff3jy3vUHLOPV+cQUb700H2F94/Lfe/yvHf2ks0DANZ2B18d9DFLCd/s/636b9&lt;br /&gt;
b/e7/u9KV7rSla50pStd6UpXutKVrnSlK13pSle60pWudKUrXXlJ+R8PJCZ+APAAAA==&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Patch configuration files&lt;br /&gt;
&lt;br /&gt;
sed -e&amp;quot;s%BASE_DIR%${BASE_DIR}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%BASE_DN%${BASE_DN}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%INITIAL_PASSWORD%${INITIAL_PASSWORD}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fix CRC32 checksums on configuration files&lt;br /&gt;
&lt;br /&gt;
for FILE in $(find -name \*.ldif); do&lt;br /&gt;
    CRC32=$(tail -n +3 ${FILE} |crc32 /dev/stdin)&lt;br /&gt;
    sed -e&amp;quot;s/^# CRC32 [0-9a-f]*$/# CRC32 ${CRC32}/&amp;quot; -i ${FILE}&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add Root DSE&lt;br /&gt;
&lt;br /&gt;
DC=$(echo ${BASE_DN} |cut -d &amp;quot;,&amp;quot; -f1 |cut -d &amp;quot;=&amp;quot; -f2)&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |/usr/sbin/slapadd -F &amp;quot;${BASE_DIR}/etc&amp;quot; -b ${BASE_DN}&lt;br /&gt;
dn: ${BASE_DN}&lt;br /&gt;
dc: ${DC}&lt;br /&gt;
objectClass: domain&lt;br /&gt;
objectClass: top&lt;br /&gt;
structuralObjectClass: domain&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Print instructions&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
Instructions&lt;br /&gt;
============&lt;br /&gt;
&lt;br /&gt;
Launch slapd (debug level 0 - foreground mode)&lt;br /&gt;
$ /usr/sbin/slapd -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -F &amp;quot;${BASE_DIR}/etc&amp;quot; -d 0&lt;br /&gt;
&lt;br /&gt;
LDAPvi on cn=config&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,cn=config&amp;quot; -b &amp;quot;cn=config&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LDAPvi on ${BASE_DN}&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,${BASE_DN}&amp;quot; -b &amp;quot;${BASE_DN}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not forget to update the intitial passwords for both identities:&lt;br /&gt;
&lt;br /&gt;
    cn=admin,cn=config&lt;br /&gt;
    cn=admin,${BASE_DN}&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basis-Struktur ergänzen ==&lt;br /&gt;
Für viele Anwendungsfälle – wie eine Synchronisation mit [[Keycloak installieren|Keycloak]] – wird empfohlen noch zwei &amp;lt;code&amp;gt;Organizational Units&amp;lt;/code&amp;gt; zu ergänzen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Editor starten mit:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;ldapvi -h &amp;quot;ldap://127.0.0.1:12345/&amp;quot; -D &amp;quot;cn=admin,dc=example,dc=com&amp;quot; -b &amp;quot;dc=example,dc=com&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oben die folgenden Zeilen ergänzen:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
add ou=users,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: users&lt;br /&gt;
&lt;br /&gt;
add ou=groups,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: groups&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun den Editor schließen und noch mit &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; bestätigen.&lt;br /&gt;
&lt;br /&gt;
== Autostart ==&lt;br /&gt;
&lt;br /&gt;
Um den neuen LDAP-Dienst dauerhaft laufen zu lassen, sollte [[Systemd]] genutzt werden. Hier ein Beispiel dafür:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In das Verzeichnis die Datei &amp;lt;code&amp;gt;slapd.service&amp;lt;/code&amp;gt; legen und mit beispielsweise den folgenden Inhalten befüllen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Slapd2 Server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=on-abort&lt;br /&gt;
WorkingDirectory=/home/pacs/xyz00/users/ldap/&lt;br /&gt;
&lt;br /&gt;
# eg -d 255 for higher loglevel&lt;br /&gt;
ExecStart=/usr/sbin/slapd -h ldap://127.0.0.1:12345/ -F /home/pacs/xyz00/users/ldap/slapd2/etc -d 0&lt;br /&gt;
PIDFile=/home/pacs/xyz00/users/ldap/slapd2/run/slapd.pid&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Anschluss:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemctl enable --user slapd&lt;br /&gt;
systemctl start --user slapd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; unter Umständen muss ein Administator diese Funktionalität erst für Sie freischalten. Ihr User benötigt womöglich außerdem die folgende Umgebungsvariable um die Befehle ausführen zu können:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pflege der LDAP Daten über die Kommandozeile ==&lt;br /&gt;
=== Benutzer anlegen ===&lt;br /&gt;
&lt;br /&gt;
Datei adduser.ldif (entsprechende Werte ersetzen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
objectClass: inetOrgPerson&lt;br /&gt;
cn: Max&lt;br /&gt;
sn: Mustermann&lt;br /&gt;
uid: mmustermann&lt;br /&gt;
userPassword: TopSecret1234&lt;br /&gt;
mail: mmustermann@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f adduser.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passwort von Benutzer ändern ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldappasswd -H ldap://127.0.0.1:$PORT -x -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -S &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nach Benutzern suchen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT # geht sogar ohne Benutzer&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was kann der normale Benutzer sehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nach Personen mit bestimmter Klasse suchen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;objectClass=inetOrgPerson&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigenschaften aktualisieren ===&lt;br /&gt;
&lt;br /&gt;
Datei modify_email.ldif:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
replace: mail&lt;br /&gt;
mail: mmustermann2@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f modify_email.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neue Gruppe anlegen ===&lt;br /&gt;
&lt;br /&gt;
Einmal vorbereiten, memberof overlay installieren:&lt;br /&gt;
&lt;br /&gt;
Datei add-memberof-overlay.ldif:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config&lt;br /&gt;
objectClass: olcMemberOf&lt;br /&gt;
objectClass: olcOverlayConfig&lt;br /&gt;
objectClass: olcConfig&lt;br /&gt;
objectClass: top&lt;br /&gt;
olcOverlay: memberof &lt;br /&gt;
olcMemberOfRefInt: TRUE&lt;br /&gt;
olcMemberOfDangling: ignore&lt;br /&gt;
olcMemberOfGroupOC: groupOfNames&lt;br /&gt;
olcMemberOfMemberAD: member&lt;br /&gt;
olcMemberOfMemberOfAD: memberOf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -W  -f  add-memberof-overlay.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei addgroup.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
cn: admins&lt;br /&gt;
objectclass: groupOfNames&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f addgroup.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer zu einer Gruppe hinzufügen ===&lt;br /&gt;
&lt;br /&gt;
Datei addmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
add: member&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f addmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Liste alle Benutzer einer Gruppe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export FILTER=&amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberof=CN=admins,OU=groups,DC=example,DC=org))&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W $FILTER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer aus einer Gruppe entfernen ===&lt;br /&gt;
&lt;br /&gt;
Datei dropmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
delete: member&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f dropmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer löschen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapdelete -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gruppe löschen ===&lt;br /&gt;
&lt;br /&gt;
Datei delete_group.ldif:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=Test,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: delete&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f delete_group.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.vincentliefooghe.net/content/openldap-setup-multiple-instances-server Ein Setup für mehrere OpenLDAP Instanzen auf einem Server]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Diskussion:Mlmmj&amp;diff=7336</id>
		<title>Diskussion:Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Diskussion:Mlmmj&amp;diff=7336"/>
		<updated>2025-04-11T10:39:28Z</updated>

		<summary type="html">&lt;p&gt;Sib: add section Mlmmj PHP Web Admin Front End&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mlmmj und DKIM =&lt;br /&gt;
&lt;br /&gt;
Testweise habe ich E-Mail so geändert, dass sie &amp;quot;sauber&amp;quot; von Listenserver als Absender kommen und an den Empfänger gehen.&lt;br /&gt;
&lt;br /&gt;
Ein Skript zum Umschreiben des From:-Header:&lt;br /&gt;
&lt;br /&gt;
  $ cat bin/receive-message &lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  sed -e &amp;quot;s/^From:\([^&amp;lt;]*\)&amp;lt;.*/From:\1&amp;lt;$1@hs-example.de&amp;gt;/&amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/lists/mlmmj/$1/&lt;br /&gt;
&lt;br /&gt;
Damit wird vor der Übergabe an Mlmmj die From:-Zeile einer eingehenden Listenmail so umgeschrieben, daß der Realname erhalten bleibt und die Adresse mit der des Verteilers ersetzt wird – also bspw. von &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;From: &amp;quot;Hinz Kunz&amp;quot; &amp;lt;hinzkunz@example.com&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;From: &amp;quot;Hinz Kunz&amp;quot; &amp;lt;meinverteiler@hs-example.de&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. (Der Name des Verteilers ergibt sich aus dem Parameter $1: siehe den Aufruf von receive-message in der .procmailrc unten.)&lt;br /&gt;
&lt;br /&gt;
.forward und .procmailrc:&lt;br /&gt;
&lt;br /&gt;
  $ cat .forward &lt;br /&gt;
  &amp;quot;|/usr/bin/procmail -p&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  $ cat .procmailrc &lt;br /&gt;
  SHELL=/bin/sh&lt;br /&gt;
  HOMEDIR=/home/pacs/xyz00/users/lists&lt;br /&gt;
  MAILDIR=/home/pacs/xyz00/users/lists/Maildir&lt;br /&gt;
  PMDIR=/home/pacs/xyz00/users/lists&lt;br /&gt;
  VERBOSE=yes&lt;br /&gt;
  LOGFILE=/home/pacs/xyz00/users/lists/var/procmail.log&lt;br /&gt;
  DEFAULT&lt;br /&gt;
  &lt;br /&gt;
  :0:&lt;br /&gt;
  * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
  |/home/pacs/xyz00/users/lists/bin/receive-message ${MATCH}&lt;br /&gt;
  &lt;br /&gt;
  :0&lt;br /&gt;
  { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;control&amp;quot;-Ordner sorge ich dafür, dass der To:-Header, die Message-ID und die DKIM-Signatur gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
  $ cat delheaders &lt;br /&gt;
  DKIM-Signature:&lt;br /&gt;
  To:&lt;br /&gt;
  Message-ID:&lt;br /&gt;
&lt;br /&gt;
  $ touch addtohdr&lt;br /&gt;
&lt;br /&gt;
Das Flag &amp;quot;addtohdr&amp;quot; sorgt dafür, dass mlmmj einen To:-Header an den endgültigen Empfänger der E-Mail einfügt.&lt;br /&gt;
&lt;br /&gt;
= Mlmmj PHP Web Admin Front End =&lt;br /&gt;
&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;
-&amp;gt; Die Datei config.php existiert nicht!&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7322</id>
		<title>Traffic</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Traffic&amp;diff=7322"/>
		<updated>2025-03-25T19:12:59Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Sib: adjust &amp;quot;Instructions&amp;quot; section to make it more consistent with the remaining wiki page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
== OpenLDAP installieren ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: Das Debian-Paket &amp;quot;slapd&amp;quot; ist auf dem Managed Server vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
BASE_DIR=&amp;quot;${HOME}/slapd2&amp;quot;&lt;br /&gt;
BASE_DN=&amp;quot;dc=example,dc=com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
INITIAL_PASSWORD=&amp;quot;myInitialPassword&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BIND_IP_ADDR=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
BIND_IP_PORT=&amp;quot;12345&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
############################################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fail, if base directory already exists&lt;br /&gt;
&lt;br /&gt;
if test -e ${BASE_DIR}; then&lt;br /&gt;
    echo &amp;quot;Initialization failed.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    echo &amp;quot;Base directory already exists.&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Create directory&lt;br /&gt;
&lt;br /&gt;
mkdir -p -m 700 ${BASE_DIR}&lt;br /&gt;
cd ${BASE_DIR}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Unpack initital configuration&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |base64 -d |tar -xz&lt;br /&gt;
H4sIALShi2IAA+w9a3PjNpLzGb8Cm0yVPXexI74ky1v5oNhOynse22vZqWS/XFEkZHOHIhWKmrE3&lt;br /&gt;
Nf/9GgDx4AMQZWtcud1R1ZQloUV0o5/obmBIGX3/5gu/BvAaDQZvBp47CgKXfXZ8n/2tXm8c3/Xd&lt;br /&gt;
kTvwAvjeGQSe+wYHXxox+lqvyrDAGP6Swg5HitVrIPS6LwL8j7IfojybJ/dfSBIY/4OgB/+d0Wg0&lt;br /&gt;
BP67vh985f9rvOr8h3eLPF6n5I/B58M0TuY7mYMyeEj5beD/aDAU/HdhBPgfDD3vDR7sZPYNr/9w&lt;br /&gt;
/n+LJ3e3Vwc/n12e3Uxuz07xT+cXZ/gAn17hy6tbfHZ6fvuXv+C7FcFpHC5BOJL50yH6Fp/cnHgu&lt;br /&gt;
PgpmQw9sNoqzY6wLD8pn/yRReZKGq9UxztPoPRu5SFYligBWAxRj12H5cIy/X6+K79Nk9j2dTg1e&lt;br /&gt;
5GF8jAF+FkYf/ncRz9CqLNZRuS7C9Mo8FcnK4unu7vz0GA+CURw5w8GB74/JgTPwooNxPHcPxl4c&lt;br /&gt;
+t7Q8QYDgqKChGVerC7DBWEEhfEiyb6TCsIByG2yICA2i+UxdgcuOC1v4IwCzxn+g894Mr1sjhwG&lt;br /&gt;
7tGRH/zjWy7y31b/4IXYoibEMitfdsusz+e/Sf+dXeu/xf+PvFFb/wdf9f81Xi/Tfy8gThDMnIb+&lt;br /&gt;
O33139la/wsyT7KyNeB8XpDFjBT5fGvD4M1H/nw0PzoYetG8MgxzMj84GgcgrkdzMBDz5xqGYDCG&lt;br /&gt;
B3qg903DIEcOnaE/9rxdGgZt1o38r+s/LNKPYGBJFv8Aaw1mdidGYJP/H3q6/4dxZxj4X/X/VV4v&lt;br /&gt;
0/8oHgy80YDrf0t4WkagGj7hwqu+YJptd+r1nzb8ehzPorpf917Rr4+D0eBP59f7vlr+fxU9kEW4&lt;br /&gt;
O+f/pof+O35D/wPHC77q/2u8Xqb/o9j3ZiEobuX/ufC09H7Kvq50l7r/Cs6s7rVfNLTdI6Fb03YS&lt;br /&gt;
v6K2B/54/P9W29uvlv8/DctwFq7ID38cOJ/nRZ6VYHZfZg426L/juk5d/13qVb7q/2u8Xqb/8/nw&lt;br /&gt;
aDw6CoX/7xSeljkQUCIOaAz/VP1OhQniBxAn1J6bRpMoIvRnED+UOf4vPHvCcXZIHsOo/OE+iS/X&lt;br /&gt;
dFPww+C/1+o91cglIQUYgZi+J48lKTKEw5R+CtflA16EWXhP6MPgiWArPtSmcuhUcpZvvuFwAFbH&lt;br /&gt;
yK3A2Hp8A4+ermfc7jV+MU3+BZuSRVIe4wAMidkoNtataRYH82HdLM42mMVdWEPHP+pnDf/MRvA/&lt;br /&gt;
+GWI/3ZaCdgi/1/Ff/DW/5r/f42Xif/wDmxqlBfk5VsBu//3hrTmV+f/yBl+jf9f5fVC/z87In7s&lt;br /&gt;
+CL+r0Rm8wZAAoLDLMsima3BAz0tCXfl+9g9DA79QxdfTt6f4b0PWf4pJfE9Oc/mebEIyyTP9vDp&lt;br /&gt;
2fQE7938dOK6wfAYf0BYgOFEhzv7+93k4vz2NxyB7zy/z2De92EZPeDpb5e3k1+xc+gdDg8dmM85&lt;br /&gt;
dPwhvHWCQ4Qd16FfBH+A1A6PPuN3ncg6ElmfI7uP91Yw6d5qXWTg+/bwuyaisColRnh/Hi6S9Okd&lt;br /&gt;
pmD7q3cYUMafHhJArHwgGJxuUj7hZIUp9RmEDHt4enfNoA24uBKXoFo4kNkkTHnk01owPoizNcJ0&lt;br /&gt;
HOdzbWLbst39OL290b6mgQ2gkt2vAADhDSvL19X3/xj6pkX1JCFDuagRrGmUr2koctlcVz9wxse4&lt;br /&gt;
/IRwfpCSEuI5fD69OoB4Yoir38DfmGgruBlDkAAHT88vf744O/hlcnF3ZkDWl8iOJLIpIJvmUZjC&lt;br /&gt;
SrawraQAkOUAkunAa644EBqukpisQI43Mj2Q0x8pASypAJYQ1V0V10X+Mcki0kQDYSEGFA6D7C0r&lt;br /&gt;
yJfhM5T4jDV8CkI4TvTNJI7hgav6oiBcYUMhcMhBuExKPHoLJaxtQyx7CSUou+MaVX0kKXMGkrQc&lt;br /&gt;
qMqL+zBL/sXMTQe3EaaE6UC1tZ2RNAcccZlvXNsjhYGjMFg3UAjTuywpdUQQ1gSvDorXAPtcfMYK&lt;br /&gt;
H2GqwXakpGVq2LcYvEEeJSBtCMf4U1I+1OzNhrkc5RYcX5q3sIgefobNXXtKPobvEabD3+GYLAsS&lt;br /&gt;
weQx3X2R7CEEUY+n+hP62AQ3MOGnPIEjzO9svUoyEOMTmPY+L55aSAIAwgwERxLmmYaXAiD8Qhl3&lt;br /&gt;
lA9xKtu7t8zBRKRSaRsk8FGQsFAAdOBPa24GGuhQgw54WA8H4phIUN7DGdVIOMk75IQPgXsAoSQv&lt;br /&gt;
WnwdZXAehsX3B8a1V57EOdIQv5rPk4j8mD+2cL+GUXyFMAPADOKl+MPa24XHgr9yRc5Y4P/wtErA&lt;br /&gt;
zZ2SNPlIiidOC7dNLU90XQFjAY05OObwvUhDeDNznqMXyq25A2HqSEqWD3lGDPHVLYwjzCCwAJE0&lt;br /&gt;
NH5cI6QxJmlBuDc1wQDCViMxypO5jkbMo4WQRyCBx4l97GTgmqZWLsx1talL8nhLikUCHuk8ph6B&lt;br /&gt;
Jo80RMDwSlQAFgtgrEP3wMtoNJQrcz3pWudhtEogSCe3TVbD0CP1rqi5Vj+Jn+D9n8LHd1j+UoqA&lt;br /&gt;
GUsIFCo8XdP6udrmSHjBR/iNyTr/Sh+IJzEYt4ZxztYLiP+jKZOsmvjVRroUCWH7KntDagtMFCg/&lt;br /&gt;
6Qo/mWQ0BVtFJMn09LJDEHkUVYOEIP/0kqJbV60elCFsom0zZUMjZcp3usJ3FuQe/BspSGziEGyC&lt;br /&gt;
sYARzki6UhoT1dzvRhyZ4zFJuatcoytcI4T1ZcJX9DyLwfyWecsCgFPQwIAJEu4Z7mYLKwabRItN&lt;br /&gt;
dpW/dKW/LMicFLCUwoW8J+VDHndIkoQE0ipvs6hgezgLX+wMEbbtDV3lEt2xQnEFNostpUkoENah&lt;br /&gt;
OkKrjocYFxVEorGsXp99ratcnidc3mq9XOYFxNCT5TKlMgDTn9BqzGMpaUBYhuACGocKHCKtCl4S&lt;br /&gt;
wzceypJrlCBs18cjE/LKxXnCxfEOsdZa86/pTjOku4UiXy+54sUJFfn7dbJ6IPGlJe2ifJonfFr+&lt;br /&gt;
KeuYin2L96tEC6oIf7fldMpVeZ4wM3lKrqJovQyzsj0rH0C4pERS0O0m9JTP8YRdo9nQE1JQftGN&lt;br /&gt;
S4ffCQYIjzGFw5EC/I5+g/86A1NS3+ookDNaVmsJM8IGETBJgKf8jCdsXTTZhPMYuHIy2QnGQ6Z6&lt;br /&gt;
22Cs/Icn7BktR+YF7I9vyMecKxDdMHXYM469hAe/In6AU/hFgwyjiQNjIfAcm/BUXsQTRk1bDSOm&lt;br /&gt;
IobjmGq/eA6uIA/6mhpxVT7CF0YsKnLYkqvpr8Oky+NVaFLgGrJLAO+7mhw/hOkXAxOKykf4rgw9&lt;br /&gt;
78ElVcmkvfusI384RzgpYPu3s+yxp+y978nALCmTMG07KDEAFgWWapUvWAYxTFNqYugkq+8wPBxn&lt;br /&gt;
ecnwqbLhgOjhZkSU7fZFjHtPwHIyCfn7GkLExu5AOE320N8FgIhTwMZR0y6fsBkBZdB9EaI+BoPB&lt;br /&gt;
XZb8viad+xNdaAY0pwaAONEgpd2YJWUtMu2hiEMTnsoT+MIwx5YFgmCZLQ7CDZyawdvVzenZDUQI&lt;br /&gt;
2sBVEZNWPE2HEe6RDjFEd6aMunI4vjDdnQm7lgAIKJn965vYc00hs68VeFSQmZd5lKe2ahSN4DiU&lt;br /&gt;
oRjV8ZAtIjjT/tDXakDC3nFpfN8d/VSiiuphEA+CJK76E3pwFww9C86M/FUOJBDB2UMOFtWsWpiO&lt;br /&gt;
A3+7deo5uS6ENyeErJU/X7mWwG3Fx+k9dcMPi67YXouLNbAeCmPycr5yIYEn93VpGVqiBo4Kg2r6&lt;br /&gt;
379u5d0s3tdXLiUQljxexPX0X4ULs8cgfafvT/doAthuon3lI4bCRC9XZB3n2dNCPBuMsTvY98uH&lt;br /&gt;
d7Dd44MIPy2Yq6ROSRSVNs1F3cHgcHzoer576Ixpd+JgAA59QIVceuxFmNCyXzGPjlz3PXxAeJY/&lt;br /&gt;
1jy34478YwxvAAJTEAaAuwT5fBJwUcVcmhG+qY82RbpPztwdwo50+Bn4bqB0bKFUZGuA1JgWY+Mc&lt;br /&gt;
KIbd32KZg+cldOPRIPV71/VHx5gDwr4PIDmcjd4pwk3t7aC2D610k4vwpm1uMLBxV7gfWbqKTxk1&lt;br /&gt;
e3rmj7O1IlNB8hKXpXL5JWg2EEm9GIwfHvlAluMF/piq7aGqIpJKfNlfmZZAoFUfotW4GtX467lH&lt;br /&gt;
g2OckvswesKhmI+pFgMWOQtWNIbIgz3MugbbrYBxPwgyrnJGWgdlrbVkKFtLqvaAljkKsRyh5gE2&lt;br /&gt;
z/kSA4J3J7d3N5ML/P5ueosj/H7yG6yeVofEb2mqLCqSJTOn77rxcCQewlyLboEORNTQ9A7h6xYm&lt;br /&gt;
HAVeN38LuJBJusrZOx2rFR1Ma+iB2poQdCWCwm7rZeM2kpkoKyOsxdhda5ZXCNPMwDVM9ykv4jay&lt;br /&gt;
nAjwA29xs4gKX2kZb/jUyrFyIptZTYQLGDAkCGFEq4BUnzqLEnwMQhGtHgDfGVLYMIJNVQTGFMo1&lt;br /&gt;
Rmat0ld95iVL+UGRZy6rgaR28trIaU9yOujgNO8l6OQ3rGerkcDC9rWV77xKXxPf5/OdbgRr+eyX&lt;br /&gt;
8B3hOud7872L7VWn1Vulri9gOzBAZ/x2bPcl22WZnxSrLtXGYoCzFjY2LeaC+clg2ojO1snl9rpx&lt;br /&gt;
PiOc90M3kOiOOqX02oA8BHzNhhedHP6+bU15v0pL4EAWepmaXgInZWGDqeklcNy4bTY1vSQO4X6m&lt;br /&gt;
5i3Vail2Bs4NJeeOOjl3k3f0C3XZF5W47nTFWcW6bhsBnNsBy6qlRDthWWUjYDto4pg0hXp634on&lt;br /&gt;
2olhqZgMa9bB5l7qOpJMFwlillK4mtMHtrfEVcaBJxNZ9hDvQ8j4zszufZGvqFmdhsuAzV5tGXn5&lt;br /&gt;
pSKnp+E5kpSIpr893gyZ0fyn0ewwWyHBNtkcSlHaTQN3ezSjsnXAYxJphJ8R8JhEGix4H8dXDZkl&lt;br /&gt;
l8ktLVHtLBJiUZXdNo0Vc0UeSqtUXhd51FWcBe6iWkVzKQA3GidNFtdSm0BpN+4X1MZFdlpqGJxV&lt;br /&gt;
LZSbENVbLbu1qqOurFQMYUaDuQZc1zahZT1thqM2RY5MYk0nHcYiTgr4JdWN1dOKdpMucHgPWOP9&lt;br /&gt;
kDa1gxhUlqO1RE1P3z5YQOXZgJ/aE8kG1Jh8BGnrQrEasOwdlUyoHn27uUqZhe+zlCqol72ooGB5&lt;br /&gt;
dj9Zlw9UCvii3K06m2xCzIFZNVFBs6BOCc/k7tfzi/PJzW+cnkZF2ICYCjtle6mqrVGZE/XLxpoi&lt;br /&gt;
zLbk2vNDBWnAaB8bqqfMMhgrlnRsUqOEMaqramggUgWrsgG1cn+8gmRygki6QZGWl74QdDnG/Nda&lt;br /&gt;
y5vNQQKRetre6ig3usk+JkoFerJ7lcrElERrygJjsQRhRjzrFFhVwPWaSQd/J3VLJNPoQLUJv5Em&lt;br /&gt;
eir90yl8B7+4fFY6jHAboIVKR7bdiIgWUsjy+c3FabLiSTTqefIka++lEdYMtcZMmyQbNAC/ZS1d&lt;br /&gt;
/XFWnlK2v8aL2OZJeJ6flmwMe8LOjI9134/wbgIgFnHAAuwkAGLhD8I9A6A+4TnaLuGzXWTuailQ&lt;br /&gt;
EfMsPyRNTxAcjahSXv/PubD6CHdqYS+z7yrXLrt+YdKTSWtKOqEmz/RYgdXOM8EyCnldNRC2mvm3&lt;br /&gt;
BhNvIElFA26t5HZyc9FJlXCeIoNbJ6JTFzvn9VgmX5UA3GAAn6SbT8MZCF18d3N+VRUe9La8wWh8&lt;br /&gt;
LM75lA9hyZrxwiRbsXoY/EhL5ZdPSwhg+Aqrp8J6ABuo8tRo6MbVN5ZWtCMCoCrLlAg3wZ4BEdNe&lt;br /&gt;
s7zCwZSH0It3hnCEGxuwGrEBv6CxlqyU4MmmkzhqrCH1V7SihVo1rU3oxJEBhaGGAv0rdBLMYnty&lt;br /&gt;
bwSTwwjMhrCd/ITS/Lz7dQLHbVwkQV7zfp3xyP03ul/nz/6ynf93Pkc59cUvvQHAfv7fHdLD/o3z&lt;br /&gt;
/4Hz9fz/q7xeeP+X77qjeTCQ5/+FyPS4AUCBGu4AMDYiyHNDj+VZRs91x1c3VaiE8M6O8Bm6d52A&lt;br /&gt;
91CYrwMw4S3cCt3bNN0bOFTeoGhqF9uGFlqD7XvmzR345gMWFmK0ZhCY9AM7EfUxp66ZnLLTNR86&lt;br /&gt;
Ol8oCIXA1W/6UPf8/kI7pzwLcfL0Tp4vmkeREK6IoYPtw0df5LIEOyXmKMuR1TLYhZRNoaM5FfY9&lt;br /&gt;
3v/ZA948vuvVKekBLmC2TdgEFmz0vAAzDbXucL6s4hw0y4Ksnrm2W5wxsq/t0EKNCGAf8lUrXAV9&lt;br /&gt;
pl+zABEe97JmxX6nui1UjCxUyLIGv/RM3wXSsgNlyeklZYYcl5S0DpBY15x2wSt8TQ2stl47maSP&lt;br /&gt;
82i9gBhS6xeFBW8Ym1YTNiVC/NLOD4S38hNb88PWZifz+wLVW3WjQnWPA6eP16h709SiiNUKd0eT&lt;br /&gt;
Y3PZKqFf4foLBFM8E4hwnW0f+cjzCKMZol0zy7H5dFUJqHDlKULKLhAinS6uRDxVYSDOok+bjtwa&lt;br /&gt;
9cmxOXGZNRDIXFT5h472xlR0CGu4Y/Dm9zRZtoFDCH9RdXJsvtxVd7U85AtyTdNxe/w9wq1z3a2Q&lt;br /&gt;
hcKp9F/b38shhLc4yb+JcO3wR2A6N+TY/L7M7a0IbMbLUOtwpIkgXSQ1iO0tOzXqfSXRFhnItGBe&lt;br /&gt;
PtA1rFqje502N3WfOzbnLU9ohzckyotYIx51tqc+v/nWsblfeQ57cdpEBKz9jhGxOVd5hHrx65dH&lt;br /&gt;
xNpnLuKqbPrFEXGtzd/y1PPVpIEJrYTvGBObl5FHmCP6p4YLbI8M/dQvwMXmM9TRVNnoLs5zdHo8&lt;br /&gt;
luprdcXHVRe92eIg3Ns5GC/LsPkFT4Xv4BVqVxy1Y0nmBZqXM/S75wjCLPNNRy+558iSXXfUYVfe&lt;br /&gt;
bRSmKoqEDaxGmRjH1cVdW25T+EUaO/Ljrs1D+OqswiKfJRTX6g1o40Y3ziH7OHLa9bYzR07vENzo&lt;br /&gt;
yF2bn9KOBC/59ov/vW32oHcQzQB7BS+iG3UnwYsT0KhgA802n+irQ1URvV9vXiQki9OnkxzQ7LwA&lt;br /&gt;
skovVXDyzsfMfm8U2joj2CnStmshjCSKfcO6daa4FXnXN7L2XEITXXodzHY6aHPNfvcRgWlJM1nr&lt;br /&gt;
Vatm1+i8pjdNrrsNZ93GIPzF9gqezePLU9T/DDNSyii0tfX+Gx3GCzG+9bEmWKztj3ZZqbLmnWWI&lt;br /&gt;
CQhfs34IkkXkasm73VpcY8e3lhIO58uqDafH1UMQzloutzBiKGKK2TpJY1gWdUK0tu7ijKgA29Zd&lt;br /&gt;
IbxTUbKFF74IL+LphJ3IVy1tCKsQaTrBcrQHPuM+F/d4tsBAngpfwUKk5IJ8JGmFAa2dNERhyoAw&lt;br /&gt;
g9oKUY8e4e2Bqs3jy7Phq/WMts28T7JksV5QNBCutwhW2HI4TAHB1/VFmNlImqLqg7DNV2vHwDnC&lt;br /&gt;
4WNPhBlg9kUQtjlaeVhcRIHT5D4DG12Qjhj4WkSKEqh33YAj7Hq2+zaMOMoM2/ntDeGtv9VCIn2z&lt;br /&gt;
cX6L1fAzUtStOxaM2wrP5iID4SLDdZzUKy4IU0TZ93h/fZCGn3oVXHx7vcW3ObRg2EjwXa9nKV2L&lt;br /&gt;
roT5Uoxtn3t9SZHOfFLX1DqkblpfJmleikMYexn5dA0uTfvqnfWUFy0vJfwkRLuSTNsM5wiLw/wz&lt;br /&gt;
1qWnapy0gMlO5ogKIXyQZS14T3eMjewiaztu7TZZ72OVgaONfvp+zdK/iLo7JfXAhXbvatk0+Fjt&lt;br /&gt;
l1pdiQiLPUVjoB3nrSnC7UAizyTu9H/SUSbCcgDaxF6pQRGL4+tNprB71dpMKw6KHlzV/ag3lOoX&lt;br /&gt;
sddpgt1E+0vt/mzGL3NXrDmkkRfX7yk90qhAuNYs2y5nic7efLHIBYom8pCFwI3k1YpM/HhBvUKj&lt;br /&gt;
wfDShvaFqBZoX0n7YjtubFozEadSpbJ1P2vLwteppoWmddK3swjPzCjauhbHDbZOQf6IOPkD0XTH&lt;br /&gt;
OY8mshvxy5S1eDZnLcdojQ2ZqkbHc3NmtdOu/mDNj1Ubbi0h2I0uIx6CIUG+9SBCvUO80T4ulgZh&lt;br /&gt;
2QXd+v8OZMN1z0bqJXCw0XfdPHum92w3n93o+6abK0PD+LneLt5uLu9oRYeti96M/tjjSJ2hI74g&lt;br /&gt;
98CAZvu8fmzWcpLXKDwiSuOX2zDmXIcFN3v0rAHvl2254JqFqy6Js+tw6+YFO0ft/KQ18C04aucn&lt;br /&gt;
7Oq34aidn/TA8hYctfOTnooxHdM1clTWhi+np5pFYJykN4e0eFkVSWDy96fq7a/y7eVUvp1eKWDY&lt;br /&gt;
4quqhu0YrhHTUc1w3ZCU2qCqe7od5tKz5eJ/NWGQYOTol02z1+ioptYNwkHtDiDzmVIjpiLPoWU0&lt;br /&gt;
5R0ztLhV5S2bPqQBru5q7TwnappdntxhUfNV7T4XxMjer/8vJV3ehYbUdcbrORvLyU4jVo6O1Sk9&lt;br /&gt;
8MnEbBVi1jegT6VyKZYjmsaJxO78d/6IC3qmIQVmhvTGA3Pn/ioUc4pTZ81sBB17K7+Hhz3qI++e&lt;br /&gt;
3Yg/mgf1/9aazF+xEX/kBP7XRvx/95et/9/9nCWrHfxP4Pb+f8cPhk6z/3/g+l/7/1/j9bL+fz/0&lt;br /&gt;
B8NZOJf9/0xkejT//197V9vcKI6E77N/hao2H672sglgMDhX88GbZOZ8N3Fcca5mv21hwA43DrC2&lt;br /&gt;
s5Nc1fz365aEkBBgkjjeqw3aqh2H19YLT7e6W4/4dTWZ/8WCKOo3FBzAQSpiTLd3Efl0eX49Qy7b&lt;br /&gt;
Vfh3XGUPh5g9WR/4a0k31z75gNEM7vLCmlql8skW+oMucj4DuXL+fJOCsftAGadxq6yUVpBmIoTF&lt;br /&gt;
DUodKRF5bQYIo6F+ifiWJn5u7q/SZZzM7kCRyrLnArM+odeQDbvoGfKWpKXit5O3r8krWBDu/DD9&lt;br /&gt;
9tnfbM/v/GQpDxIw6JHfqRXDLWs7t+32gKosA0WWKyUNBmcVTISWSwPaCeFoQriqEP7j2wsx0ITw&lt;br /&gt;
FCG++OtEDeoxQXpkz13iaoIMFUHGCQxLmHmVJYHhsWdJPE0SkY7PRLl8zOBbf/smGeqCmIogH1e+&lt;br /&gt;
3jPr9kuN2olh6ugv8uEZ4dO/47ACRABoqpA9x5fnhSV4tKo2eVEHc+E6YzJO4s0k2pZJtHtVkPdS&lt;br /&gt;
WSn9aYtESx25hacmKaS8XcdZwcI2QYooxkSy5SdKQuB/xkltYrIOv8KZEGezaI3UONN0vS2NJ3jp&lt;br /&gt;
vr8vU0dfwTtTiMKZ2CUi6DqCZFMHUuF9iLP8Qdpmb+gv2e5ftZg6ogoPQ5oEN1mgS/I2OGbqkCrW&lt;br /&gt;
98fZP9LNVl1GN56yNMoeqUmkfFYaa+PGfTrECj9InMFQ/5auv2rCYTo/PbMf4Xrke6tW1FFYeEeo&lt;br /&gt;
rPf+pkZWPHNQWa0KO10gtR+UNra6Gp3zvFno8bftcEuHZ0HQMU/T7dRfwxe+LZpwnQUncAIaMcNT&lt;br /&gt;
IcmKKypxrzYhVwdbsUcfvvljXGDsz/A3ie/9ZUQwYKrNVp5lGTdpAEsHY7H0ATTAlZ+xXKtdW4vr&lt;br /&gt;
QCpWLrDHXDJHZqkWULd9qLuBsic7DgADJKoYp1VpBLLY1olwgqab+HGUh5hZr4xQFrT9Usobu0C3&lt;br /&gt;
MI9Cs7T16fVs/EvBkbKp9RpSgqYjSsMB/++ROBQO/qX0W5n91RElFXMsvBu+dpgGtyP7KX8K1olq&lt;br /&gt;
1JWrH4Yx8/Qi746oJCV1ZzfAt8HEqq/5g4jH59XokZzxqTT5EodgDlT89h/Fbz4jEH+DYQ61R9Nc&lt;br /&gt;
HGIGsvgTzdSWREha21jyyPjErDdtXCAv7UIiLM3HRwP7Ix8LRb9L/QyGvNTTwsRtV4Xyp20Jr4Kw&lt;br /&gt;
bapqQEmRxzR8FW1JbrRQ5kTBWdhQD8WEoykDmiXFa6hUoS7SrlbA1oyp+j5ICGi/TDHeGsVWzbOi&lt;br /&gt;
iTG0miZtZS5bgFbBm05Nrkp5F6zRryfnpzfTczLHnalwprtDZtmIU4cE5blrJW/ZRrROBophVicv&lt;br /&gt;
6dHcl2PezjKhZT3eybaeGOY6beVRvpi8iT9YFdot22zVciNwUXmT/Kqdw0KxAYXQeJzbVaL9yxRr&lt;br /&gt;
O6tRtj0t4fFI5CmiXpEe64JEXLKTWVabzQk4mWC0Pz/XDljKdqglHCRM1wuRGWlJHKC3EoXnnxIV&lt;br /&gt;
fjKeQfs0yF6YH+1GsuYcsApvCTxLpcsaJXzlWUxJcHdLw8eDZMyIv3hGDRNSocKsjXaWxBRWfBRF&lt;br /&gt;
nmFdKLSxI/5xwdilRoZPCnO5Ws+CIIWN3RAKLUlhScaoP19FlWIgYyMVA68qbOFaQf5KctsW03lk&lt;br /&gt;
A5tuj/3S2OdwMVRJyBbGIWOfQ894H7HPpvhf/3sMCJSulyyx88WRwOb4n+HYbl+N/1mm2e/ifwcp&lt;br /&gt;
r4v/RRH0mD0fiPhfaci0iARqd9TEBC2k7aXbV+EGVm6fsl6K+Uzgrz8DliUbhYy7R+BDRkqRuzgA&lt;br /&gt;
fFqxK3CnUpYyteb87Su6HfCORHdl8fke1wmatZUTTDARwPAW001l5w9fGWXRKgqWmw0lH8+vp0iO&lt;br /&gt;
m5IlRN2/qVxXMDheypKm1xUjdbWrIutrawt6n3gDXfKkbBNI6UtpVYuN26m/YpuSeYRTqZB8u4sS&lt;br /&gt;
wm/GaSMCPM3OPUBtW0Ylq6ueT9ui+2yVPkWR6uOj68VY3ZOHezS3/NXqSelyMHb4rbt6XGUueGUb&lt;br /&gt;
yMub27WBXdsGdqkNbin9rMS6xloAWWkprQC9jI5xdE8UuxS1WK4CJs7ev+KmhWyD3Er9TxYtpyoT&lt;br /&gt;
m6iYT/45vfzEfIKteNjqthEf1A+z3IoXn9BnP1k+0BdK7A3lz+zbOt5uIxxPZJOlX+HXit9W3/QF&lt;br /&gt;
68EePrPc79duiLn1Q0zsiIu89Ffjq0t5O3g5U5Q1wfRf57MfXLrejaUJMpgBxOHM82R2ik+p6K6K&lt;br /&gt;
ddd1I8erR0QRq6KuNJDGtCpGjqBwYIigsucfUxbv8xn5Acz/6cdf2m2n3rAoq0rUwneGuvx6vSzv&lt;br /&gt;
iyNkFW6na3Vp+FTaIKdqZy95utYTtN+4kq5yDUFhDtAJr6o+8ZDQMDjdOSIq8EoHsJOo747vxp6v&lt;br /&gt;
4KJ8CtpqLgxn0dRwvjn6ERFfPLoPChJttoRKciDka7MI23EBl2Px/Qr5zcoSF3nBGHcxl2jYjwhu&lt;br /&gt;
WF6QC0jLB7SPn99e/iDyJRd02L0ii3XuDi11JmcecCbnOcP++5jJvayo8z/oSsS5OcA0cvneh/PT&lt;br /&gt;
PbwDG9x1jLr5H5ZS/ufAgNPE2cO7d5Z3Pv/b2f+oBn6P1oCWHwD/ATviZPtMTwCd/xu1/W8atlua&lt;br /&gt;
/1uu63bz/0OUV87/B2DhLsIhnf9XjRTNAcB1RPkwv7Hm7A19VtXJbZr1itupiZK/OL9NGFxn3CGO&lt;br /&gt;
XLZsT6Rc+7Idj+Ttkhp0nSKMpOsczw78uRP9NOgHC67rFgvjJ2/owLD3FqDzFi/VdY4xhAfalq7r&lt;br /&gt;
xBmwyfre0NunrpPe+kcP0668UXkW/sMR/gU9SwPswn/LLq3/sNDK6vD/EOV1+L9wHC/wbUfD/2Kk&lt;br /&gt;
aGDOAPZaP9GsA1qhv/za4k0XMNFZxcnyjMC8J13LpwDMYUp6husML+XjNP3j+vyM6Bv3NV2mXcD+&lt;br /&gt;
HV2cqdpFu+J6gdfc501Tr31E60maZ+B5QRAGnqp5zH1qHseu0zyOfWIaLnzXb6B58K1/9AfyJy8N&lt;br /&gt;
+G98Z0dfvQJwR/wPhk+/vP7PNrv430HK6/B/2F94RmC4Of7rg0fD8fySHM+LI9R6D8ThUYCbKtOD&lt;br /&gt;
25T8SOZPJExOIswb/SBy6T4Yf3sofiOuZFG0BigL8Xf0iN5GJCTCv5B7n5v8+DB4IiDeVzpRSNPt&lt;br /&gt;
xaQSn/jZ6ZczMp6Mb8ejz79OR7PZl+ubiwaULlWy5BHrDy1fXdcd7PCI7WNftb7TcnLwrvxf773s&lt;br /&gt;
sv/3sPx7J/4PAPM5/ruuO0D/n9vv/D8HKa/D/8Fi6Iem4+j4TwfPTvAvG7fhvFIt8IfBsbnIlj8j&lt;br /&gt;
P49ml79ejG9Of/epRT17WCzix/z4RNchmNK++aBk14Me2ESrBY1xUq3gJ2nydJ8+bOhWLUxPJJQV&lt;br /&gt;
XHmeWTxPy2rXnvkjAdwOlfstodOKk/iIqzQsJiOaWpJqVquUaCud30XB1wx3kT4jjmmRvsGOj5Mw&lt;br /&gt;
esx3gGVUhdFvyqkgOcaIUumo0LHHRRZ76RI2dzkuUtjz81f+4yz+L3Qj2nlg2HmW3TS/EUNAVZoR&lt;br /&gt;
KDBPDSPZhwsj9U3b+HMmBCr4vw+wryg78B+GRY7/0DAOHDfhws7/c5DySvyfz10vKPg/amz+T6t0&lt;br /&gt;
7q9ovp9k36+XG0wbloB8/ZCcblZ+Fp74cJJiYrqk5NNnCMIUgqdxWHtXFlMgvU3T1e0dwiq83mwA&lt;br /&gt;
Gy5XyTy33EXJPPff3jy3vUHLOPV+cQUb700H2F94/Lfe/yvHf2ks0DANZ2B18d9DFLCd/s/636b9&lt;br /&gt;
b/e7/u9KV7rSla50pStd6UpXutKVrnSlK13pSle60pWudKUrXXlJ+R8PJCZ+APAAAA==&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Patch configuration files&lt;br /&gt;
&lt;br /&gt;
sed -e&amp;quot;s%BASE_DIR%${BASE_DIR}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%BASE_DN%${BASE_DN}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
sed -e&amp;quot;s%INITIAL_PASSWORD%${INITIAL_PASSWORD}%&amp;quot; -i $(find -name \*.ldif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Fix CRC32 checksums on configuration files&lt;br /&gt;
&lt;br /&gt;
for FILE in $(find -name \*.ldif); do&lt;br /&gt;
    CRC32=$(tail -n +3 ${FILE} |crc32 /dev/stdin)&lt;br /&gt;
    sed -e&amp;quot;s/^# CRC32 [0-9a-f]*$/# CRC32 ${CRC32}/&amp;quot; -i ${FILE}&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add Root DSE&lt;br /&gt;
&lt;br /&gt;
DC=$(echo ${BASE_DN} |cut -d &amp;quot;,&amp;quot; -f1 |cut -d &amp;quot;=&amp;quot; -f2)&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF |/usr/sbin/slapadd -F &amp;quot;${BASE_DIR}/etc&amp;quot; -b ${BASE_DN}&lt;br /&gt;
dn: ${BASE_DN}&lt;br /&gt;
dc: ${DC}&lt;br /&gt;
objectClass: domain&lt;br /&gt;
objectClass: top&lt;br /&gt;
structuralObjectClass: domain&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Print instructions&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
Instructions&lt;br /&gt;
============&lt;br /&gt;
&lt;br /&gt;
Launch slapd (debug level 0 - foreground mode)&lt;br /&gt;
$ /usr/sbin/slapd -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -F &amp;quot;${BASE_DIR}/etc&amp;quot; -d 0&lt;br /&gt;
&lt;br /&gt;
LDAPvi on cn=config&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,cn=config&amp;quot; -b &amp;quot;cn=config&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LDAPvi on ${BASE_DN}&lt;br /&gt;
$ ldapvi -h &amp;quot;ldap://${BIND_IP_ADDR}:${BIND_IP_PORT}/&amp;quot; -D &amp;quot;cn=admin,${BASE_DN}&amp;quot; -b &amp;quot;${BASE_DN}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not forget to update the intitial passwords for both identities:&lt;br /&gt;
&lt;br /&gt;
    cn=admin,cn=config&lt;br /&gt;
    cn=admin,${BASE_DN}&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basis-Struktur ergänzen ==&lt;br /&gt;
Für viele Anwendungsfälle – wie eine Synchronisation mit [[Keycloak installieren|Keycloak]] – wird empfohlen noch zwei &amp;lt;code&amp;gt;Organizational Units&amp;lt;/code&amp;gt; zu ergänzen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Editor starten mit:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;ldapvi -h &amp;quot;ldap://127.0.0.1:12345/&amp;quot; -D &amp;quot;cn=admin,dc=example,dc=com&amp;quot; -b &amp;quot;dc=example,dc=com&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oben die folgenden Zeilen ergänzen:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
add ou=users,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: users&lt;br /&gt;
&lt;br /&gt;
add ou=groups,dc=example,dc=com&lt;br /&gt;
objectClass: organizationalUnit&lt;br /&gt;
objectClass: top&lt;br /&gt;
ou: groups&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun den Editor schließen und noch mit &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; bestätigen.&lt;br /&gt;
&lt;br /&gt;
== Autostart ==&lt;br /&gt;
&lt;br /&gt;
Um den neuen LDAP-Dienst dauerhaft laufen zu lassen, sollte [[Systemd]] genutzt werden. Hier ein Beispiel dafür:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mkdir -p .config/systemd/user&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In das Verzeichnis die Datei &amp;lt;code&amp;gt;slapd.service&amp;lt;/code&amp;gt; legen und mit beispielsweise den folgenden Inhalten befüllen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
Description=Slapd2 Server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
Restart=on-abort&lt;br /&gt;
WorkingDirectory=/home/pacs/xyz00/users/ldap/&lt;br /&gt;
&lt;br /&gt;
# eg -d 255 for higher loglevel&lt;br /&gt;
ExecStart=/usr/sbin/slapd -h ldap://127.0.0.1:12345/ -F /home/pacs/xyz00/users/ldap/slapd2/etc -d 0&lt;br /&gt;
PIDFile=/home/pacs/xyz00/users/ldap/slapd2/run/slapd.pid&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Anschluss:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
systemctl enable --user slapd&lt;br /&gt;
systemctl start --user slapd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; unter Umständen muss ein Administator diese Funktionalität erst für Sie freischalten. Ihr User benötigt womöglich außerdem die folgende Umgebungsvariable um die Befehle ausführen zu können:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export XDG_RUNTIME_DIR=/run/user/$UID&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pflege der LDAP Daten über die Kommandozeile ==&lt;br /&gt;
=== Benutzer anlegen ===&lt;br /&gt;
&lt;br /&gt;
Datei adduser.ldif (entsprechende Werte ersetzen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
objectClass: inetOrgPerson&lt;br /&gt;
cn: Max&lt;br /&gt;
sn: Mustermann&lt;br /&gt;
uid: mmustermann&lt;br /&gt;
userPassword: TopSecret1234&lt;br /&gt;
mail: mmustermann@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f adduser.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Passwort von Benutzer ändern ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldappasswd -H ldap://127.0.0.1:$PORT -x -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -S &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nach Benutzern suchen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export PORT=30389&lt;br /&gt;
export BASE_DN=&amp;quot;dc=example,dc=org&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT # geht sogar ohne Benutzer&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was kann der normale Benutzer sehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot; -W&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nach Personen mit bestimmter Klasse suchen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;objectClass=inetOrgPerson&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigenschaften aktualisieren ===&lt;br /&gt;
&lt;br /&gt;
Datei modify_email.ldif:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap line&amp;gt;&lt;br /&gt;
dn: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
replace: mail&lt;br /&gt;
mail: mmustermann2@example.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f modify_email.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neue Gruppe anlegen ===&lt;br /&gt;
&lt;br /&gt;
Einmal vorbereiten, memberof overlay installieren:&lt;br /&gt;
&lt;br /&gt;
Datei add-memberof-overlay.ldif:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config&lt;br /&gt;
objectClass: olcMemberOf&lt;br /&gt;
objectClass: olcOverlayConfig&lt;br /&gt;
objectClass: olcConfig&lt;br /&gt;
objectClass: top&lt;br /&gt;
olcOverlay: memberof &lt;br /&gt;
olcMemberOfRefInt: TRUE&lt;br /&gt;
olcMemberOfDangling: ignore&lt;br /&gt;
olcMemberOfGroupOC: groupOfNames&lt;br /&gt;
olcMemberOfMemberAD: member&lt;br /&gt;
olcMemberOfMemberOfAD: memberOf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,cn=config&amp;quot; -W  -f  add-memberof-overlay.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei addgroup.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
cn: admins&lt;br /&gt;
objectclass: groupOfNames&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapadd -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W  -f addgroup.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer zu einer Gruppe hinzufügen ===&lt;br /&gt;
&lt;br /&gt;
Datei addmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
add: member&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f addmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Liste alle Benutzer einer Gruppe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
export FILTER=&amp;quot;(&amp;amp;(objectClass=inetOrgPerson)(memberof=CN=admins,OU=groups,DC=example,DC=org))&amp;quot;&lt;br /&gt;
ldapsearch -x -b &amp;quot;$BASE_DN&amp;quot; -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W $FILTER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer aus einer Gruppe entfernen ===&lt;br /&gt;
&lt;br /&gt;
Datei dropmember.ldif (entsprechende Werte ersetzen): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=admins,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: modify&lt;br /&gt;
delete: member&lt;br /&gt;
member: uid=mmustermann,ou=users,dc=example,dc=org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f dropmember.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzer löschen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapdelete -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W &amp;quot;uid=mmustermann,ou=users,$BASE_DN&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gruppe löschen ===&lt;br /&gt;
&lt;br /&gt;
Datei delete_group.ldif:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ldap&amp;gt;&lt;br /&gt;
dn: cn=Test,ou=groups,dc=example,dc=org&lt;br /&gt;
changetype: delete&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
ldapmodify -H ldap://127.0.0.1:$PORT -D &amp;quot;cn=admin,$BASE_DN&amp;quot; -W -f delete_group.ldif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[https://www.vincentliefooghe.net/content/openldap-setup-multiple-instances-server Ein Setup für mehrere OpenLDAP Instanzen auf einem Server]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7285</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=7285"/>
		<updated>2025-03-03T15:01:30Z</updated>

		<summary type="html">&lt;p&gt;Sib: updated link to Gitea admin page&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;
=== Default Branches ohne Force Push ===&lt;br /&gt;
&lt;br /&gt;
In den Einstellungen von jedem Repository kann unter &amp;quot;Branches&amp;quot; eine Regel z.B. für den Hauptbranch erstellt werden, damit entweder nur Pull Requests und kein direkter Push erlaubt ist, oder dass Push erlaubt ist, aber kein Verändern der Historie mit force push.&lt;br /&gt;
&lt;br /&gt;
Über diese SQL Befehl können die Einstellungen überprüft werden:&lt;br /&gt;
&lt;br /&gt;
Zeige alle Repositories, die noch keine Regel für den Hauptbranch haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT r.id, owner_name, lower_name, r.default_branch&lt;br /&gt;
FROM repository r&lt;br /&gt;
WHERE NOT EXISTS (&lt;br /&gt;
        SELECT 1&lt;br /&gt;
        FROM protected_branch pb&lt;br /&gt;
        WHERE pb.repo_id = r.id AND pb.branch_name = r.default_branch&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeige die Regeln für die Hauptbranches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
SELECT r.id, owner_name, lower_name, r.default_branch, pb.can_push, pb.required_approvals&lt;br /&gt;
FROM repository r JOIN protected_branch pb ON pb.repo_id = r.id AND pb.branch_name = r.default_branch;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7279</id>
		<title>Umstellung von Daemon-Diensten auf systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Umstellung_von_Daemon-Diensten_auf_systemd&amp;diff=7279"/>
		<updated>2025-02-17T20:49:30Z</updated>

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

		<summary type="html">&lt;p&gt;Sib: Erstellung der .ncdata Datei fuer HDD Storage hinzugegeben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls der &#039;&#039;Redirect&#039;&#039; auf die Domain &#039;&#039;example.org&#039;&#039; umleitet statt auf die Subdomain &#039;&#039;cloud.example.org&#039;&#039;, kann diese Aktion helfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
mkdir -p subs-ssl/www&lt;br /&gt;
cp htdocs/.htaccess subs-ssl/www/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-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 für Redis als eigener Serverdienst RAM gebucht 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;Arbeitsspeicher für eigene Serverdienste&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit systemd-Timern werden die Logdateien täglich rotiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate log files&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/sbin/logrotate -s %h/.logrotate.state %h/.logrotate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.timer&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=timer for nextcloud cleanup job&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=1:1&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
$ systemctl --user enable logrotate.timer&lt;br /&gt;
$ systemctl --user start logrotate.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/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;
Seit mindestens Version 30 von Nextcloud führt diese Konfiguration zu diesem Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
Your data directory is invalid.&lt;br /&gt;
Ensure there is a file called &amp;quot;.ncdata&amp;quot; in the root of the data directory. It should have the content: &amp;quot;# Nextcloud data directory&amp;quot;&lt;br /&gt;
&lt;br /&gt;
An unhandled exception has been thrown:&lt;br /&gt;
Exception: Environment not properly prepared. in /home/pacs/sib03/users/nc/nextcloud/lib/private/Console/Application.php:137&lt;br /&gt;
Stack trace:&lt;br /&gt;
#0 /home/pacs/sib03/users/nc/nextcloud/console.php(81): OC\Console\Application-&amp;gt;loadCommands()&lt;br /&gt;
#1 /home/pacs/sib03/users/nc/nextcloud/occ(11): require_once(&#039;...&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Konfiguration umgehen wir diesen Fehler.&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;
xyz00-cloud@h00:~/nextcloud$ vi /home/storage/xyz00/users/cloud/data/.ncdata&lt;br /&gt;
# Den Text &#039;# Nextcloud data directory&#039; dazugeben&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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7236</id>
		<title>Nextcloud</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Nextcloud&amp;diff=7236"/>
		<updated>2025-01-30T14:42:52Z</updated>

		<summary type="html">&lt;p&gt;Sib: add troubleshooting in case HTTP Redirect resolves to the domain instead of the subdomain&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nextcloud =&lt;br /&gt;
&lt;br /&gt;
[https://nextcloud.com/ Nextcloud] ist eine PHP-basierte Open Source Lösung für gängige Cloud-Anwendungen, u.a.:&lt;br /&gt;
&lt;br /&gt;
* Filesharing unter Nutzern derselben Nextcloud, und mit der Öffentlichkeit&lt;br /&gt;
* Single-Sign-On Authentifizierung (SSO)&lt;br /&gt;
* Videokonferenzen (WebRTC)&lt;br /&gt;
* Online-Office Anwendung [https://www.collaboraoffice.com/ Collabora Online]&lt;br /&gt;
&lt;br /&gt;
Beispiel-Funktionalität, die über Plugins, sogenannte [https://apps.nextcloud.com/ &amp;quot;Apps&amp;quot;], bereit gestellt werden kann:&lt;br /&gt;
&lt;br /&gt;
* Kalender, Aufgabenverwaltung, Adressbuch&lt;br /&gt;
* Datei-Kollaboration (Kommentare zu Dateien, Verschlagwortung)&lt;br /&gt;
* Feedreader&lt;br /&gt;
* E-Mail-Programm&lt;br /&gt;
* Fotogalerie&lt;br /&gt;
* Musik- und Videowiedergabe&lt;br /&gt;
&lt;br /&gt;
= Nextcloud installieren =&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039;, zum Beispiel mit &#039;&#039;hsscript&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;hsadmin&#039;&#039;-Shell starten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -i&lt;br /&gt;
Password: ********&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann nacheinander anlegen:&lt;br /&gt;
&lt;br /&gt;
* Linux User als Domain-Administrator&lt;br /&gt;
* Subdomain &#039;&#039;cloud.example.org&#039;&#039;&lt;br /&gt;
* PostgreSQL-User &lt;br /&gt;
* PostgreSQL Datenbank&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-cloud&#039;,password:&#039;geheim&#039;,shell:&#039;/bin/bash&#039;,comment:&#039;Nextcloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{name:&#039;cloud.example.org&#039;,user:&#039;xyz00-cloud&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqluser.add({set:{name:&#039;xyz00_nextclusr&#039;,password:&#039;geheim&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; postgresqldb.add({set:{name:&#039;xyz00_nextcloud&#039;,owner:&#039;xyz00_nextclusr&#039;}})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nextcloud installieren ==&lt;br /&gt;
&lt;br /&gt;
Anmelden als Linux-User &#039;&#039;xyz00-cloud&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
ssh -l xyz00-cloud xyz00.hostsharing.net&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;htdocs&#039;&#039; Verzeichnis vorbereiten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir nextcloud&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
rm -rf subs/www subs-ssl/www htdocs-ssl&lt;br /&gt;
ln -s $HOME/nextcloud htdocs-ssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls der &#039;&#039;Redirect&#039;&#039; auf die Domain &#039;&#039;exmaple.org&#039;&#039; umleitet statt auf die Subdomain &#039;&#039;cloud.example.org&#039;&#039;, kann diese Aktion helfen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd doms/cloud.example.org&lt;br /&gt;
mkdir -p subs-ssl/www&lt;br /&gt;
cp htdocs/.htaccess subs-ssl/www/.htaccess&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nextcloud herunterladen und entpacken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd &lt;br /&gt;
wget https://download.nextcloud.com/server/releases/nextcloud-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 für Redis als eigener Serverdienst RAM gebucht 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;Arbeitsspeicher für eigene Serverdienste&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Redis-Dientes ist auf der Seite [[Redis]] beschrieben. Hier wird für Nextcloud die Variante mit einem Unixsocket benutzt.&lt;br /&gt;
&lt;br /&gt;
In der Konfiguration der Nextcloud (in &#039;&#039;~/nextcloud/config/config.php&#039;&#039;) wird der Redis-Cache wie folgt konfiguriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=php line&amp;gt;&lt;br /&gt;
&#039;memcache.local&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.distributed&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;memcache.locking&#039; =&amp;gt; &#039;\\OC\\Memcache\\Redis&#039;,&lt;br /&gt;
&#039;redis&#039; =&amp;gt; &lt;br /&gt;
  array (&lt;br /&gt;
    &#039;host&#039; =&amp;gt; &#039;/home/pacs/xyz00/users/cloud/redis/var/redis-server.sock&#039;,&lt;br /&gt;
    &#039;port&#039; =&amp;gt; 0,&lt;br /&gt;
    &#039;password&#039; =&amp;gt; &#039;mein-redis-passwort&#039;,&lt;br /&gt;
    &#039;timeout&#039; =&amp;gt; 1.5,&lt;br /&gt;
  ),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um es perfekt zu machen, nutze ich &#039;&#039;logrotate&#039;&#039; um die Logdateien zu organisieren. Dazu die Konfiguration in &#039;&#039;~/.logrotate&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
compress&lt;br /&gt;
/home/pacs/xyz00/users/cloud/redis/var/redis.log {&lt;br /&gt;
  rotate 5&lt;br /&gt;
  daily&lt;br /&gt;
  missingok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit systemd-Timern werden die Logdateien täglich rotiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;~/.config/systemd/user/logrotate.service&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=rotate log files&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=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;
&amp;lt;syntaxhighlight lang=text&amp;gt;&lt;br /&gt;
TypeError: Return value of OCA\Files_FullTextSearch\Model\MountPoint::isGlobal()&lt;br /&gt;
must be of the type bool, null returned in [...]/apps/files_fulltextsearch/lib/Model/MountPoint.php:103&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sollte dieser Patch angewendet werden: https://github.com/nextcloud/files_fulltextsearch/issues/125#issuecomment-877789742&lt;br /&gt;
&lt;br /&gt;
Zur Pflege des Indexes wird ein weiterer Hintergrundprozess gestartet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
cd nextcloud/&lt;br /&gt;
php occ fulltextsearch:live -q&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Monit Konfiguration dafür sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/start-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
cd $HOME&lt;br /&gt;
mkdir -p $HOME/var&lt;br /&gt;
cd $HOME/nextcloud&lt;br /&gt;
exec php occ fulltextsearch:live -q &amp;amp;&lt;br /&gt;
echo $! &amp;gt;$HOME/var/fulltextsearchlive.pid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
#~/bin/stop-fulltextsearchlive&lt;br /&gt;
#&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
export HOME=/home/pacs/xyz00/users/cloud&lt;br /&gt;
kill $( cat $HOME/var/fulltextsearchlive.pid )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.monitrc (siehe oben von der Redis Installation) entsprechend ergänzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
check process fulltextsearchlive with pidfile /home/pacs/xyz00/users/cloud/var/fulltextsearchlive.pid&lt;br /&gt;
    start program &amp;quot;/home/pacs/xyz00/users/cloud/bin/start-fulltextsearchlive&amp;quot;&lt;br /&gt;
    stop program &amp;quot;/home/pacs/xyz00/users/cloud/bin/stop-fulltextsearchlive&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integration mit LDAP ==&lt;br /&gt;
&lt;br /&gt;
Um einheitliche Benutzerzugänge für verschiedene Anwendungen zu ermöglichen, wird oft auf ein zentrales LDAP Verzeichnis gesetzt. &lt;br /&gt;
&lt;br /&gt;
Dieses kann für Nextcloud eingesetzt werden, damit Benutzer nicht lokal in Nextcloud, sondern in LDAP verwaltet werden können.&lt;br /&gt;
&lt;br /&gt;
Siehe auch https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_auth_ldap.html&lt;br /&gt;
&lt;br /&gt;
Dazu muss die App &amp;quot;LDAP user and group backend&amp;quot; in den Nextcloud Apps aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Dann muss die LDAP Anbindung in den Administrationseinstellungen unter &amp;quot;LDAP/AD-Integration&amp;quot; eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Der Server mit Port, die BenutzerDN mit Passwort und die BaseDN müssen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Es muss auch bestimmt werden, welche Klasse (z.B. inetOrgPerson) die Benutzer brauchen, um Zugriff auf die Nextcloud zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Falls schon Benutzer in der Nextcloud existieren, und diese zu LDAP mitgenommen werden sollen, kann der Anleitung aus diesem Forum Eintrag gefolgt werden: https://help.nextcloud.com/t/migration-to-ldap-keeping-users-and-data/13205&lt;br /&gt;
&lt;br /&gt;
* Voraussetzung ist, dass der Benutzernamen der zu übernehmenden Benutzer in Nextcloud der uid in LDAP entspricht.&lt;br /&gt;
* Es wird ein Administrator Benutzer benötigt, der lokal angelegt wurde, und auch lokal bleibt.&lt;br /&gt;
* Mit diesem Administrator Benutzer wird die LDAP Anbindung eingerichtet.&lt;br /&gt;
* In der Experten Ansicht von LDAP/AD muss bei &amp;quot;Attribut für interne Benutzernamen&amp;quot; eingetragen werden: uid&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Benutzernamenzuordnung löschen&amp;quot;&lt;br /&gt;
* Klicke den Schalter &amp;quot;LDAP Gruppennamenzuordnung löschen&amp;quot;&lt;br /&gt;
* dann in der MySQL Datenbank anmelden, und aus uc_users alle Benutzer bis auf den Administrator Benutzer löschen&lt;br /&gt;
* Dann in der Nextcloud Weboberfläche sich alle Benutzer anzeigen lassen&lt;br /&gt;
* Nun gelingt die Anmeldung mit den anderen Benutzern mit dem LDAP Passwort, und die Dateien wurden übernommen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Geschwindigkeit ==&lt;br /&gt;
Manchmal fühlt sich die Nextcloud träge an.&lt;br /&gt;
&lt;br /&gt;
Folgende Änderungen können helfen:&lt;br /&gt;
&lt;br /&gt;
* HTTP/2.0 aktivieren: dem Service von Hostsharing Bescheid geben&lt;br /&gt;
* Die App Dashboard deaktivieren, und dafür werden direkt die Dateien angezeigt&lt;br /&gt;
* Einblenden der README in den Ordnern abschalten: das kann pro Ordner in der UI geschehen (links unten), oder global: &amp;lt;code&amp;gt;occ config:app:set text workspace_available --value=0&amp;lt;/code&amp;gt;. Siehe auch [https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/text_configuration.html#disable-rich-workspaces-globally]&lt;br /&gt;
&lt;br /&gt;
== Default App einstellen ==&lt;br /&gt;
&lt;br /&gt;
In der Datei config.php können wir einstellen, welche App direkt nach der Anmeldung gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das ist entweder die Dashboard App, wenn sie aktiviert ist, oder die Dateien App (files).&lt;br /&gt;
&lt;br /&gt;
Falls der Kalender direkt angezeigt werden soll, muss folgende Zeile in der config.php hinzugefügt werden (siehe auch [https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/config_sample_php_parameters.html#defaultapp]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&#039;defaultapp&#039; =&amp;gt; &#039;calendar&#039;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Nextcloud Updates =&lt;br /&gt;
&lt;br /&gt;
== Updater über die Shell starten ==&lt;br /&gt;
&lt;br /&gt;
Wenn die NextCloud sich nicht über das Webfrontend updaten lässt, kann der Updater auch per Shell im directory /updater durch ausführen des updater.phar gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
xyz00-cloud@h00:~$ cd ~/nextcloud/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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6938</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6938"/>
		<updated>2024-09-04T13:15:37Z</updated>

		<summary type="html">&lt;p&gt;Sib: adjust section Tomcat: secretRequired=&amp;quot;true&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes (TODO: Warum nicht ```git checkout 6.6```? Typo?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== CAS: Unterschiedliche Zeitstempel ===&lt;br /&gt;
Wenn wir das cas.war erneut bauen, wird Tomcat vermeintlich über unterschiedliche Zeitstempel meckern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:30:32.976 INFO [main] org.apache.catalina.startup.ExpandWar.expand An expanded directory [/home/pacs/sib01/users/auth/tomcat/webapps/cas] was found with a last modified time that did not match the associated WAR. It will be deleted.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird Tomcat den CAS-Dienst nur bedienen, wenn die alte Version komplett bereinigt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
rm -rf ~/tomcat9/webapps/cas*&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend akzeptiert Tomcat das neue cas.war.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:50:34.904 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/home/pacs/sib01/users/auth/tomcat/webapps/cas.war]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tomcat: secretRequired=&amp;quot;true&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Die Standard-Konfiguration der Datei ~/tomcat/conf/server.xml führt zu dieser Fehlermeldung.&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/catalina.sh run&lt;br /&gt;
...&lt;br /&gt;
The AJP Connector is configured with secretRequired=&amp;quot;true&amp;quot; but the secret attribute is either null or &amp;quot;&amp;quot;. This combination is not valid.&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazit: Ich habe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot;&lt;br /&gt;
               connectionTimeout=&amp;quot;20000&amp;quot;&lt;br /&gt;
               redirectPort=&amp;quot;8443&amp;quot; secretRequired=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in dieser Konfiguration gesetzt. Damit überwinden wir den betreffenden Fehler und Tomcat startet wie erwartet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
04-Sep-2024 15:13:18.196 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [101] milliseconds&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solange der AJP-Listener ausschließlich auf eine Localhost-IP konfiguriert ist, sollte diese Konfiguration (insbesondere auf einem Managed-Server) akzeptabel sein. Dann ist der AJP-Listener von extern nicht erreichbar.&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6937</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6937"/>
		<updated>2024-09-03T14:26:17Z</updated>

		<summary type="html">&lt;p&gt;Sib: add section Tomcat: secretRequired=&amp;quot;true&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes (TODO: Warum nicht ```git checkout 6.6```? Typo?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== CAS: Unterschiedliche Zeitstempel ===&lt;br /&gt;
Wenn wir das cas.war erneut bauen, wird Tomcat vermeintlich über unterschiedliche Zeitstempel meckern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:30:32.976 INFO [main] org.apache.catalina.startup.ExpandWar.expand An expanded directory [/home/pacs/sib01/users/auth/tomcat/webapps/cas] was found with a last modified time that did not match the associated WAR. It will be deleted.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird Tomcat den CAS-Dienst nur bedienen, wenn die alte Version komplett bereinigt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
rm -rf ~/tomcat9/webapps/cas*&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend akzeptiert Tomcat das neue cas.war.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:50:34.904 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/home/pacs/sib01/users/auth/tomcat/webapps/cas.war]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tomcat: secretRequired=&amp;quot;true&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Die Standard-Konfiguration der Datei ~/tomcat/conf/server.xml führt zu dieser Fehlermeldung.&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/catalina.sh run&lt;br /&gt;
...&lt;br /&gt;
The AJP Connector is configured with secretRequired=&amp;quot;true&amp;quot; but the secret attribute is either null or &amp;quot;&amp;quot;. This combination is not valid.&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazit: Ich habe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot;&lt;br /&gt;
               connectionTimeout=&amp;quot;20000&amp;quot;&lt;br /&gt;
               redirectPort=&amp;quot;8443&amp;quot; secretRequired=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in dieser Konfiguration gesetzt. Damit überwinde ich den betreffenden Fehler. Solange der AJP-Listener ausschließlich auf eine Localhost-IP konfiguriert ist, sollte diese Konfiguration (insbesondere auf einem Managed-Server) akzeptabel sein. Dann ist der AJP-Listener von extern nicht erreichbar.&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6929</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6929"/>
		<updated>2024-08-28T13:54:08Z</updated>

		<summary type="html">&lt;p&gt;Sib: add Troubleshooting section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes (TODO: Warum nicht ```git checkout 6.6```? Typo?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== CAS: Unterschiedliche Zeitstempel ===&lt;br /&gt;
Wenn wir das cas.war erneut bauen, wird Tomcat vermeintlich über unterschiedliche Zeitstempel meckern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:30:32.976 INFO [main] org.apache.catalina.startup.ExpandWar.expand An expanded directory [/home/pacs/sib01/users/auth/tomcat/webapps/cas] was found with a last modified time that did not match the associated WAR. It will be deleted.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall wird Tomcat den CAS-Dienst nur bedienen, wenn die alte Version komplett bereinigt ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
rm -rf ~/tomcat9/webapps/cas*&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend akzeptiert Tomcat das neue cas.war.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
28-Aug-2024 15:50:34.904 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/home/pacs/sib01/users/auth/tomcat/webapps/cas.war]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6925</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6925"/>
		<updated>2024-08-22T12:31:49Z</updated>

		<summary type="html">&lt;p&gt;Sib: Typo: ```git checkout 6.0``` ?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes (TODO: Warum nicht ```git checkout 6.6```? Typo?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6924</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6924"/>
		<updated>2024-08-22T11:54:35Z</updated>

		<summary type="html">&lt;p&gt;Sib: adjust instruction order for CAS base installation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6923</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6923"/>
		<updated>2024-08-22T10:39:18Z</updated>

		<summary type="html">&lt;p&gt;Sib: add link to Apache Tomcat 10&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 (Stand August 2024: [[Tomcat Installieren|Apache Tomcat 10]]) im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6922</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6922"/>
		<updated>2024-08-22T10:26:24Z</updated>

		<summary type="html">&lt;p&gt;Sib: Unterscheidung Webspace/Managed Server fuer Tomcat eingefuegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; im [https://www.hostsharing.net/paas/managed-webspace/ Hostsharing Webspace] notwendig ( im [https://www.hostsharing.net/paas/managed-server/ Managed Server] nicht). Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6921</id>
		<title>CAS Authentication Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=CAS_Authentication_Server&amp;diff=6921"/>
		<updated>2024-08-22T10:05:29Z</updated>

		<summary type="html">&lt;p&gt;Sib: fixing typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CAS Authentication Server =&lt;br /&gt;
&lt;br /&gt;
Der CAS Server (&amp;quot;Central Authentication Service&amp;quot; oder &amp;quot;CAS Authentication Server&amp;quot;) ist eine SSO- (&amp;quot;Single Sign On&amp;quot;) Lösung.&lt;br /&gt;
&lt;br /&gt;
CAS ist für große, verteilte Deployments von Web-Anwendungen geeignet. Er stammt aus dem Universitätsumfeld in den USA. Er wurde bei der Yale Universität entwickelt und wird aktuell bei JA-SIG / Apereo als freie Software unter der Apache Lizenz gepflegt. [1], [2]&lt;br /&gt;
&lt;br /&gt;
Die Hostsharing eG nutzt CAS seit Jahren als Login-Lösung insbesondere für die Administrationswerkzeuge von [[Hsadmin|HSAdmin]].&lt;br /&gt;
&lt;br /&gt;
Dieser Beitrag erläutert die Installation von CAS in einem Hostsharing Webspace und die Konfiguration von Beispielanwendungen zum Login mit CAS. Als Nutzerdatenbank wird ein vorhandener Nutzerstamm in einer SQL-Datenbank benutzt.&lt;br /&gt;
&lt;br /&gt;
== Erste Installation ==&lt;br /&gt;
&lt;br /&gt;
Die aktuelle stabile Version des CAS Server ist v6.6.7 (Stand August 2024: v7.0.6). Diese Version erfordert Java 11. Die empfohlene Installation eines Standalone-CAS erfolgt über das WAR Overlay Projekt [3]. Eine ausführliche Deployment-Anleitung (leider noch für Version 5.x) findet sich bei [https://www.newschool.edu/ The New School] [4]. Eine Anleitung für die aktuelle Version 6.6.x ist unter [10] verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== Service-User und Domain ===&lt;br /&gt;
&lt;br /&gt;
Zunächst werden mit HSAdmin ein User und eine Domain eingerichtet. Darauf achten, dass der User eine gültige Login-Shell erhält, hier die Bash (&#039;&#039;/bin/bash&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00@h50:~$ hsscript -i&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-login&#039;,shell:&#039;/bin/bash&#039;,password:&#039;***&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; domain.add({set:{user:&#039;xyz00-login&#039;,name:&#039;login.hs-example.de&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung des Tomcat ===&lt;br /&gt;
&lt;br /&gt;
Für den Apache Tomcat Webserver ist die Option &amp;quot;Eigener Daemon&amp;quot; notwendig. Bei der Anmeldung (bei service(at)hostsharing.net bitte den Service User &#039;&#039;xyz00-login&#039;&#039; und die gewüschte Anzahl IP-Ports angeben). Hier verwenden wir die Ports 31530, 31531 und 31532.&lt;br /&gt;
&lt;br /&gt;
Weiter geht es als User &#039;&#039;xyz00-login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Einrichten eines Apache Tomcat 9 im Userspace:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;output&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ tomcat9-instance-create tomcat9&lt;br /&gt;
You are about to create a Tomcat instance in directory &#039;tomcat9&#039;&lt;br /&gt;
Warning: HTTP port 8080 appears to be in use.&lt;br /&gt;
Type &amp;lt;ENTER&amp;gt; to continue, &amp;lt;CTRL-C&amp;gt; to abort.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;Enter&amp;gt; bestätigen, dann wird eine Tomcat-Konfiguration im neuen Verzeichnis $HOME/tomcat9 angelegt.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;server.xml&#039;&#039; im Verzeichnis $HOME/tomcat9/conf wird angepasst:&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;31530&amp;quot; shutdown=&amp;quot;SHUTDOWN&amp;quot;&amp;gt;&lt;br /&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;
&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; 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;
&lt;br /&gt;
  &amp;lt;Service name=&amp;quot;Catalina&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Connector address=&amp;quot;localhost&amp;quot; port=&amp;quot;31531&amp;quot; protocol=&amp;quot;AJP/1.3&amp;quot; redirectPort=&amp;quot;443&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;&lt;br /&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;
Insbesondere die beiden Angaben &#039;&#039;port=&amp;quot;31530&amp;quot;&#039;&#039; und &#039;&#039;port=&amp;quot;31531&amp;quot;&#039;&#039; müssen angepasst werden!&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;&#039;setenv.sh&#039;&#039; im Verzeichnis $HOME/tomcat9/bin ergänzenen wir den Pfad zur Java 11 Installation als Variable $JAVA_HOME (für 32-Bit bzw. für 64-Bit Systeme), dazu den Pfad für eine Datei mit der Prozess-ID Prozess-Id und eine System-Property in den Java-Opts mit dem Verzeichnis-Pfad, in dem wir später die CAS-Konfiguration ablegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-i386&lt;br /&gt;
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&lt;br /&gt;
export JAVA_OPTS=&amp;quot;-Djava.awt.headless=true -Dcas.standalone.configurationDirectory=/home/pacs/xyz00/users/login/cas/conf&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich kopiere zum Testen gern noch das Startskript &#039;&#039;catalina.sh&#039;&#039; in die Installation des Tomcat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xyz00-login@h50:~$ cp /usr/share/tomcat9/bin/catalina.sh $HOME/tomcat9/bin/&lt;br /&gt;
xyz00-login@h50:~$ cd tomcat9/&lt;br /&gt;
xyz00-login@h50:~/tomcat9$ ./bin/catalina.sh run&lt;br /&gt;
Using CATALINA_BASE:   /home/pacs/xyz00/users/login/tomcat9&lt;br /&gt;
Using CATALINA_HOME:   /usr/share/tomcat9&lt;br /&gt;
Using CATALINA_TMPDIR: /home/pacs/xyz00/users/login/tomcat9/temp&lt;br /&gt;
Using JRE_HOME:        /usr/lib/jvm/default-java&lt;br /&gt;
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar&lt;br /&gt;
&amp;lt;6&amp;gt;Server version name:   Apache Tomcat/9.0.31 (Debian)&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;6&amp;gt;Server startup in [75] milliseconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomcat läuft, abbrechen mit &amp;lt;Ctrl-C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration des Apache als Proxy ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/doms/login.hs-example.de/&lt;br /&gt;
rm -rf subs/www subs-ssl/www&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bearbeiten der ~/doms/login.hs-example.de/htdocs-ssl/.htaccess&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://localhost:31531/$1 [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: der Port 31531 ist wieder durch den Port des AJP-Listeners in der eigenen Tomcat-Konfiguration zu ersetzen.&lt;br /&gt;
&lt;br /&gt;
=== CAS Basisinstallation ===&lt;br /&gt;
&lt;br /&gt;
Anlegen von Verzeichnissen für die spätere Konfiguration des CAS Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir -p cas/conf&lt;br /&gt;
mkdir -p cas/services&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ins Verzeichnis &#039;&#039;~/cas/conf&#039;&#039; legen wir eine Datei &#039;&#039;cas.properties&#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;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &#039;&#039;log4j2.xml&#039;&#039; kopieren wir aus &#039;&#039;~/git/cas-overlay-template/etc/cas/config/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp ~/git/cas-overlay-template/etc/cas/config/ ~/cas/conf/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der log4j2.xml passen wir den Wert für die Variable &#039;&#039;baseDir&#039;&#039; (etwa Zeile 5) an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Property name=&amp;quot;baseDir&amp;quot;&amp;gt;/home/pacs/xyz00/users/login/tomcat9/logs&amp;lt;/Property&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auschecken des CAS Overlay Projektes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/apereo/cas-overlay-template.git&lt;br /&gt;
cd cas-overlay-template/&lt;br /&gt;
git fetch&lt;br /&gt;
git checkout 6.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build und Deployment der Web-Applikation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./build.sh package&lt;br /&gt;
cd&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einer erneuten Start des Tomcat ist das CAS-Login unter&lt;br /&gt;
https://login.hs-example.de/cas/ erreichbar.&lt;br /&gt;
&lt;br /&gt;
Ein Login mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte erfolgreich sein.&lt;br /&gt;
&lt;br /&gt;
== Erweiterte Konfiguration des CAS ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität des CAS Server ist modular erweiterbar. Im ersten Schritt erweitern wir den CAS um eine Service Registry. Für unsere einfache Standalone-Installation nutzen wir die JSON-File-Registry&lt;br /&gt;
&lt;br /&gt;
=== JSON Service Registry ===&lt;br /&gt;
&lt;br /&gt;
Erweiterungen werden in der Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039; eingetragen. Die Datei liegt im Wurzelverzeichnis des Git-Repositories für unser CAS Overlay (&#039;&#039;~/git/cas-overlay-template/&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Der betreffende Ausschnitt der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
    * CAS dependencies and modules may be listed here.&lt;br /&gt;
    *&lt;br /&gt;
    * There is no need to specify the version number for each dependency&lt;br /&gt;
    * since versions are all resolved and controlled by the dependency management&lt;br /&gt;
    * plugin via the CAS bom.&lt;br /&gt;
    **/&lt;br /&gt;
&lt;br /&gt;
  // email notification, service registry&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-notifications&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-json-service-registry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // jdbc datasource&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // password reset&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-webflow&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-pm-jdbc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // openid-connect / oidc&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-support-oidc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
  * Do NOT modify the lines below or else you will risk breaking the build.&lt;br /&gt;
  */&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-core-api-configuration-model&amp;quot;&lt;br /&gt;
  implementation &amp;quot;org.apereo.cas:cas-server-webapp-init&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // [...] Teile ausgespart&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir bauen das cas.war mit den folgenden Befehlen neu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git/cas-overlay-template&lt;br /&gt;
./build.sh package&lt;br /&gt;
cp ~/git/cas-overlay-template/build/libs/cas.war ~/tomcat9/webapps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pfad zur Service-Registry war in der oben erstellten &#039;&#039;cas.properties&#039;&#039; bereits enthalten.&lt;br /&gt;
Nun legen wir einen ersten Service an, in meinem Fall eine Nextcloud-Installation. Die Datei heißt&lt;br /&gt;
&#039;&#039;hsexamplecloud-1000001.json&#039;&#039; und wird im Verzeichnis &#039;&#039;~/cas/services/&#039;&#039; abgelegt. Der Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;@class&amp;quot; : &amp;quot;org.apereo.cas.services.RegexRegisteredService&amp;quot;,&lt;br /&gt;
  &amp;quot;serviceId&amp;quot; : &amp;quot;^https://cloud.hs-example.de.*&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;hsexamplecloud&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot; : 1000001,&lt;br /&gt;
  &amp;quot;description&amp;quot; : &amp;quot;Nextcloud HS-Example&amp;quot;,&lt;br /&gt;
  &amp;quot;evaluationOrder&amp;quot; : 10000&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Name der Datei setzt sich aus Service-Name und Service-Id zusammen!&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des CAS-Login in der Nextcloud erfolgt über die entsprechende &amp;quot;App&amp;quot; in Nextcloud.&lt;br /&gt;
Die Parameter sind wie folgt:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cas-nextcloud-app.png]]&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;Dienst-URL&amp;quot; im Screenshot ist: &#039;&#039;https://cloud.hs-example.de/index.php/apps/user_cas/login&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Anmeldung mit der Kennung &#039;&#039;casuser&#039;&#039; und dem Passwort &#039;&#039;Mellon&#039;&#039; sollte nun von der Nextcloud-Loginseite  über den Link zum CAS-Login möglich sein.&lt;br /&gt;
&lt;br /&gt;
=== Authentifizierung gegen JDBC Datenbank ===&lt;br /&gt;
&lt;br /&gt;
Wir erweitern wieder die Datei &#039;&#039;build.gradle&#039;&#039; im Abschnitt &#039;&#039;dependencies&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
dependencies {&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}&amp;quot;&lt;br /&gt;
  // Other CAS dependencies/modules may be listed here...&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-json-service-registry:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc-drivers:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
  compile &amp;quot;org.apereo.cas:cas-server-support-jdbc:${project.&#039;cas.version&#039;}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cas-server-support-jdbc-drivers&#039;&#039; liefert JDBC-Treiber für die gängigen Open-Source Datenbanksysteme. &#039;&#039;org.apereo.cas:cas-server-support-jdbc&#039;&#039; liefert das eigentliche CAS-Authentication Backend.&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration wird die Datei &#039;&#039;cas.properties&#039;&#039; im Verzeichnis &#039;&#039;~/cas/conf/&#039;&#039; erweitert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line&amp;gt;&lt;br /&gt;
cas.server.name=https://login.hs-example.de&lt;br /&gt;
cas.server.prefix=${cas.server.name}/cas&lt;br /&gt;
cas.serviceRegistry.json.location=file:/home/pacs/xyz00/users/login/cas/services&lt;br /&gt;
logging.config=file:/home/pacs/xyz00/users/login/cas/conf/log4j2.xml&lt;br /&gt;
logging.level.org.apereo=DEBUG&lt;br /&gt;
cas.authn.jdbc.query[0].sql=SELECT * FROM USERS WHERE UID=?&lt;br /&gt;
cas.authn.jdbc.query[0].url=jdbc:postgresql://localhost/xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.PostgreSQL92Dialect&lt;br /&gt;
cas.authn.jdbc.query[0].user=xyz00_cas&lt;br /&gt;
cas.authn.jdbc.query[0].password=Ein_schlechtes_Passwort&lt;br /&gt;
cas.authn.jdbc.query[0].driverClass=org.postgresql.Driver&lt;br /&gt;
cas.authn.jdbc.query[0].fieldPassword=PSW&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT&lt;br /&gt;
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8&lt;br /&gt;
cas.authn.accept.users=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine PostgreSQL-Datenbank mit einer Tabelle &#039;&#039;USERS&#039;&#039; mit den Spalten &#039;&#039;UID&#039;&#039; und &#039;&#039;PSW&#039;&#039;. Die Spalte &#039;&#039;UID&#039;&#039; enthält den Login-Namen des Users, die Spalte &#039;&#039;PSW&#039;&#039; das Passwort mit dem BCrypt-Algorithmus verschlüsselt.&lt;br /&gt;
&lt;br /&gt;
Die Zeile &#039;&#039;cas.authn.accept.users=&#039;&#039; deaktiviert das Default-Login als User &#039;&#039;casuser&#039;&#039; mit Passwort &#039;&#039;Mellon&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Spring-Security Framework erwartet das BCrypt-Passwort mit der Kennung &#039;&#039;$2a$&#039;&#039; als erste Zeichen des Passwortfeldes. Die PHP-Funktion &#039;&#039;password_hash&#039;&#039; schreibt &#039;&#039;$2y$&#039;&#039; Wenn eine PHP-Passwort-Datenbank genutzt wird, muss hier ggf. eine VIEW in der Datenbank helfen.&lt;br /&gt;
&lt;br /&gt;
== Grafische Anpassung der CAS Login-Seiten ==&lt;br /&gt;
&lt;br /&gt;
Die Anpassungen der Login-Seite und anderer Teile der Browser-Anwendung ist vorgesehen. Eine Anleitung findet sich unter Link [7] und [4].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
[1] https://de.wikipedia.org/wiki/Central_Authentication_Service&lt;br /&gt;
&lt;br /&gt;
[2] https://www.apereo.org/projects/cas&lt;br /&gt;
&lt;br /&gt;
[3] https://github.com/apereo/cas-overlay-template&lt;br /&gt;
&lt;br /&gt;
[4] https://dacurry-tns.github.io/deploying-apereo-cas/&lt;br /&gt;
&lt;br /&gt;
[5] https://apereo.github.io/2017/02/22/cas51-dbauthn-tutorial/&lt;br /&gt;
&lt;br /&gt;
[6] https://apereo.github.io/2017/02/02/cas51-authn-handlers/&lt;br /&gt;
&lt;br /&gt;
[7] https://apereo.github.io/2018/06/10/cas-userinterface-customizations/&lt;br /&gt;
&lt;br /&gt;
[8] https://apereo.github.io/tags/#CAS&lt;br /&gt;
&lt;br /&gt;
[9] https://iam.uconn.edu/java-cas-client-installation-and-configuration/&lt;br /&gt;
&lt;br /&gt;
[10] https://fawnoos.com/2022/08/06/cas66-gettingstarted-overlay/&lt;br /&gt;
&lt;br /&gt;
[11] https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/cas Ansible Playbook&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Ansible Playbook]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:SSO]]&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Eigene Daemons]]&lt;/div&gt;</summary>
		<author><name>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=5959</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=5959"/>
		<updated>2022-12-02T08:00:59Z</updated>

		<summary type="html">&lt;p&gt;Sib: Ordner zum Speichern der Log-Dateien von Gitea ergaenzt&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;
1. Anlegen eines Domain-Benutzers. In unserem Beispiel &amp;lt;code&amp;gt;xyz00-gitea&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Anlegen einer Domain. In unserem Beispiel &amp;lt;code&amp;gt;gitea.hs-example.de&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Anlegen eines Datenbank-Benutzers. Hier &amp;lt;code&amp;gt;xyz00_giteadbuser&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. 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;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Anschließend kann man die Vorbereitungsschritte 1 bis 4 erledigen:&lt;br /&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;
&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;
  sudo -u xyz00-gitea -i&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;
  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;
&lt;br /&gt;
Wir laden die GPG-Signatur herunter und überprüfen sie:&lt;br /&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;
&lt;br /&gt;
Nun können wir Gitea testweise starten:&lt;br /&gt;
&lt;br /&gt;
  ./gitea web&lt;br /&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;
  rm -rf subs/www&lt;br /&gt;
  rm -rf subs-ssl/www&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;
  vi htdocs/.htaccess&lt;br /&gt;
  &lt;br /&gt;
Der Eintrag muss lauten:&lt;br /&gt;
&lt;br /&gt;
  Redirect permanent / https://gitea.hs-example.com/&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;
  DirectoryIndex disabled&lt;br /&gt;
  RewriteEngine on&lt;br /&gt;
  RewriteBase /&lt;br /&gt;
  RewriteRule ^(.*) http://localhost:31580/$1 [proxy,last]&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;
  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;
  &lt;br /&gt;
Im Abschnitt [database] folgen die Angaben zur Datenbank:&lt;br /&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;
&lt;br /&gt;
Es folgt der Pfad zu den Git-Repositorys und die Server-Konfiguration:&lt;br /&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;
  &lt;br /&gt;
Sie können nun Gitea starten:&lt;br /&gt;
&lt;br /&gt;
  ./gitea web&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;
=== Start- und Stopp-Skripte einrichten ===&lt;br /&gt;
&lt;br /&gt;
Zum Schluss müssen Sie noch Start- und Stoppskripte einrichten und Monit konfigurieren.&lt;br /&gt;
&lt;br /&gt;
Das Startskript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/bin/gitea-start.sh&amp;lt;/code&amp;gt; ab.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  export HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  export PID=$HOME/.gitea.pid&lt;br /&gt;
  cd $HOME&lt;br /&gt;
  exec $HOME/gitea web &amp;gt;$HOME/custom/logs/gitea.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
  echo $! &amp;gt; $PID&lt;br /&gt;
&lt;br /&gt;
Das Stoppskript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/bin/gitea-stop.sh&amp;lt;/code&amp;gt; an.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  export HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  export PID=$HOME/.gitea.pid&lt;br /&gt;
  cd $HOME&lt;br /&gt;
  &lt;br /&gt;
  if [ -f $PID ] ; then &lt;br /&gt;
      kill $( cat $PID );&lt;br /&gt;
      sleep 20 ;&lt;br /&gt;
      kill -9 $( cat $PID ) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 ;&lt;br /&gt;
      rm $PID ;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte prüfen Sie, ob die Skripte vom Nutzer xzy00 ausführbar sind. Bei Bedarf passen Sie die Berechtigungen entsprechend an.&lt;br /&gt;
&lt;br /&gt;
  ls -lha ~/bin/&lt;br /&gt;
  chmod 744 ~/bin/gitea-st*&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;
  mkdir -p /home/pacs/xyz00/users/gitea/custom/logs&lt;br /&gt;
&lt;br /&gt;
Monit ist ein Programm zur Überwachung eines Servers oder eines Dienstes.&lt;br /&gt;
Das Programm erwartet im Verzeichnis des Domain-Benutzers die Datei &amp;lt;code&amp;gt;~/.monitrc&amp;lt;/code&amp;gt; mit der entsprechenden Konfiguration.&lt;br /&gt;
Legen Sie die Datei mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
  set daemon 600&lt;br /&gt;
  set logfile /home/pacs/xyz00/users/gitea/custom/logs/monit.log&lt;br /&gt;
  set mailserver localhost&lt;br /&gt;
  set alert webmaster@gitea.hs-example.de&lt;br /&gt;
  #&lt;br /&gt;
  check process gitead with pidfile /home/pacs/xyz00/users/gitea/.gitea.pid&lt;br /&gt;
      start program &amp;quot;/home/pacs/xyz00/users/gitea/bin/gitea-start.sh&amp;quot;&lt;br /&gt;
      stop program &amp;quot;/home/pacs/xyz00/users/gitea/bin/gitea-stop.sh&amp;quot;&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;
  /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;
  /home/pacs/xyz00/users/gitea/custom/logs/monit.log {&lt;br /&gt;
    copytruncate&lt;br /&gt;
    monthly&lt;br /&gt;
    rotate 2&lt;br /&gt;
    compress&lt;br /&gt;
    missingok&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Damit gitea auch nach einem Server-Neustart neu gestartet wird und auch die Konfiguration für logrotate und monit eingelesen werden, müssen Sie folgenden Eintrag in der crontab der Domain-Benutzers machen:&lt;br /&gt;
&lt;br /&gt;
  # m h  dom mon dow   command&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  PID=$HOME/.gitea.pid&lt;br /&gt;
  @reboot /usr/bin/monit -c $HOME/.monitrc &amp;gt; /dev/null&lt;br /&gt;
  @reboot $HOME/gitea-start.sh&lt;br /&gt;
  51 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
 &lt;br /&gt;
Wichtig sind die @reboot-Einträge, die automatisch nach einem Neustart des Hosts ausgeführt werden.&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;
  ~/bin/gitea-start.sh&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://github.com/tpokorra/Hostsharing-Ansible-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>Sib</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=5956</id>
		<title>Gitea</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Gitea&amp;diff=5956"/>
		<updated>2022-11-21T12:53:40Z</updated>

		<summary type="html">&lt;p&gt;Sib: Benutzer hatten bisher keine Berechtigung die Skripte fuer Start und Stop auszuführen&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;
1. Anlegen eines Domain-Benutzers. In unserem Beispiel &amp;lt;code&amp;gt;xyz00-gitea&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Anlegen einer Domain. In unserem Beispiel &amp;lt;code&amp;gt;gitea.hs-example.de&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Anlegen eines Datenbank-Benutzers. Hier &amp;lt;code&amp;gt;xyz00_giteadbuser&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. 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;
  hsscript -u xyz00 -i&lt;br /&gt;
  Password: ********&lt;br /&gt;
&lt;br /&gt;
Anschließend kann man die Vorbereitungsschritte 1 bis 4 erledigen:&lt;br /&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;
&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;
  sudo -u xyz00-gitea -i&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;
  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;
&lt;br /&gt;
Wir laden die GPG-Signatur herunter und überprüfen sie:&lt;br /&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;
&lt;br /&gt;
Nun können wir Gitea testweise starten:&lt;br /&gt;
&lt;br /&gt;
  ./gitea web&lt;br /&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;
  rm -rf subs/www&lt;br /&gt;
  rm -rf subs-ssl/www&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;
  vi htdocs/.htaccess&lt;br /&gt;
  &lt;br /&gt;
Der Eintrag muss lauten:&lt;br /&gt;
&lt;br /&gt;
  Redirect permanent / https://gitea.hs-example.com/&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;
  DirectoryIndex disabled&lt;br /&gt;
  RewriteEngine on&lt;br /&gt;
  RewriteBase /&lt;br /&gt;
  RewriteRule ^(.*) http://localhost:31580/$1 [proxy,last]&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;
  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;
  &lt;br /&gt;
Im Abschnitt [database] folgen die Angaben zur Datenbank:&lt;br /&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;
&lt;br /&gt;
Es folgt der Pfad zu den Git-Repositorys und die Server-Konfiguration:&lt;br /&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;
  &lt;br /&gt;
Sie können nun Gitea starten:&lt;br /&gt;
&lt;br /&gt;
  ./gitea web&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;
=== Start- und Stopp-Skripte einrichten ===&lt;br /&gt;
&lt;br /&gt;
Zum Schluss müssen Sie noch Start- und Stoppskripte einrichten und Monit konfigurieren.&lt;br /&gt;
&lt;br /&gt;
Das Startskript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/bin/gitea-start.sh&amp;lt;/code&amp;gt; ab.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  export HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  export PID=$HOME/.gitea.pid&lt;br /&gt;
  cd $HOME&lt;br /&gt;
  exec $HOME/gitea web &amp;gt;$HOME/custom/logs/gitea.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
  echo $! &amp;gt; $PID&lt;br /&gt;
&lt;br /&gt;
Das Stoppskript speichern Sie unter dem Pfad &amp;lt;code&amp;gt;~/bin/gitea-stop.sh&amp;lt;/code&amp;gt; an.&lt;br /&gt;
Es hat folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  export HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  export PID=$HOME/.gitea.pid&lt;br /&gt;
  cd $HOME&lt;br /&gt;
  &lt;br /&gt;
  if [ -f $PID ] ; then &lt;br /&gt;
      kill $( cat $PID );&lt;br /&gt;
      sleep 20 ;&lt;br /&gt;
      kill -9 $( cat $PID ) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 ;&lt;br /&gt;
      rm $PID ;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Bitte prüfen Sie, ob die Skripte vom Nutzer xzy00 ausführbar sind. Bei Bedarf passen Sie die Berechtigungen entsprechend an.&lt;br /&gt;
&lt;br /&gt;
  #!/bin/bash&lt;br /&gt;
  ls -lha ~/bin/&lt;br /&gt;
  chmod 744 ~/bin/gitea-st*&lt;br /&gt;
&lt;br /&gt;
Monit ist ein Programm zur Überwachung eines Servers oder eines Dienstes.&lt;br /&gt;
Das Programm erwartet im Verzeichnis des Domain-Benutzers die Datei &amp;lt;code&amp;gt;~/.monitrc&amp;lt;/code&amp;gt; mit der entsprechenden Konfiguration.&lt;br /&gt;
Legen Sie die Datei mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
  set daemon 600&lt;br /&gt;
  set logfile /home/pacs/xyz00/users/gitea/custom/logs/monit.log&lt;br /&gt;
  set mailserver localhost&lt;br /&gt;
  set alert webmaster@gitea.hs-example.de&lt;br /&gt;
  #&lt;br /&gt;
  check process gitead with pidfile /home/pacs/xyz00/users/gitea/.gitea.pid&lt;br /&gt;
      start program &amp;quot;/home/pacs/xyz00/users/gitea/bin/gitea-start.sh&amp;quot;&lt;br /&gt;
      stop program &amp;quot;/home/pacs/xyz00/users/gitea/bin/gitea-stop.sh&amp;quot;&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;
  /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;
  /home/pacs/xyz00/users/gitea/custom/logs/monit.log {&lt;br /&gt;
    copytruncate&lt;br /&gt;
    monthly&lt;br /&gt;
    rotate 2&lt;br /&gt;
    compress&lt;br /&gt;
    missingok&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Damit gitea auch nach einem Server-Neustart neu gestartet wird und auch die Konfiguration für logrotate und monit eingelesen werden, müssen Sie folgenden Eintrag in der crontab der Domain-Benutzers machen:&lt;br /&gt;
&lt;br /&gt;
  # m h  dom mon dow   command&lt;br /&gt;
  HOME=/home/pacs/xyz00/users/gitea&lt;br /&gt;
  PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&lt;br /&gt;
  PID=$HOME/.gitea.pid&lt;br /&gt;
  @reboot /usr/bin/monit -c $HOME/.monitrc &amp;gt; /dev/null&lt;br /&gt;
  @reboot $HOME/gitea-start.sh&lt;br /&gt;
  51 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate&lt;br /&gt;
 &lt;br /&gt;
Wichtig sind die @reboot-Einträge, die automatisch nach einem Neustart des Hosts ausgeführt werden.&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;
  ~/bin/gitea-start.sh&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://github.com/tpokorra/Hostsharing-Ansible-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>Sib</name></author>
	</entry>
</feed>