https://znil.net/index.php?title=Spezial:Neue_Seiten&feed=atom&hideredirs=1&limit=50&offset=&namespace=0&username=&tagfilter=&size-mode=max&size=0znilwiki - Neue Seiten [de]2024-03-29T10:32:57ZAus znilwikiMediaWiki 1.39.6https://znil.net/index.php?title=VMware_vCenter_Zertifikate_Reset_alle_neu_ausstellenVMware vCenter Zertifikate Reset alle neu ausstellen2024-03-07T08:53:47Z<p>BLinz: Die Seite wurde neu angelegt: „Link: https://kb.vmware.com/s/article/2097936 Kurzfassung:<br> * per SSH an der vCenter-Appliance anmelden (Benutzer ist <code>root</code>) * Shell starten mit dem Befehl <code>shell</code> * folgenden Befehl ausführen: /usr/lib/vmware-vmca/bin/certificate-manager und dort Option 4 oder 8 auswählen.<br> ggf. die Dienste neu starten (macht er meine ich automatisch): service-control --stop --all service-control --start --all status per service-contro…“</p>
<hr />
<div>Link: https://kb.vmware.com/s/article/2097936<br />
<br />
Kurzfassung:<br><br />
* per SSH an der vCenter-Appliance anmelden (Benutzer ist <code>root</code>)<br />
* Shell starten mit dem Befehl <code>shell</code><br />
* folgenden Befehl ausführen:<br />
/usr/lib/vmware-vmca/bin/certificate-manager<br />
und dort Option 4 oder 8 auswählen.<br><br />
ggf. die Dienste neu starten (macht er meine ich automatisch):<br />
service-control --stop --all<br />
service-control --start --all<br />
status per<br />
service-control --list<br />
siehe auch https://kb.vmware.com/s/article/2109887<br />
----<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=Brocade-SAN-Switche_Verf%C3%BCgbare_Lizenzen_anzeigenBrocade-SAN-Switche Verfügbare Lizenzen anzeigen2024-02-12T11:18:49Z<p>BLinz: </p>
<hr />
<div><u>'''Changelog:'''</u><br><br />
* 12.02.2024 erste Version<br />
----<br />
=ab Version 9.x=<br />
----<br />
==per CLI==<br />
Verbindet euch per SSH und tippt folgendes ein:<br><br />
license --show -port<br />
Beispielausgabe:<br><br />
<source><br />
DS_6620B:FID128:admin> license --show -port<br />
48 SFP-based ports are available in this switch<br />
16 QSFP-based ports are available in this switch<br />
No Ports on Demand license is installed<br />
No Q-Flex Ports on Demand license is installed<br />
Dynamic POD method is in use<br />
<br />
24 SFP-based port assignments are provisioned for use in this switch:<br />
24 SFP-based port assignments are provisioned by the base switch allowance<br />
0 SFP-based ports are assigned to the base switch allowance or installed licenses:<br />
0 ports are assigned to the Ports on Demand base switch allowance<br />
SFP-based ports assigned to the base switch allowance:<br />
None<br />
SFP-based ports assigned to the Ports on Demand license:<br />
None<br />
SFP-based ports that are not assigned:<br />
0, 1, 2, 3, 4, 5, 6, 7, 8, 9<br />
10, 11, 12, 13, 14, 15, 16, 17, 18, 19<br />
20, 21, 22, 23, 24, 25, 26, 27, 28, 29<br />
30, 31, 32, 33, 34, 35, 36, 37, 38, 39<br />
40, 41, 42, 43, 44, 45, 46, 47<br />
24 license reservations are still available for use by unassigned ports<br />
<br />
0 QSFP-based port assignments are provisioned for use in this switch:<br />
0 QSFP-based port assignments are provisioned by the base switch allowance<br />
0 QSFP-based ports are assigned to the base switch allowance or installed licenses:<br />
0 ports are assigned to the Q-Flex Ports on Demand base switch allowance<br />
QSFP-based ports assigned to the base switch allowance:<br />
None<br />
QSFP-based ports assigned to the Q-Flex Ports on Demand license:<br />
None<br />
QSFP-based ports that are not assigned:<br />
48, 49, 50, 51, 52, 53, 54, 55, 56, 57<br />
58, 59, 60, 61, 62, 63<br />
0 license reservations are still available for use by unassigned ports<br />
</source><br />
In diesem Beispiel also 24 Ports von denen 24 noch nicht vergeben sind.<br><br />
----<br />
==Per GUI==<br />
:[[Datei:ClipCapIt-240212-121832.PNG]]<br><br />
----<br />
=Kommentare=<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=PfSense_-_HAProxy_%2B_Lets_Encrypt_ACME_%2B_GeoIP-Blocking_pfBlockerNGPfSense - HAProxy + Lets Encrypt ACME + GeoIP-Blocking pfBlockerNG2024-02-08T09:58:42Z<p>BLinz: Die Seite wurde neu angelegt: „{{Vorlage:AchtungBaustelle}}<br> ---- <u>'''Changelog:'''</u><br> * 08.02.2024 erste Version ---- ==Vorwort== Jahrelang habe ich meine Webdienste in der folgenden Konstellation betrieben:<br> Internet => pfSense Firewall => Ubuntu-Server mit Apache-Reverse-Proxy => eigentlicher Server Auf der Firewall nutze ich zwar GeoIP-Blocking mit dem '''''pfBlockerNG''''' Plugin, die Ports <code>80</code> und <code>443</code> habe ich aber an einen Server dahinter m…“</p>
<hr />
<div>{{Vorlage:AchtungBaustelle}}<br><br />
----<br />
<u>'''Changelog:'''</u><br><br />
* 08.02.2024 erste Version<br />
----<br />
==Vorwort==<br />
Jahrelang habe ich meine Webdienste in der folgenden Konstellation betrieben:<br><br />
Internet => pfSense Firewall => Ubuntu-Server mit Apache-Reverse-Proxy => eigentlicher Server<br />
Auf der Firewall nutze ich zwar GeoIP-Blocking mit dem '''''pfBlockerNG''''' Plugin, die Ports <code>80</code> und <code>443</code> habe ich aber an einen Server dahinter mit Apache-Reverse-Proxy durchgereicht. Ohne Blocking und Weltweit offen.<br><br />
Der Apache-Reverse-Proxy ist im Prinzip der normale Apache2-Webserver, man installiert ein Modul nach und schon kann man Reverse-Proxy Befehle nutzen.<br><br />
Aus Faulheit nutze ich seit Jahren ISPConfig dafür. Diese Software bietet eine Weboberfläche in welcher ich einfach eine neue Subdomain erstellen kann, den Haken bei Let`s Encrypt Zertifikat setze, speichere und ein bis zwei Minuten warte - fertig ist die Webseite (externer DNS-Eintrag vorausgesetzt). Dann in den Einstellungen der Webseite die Reverse-Proxy-Einstellungen gesetzt und das ganze läuft.<br><br />
Zusätzlich habe ich das Maxmind-Geolocation-Modul installiert und kann so bei einzelnen Subdomänen den Zugriff von Weltweit Blocken.<br><br />
<br><br />
Dazu kam ich weil ich einen Exchange-Server umziehen möchte der bisher eine eigene externe IP-Adresse hatte und bisher über eine "Sophos UTM - Webserver Protection" geschützt ist.<br><br />
Ich hatte dann die neueste Generation der Sophos-Firewall mit "Firewall-OS" getestet, musste aber feststellen das es die Webserver-Protection noch gibt, die automatische Anforderung von Let's Encrypt Zertifikaten aber nicht mit umgesetzt wurde (sondern extern erfolgen und dann per API und Skripten hochgeladen werden soll).<br><br />
<br><br />
Da ein Kollege schon seit Jahren '''''HAProxy''''' für Exchange einsetzt habe ich mir das ganze auch mal angeschaut. In Verbindung mit der pfSense. HAProxy und das ACME-Plugin haben mich dabei begeistert, insbesondere da ACME automatisch Zertifikate über die API-Schnittstelle von meinem Domainhoster IONOS anfordern kann, Let's Encrypt Zertifikate also nicht per Webserver sondern über die DNS-Challenge anfordern kann. So kann ich auch problemlos Wildcard-Zertifikate wie <code>*.znil.net</code> anfordern. Nicht das ich ein Freund davon wäre, mach aber manches einfacher.<br><br />
HAProxy kann dabei auch nicht alles, ich vermisse zum Beispiel den Einsatz von einzelnen Zertifikaten pro Subdomain hinter einer IP-Adresse. Was ich aber Dank Wildcard-Zertifikat umgehen konnte.<br><br />
Nachfolgend beschreibe ich die Einrichtung damit ich das beim nächsten mal auch wieder hinbekomme.<br><br />
Denn wie das so ist musste ich mir das gewünschte über mehrere Webseiten zusammensuchen und für mich anpassen.<br><br />
----<br />
==Linksammlung==<br />
* https://hwp24.com/articles/setting_up_geoip_blocking_for_web_services_using_pfsense_haproxy_and_free_ipdeny_databases/<br />
<br></div>BLinzhttps://znil.net/index.php?title=Brocade-SAN-Switche_Banner_Meldung_Login_Meldung_abschalten_oder_%C3%A4ndernBrocade-SAN-Switche Banner Meldung Login Meldung abschalten oder ändern2024-02-05T11:31:13Z<p>BLinz: /* Bannermeldung abschalten */</p>
<hr />
<div><u>'''Changelog:'''</u><br />
* 05.02.2024 erste Version<br />
----<br />
==Vorwort==<br />
Bei neu gelieferten Brocade-Switchen mit einer Firmwareversion ab 9.x.x gab es immer die folgende Warnmeldung:<br><br />
--------------------------------------------------------------------------------------------<br />
ATTENTION<br />
It is recommended that you change the default passwords for all the switch accounts.<br />
Refer to the product release notes and administrators guide if you need further information.<br />
--------------------------------------------------------------------------------------------<br />
:[[Datei:ClipCapIt-240205-122733.PNG]]<br><br />
Auch nachdem ich die Kennwörter geändert hatte, kam diese Meldung weiter (ich meine das die bei Firmwareversion bis 8.x.x dann verschwand).<br><br />
----<br />
==Bannermeldung abschalten==<br />
Ihr loggt euch per SSH (z.B. mit puTTY) auf dem Switch an und gebt folgenden Befehl ein:<br><br />
bannerset ""<br />
Damit ist die Meldung bei der Anmeldung gelöscht / deaktiviert.<br><br />
Alternativ tippt Ihr - nacheinander und mit {{Key|Enter}} pro Zeile als Abschluß folgendes ein:<br><br />
bannerset<br />
.<br />
Ja, einfach nur einen einzelnen Punkt <code>.</code><br><br />
----<br />
<br />
==Eigene Bannermeldung setzen==<br />
Eine eigene Meldung setzt Ihr entweder indem ihr hinter dem Befehl das gewünschte schreibt:<br><br />
bannerset "Hallo Welt!"<br />
oder Ihr gebt nur<br />
bannerset<br />
ein, dann könnt Ihr den Text frei eingeben inklusive mehrere Zeilen. Wie bei einer Email beendet Ihr den Modus indem Ihr in eine neue Zeile einen einzelnen Punkt <code>.</code> schreibt:<br><br />
:[[Datei:ClipCapIt-240205-123056.PNG]]<br><br />
----<br />
==Kommentare==<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=Brocade-SAN-Switche_SNMP_V1_aktivierenBrocade-SAN-Switche SNMP V1 aktivieren2024-02-05T11:20:36Z<p>BLinz: Die Seite wurde neu angelegt: „<u>'''Changelog:'''</u> * 05.02.2024 erste Version ---- ==Vorwort== Sowohl bei den Modellen mit Firmware-Version bis 8.x.x als auch die neuen mit einer Firmware ab 9.x.x ist SNMP zunächst einmal deaktiviert.<br> Man aktiviert bei beiden SNMP zwingend zunächst über die CLI, also z.B. per puTTY eine SSH-Verbindung aufbauen und dann die Befehle eintippen.<br> Danach kann man das ganze auch über die Java bzw. Weboberfläche verwalten. SNMPv3 müsste auf g…“</p>
<hr />
<div><u>'''Changelog:'''</u><br />
* 05.02.2024 erste Version<br />
----<br />
==Vorwort==<br />
Sowohl bei den Modellen mit Firmware-Version bis 8.x.x als auch die neuen mit einer Firmware ab 9.x.x ist SNMP zunächst einmal deaktiviert.<br><br />
Man aktiviert bei beiden SNMP zwingend zunächst über die CLI, also z.B. per puTTY eine SSH-Verbindung aufbauen und dann die Befehle eintippen.<br><br />
Danach kann man das ganze auch über die Java bzw. Weboberfläche verwalten.<br />
SNMPv3 müsste auf gleichen Wege separat aktiviert werden.<br><br />
----<br />
==Bis Firmware 8.x.x (Java-Oberfläche)==<br />
Text folgt ...<br><br />
----<br />
==Ab Firmware 9.x.x (HTML-Oberfläche)==<br />
Zuerst müssen wir eine Community erstellen:<br><br />
snmpconfig --add snmpv1 -index 1 -community dieistgeheim42 -groupname ro<br />
Erklärung:<br />
snmpconfig : Der Befehl zum hinzufügen<br />
--add snmpv1 : für welches Protokoll<br />
-index 1 : Erster Eintrag von 5 möglichen<br />
-community dieistgeheim42 : Setze die Community "diestgeheim42"<br />
-groupname ro : ro = readonly/nur lesen (rw wäre lesen und schreiben)<br />
Man könnte per weiterer Parameter auch noch eine IP-Adresse setzten. Die ist nicht für den Zugriff sondern wird dann der SNMP-Trap-Empfänger<br><br />
<br><br />
Nun können wir das Protokoll SNMPv1 aktivieren:<br><br />
snmpconfig --enable snmpv1<br />
<br><br />
Die weitere Verwaltung kann man nun auch über die Weboberfläche vornehmen:<br><br />
:[[Datei:ClipCapIt-240205-121852.PNG]]<br><br />
:[[Datei:ClipCapIt-240205-122019.PNG]]<br><br />
----<br />
==Kommentare==<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=NextCloud_unter_Ubuntu_22.04_LTS_installierenNextCloud unter Ubuntu 22.04 LTS installieren2024-01-29T08:52:38Z<p>BLinz: /* Benötigte Programme für Nextcloud installieren */</p>
<hr />
<div><u>'''Changelog:'''</u><br><br />
* 29.01.2024 erste Version<br />
----<br />
----<br />
==Installation Ubuntu Server 22.04.x LTS (Long Term Support)==<br />
<br><br />
----<br />
===Einstellungen für die VM===<br />
Falls Ihr den NextCloud-Server als virtuelle Maschine (VM) installiert so könnt Ihr Beispielsweise folgenden Einstellungen nehmen. Diese berücksichtigen auch die Mindestanforderungen von Ubuntu 22.04<br><br />
* Konfiguration: '''Typisch'''<br />
* Name und Speicherort: '''Nach eigener Wahl'''<br />
* Speicher: '''Nach eigener Wahl'''<br />
* Gastbetriebssystem: '''(*) Linux --> Ubuntu (64-Bit)'''<br />
* Netzwerk:<br />
** Wie viele Netzwerkkarten möchten Sie anschließen: '''1'''<br />
** Netzwerk: '''Nach Wahl (VM Network?)'''<br />
** Adapter: '''VMXNET 3'''<br />
* Größer der virtuellen Festplatte: <br />
** Hängt von der Anzahl der überwachten Geräte / Items ab. <br />
** Ich empfehle min '''32GB''' für das Betriebssystem des Servers. Für die Datenpartition hängen wir später noch eine zweite Festplatte an. <br />
** Die Festplatte kann bei einer VM nachträglich vergrößert werden - siehe dazu den Abschnitt in diesem Artikel weiter unten<br />
** '''Thick-Provision Lazy-Zeroed'''<br />
Danach Einstellungen der VM bearbeiten:<br />
<u>Reiter Hardware:</u><br />
* Arbeitsspeicher:<br />
** '''4GB''' oder mehr<br />
* CPUs:<br />
** Anzahl der virtuellen Sockets<br />
*** '''4 oder mehr'''<br />
** Anzahl der Cores pro Socket: '''1''' (Immer Anzahl der Sockets erhöhen)<br />
<u>Reiter Optionen</u><br />
* ...<br />
<br><br />
<br><br />
----<br />
<br />
===Grundinstallation===<br />
{{Hinweis|Ich habe die offizielle ISO verwendet: https://ubuntu.com/download/server (Option 1: Manual server installation - ubuntu-22.04.3-live-server-amd64.iso). Es gibt zur Zeit keine Minimalversion mit LAMP Installer.}}<br><br />
CD einlegen und los,<br><br />
die Fragen beantwortet Ihr wie folgt (sind ggf. die Überschriften der Dialoge):<br><br />
:[[Datei:Install_Ubuntu2204_Pic1.png|50px]] Ubuntu Server with the HWE kernel (=trotz LTS werden auch neuere Kernel installiert)<br><br />
:[[Datei:ClipCapIt-220427-115721.PNG|50px]] Deutsch<br><br />
:[[Datei:ClipCapIt-220427-115808.PNG|50px]] German / German<br><br />
:Wenn er einen neueren Installer findet und fragt ob er auf diesen aktualisieren soll - Ja!<br><br />
:[[Datei:Install_Ubuntu2204_Pic2.png|50px]] Ubuntu Server<br><br />
:[[Datei:ClipCapIt-220427-120131.PNG|50px]] Jetzt könnt Ihr schon die gewünschte feste IP-Adresse einstellen. Wählt dazu mit den Pfeiltasten den <code>ens160</code> Eintrag aus und drückt {{Key|Enter}}:<br><br />
:[[Datei:ClipCapIt-200521-152546.PNG|50px]] ens192 => Bearbeite IPv4<br><br />
:[[Datei:ClipCapIt-200521-152642.PNG|50px]] Manuell<br><br />
:[[Datei:ClipCapIt-200521-152742.PNG|50px]] Bei Subnetz kommt nicht die Subnetzmaske sondern das Netzwerk mit Suffix. Bei einer 24 Maske (= 255.255.255.0) ist das die IP 0 mit Suffix /24<br><br />
:[[Datei:ClipCapIt-200521-153302.PNG|50px]] Erledigt<br><br />
:[[Datei:ClipCapIt-220427-120259.PNG|50px]] Bei Bedarf, sonst leer lassen<br><br />
:[[Datei:ClipCapIt-220427-120335.PNG|50px]] Erledigt<br><br />
:[[Datei:ClipCapIt-220427-120400.PNG|50px]] Nutzt die ganze Festplatte ohne LVM (also Haken entfernen). Die Festplatte lässt sich später trotzdem leicht vergrößern<br><br />
:[[Datei:ClipCapIt-220427-120443.PNG|50px]] Erledigt<br><br />
:[[Datei:ClipCapIt-220427-120505.PNG|50px]] Fortfahren<br><br />
:[[Datei:ClipCapIt-220427-120827.PNG|50px]] Ich lege hier den Benutzer '''''installadmin''''' an. Wählt euren Benutzer und Passwort nach Wunsch (Aufschreiben!)<br><br />
:[[Datei:ClipCapIt-220427-120914.PNG|50px]] OpenSSH-Server auswählen => Erledigt (für Zugriff z.B. mit Putty)<br><br />
:[[Datei:ClipCapIt-220427-120938.PNG|50px]] Erledigt<br><br />
Ab jetzt heißt es abwarten. Wenn er kann lädt er gleich ein paar Sicherheitsupdates nach:<br><br />
:[[Datei:ClipCapIt-220427-121943.PNG|50px]] Jetzt neustarten<br><br />
:[[Datei:ClipCapIt-220427-122036.PNG|50px]] ISO aus der VM entfernen und {{Key|Enter}} drücken<br><br />
:[[Datei:ClipCapIt-220427-122152.PNG|50px]] Nach dem Reboot wartet ab bis diverse Meldungen abgelaufen sind<br><br />
----<br />
<br />
===PuTTY===<br />
Ab dieser Stelle könnt Ihr PuTTY oder den SSH Client eurer Wahl nutzen - was ich dringend empfehle. Denn dann könnt Ihr hier vorgeschlagenen Befehle einfach per Copy&Paste übernehmen.<br><br />
Die IP-Adresse habt Ihr zu diesem Zeitpunkt ja bereits festgelegt:<br><br />
:[[Datei:ClipCapIt-200521-155245.PNG|150px]] [[Datei:ClipCapIt-200521-155339.PNG|150px]] [[Datei:ClipCapIt-200521-160706.PNG|150px]]<br><br />
Nach der Anmeldung nutze ich immer gerne ein<br />
sudo -i<br />
Damit wechselt man dauerhaft zum '''''root''''' Benutzer und muss nicht vor jedem Befehl ein <code>sudo</code> stellen.<br><br />
----<br />
===root wieder freischalten===<br />
{{Hinweis| Ob nun wie ich immer als root arbeiten wollt oder aber als einfacher Benutzer und dann immer <code>sudo</code> verwendet müsst Ihr selbst wissen}}<br />
* Mit Benutzer '''''installadmin''''' anmelden<br><br />
sudo -i<br />
* Kennwort des Benutzer '''''installadmin''''' eintippen<br><br />
passwd root<br />
* neues Kennwort für "root" 2x eintippen<br><br />
:[[Datei:ClipCapIt-200521-161108.PNG|150px]]<br />
* Lokal Anmelden kann man sich nun mit '''''root''''' - aber eine Anmeldung über SSH funktioniert dann immer noch nicht.<br><br />
* Damit diese auch funktioniert müsst ihr die <code>sshd_config</code> bearbeiten:<br><br />
nano /etc/ssh/sshd_config<br />
<br />
sucht nach der Zeile ({{Key|STRG}} + {{Key|W}} ist Suchen) nach<br />
#PermitRootLogin without-password<br />
und stellt den Cursor in die Zeile.<br><br />
Drückt nun einmal {{Key|F9}} und 2x {{Key|F10}} - damit erstellt Ihr eine Kopie der Zeile.<br><br />
Ändert die Kopie wie folgt ab:<br><br />
PermitRootLogin yes<br />
:[[Datei:ClipCapIt-200521-161435.PNG|150px]]<br><br />
Speichert die Datei ({{Key|STRG}} + {{Key|x}}, dann {{Key|y}} und {{Key|Enter}}) und startet den ssh Dienst neu:<br><br />
systemctl restart ssh.service<br />
Ab dann klappt es auch mit dem SSH-Login für den Benutzer root, z.B. über '''puTTY'''<br><br />
Jetzt 2x<br><br />
exit<br />
eintippen wodurch sich das PuTTY Fenster schließt - der (eingeschränkte) Benutzer '''''installadmin''''' hat sich somit abgemeldet<br />
<br><br />
<br><br />
{{Hinweis|<br><br>Ja, ich persönlich arbeite gerne als root und habe diesen für die Anmeldung freigeschaltet. Was ich nicht mache ist das Login per SSH mit Passwort zu erlauben. Ich hinterlege also immer einen SSH-Key für die Anmeldung und nutze diesen statt des Kennwortes. Die Lösung hier ist einfach gehalten, der Profi mögen anpassen wie er es braucht. Ein Anmeldung als eingeschränkter Benutzer geht natürlich auch, das erste was ich dann immer mache ist ein <code>sudo -i</code> um dauerhaft zum root zu wechseln}}<br />
----<br />
<br />
===Anmelden als root===<br />
Startet PuTTY wieder und meldet euch diesmal gleich als Benutzer '''''root''''' an.<br><br />
----<br />
===nano & Co auf Deutsch===<br />
'''''nano''''' war eben z.B. noch auf Englisch, mit<br />
apt install -y language-pack-de<br />
ist es (und vieles andere) auf deutsch.<br><br />
----<br />
<br />
===root farbiger Prompt===<br />
Als '''''root''''' anmelden:<br><br />
nano ~/.bashrc<br />
Zeile 39 ({{Key|Alt}} + {{Key|C}} aktiviert Zeilennummernanzeige):<br><br />
#force_color_prompt=yes<br />
ändern zu (# entfernen):<br><br />
force_color_prompt=yes<br />
<br><br />
nun wieder Abmelden - ab der nächsten Anmeldung ist der neue Prompt aktiv.<br><br />
:[[Datei:ClipCapIt-200521-162422.PNG|150px]]<br><br />
Wer den sofort haben will (ohne neu Anmelden):<br><br />
source ~/.bashrc<br />
----<br />
<br />
===Feste IP-Adresse vergeben===<br />
Der Server hat dank des neuen Setupdialoges nun bereits eine feste IP-Adresse.<br><br />
Solltet Ihr an dieser etwas ändern müssen so bearbeitet die Datei<br><br />
nano /etc/netplan/00-installer-config.yaml<br />
:[[Datei:ClipCapIt-200521-162802.PNG|150px]]<br><br />
----<br />
===Updates einspielen===<br />
* wieder anmelden als '''''root''''' bzw. zum '''''root''''' wechseln<br />
* Updates suchen für Betriebssystem: (aktualisiert den Katalog aus den Update-Quellen)<br />
apt update<br />
* Updates einspielen:<br />
apt upgrade -y<br />
* Nach Update überflüssige Pakete entfernen:<br />
apt autoremove -y<br />
<br><br />
Ich mache das normalerweise immer als Einzeiler:<br />
apt update && apt upgrade -y && apt autoremove -y<br />
<br><br />
<br><br />
----<br />
<br />
===Multipathing deinstallieren (wenn der Server eine VM ist)===<br />
Ab Werk wird nun das<br />
/var/log/syslog<br />
mit Multipath-Meldungen vollgemüllt:<br><br />
May 21 14:28:19 zabbix multipathd[674]: sda: add missing path<br />
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get udev uid: Invalid argument<br />
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get sysfs uid: Invalid argument<br />
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get sgio uid: No such file or directory<br />
Unter Ubuntu 22.04 scheint es nicht mehr ganz so schlimm wie unter 20.04 - aber in einer VM macht Multipath keinen Sinn, also deaktivieren und deinstallieren um das Syslog von den Meldungen befreien:<br><br />
systemctl stop multipathd.service && systemctl disable multipathd.service<br />
apt install kpartx libsgutils2-2 liburcu8 sg3-utils sg3-utils-udev<br />
apt remove -y multipath-tools && apt purge -y multipath-tools<br />
Die <code>apt install</code> Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf '''''manuell installiert''''' gesetzt und dann nicht bei einem <code>apt autoremove</code> deinstalliert<br><br />
----<br />
<br />
===Cloud-Init deinstallieren (Wenn es keine VM bei einem Cloudanbieter ist)===<br />
Wenn Ihr die VM reboootet und die Console betrachtet tauchen kurz nach dem Reboot (Fehler-)Meldungen zum Cloud-init auf:<br><br />
:[[Datei:ClipCapIt-200521-163633.PNG|150px]]<br><br />
Das Cloud-Init ist - wenn ich mich recht erinnere - dafür da falls eure VM z.B. bei Amazon AWS, Azure oder andere Anbieter läuft um z.B. die Netzwerkinformationen vom Hoster/Provider zu erhalten.<br><br />
Brauchen wir nicht, also weg damit:<br><br />
echo 'datasource_list: [ None ]' | tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg<br />
apt purge -y cloud-init<br />
rm -rf /etc/cloud/ && sudo rm -rf /var/lib/cloud/<br />
apt install eatmydata libeatmydata1 python-babel-localedata python3-babel python3-certifi python3-jinja2 python3-json-pointer python3-jsonpatch python3-jsonschema python3-markupsafe python3-pyrsistent python3-requests python3-tz python3-urllib3 -y<br />
reboot<br />
Die <code>apt install</code> Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf '''''manuell installiert''''' gesetzt und dann nicht bei einem <code>apt autoremove</code> deinstalliert<br><br />
----<br />
<br />
===Zeitzone setzen===<br />
In meiner VM ist die Uhrzeit zu diesem Zeitpunkt falsch (gebt mal probeweise <code>date</code> ein) - weil der ESXi-Host auf UTC Zeit läuft und die Ubuntu in der VM die richtige Zeitzone nicht eingestellt hat.<br><br />
Wir korrigieren das mit<br><br />
timedatectl set-timezone Europe/Berlin<br />
ein<br />
date<br />
sollte dann die richtige Uhrzeit ausspucken.<br><br />
----<br />
<br />
===Automatische Updates deaktivieren===<br />
Ich persönlich möchte nicht das der Zabbix-Server automatisch Updates einspielt.<br><br />
Die automatischen Updates aktualisieren - soweit ich das beobachten konnte - nur den Kernel. Aber auch das möchte ich nicht. Ich möchte das geplant durchführen.<br><br />
Die automatischen Updates verhindern wir mit<br><br />
apt remove -y unattended-upgrades<br />
----<br />
<br />
===Benötigte Programme für Nextcloud installieren===<br />
Die nachfolgende Zeile installiert alles notwendige die auch nachfolgend beschriebenen Features von NextCloud zu nutzen. Als Datenbank wird MariaDB verwendet.<br><br />
apt install apache2 mariadb-server libapache2-mod-php php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip php-ldap php-bz2 php-json unzip zip imagemagick-y<br />
{{Tipp| Zum kopieren der oberen Zeile mit der Maus vor das <code>apt</code> gehen und 3x Klicken. Ggf. mehrmals versuchen - bis die ganze Zeile markiert ist. Diese kann dann so in z.B. PuTTY eingefügt werden}}<br><br />
<br><br />
<br><br />
----<br />
<br />
==Zusätzliche Festplatte einbinden==<br />
Die Daten von NextCloud sollen auf einer 2. Festplatte gespeichert werden - exklusive der SQL-Datenbank, diese wird auf der Festplatte mit dem Betriebssystem liegen.<br><br />
Dazu habe ich der VM einfach eine weitere Festplatte mit 50GiB hinzugefügt. Diese können wir später bei bedarf einfach vergrößern.<br><br />
Nach dem hinzufügen startet Ihr den Server einmal neu.<br><br />
<br><br />
Zuerst müssen wir herausfinden wie die 2. Festplatte unter Ubuntu heißt:<br><br />
ls -l /dev/sd*<br />
<u>'''Ausgabe:'''</u><br><br />
<source><br />
brw-rw---- 1 root disk 8, 0 Jan 29 10:46 /dev/sda<br />
brw-rw---- 1 root disk 8, 1 Jan 29 10:46 /dev/sda1<br />
brw-rw---- 1 root disk 8, 2 Jan 29 10:46 /dev/sda2<br />
brw-rw---- 1 root disk 8, 16 Jan 29 10:46 /dev/sdb<br />
</source><br />
<code>/dev/sda</code> ist die erste Festplatte, <code>sda1</code> und <code>sda2</code> sind Partitionen auf dieser.<br><br />
Unsere Zielfestplatte Platte ist die <code>/dev/sdb</code><br><br />
Da wir hier keine <code>/dev/sdb1</code> sehen hat diese Festplatte noch keine Partitionen.<br><br />
<br><br />
Ich arbeite hier ohne LVM, die Festplatte können wir später trotzdem leicht vergrößern.<br><br />
{{Warnung| Das müsst Ihr nur machen falls Ihr noch keine Partition habt, also kein <code>/dev/sda1</code> sondern nur <code>/dev/sda</code>}}<br><br />
Wir tippen ein:<br />
fdisk /dev/sdb<br />
Da kommt dann etwas Text und die Aufforderung<br><br />
'''Befehl (m für Hilfe):'''<br />
Wir drücken<br />
n<br />
um eine neue Partition zu erstellen und dann<br />
p<br />
für eine Primäre Partition, dann<br />
1<br />
für die erste Partition.<br><br />
Dann drückt 2x {{Key|Enter}} um die vorgeschlagenen Werte zu übernehmen.<br><br />
Jetzt sollte da wieder<br />
'''Befehl (m für Hilfe):'''<br />
stehen und wir drücken <br />
w<br />
um das ganze auf die Platte zu schreiben.<br><br />
<br><br />
Das sollte also etwas so aussehen:<br><br />
root@nextcloud1:~# fdisk /dev/sdb<br />
<br />
Willkommen bei fdisk (util-linux 2.37.2).<br />
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich<br />
entscheiden, sie zu schreiben.<br />
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.<br />
<br />
Gerät enthält keine erkennbare Partitionstabelle.<br />
Eine neue DOS-Festplattenbezeichnung 0xdc256c5b wurde erstellt.<br />
<br />
Befehl (m für Hilfe): n<br />
Partitionstyp<br />
p Primär (0 primär, 0 erweitert, 4 frei)<br />
e Erweitert (Container für logische Partitionen)<br />
Wählen (Vorgabe p): p<br />
Partitionsnummer (1-4, Vorgabe 1): 1<br />
Erster Sektor (2048-104857599, Vorgabe 2048):<br />
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-104857599, Vorgabe 104857599):<br />
<br />
Eine neue Partition 1 des Typs „Linux“ und der Größe 50 GiB wurde erstellt.<br />
<br />
Befehl (m für Hilfe): w<br />
Die Partitionstabelle wurde verändert.<br />
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.<br />
Festplatten werden synchronisiert.<br />
<br><br />
<br><br />
Prima, jetzt haben wir eine Partition <code>/dev/sdb1</code>, diese formatieren wir nun mit dem '''''ext4''''' Dateisystem:<br><br />
mkfs.ext4 /dev/sdb1<br />
Ausgabe:<br><br />
root@nextcloud1:~# mkfs.ext4 /dev/sdb1<br />
mke2fs 1.46.5 (30-Dec-2021)<br />
Geräteblöcke werden verworfen: erledigt<br />
Ein Dateisystem mit 13106944 (4k) Blöcken und 3276800 Inodes wird erzeugt.<br />
UUID des Dateisystems: 2ead4117-e280-4ac4-8038-f41ef64c1e70<br />
Superblock-Sicherungskopien gespeichert in den Blöcken:<br />
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,<br />
4096000, 7962624, 11239424<br />
<br />
beim Anfordern von Speicher für die Gruppentabellen: erledigt<br />
Inode-Tabellen werden geschrieben: erledigt<br />
Das Journal (65536 Blöcke) wird angelegt: fertig<br />
Die Superblöcke und die Informationen über die Dateisystemnutzung werden<br />
geschrieben: erledigt<br />
<br />
Nun müssen wir die Festplatte noch mounten. NextCloud werden wir nach<br />
/var/www/nextcloud<br />
installieren. Deshalb hängen wir die neue Festplatte unterhalb von <code>/var/www</code> ein. In diesem Verzeichnis gibt es im Moment noch das Unterverzeichnis <code>html</code> was wir uns vorher wegsichern:<br><br />
mv /var/www/html /tmp/html<br />
Dann mounten wir unsere neue Partition an diesen Pfad:<br><br />
mount /dev/sdb1 /var/www/<br />
Prüfen wir ob das geklappt hat:<br />
root@nextcloud1:~# df -h<br />
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf<br />
tmpfs 391M 1,2M 390M 1% /run<br />
/dev/sda2 32G 7,5G 23G 26% /<br />
tmpfs 2,0G 0 2,0G 0% /dev/shm<br />
tmpfs 5,0M 0 5,0M 0% /run/lock<br />
tmpfs 391M 4,0K 391M 1% /run/user/1000<br />
/dev/sdb1 49G 24K 47G 1% /var/www<br />
In der letzten Zeile sehen wir das es geklappt hat.<br><br />
Nun müssen wir dafür sorgen das dies auch beim nächsten Booten automatisch gemacht wird. Dazu brauchen wir die UUID die wir wie folgt herausbekommen:<br><br />
ls -l /dev/disk/by-uuid/ | grep sdb<br />
Ergebnis bei mir:<br><br />
lrwxrwxrwx 1 root root 10 Jan 29 11:10 2ead4117-e280-4ac4-8038-f41ef64c1e70 -> ../../sdb1<br />
Nun bearbeiten wir die <code>fstab</code>:<br><br />
nano /etc/fstab<br />
und hängen unten folgende Zeile an:<br />
/dev/disk/by-uuid/2ead4117-e280-4ac4-8038-f41ef64c1e70 /var/www ext4 defaults 0 1<br />
Die Werte bedeuten:<br />
/dev/disk/by-uuid/2ead4117-e280-4ac4-8038-f41ef64c1e70 : Pfad mit UUID des Datenträgers<br />
/var/www : Das Verzeichnis in das gemountet werden soll<br />
ext4 : Welches Dateisystem soll gemountet werden, ggf. auch mit '''auto''' probieren<br />
defaults : Mit Standardeinstellungen / Rechten mounten, Detail siehe z.B. hier: https://wiki.archlinux.de/title/Fstab<br />
0 : Für den Befehl Dump, 0 bedeutet "keine Systempartition"<br />
0 : Für Dateisystemprüfung, 1 bedeutet "mit Prüfung" einbinden<br />
<br><br />
Bevor wir nun neu Starten verschieben wir noch das <code>html</code> Verzeichnis zurück:<br><br />
mv /tmp/html /var/www/html<br />
Als Test nun einen Reboot - danach sollte die Platte weiterhin/wieder eingehängt sein. Das könnte ihr wieder mit <code>df -h</code> kontrollieren:<br><br />
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf<br />
tmpfs 391M 1,2M 390M 1% /run<br />
/dev/sda2 32G 7,5G 23G 26% /<br />
tmpfs 2,0G 0 2,0G 0% /dev/shm<br />
tmpfs 5,0M 0 5,0M 0% /run/lock<br />
/dev/sdb1 49G 40K 47G 1% /var/www<br />
tmpfs 391M 4,0K 391M 1% /run/user/1000<br />
----<br />
<br />
==Nextcloud installieren==<br />
Die folgenden Installationsschritte habe ich mir aus verschiedenen Anleitungen zusammengesucht, die Quellen sind:<br><br />
* https://docs.nextcloud.com/server/latest/admin_manual/installation/example_ubuntu.html<br />
* https://mailserverguru.com/install-nextcloud-on-ubuntu-22-04-lts/<br />
----<br />
===Datenbank erstellen===<br />
NextCloud benötigt eine MySQL / MariaDB Datenbank die wir wie folgt erstellen:<brA><br />
<source lang="bash"><br />
mysql -u root -e "CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"<br />
mysql -u root -e "CREATE USER 'dbusernextcloud'@'localhost' IDENTIFIED BY 'password4nextclouddb'"<br />
mysql -u root -e "GRANT ALL PRIVILEGES ON nextcloud.* TO 'dbusernextcloud'@'localhost'"<br />
mysql -u root -e "FLUSH PRIVILEGES"<br />
</source><br />
Damit wird eine Datenbank '''''nextcloud''''' erstellt (falls noch nicht vorhanden) und dem lokalen Benutzer '''''dbusernextcloud''''' mit dem Passwort '''''password4nextclouddb''''' darauf Zugriff gewährt.<br><br />
<br><br />
----<br />
===NextCloud herunterladen===<br />
Die folgenden Befehle laden die aktuellste Version als {{Key|.zip}} herunter, entpacken diese in den Ordern <code>/var/www/nextcloud</code>, löschen die {{Key|.zip}} und geben dem Benzutzer unter dem der Webserver läuft volle Rechte auf den Ordner:<br><br />
cd /var/www/<br />
wget <nowiki>https://download.nextcloud.com/server/releases/latest.zip</nowiki><br />
unzip latest.zip<br />
rm -rf latest.zip<br />
chown -R www-data:www-data /var/www/nextcloud/<br />
<br><br />
----<br />
===Webserver auf NextCloud-Pfad setzen===<br />
Die Default-Webseite zeigt im Moment noch auf <code>/var/www/html</code>, wir ändern dies auf unser neues Verzeichnis:<br><br />
nano /etc/apache2/sites-enabled/000-default.conf<br />
Mit {{Key|F9}} könnt Ihr den gesamten Inhalt der Datei löschen und das nachfolgende einfügen.<br><br />
Geändert wird aber erst einmal nur die Zeile mit '''''DocumentRoot'''''<br><br />
<source><br />
<VirtualHost *:80><br />
# The ServerName directive sets the request scheme, hostname and port that<br />
# the server uses to identify itself. This is used when creating<br />
# redirection URLs. In the context of virtual hosts, the ServerName<br />
# specifies what hostname must appear in the request's Host: header to<br />
# match this virtual host. For the default virtual host (this file) this<br />
# value is not decisive as it is used as a last resort host regardless.<br />
# However, you must set it for any further virtual host explicitly.<br />
#ServerName www.example.com<br />
<br />
ServerAdmin webmaster@localhost<br />
DocumentRoot /var/www/nextcloud<br />
<br />
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,<br />
# error, crit, alert, emerg.<br />
# It is also possible to configure the loglevel for particular<br />
# modules, e.g.<br />
#LogLevel info ssl:warn<br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
# For most configuration files from conf-available/, which are<br />
# enabled or disabled at a global level, it is possible to<br />
# include a line for only one particular virtual host. For example the<br />
# following line enables the CGI configuration for this host only<br />
# after it has been globally disabled with "a2disconf".<br />
#Include conf-available/serve-cgi-bin.conf<br />
</VirtualHost><br />
</source><br />
Wo wir schon mal dabei sind aktivieren wir gleich weitere Apache2 Module die wir gleich noch brauchen:<br><br />
a2enmod rewrite dir mime env headers<br />
und starten den Webserver dann neu:<br><br />
systemctl restart apache2<br />
<br><br />
----<br />
===Grundsetup über das Webinterface===<br />
Im Webbrowser müsstet Ihr jetzt über die IP-Adresse des Servers das Setup erreichen:<br><br />
http://IP-eurer-NextCloud-VM/<br />
:[[Datei:ImageNextCloudSetup.png]]<br><br />
Den Benutzernamen und das Passwort dürft Ihr euch frei ausdenken. Das wird der erste Admin-Benutzer.<br><br />
Das Datenverzeichnis lasst Ihr so stehen wie vorgeschlagen auf<br />
/var/www/nextcloud/data<br />
Beim Datenbank-Benutzer müsst tragt Ihr - wenn Ihr mein Beispiel übernommen habt<br />
dbusernextcloud<br />
ein, das Passwort ist<br><br />
password4nextclouddb<br />
und der Datenbank-Name<br />
nextcloud<br />
Den Host last ihr wie er ist.<br><br />
Auf installieren drücken und Geduld beweisen, nach 10 bis 30 Sekunden geht es weiter:<br />
<br />
[[Datei:ImageNextCloudSetup2.png]]<br><br />
<br />
Das könnt Ihr nach eigenen Gutdünken entscheiden, ich überspringe hier da ich den Server nur für den Austausch von Dateien verwenden möchte.<br />
<br />
Es folgt eine Infoseite durch die man sich durchklickt bis man bei '''''Los gehts!''''' landet.<br><br />
<br><br />
Fertig! Der grundlegende NextCloud-Server läuft nun!<br />
----<br />
==Feintuning Teil 1==<br />
Im Verwaltungsbereich wird uns NextCloud ein paar Warnung bezüglich verschiedener Einstellungen geben, ein paar davon stellen wir hier ab.<br><br />
Zudem folgen wir den Empfehlungen von https://mailserverguru.com/install-nextcloud-on-ubuntu-22-04-lts/ und bauen auf PHP-FPM um, das wird auch von NextCloud selbst empfohlen (aus Performancegründen):<br />
apt install php-fpm<br />
Der Dienst dazu sollte automatisch starten, das können wir per<br />
systemctl status php8.1-fpm.service<br />
prüfen.<br><br />
Nun wechseln wir die PHP-Engine von Apache:<br><br />
a2dismod php8.1<br />
a2dismod mpm_prefork<br />
a2enmod mpm_event proxy_fcgi setenvif<br />
a2enconf php8.1-fpm<br />
dann bearbeiten wir die Datei <br />
nano /etc/php/8.1/fpm/php.ini<br />
und ändern folgende Zeilen ({{Key|STRG}} + {{Key|W}} ist suchen):<br><br />
<source><br />
upload_max_filesize = 1024M <br />
post_max_size = 1536M <br />
memory_limit = 2048M <br />
max_execution_time = 600<br />
max_input_vars = 3000 <br />
max_input_time = 1000<br />
</source><br />
<br><br />
Nun noch die FPM-Pool-Einstellungen:<br><br />
nano /etc/php/8.1/fpm/pool.d/www.conf<br />
und folgende Änderungen:<br><br />
<source><br />
pm.max_children = 64<br />
pm.start_servers = 16<br />
pm.min_spare_servers = 16<br />
pm.max_spare_servers = 32<br />
</source><br />
Im Anschluss den Dients neu starten:<br><br />
systemctl restart php8.1-fpm.service<br />
Jetzt noch die Webseitenkonfiguration anpassen damit php-fpm verwendet wird:<br><br />
nano /etc/apache2/sites-enabled/000-default.conf<br />
<source><br />
<VirtualHost *:80><br />
# The ServerName directive sets the request scheme, hostname and port that<br />
# the server uses to identify itself. This is used when creating<br />
# redirection URLs. In the context of virtual hosts, the ServerName<br />
# specifies what hostname must appear in the request's Host: header to<br />
# match this virtual host. For the default virtual host (this file) this<br />
# value is not decisive as it is used as a last resort host regardless.<br />
# However, you must set it for any further virtual host explicitly.<br />
#ServerName www.example.com<br />
<br />
ServerAdmin webmaster@localhost<br />
DocumentRoot /var/www/nextcloud<br />
<br />
<br />
<Directory /var/www/nextcloud><br />
Options Indexes FollowSymLinks<br />
AllowOverride All<br />
Require all granted<br />
</Directory><br />
<br />
<FilesMatch ".php$"><br />
SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/"<br />
</FilesMatch><br />
<br />
<br />
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,<br />
# error, crit, alert, emerg.<br />
# It is also possible to configure the loglevel for particular<br />
# modules, e.g.<br />
#LogLevel info ssl:warn<br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
# For most configuration files from conf-available/, which are<br />
# enabled or disabled at a global level, it is possible to<br />
# include a line for only one particular virtual host. For example the<br />
# following line enables the CGI configuration for this host only<br />
# after it has been globally disabled with "a2disconf".<br />
#Include conf-available/serve-cgi-bin.conf<br />
</VirtualHost><br />
</source><br />
----<br />
<br />
==Umbau auf https - Selbstsigniertes Zertifikat==<br />
In der <code>http://</code> Anzeige funktioniert zunächst alles, aber zum Beispiel das kopieren von Links zum Teilen nicht.<br><br />
Wir machen den Server also über <code>https://</code> erreichbar, zunächst mit einem selbst signierten Zertifikat:<br><br />
https-Unterstützung des Apache2 aktivieren:<br><br />
a2enmod ssl<br />
systemctl restart apache2<br />
Dann erstellen wir unser eigenes SSL-Zertifikat:<br><br />
openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt<br />
Die Fragen beantwortet ihr nach eigenem Gutdünken oder eben gar nicht (einfach mit Enter bestätigen).<br><br />
Bei '''''Common Name (e.g. server FQDN or YOUR name) []:''''' solltet Ihr den DNS-Namen eintragen unter dem der Server später erreicht werden soll:<br><br />
Common Name (e.g. server FQDN or YOUR name) []:nextcloud1.test.local<br />
Nun erstellen wir eine neue Apache2-Konfiguration für den verschlüsselten Zugriff:<br><br />
nano /etc/apache2/sites-available/nextcloud-ssl.conf<br />
mit folgendem Inhalt:<br><br />
<source><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@localhost<br />
DocumentRoot /var/www/nextcloud<br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
SSLEngine on<br />
<br />
SSLCertificateFile /etc/ssl/certs/nextcloud-selfsigned.crt<br />
SSLCertificateKeyFile /etc/ssl/private/nextcloud-selfsigned.key<br />
<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<Directory /usr/lib/cgi-bin><br />
SSLOptions +StdEnvVars<br />
</Directory><br />
<br />
</VirtualHost><br />
</source><br />
Jetzt müssen wir die Seite noch aktivieren:<br><br />
a2ensite nextcloud-ssl.conf<br />
systemctl reload apache2<br />
Nun müssen wir NextCloud noch davon erzählen - das der Zugriff per DNS-Name aus dem Zertifikat ok ist:<br><br />
nano /var/www/nextcloud/config/config.php<br />
und oben folgenden Eintrag ergänzen (der <code>1 =></code>):<br><br />
array (<br />
0 => '192.168.1.10',<br />
1 => 'nextcloud1.test.local',<br />
),<br />
und nun sollte Ihr im Webbrowser eure NextCloud-Installation auch per https erreichen. (mit Zertifikatswarnung).<br><br />
Damit es über den Namen klappt müsst Ihr diesen auf eurem DNS-Server hinterlegen.<br><br />
<br><br />
----<br />
==kurze URLs verwenden==<br />
{{Hinweis| Das funktioniert nur wenn ihr den vorherigen Umbau auf PHP-FPM gemacht habt!}}<br><br />
Die Links wenn Ihr später Dateien teilt enthalten immer die <code>index.php</code><br><br />
https://192.168.1.10/index.php/s/2D7HRQ2NnzHX8BW<br />
Um diese Anzeige zu entfernen bearbeiten wir die Konfigurationsdatei von NextCloud:<br><br />
nano /var/www/nextcloud/config/config.php<br />
und hängen unten folgende Zeile an (vor dem <code>);</code> in der letzten Zeile):<br><br />
'overwrite.cli.url' => 'https://nextcloud1.test.local/',<br />
'htaccess.RewriteBase' => '/',<br />
Speichern und dann folgenden Befehl ausführen:<br><br />
sudo -u www-data php --define apc.enable_cli=1 /var/www/nextcloud/occ maintenance:update:htaccess<br />
Ab jetzt müsstet Ihr den Server über seinen DNS-Namen aufrufen!<br><br />
----<br />
==LDAP / Active Directory anbinden==<br />
Für die LDAP-Anbindung muss das LDAP-PHP Modul installiert sein, nach dieser Anleitung ist das schon der Fall.<br><br />
Ansonsten:<br><br />
apt install php-ldap<br />
<br><br />
Zunächst brauchen wir im Active Directory einen Benutzer für die LDAP-Abfrage.<br><br />
Das ist ein ganz normales Benutzerkonto ohne weitere Rechte, es muss sich nur am AD anmelden können.<br><br />
Erstellt den Benutzer. Der Benutzer sollte nicht mehr in eine andere OU verschoben werden nachdem er in NextCloud eingetragen wurde.<br><br />
Ich nenne meinen Benutzer<br />
ldapnextcloud<br />
Das Kennwort des Benutzers sollte nie ablaufen und er muss es auch nicht bei der nächsten Anmeldung ändern.<br><br />
Jetzt brauchen wir noch den '''Distinguished Name''' des Benutzers. Öffnet auf dem Domänencontroller eine Eingabeaufforderung und nutz folgenden Befehl:<br><br />
dsquery user -samid ldapnextcloud<br />
Beispielausgabe:<br><br />
"CN=ldapnextcloud,OU=Funktionsbenutzer,OU=Benutzer,OU=Sonstiges,DC=test,DC=local"<br />
Den Pfad, ohne die <code>" "</code> brauchen wir gleich.<br><br />
Dann bauen wir noch eine Gruppe. Nur Mitglieder in dieser Gruppe sollen NextCloud nutzen können.<br><br />
Ich nenne meine Gruppe hier "nextcloud". Den '''Distinguished Name''' brauchen wir ebenfalls, diesen ermitteln wir mit dem gleichen Befehl wie zuvor:<br><br />
dsquery group -samid nextcloud<br />
Ausgabe:<br><br />
"CN=nextcloud,OU=VerwaltungsGruppen,OU=Gruppen,OU=Sonstiges,DC=test,DC=local"<br />
Zum testen packen wir auch ein paar Benutzer in diese Gruppe.<br><br />
<br />
<br />
<br />
Wir gehen in der Managementoberfläche in das Apps-Menü und aktivieren das '''''LDAP user an group backend''''':<br>[[Datei:ImageNextCloudLDAP1.png]]<br />
<br />
Danach könnt Ihr wieder zurück in die Verwaltungseinstellungen wechseln, dort gibt es nun einen neuen Abschnitt "LDAP/AD-Integration":<br />
<br />
Auf der ersten Seite tragen wir unseren Server ein. Das kann eine IP-Adresse sein, aber auch ein Domänenname. In der Regel wird Port 389 verwendet, das ist der unverschlüsselt LDAP-Port. Kopiert den DN des benutzers hinein und sein Passwort. Drückt auf '''Zugangsdaten speichern''' und danach auf '''Base DN ermitteln''' - das ist dann der erste Test ob der Zugriff klappt.<br />
<br />
[[Datei:ImageNextCloudLDAP2.png]]<br />
<br />
Mit '''Fortsetzen''' wechseln wir auf den Reiter '''Benutzer'''. Hier können wir unter Nur aus diesen Gruppen nach unserer Gruppe suchen:<br />
<br />
[[Datei:ImageNextCloudLDAP3.png]]<br />
<br />
Markiert den Treffer (2) und drückt dann auf <nowiki><code>></code></nowiki> bei (3)<br />
<br />
Der LDAP-Filter sollte sich dann entsprechend ändern:<br />
<br />
[[Datei:ImageNextCloudLDAP4.png]]<br />
<br />
Nach einem Klick auf '''Fortsetzen''' können wir wählen welche Attribute für die Anmeldung erlaubt sind, ob Benutzername und/oder Emailadresse:<br />
<br />
[[Datei:ImageNextCloudLDAP5.png]]<br />
<br />
Unten links könnt Ihr das testen.<br />
<br />
Bei Bedarf können auch noch Gruppen ausgewählt werden die in NextCloud verwendet werden sollen.<br />
<br />
Wenn Ihr nun in die Benutzerverwaltung wechselt, tauchen dort die Gruppenmitglieder aus dem Active Directory auf:<br />
<br />
[[Datei:ImageNextCloudLDAP6.png]]<br />
----<br />
==Cronjob für interne Verarbeitung einrichten==<br />
NextCloud muss von Zeit zu Zeit Hintergrundaufgaben ausführen. NextCloud ist aber eine PHP-Anwendung in einer Webseite und würde somit nur beim Aufruf der Seite ausgeführt. Damit regelmäßige Aufgaben auch ausgeführt werden wenn niemand gerade die Webseite benutzt richten wir einen CronJob ein.<br><br />
In NextCloud stellt Ihr unter<br />
Verwaltungseinstellungen => Verwaltung - Grundeinstellungen<br />
Die '''Hintergrund-Job''' um auf <code>Cron</code><br><br />
<br><br />
Auf der NextCloud-VM melden wir uns per SSH (puTTY) an, wechseln zum '''''root''''' Benutzer und geben folgenden Befehl ein:<br><br />
crontab -u www-data -e<br />
Falls da eine Auswahl kommt die nach dem zu verwendenden Editor fragt nehmt die <code>1. /bin/nano</code><br><br />
Hängt unten and die Datei die folgenden Zeile an:<br><br />
*/5 * * * * php -f /var/www/nextcloud/cron.php<br />
Speichern und fertig! In der Weboberfläche wo Ihr auf Cron umgestellt habt könnt Ihr - als ungefähre Zeitangabe wie '''''Der letzte Job lief vor einer Minute''''' sehen ob es funktioniert.<br><br />
----<br />
<br />
==Backup der VM (Hot Backup - Datenbank einfrieren)==<br />
Bei dieser Methode passiert folgendes:<br />
* Die Datenbank wird vor einem Snapshot auf "READ ONLY" gesetzt - zuvor werden noch alle Daten geschrieben ("FLUSH TABLES")<br />
* Der Snapshot wird erstellt<br />
* Die Datenbank wird wieder für Schreibzugriffe freigegeben<br />
<br><br />
Unter VMware funktioniert das mit 2 Skripten die wir wie folgt anlegen:<br><br />
nano /usr/sbin/pre-freeze-script<br />
mit folgendem Inhalt:<br><br />
{{Warnung|Vergesst nicht das Passwort in Zeile 9 zu setzen (steht auf Leer was per Default passen sollte)}}<br />
<source lang="bash"><br />
#!/bin/sh<br />
# 2018-04-20 Bernhard Linz<br />
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information<br />
# Log will be write to syslog and(!) to /tmp/snapshot.log<br />
echo "$0 pre-freeze start" | logger<br />
echo "-------------------------------------------------------------------------------------" >> /tmp/snapshot.log<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze start" >> /tmp/snapshot.log<br />
# Set Username and Passwort for MySQL Access. Set mysql_password="" if no password needed<br />
mysql_username="root"<br />
mysql_password=""<br />
timeout=300<br />
<br />
# ************************************************************************************************<br />
# No Changes behind this line!<br />
# ************************************************************************************************<br />
# Check if username + password is used<br />
if [ -n "$mysql_password" ]; then<br />
use_credentials="-u$mysql_username -p$mysql_password"<br />
else<br />
use_credentials=""<br />
fi<br />
<br />
# Name of the Lockfile<br />
lock_file=/tmp/mysql_tables_read_lock<br />
<br />
sleep_time=$((timeout+10))<br />
rm -f $lock_file<br />
echo "$0 executing FLUSH TABLES WITH READ LOCK" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') executing FLUSH TABLES WITH READ LOCK" >> /tmp/snapshot.log<br />
<br />
# Start READ LOCK - Process will send to background (and will still run after script is completed. Lock will stop if process is stopped<br />
# After READ ONLY mode is entered the lockfile will be created. Process will stop when getting stop signal from post-thaw-script or timeout reached<br />
mysql $use_credentials -e "FLUSH TABLES WITH READ LOCK; system touch $lock_file; system nohup sleep $sleep_time; system echo lock released|logger; " > /dev/null &<br />
# get the PID of the mysql process<br />
mysql_pid=$!<br />
<br />
echo "$0 child pid $mysql_pid" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') child pid $mysql_pid" >> /tmp/snapshot.log<br />
<br />
# Waiting for the lockfile ...<br />
c=0<br />
while [ ! -f $lock_file ]<br />
do<br />
# check if mysql is running<br />
if ! ps -p $mysql_pid 1>/dev/null ; then<br />
echo "$0 mysql command has failed (bad credentials?)" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') mysql command has failed (bad credentials?)" >> /tmp/snapshot.log<br />
exit 1<br />
fi<br />
sleep 1<br />
c=$((c+1))<br />
# check if the script run into timeout<br />
if [ $c -gt $timeout ]; then<br />
echo "$0 timed out waiting for lock" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') timed out waiting for lock" >> /tmp/snapshot.log<br />
touch $lock_file<br />
kill $mysql_pid<br />
fi<br />
done<br />
# write PID into the lockfile<br />
echo $mysql_pid > $lock_file<br />
<br />
echo "$0 pre-freeze stop" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze stop" >> /tmp/snapshot.log<br />
<br />
exit 0<br />
</source><br />
<br><br />
und<br><br />
nano /usr/sbin/post-thaw-script<br />
<source lang="bash"><br />
#!/bin/sh<br />
# 2018-04-20 Bernhard Linz<br />
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information<br />
# Log will be write to syslog and(!) to /tmp/snapshot.log<br />
echo "$0 post-thaw start" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') post-thaw start" >> /tmp/snapshot.log<br />
<br />
lock_file=/tmp/mysql_tables_read_lock<br />
<br />
# get PID from lockfile<br />
mysql_pid=$(cat $lock_file)<br />
echo "$0 sending sigterm to $mysql_pid" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') sending sigterm to $mysql_pid" >> /tmp/snapshot.log<br />
# and send stop to process<br />
pkill -9 -P $mysql_pid<br />
rm -f $lock_file<br />
<br />
echo "$0 post-thaw stop" | logger<br />
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') post-thaw stop" >> /tmp/snapshot.log<br />
<br />
exit 0<br />
</source><br />
<br><br />
Jetzt müssen wir die beiden Skripte noch ausführbar machen und dem root zuordnen:<br><br />
chmod 0700 /usr/sbin/pre-freeze-script<br />
chmod 0700 /usr/sbin/post-thaw-script<br />
chown root:root /usr/sbin/pre-freeze-script<br />
chown root:root /usr/sbin/post-thaw-script<br />
<br><br />
Voraussetzung ist das die VMware-Tools installiert sind!<br><br />
Dabei ist es egal ob es sich um die Original VMware-Tools oder um die Open-VM-Tools aus den Repositories handelt.<br> <br />
Nun können wir die Skripts testen indem wir einen Snapshot mit den folgenden Einstellungen erstellen:<br><br />
:[[Datei:ClipCapIt-200521-204401.PNG]]<br><br />
<br><br />
Beispielausgabe aus der <br />
cat /tmp/snapshot.log<br />
<br />
-------------------------------------------------------------------------------------<br />
/usr/sbin/pre-freeze-script 2023-03-20 12:49:14 pre-freeze start<br />
/usr/sbin/pre-freeze-script 2023-03-20 12:49:14 executing FLUSH TABLES WITH READ LOCK<br />
/usr/sbin/pre-freeze-script 2023-03-20 12:49:14 child pid 11824<br />
/usr/sbin/pre-freeze-script 2023-03-20 12:49:15 pre-freeze stop<br />
/usr/sbin/post-thaw-script 2023-03-20 12:49:18 post-thaw start<br />
/usr/sbin/post-thaw-script 2023-03-20 12:49:18 sending sigterm to 11824<br />
/usr/sbin/post-thaw-script 2023-03-20 12:49:18 post-thaw stop<br />
<br><br />
Falls es mit dem Passwort mal hakt so müsste das auch dort stehen:<br />
/usr/sbin/pre-freeze-script 2018-06-13 12:01:04 mysql command has failed (bad credentials?)<br />
Mehr Details stehen ggf. im '''''syslog'''''<br />
tail -f -n 500 /var/log/syslog<br />
In den meisten Umgebungen geht das so schnell das die Anwendungen das nicht einmal mitbekommen (4 bis 5 Sekunden).<br><br />
Es müsste schon in diesen Sekunden ein Schreibzugriff stattfinden - und dieser würde dann statt Millisekunden die 4 bis 6 Sekunden dauern.<br><br />
{{Hinweis| Das ganze funktioniert sowohl mit den original VMware-Tools als auch den Open-VM-Tools!}}<br><br />
<br><br />
<br><br />
----<br />
<br />
==Festplatte im laufenden Betrieb vergrößern==<br />
Ihr habt den NextCloud-Server nach dieser Anleitung hier als VM installiert (und ohne LVM) und nun geht euch der Platz aus?<br><br />
Kein Problem, Ihr könnt die Festplatte im laufenden Betrieb vergößern!<br><br />
----<br />
===Schritt 1: Platz an die Festplatte anhängen===<br />
* Stellt sicher das auf der VM zur zeit kein Snapshot aktiv ist!<br />
* Vergrößert die Festplatte um den benötigten Speicherplatz<br />
in dem Beispiel hier wird der Platz von 50 auf 100GB vergrößert.<br><br />
----<br />
===Schritt 2: Betriebssystem die neue Größe erkennen lassen===<br />
<big>'''Die einfachste und sicherste Methode ist den Server neu zu starten.'''</big><br><br />
Wer will kann es aber auch im laufenden Betrieb durchführen, und das geht so:<br><br />
Wählt bitte eine der beiden Methoden, im Moment empfehle ich Methode 2!<br><br />
----<br />
<u>'''Methode 1: (Führt neuerdings zu Problemen)'''</u><br><br />
apt install scsitools -y<br />
rescan-scsi-bus --forcerescan<br />
Da kommen dann reichlich Meldungen.<br><br />
{{Warnung| Ich hatte nun schon zweimal das die VM danach hing, Ubuntu schrieb bei allen Befehlen "nicht gefunden", nach einem Reste ging es wieder. Vorher hatte es aber schon duzende Male ohne Probleme geklappt. Ich suche nach einer Lösung}}<br><br />
<br><br />
----<br />
<u>'''Methode 2: (Umständlicher, aber scheinbar sicherer)'''</u><br><br />
Wir müssen die Festplattenkontroller-Adapternummer ermitteln:<br />
grep mpt /sys/class/scsi_host/host*/proc_name<br />
findet er nichts probiert<br />
grep pvscsi /sys/class/scsi_host/host*/proc_name<br />
Beispielausgaben (eine von beiden wird kommen):<br />
/sys/class/scsi_host/'''host32'''/proc_name:mptspi<br />
/sys/class/scsi_host/'''host2'''/proc_name:vmw_pvscsi<br />
Die Nummer ist in diesem Fall <code>host2</code>! Die brauchen wir für den nächsten Befehl:<br><br />
find /sys -name rescan | grep host2<br />
Beispielausgabe:<br />
/sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/rescan<br />
/sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/rescan<br />
Das sind unsere beiden Festplatten, die mit "target2:0:0" ist unsere Bootplatte, die mit "target2:0:1" unsere zweite Festplatte. Keine Angst, es geht nicht kaputt wenn ihr den nächsten Befehl an die falsche Festplatte sendet.<bt><br />
Ok, an die 2. Festplatte schicken wir jetzt eine <code>1</code> um den Rescan auszulösen:<br />
echo 1 > /sys/devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:1/2:0:1:0/rescan<br />
Fertig!<br><br />
<br><br />
<br />
----<br />
Im Anschluß zur Kontrolle ein<br />
fdisk -l<br />
Die Ausgabe sollte ähnlich wie diese sein:<br><br />
Festplatte /dev/loop0: 54,98 MiB, 57626624 Bytes, 112552 Sektoren<br />
Einheiten: Sektoren von 1 * 512 = 512 Bytes<br />
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes<br />
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes<br />
<br />
Festplatte /dev/loop1: 71,28 MiB, 74735616 Bytes, 145968 Sektoren<br />
Einheiten: Sektoren von 1 * 512 = 512 Bytes<br />
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes<br />
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes<br />
<br />
Festplatte /dev/loop2: 29,9 MiB, 31334400 Bytes, 61200 Sektoren<br />
Einheiten: Sektoren von 1 * 512 = 512 Bytes<br />
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes<br />
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes<br />
<br />
<span style="color:red">GPT-PMBR-Größenunterschied (104857599 != 167772159) wird durch »write« korrigiert.<br />
Die Sicherungs-GPT-Tabelle befindet sich nicht am Ende des Gerätes. Das Problem wird durch »write« korrigiert.</span><br />
<span style="background:lightgreen">Festplatte /dev/sda: 80 GiB, 85899345920 Bytes, 167772160 Sektoren</span><br />
Festplattenmodell: Virtual disk<br />
Einheiten: Sektoren von 1 * 512 = 512 Bytes<br />
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes<br />
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes<br />
Festplattenbezeichnungstyp: gpt<br />
Festplattenbezeichner: D205F6E7-853F-4CCC-83BE-67262A1827C8<br />
Er meckert also schon das die Platte ungenutzten Platz hat (weshalb die GPT nicht mehr am Ende steht), zudem können wir in der Zeile<br />
Festplatte /dev/sdb: 100 GiB, 107374182400 Bytes, 209715200 Sektoren<br />
sehen das es nun 100GB sind und nicht mehr 50GB. '''Sollte er nicht meckern ist das auch ok, Hauptsache er zeigt die neue Größe an!'''<br />
<br />
===Schritt 3: Partition vergrößern===<br />
Das <code>/var/www</code> Verzeichnis unserer zweiten Festplatte befindet sich auf dem Gerät<br />
/dev/sdb1<br />
wenn Ihr nach dieser Anleitung installiert hattet. Kontrollieren könnte Ihr das z.B. mit<br />
df -h<br />
und dann schauen was links vom Verzeichnis <code>/</code> steht:<br><br />
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf<br />
tmpfs 391M 1,2M 390M 1% /run<br />
/dev/sda2 32G 7,6G 23G 26% /<br />
tmpfs 2,0G 0 2,0G 0% /dev/shm<br />
tmpfs 5,0M 0 5,0M 0% /run/lock<br />
<span style="background:yellow">/dev/sdb1 49G 655M 46G 2% /var/www</span><br />
tmpfs 391M 4,0K 391M 1% /run/user/1000<br />
Die nächsten Befehle gehen von {{Key|/dev/sdb1}}, wenn der Pfad anderes ist müsst Ihr diesen anpassen!<br><br />
growpart /dev/sdb 1<br />
resize2fs /dev/sdb1<br />
Ja, beim ersten Befehl ist da ein Leerzeichen zwischen dem sdb und der 1, beim zweiten Befehl nicht.<br><br />
<br />
===Schritt 4: Das war schon alles!===<br />
Ihr könnt mit<br><br />
df -h<br />
es einmal kontrollieren - aber das war schon alles:<br />
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf<br />
tmpfs 391M 1,2M 390M 1% /run<br />
/dev/sda2 32G 7,6G 23G 26% /<br />
tmpfs 2,0G 0 2,0G 0% /dev/shm<br />
tmpfs 5,0M 0 5,0M 0% /run/lock<br />
/dev/sdb1 99G 655M 93G 1% /var/www<br />
tmpfs 391M 4,0K 391M 1% /run/user/1000<br />
----<br />
==Feintuning Teil 2==<br />
Wir editieren die Datei<br><br />
nano /var/www/nextcloud/config/config.php<br />
und setzen noch zusätzlich folgende Optionen:<br><br />
'defaultapp' => 'files',<br />
'skeletondirectory' => '',<br />
'default_language' => 'de',<br />
'overwritehost' => 'nextcloud1.test.local',<br />
'overwriteprotocol' => 'https',<br />
'versions_retention_obligation' => 'auto, 30',<br />
'trashbin_retention_obligation' => '3,7',<br />
Erklärungen:<br />
'defaultapp' => 'files', : Standardansicht nach der Anmeldung ist nun die Dateiansicht.<br />
'skeletondirectory' => '', : Neuen Benutzern werden nicht die üblichen Startdateien kopiert<br />
'default_language' => 'de', : Anzeigesprache Deutch, kann sich der Benutzer umstellen<br />
'overwritehost' => 'nextcloud1.test.local', : Keine Autoermittlung der URL sondern in Links diesen Host einsetzen (wichtig für Reverse Proxy)<br />
'overwriteprotocol' => 'https', : Keine Autoermittlung des Protokolls sondern immer dieses in Links verwenden<br />
'versions_retention_obligation' => 'auto, 30', : Versionen gemäß Plan behalten, Versionen älter als 30 Tage aber löschen<br />
'trashbin_retention_obligation' => '3,7', : gelöschte Dateien bleiben mindestens 3 Tage im Papierkorb und werden spätestens nach 7 Tagen gelöscht<br />
----<br />
==Kommentare==<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=Zabbix_JavaScript_Preprocessing_BeispieleZabbix JavaScript Preprocessing Beispiele2024-01-26T08:51:58Z<p>BLinz: /* Telefonanlage MiVoice MX-ONE */</p>
<hr />
<div><u>'''Changelog:'''</u><br><br />
* 26.01.2024 erste Version<br />
----<br />
==Vorwort==<br />
Nachfolgend einige Beispiele für den Einsatz von JavaScript im Preprocessing in Zabbix Items.<br><br />
Die Sammlung habe ich erstellt weil ich auch immer wieder gerne bei mir selbst abschreibe.<br><br />
----<br />
==Links zu anderen JavaScript Beispielen und Anleitungen==<br />
* [[Zabbix PowerShell JSON und LLD per system.run]]<br />
* https://www.zabbix.com/documentation/current/en/manual/config/items/preprocessing/javascript<br />
* https://www.zabbix.com/documentation/current/en/manual/config/items/preprocessing/javascript/javascript_objects<br />
----<br />
==Telefonanlage MiVoice MX-ONE==<br />
Ausgelesen werden sollte der Zustand der DECT-Stationen.<br><br />
Den Zustand kann man auslesen wenn man sich per SSH an der Anlage anmeldet (scheint ein SUSE-Linux zu sein) und folgenden Befehl ausführt:<br><br />
/opt/eri_sn/16.3.3.1.6/sbin/opt/dect_rfp -p<br />
Die Versionsnummer muss man ggf. anpassen, die Ausgabe sieht wie folgt aus:<br><br />
<source><br />
Dect Extension Radio Fixed Part Data<br />
FPI = 1, BPOS = 1A-0-10.<br />
Rpn Operating State Blocking State Information<br />
1 Operable Not Blocked<br />
2 Operable Not Blocked<br />
3 Operable Not Blocked<br />
4 Operable Not Blocked<br />
5 Operable Not Blocked<br />
6 Operable Not Blocked<br />
7 Operable Not Blocked<br />
8 Operable Not Blocked<br />
<br />
FPI = 2, BPOS = 1A-0-20.<br />
Rpn Operating State Blocking State Information<br />
1 Operable Not Blocked<br />
2 Operable Not Blocked<br />
3 Operable Not Blocked<br />
4 Operable Not Blocked <br />
5 Operable Not Blocked<br />
6 Operable Not Blocked<br />
7 Not Alive Not Blocked<br />
8 Operable Not Blocked<br />
</source><br />
Es sind wohl Haupteinheiten (BPOS) mit Modulen (RPN).<br><br />
Die Ausgabe habe ich in Zabbix in ein LLD Discovery umgesetzt das pro Modul ein Item erstellt und den Status ('''''Operable''''', '''''Not Alive''''' etc.) speichert.<br><br />
<br />
Im Schritt 1 habe ich mir ein Item erstellt welches die Ausgabe des Befehls abholt und in ein JSON umwandelt:<br><br />
:[[Datei:ImageMiVoice1.png]]<br><br />
Den Befehl <code>dect_rfp</code> konnte man in einer SSH-Sitzung auch ohne Pfad nutzen, das Funktioniert aber nicht mit dem Zabbix <code>ssh.run</code>, deshlab hier mit ganzem Pfad.<br><br />
Im Item habe ich dann folgendes JavaScript Preprocessing hinzugefügt:<br><br />
[[Datei:ImageMiVoice2.png]]<br><br />
<source lang="JavaScript"><br />
// Den Text in einzelne Zeilen aufteilen<br />
var lines = value.split('\n');<br />
// Das Rueckgabe-JSON initialisieren (Startwert reinschreiben)<br />
myJSON = '[';<br />
// Die Zeilen des Textes einzeln durcharbeiten<br />
for (i = 0; i < lines.length; i++) {<br />
// Testen ob das Wort "BPOS" in dieser Zeile vorkommt<br />
if ( lines[i].includes("BPOS") == true ) {<br />
// Die Bezeichnung der BPOS extrahieren, steht hinter dem =<br />
temparray = lines[i].split(' = ');<br />
// Meldung in das zabbix-server.log schreiben<br />
// console.warn(temparray[2]);<br />
// Leerzeichen davor und dahinter abschneiden und in Variable speichern<br />
myBPOS = temparray[2].trim();<br />
}<br />
// Testen ob die Zeile mit einer Zahl beginnt<br />
if (lines[i].match(/^\d/)) {<br />
// Ja, also ist es ein RPN-Eintrag<br />
// Anhand von 2 Leerzeichen trennen, so bleiben die Meldungen mit nur einem Leerzeichen verbunden<br />
temparray = lines[i].split(' ');<br />
// daraus JSON mit mit 2 Werten bauen, pro RPN einen Abschnitt mit Name und Wert<br />
myJSON = myJSON + '{"BPOSRPN":"' + myBPOS + temparray[0].trim() + '",';<br />
myJSON = myJSON + '"State":"' + temparray[1].trim() + '"},';<br />
}<br />
}<br />
// Das letzte , (Komma) vom JSON-String abschneiden<br />
myJSON = myJSON.slice(0, -1);<br />
// Den JSON-String abschliessen<br />
myJSON = myJSON + ']';<br />
// Fertig, JSON-String zurückgeben<br />
return myJSON;<br />
</source><br />
Ich hoffe die Kommentare reichen aus. Wie man sieht kann man sogar zum Debuggen Logeinträge in der <code>zabbix-server.log</code> erzeugen (findet Ihr auch unter der Linksammlung).<br><br />
Als Ergebnis steht dann ein JSON in dem Item wenn der Wert geholt wird:<br><br />
:[[Datei:ImageMiVoice3.png]]<br><br />
Das nutzen wir nun um ein Discovery zu machen. Das Discovery-Item ist ein '''''Dependent Item''''' welches auf unser Item mit dem JSON zeigt.<br><br />
Dort im Preprocessing verwende ich folgendes Skript:<br><br />
<source lang="JavaScript"><br />
//2024-01-25 Bernhard.Linz@datagroup.de / Bernhard@znil.de<br />
indexcounter = -1;<br />
output = JSON.parse(value).map(function(pool){<br />
indexcounter++;<br />
return {<br />
"{#BPOSRPN}": pool.BPOSRPN<br />
}})<br />
return JSON.stringify({"data": output})<br />
</source><br />
Das gibt uns also schlicht jedes gefundene RPN zurück.<br><br />
Damit kann man nun die Trigger-Protypen bauen. Diese sind wieder vom Typ '''''Dependent Item''''' und zeigen ebenfalls auf das gleiche Item mit dem JSON.<br><br />
Die Items bekommen ein PreProcessing vom Typ '''''JSON Path''''' mit folgendem Inhalt:<br><br />
$.[?(@.BPOSRPN== '{#BPOSRPN}')].State<br />
Das gibt den <code>State</code> des JSON-Abschnittes zurück in welchen der <code>BPOSRPN</code> mit unserem aktuellen übereinstimmt.<br><br />
Bei dieser Art der Abfrage wird das Ergebnis in <code>["</code> und <code>"]</code> eingeschlossen die man dann einfach entfernt:<br><br />
:[[Datei:ImageMiVoice4.png]]<br><br />
Vergesst nicht das der Item-Key auch immer eindeutig sein muss, dort also auch das LLD-Makro einsetzen:<br><br />
:[[Datei:ImageMiVoice5.png]]<br><br />
----<br />
==Kommentare==<br />
<comments /></div>BLinzhttps://znil.net/index.php?title=DynDNS_Update_Skript_Linux_BashDynDNS Update Skript Linux Bash2024-01-14T15:38:23Z<p>BLinz: /* Vorwort */</p>
<hr />
<div>==Vorwort==<br />
Ein Kunde nutze seit vielen Jahren eine DynDNS-Adresse - mit einem bezahlten Pro Account.<br><br />
Leider ist die Windows-DynUpdater-Software schon ziemlich alt, und seit ein paar Tagen funktioniert dieser irgendwie überhaupt nicht mehr.<br><br />
Ich habe den Account auch in dessen FritzBox eingetragen - das ist aber auch ein älteres Modell von seinem Internet Provider und ich kann nicht sehen was es macht.<br><br />
Und ich hatte nun schon 2x hintereinander das die Adresse nach der Zwangstrennung nicht neu gesetzt wurde.<br><br />
<br><br />
Also habe ich mir ein Skript dafür geschrieben welches ich nun entweder über einen CronJob laufen lassen kann oder per Zabbix-Item anstoße.<br><br />
<br><br />
----<br />
<br />
==Skript==<br />
<source lang="bash"><br />
#!/bin/bash<br />
<br />
# DynDNS-Adresse die aktualisiert werden soll<br />
HOST=euresubdomain.dyndns.org<br />
<br />
# DynDNS-Benutzername<br />
USER=Manfred<br />
<br />
# DynDNS-Updater Client Key<br />
PASS=1234567890123456789012345678901<br />
<br />
# Aktuelle IP-Adresse holen - ist ein .php Skript auf meinem Webserver welche nur die Ip als Text zurück gibt<br />
IPADDR=$(wget -q -O- checkip.znil.org --no-check-certificate)<br />
#IPADDR=$(curl -s https://checkip.znil.org)<br />
<br />
# Den DNS-Eintrag der DynDNS-Adresse prüfen in dem wir den Google-DNS Server fragen<br />
DYNIP=$(dig +short @8.8.8.8 $HOST)<br />
<br />
# Vergleichen ob die beiden Einträge identisch sind<br />
if [ "$IPADDR" != "$DYNIP" ]<br />
then<br />
RESULT=$(curl -s "https://$USER:$PASS@members.dyndns.org/v3/update?hostname=$HOST&myip=$IPADDR")<br />
echo $RESULT<br />
else<br />
echo nochange $IPADDR<br />
fi<br />
exit 0<br />
</source><br />
<br><br />
----<br />
==Hinweise==<br />
Das Skript nutzt eine von mir gehostete Webseite https://checkip.znil.org für die Feststellung der eigenen IP-Adresse.<br><br />
Dahinter ist eine <code>index.php</code> mit folgenden Inhalt:<br><br />
<source lang="php"><br />
<?php<br />
$input = getenv("REMOTE_ADDR");<br />
echo $input;<br />
?><br />
</source><br />
Es wird also nur die IP-Adresse zurück gegeben.<br><br />
Um den aktuellen DNS-Eintrag zu prüfen wird google gefragt, das System auf dem das Skript läuft muss also auf Port 53 UDP in das Internet dürfen.<br><br />
Ich hatte extra keinen Internen DNS genommen, das ginge aber auch.<br><br />
Den "Updater Client Key" für DynDNS findet Ihr in euren Konto-Einstellungen dort. Steht dort keine so könnt Ihr per Knopfdruck einen erstellen.<br><br />
Das Skript updatet nur wenn es eine Änderung gibt.<br><br />
<br><br />
----<br />
==Kommentare==<br />
<comments /></div>BLinz