Jan Ulrich Hasecke
2022-07-08 2c93a1f13923de42bac5fbf0843c08140937c235
Geputzt
6 files renamed
20 files modified
981 ■■■■■ changed files
control/default/pdf.yml 4 ●●●● patch | view | raw | blame | history
source/plattform/backup/index.md 13 ●●●●● patch | view | raw | blame | history
source/plattform/index.md 7 ●●●● patch | view | raw | blame | history
source/plattform/netze/index.md 43 ●●●●● patch | view | raw | blame | history
source/plattform/rechenzentren/index.md 28 ●●●●● patch | view | raw | blame | history
source/plattform/redundanz/index.md 11 ●●●●● patch | view | raw | blame | history
source/plattform/replikation/index.md 10 ●●●● patch | view | raw | blame | history
source/referenz/backup/index.md 35 ●●●● patch | view | raw | blame | history
source/referenz/hostkeys/index.md 37 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/emailaddress/index.md 54 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/emailaliases/index.md 58 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/postgresqldb/index.md 47 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/postgresqluser/index.md 56 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/q/index.md 19 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/skript/createall.py patch | view | raw | blame | history
source/referenz/hsadmin/skript/createdomain.js patch | view | raw | blame | history
source/referenz/hsadmin/skript/createdomain.py patch | view | raw | blame | history
source/referenz/hsadmin/skript/createdomainandadmin.js patch | view | raw | blame | history
source/referenz/hsadmin/skript/createuseranddb.js patch | view | raw | blame | history
source/referenz/hsadmin/skript/createuseranddb.py patch | view | raw | blame | history
source/referenz/hsadmin/skript/index.md 380 ●●●●● patch | view | raw | blame | history
source/referenz/hsadmin/webfrontend/index.md 7 ●●●● patch | view | raw | blame | history
source/referenz/htaccess/index.md 66 ●●●●● patch | view | raw | blame | history
source/referenz/logging/index.md 47 ●●●● patch | view | raw | blame | history
source/referenz/php/index.md 28 ●●●●● patch | view | raw | blame | history
source/referenz/wartungsfenster/index.md 31 ●●●●● patch | view | raw | blame | history
control/default/pdf.yml
@@ -1,6 +1,6 @@
to: context
standalone: true
template: handbuch-vereine
template: userdoc
section-divs: true
top-level-division: chapter
csl: eva-berlin-konferenz.csl
@@ -9,4 +9,4 @@
data-dir: '${HS_PUBBASE}/pandoc/'
resource-path: ['.','${HS_PUBBASE}/pandoc/','${HS_PUBBASE}/context/tex/texmf-project/images']    
filters:
  - div-context.lua
  - div-context.lua
source/plattform/backup/index.md
@@ -1,12 +1,9 @@
# Backup
Hostsharing führt täglich Sicherungen der Daten der Produktivsysteme
durch. Die Datensicherungen werden in einem vom Produktivrechenzentrum
rund 5 km entfernten Rechenzentrum aufbewahrt. Die Datenübertragung
zwischen den Standorten erfolgt ssh-verschlüsselt über eigene Leitungen.
Die Backups jedes Produktivsystems werden separat archiviert und können
nur von diesem System zur Rücksicherung angefordert werden. Ferner wird
gewährleistet, dass Backups nicht nachträglich kompromittiert werden
können.
Hostsharing führt täglich Sicherungen der Daten der Produktivsysteme durch.
Die Datensicherungen werden in einem vom Produktivrechenzentrum rund 5 km entfernten Rechenzentrum aufbewahrt.
Die Datenübertragung zwischen den Standorten erfolgt ssh-verschlüsselt über eigene Leitungen.
Die Backups jedes Produktivsystems werden separat archiviert und können nur von diesem System zur Rücksicherung angefordert werden.
Ferner wird gewährleistet, dass Backups nicht nachträglich kompromittiert werden können.
In der Regel werden mindestens 15 Backups vorgehalten.
source/plattform/index.md
@@ -1,8 +1,5 @@
# Managed Operations Platform
In diesem Kapitel beschreiben wir Komponenten der Managed Operations
Platform.
::: {.toctree maxdepth="1"}
rechenzentren netze redundanz replikation monitoring backup
:::intro
In diesem Kapitel beschreiben wir Komponenten der Managed Operations Platform.
:::
source/plattform/netze/index.md
@@ -2,44 +2,31 @@
## Separierte Netzwerke
Die Aufteilung in private, abgeschottete Netze (VLANs) zwischen den
Managed Servern eines Nutzers erlaubt effiziente und sichere
Verbindungen.
Die Aufteilung in private, abgeschottete Netze (VLANs) zwischen den Managed Servern eines Nutzers erlaubt effiziente und sichere Verbindungen.
Dabei wird zwischen den folgenden Netzen unterschieden, die nicht nur
durch VLANs, sondern zusätzlich durch Verkabelung und separate Switches
oder Router getrennt sind:
Dabei wird zwischen den folgenden Netzen unterschieden, die nicht nur durch VLANs, sondern zusätzlich durch Verkabelung und separate Switches oder Router getrennt sind:
Frontend-Netzwerk
:   Dieses Netzwerk ist für allgemeine Anfragen gedacht. Die Firewall
    erlaubt aktuell den Zugang zu allen Adressen in diesem Netzwerk.
    Mittelfristig ist geplant, nur beabsichtigt belegte Ports
    freizugeben.
:   Dieses Netzwerk ist für allgemeine Anfragen gedacht.
Die Firewall erlaubt aktuell den Zugang zu allen Adressen in diesem Netzwerk.
Mittelfristig ist geplant, nur beabsichtigt belegte Ports freizugeben.
Server-Netzwerk
:   Physikalisch getrenntes Netzwerk zur Kommunikation der Anwendungen
    untereinander. In diesem Netzwerk lassen sich VLANs aufschalten, um
    den Traffic zwischen verschiedenen Anwendungskomponenten sicher
    übertragen zu können. Darüberhinaus können auch verschiedene
    Traffic-Arten einer Anwendung separiert werden, so z.B. die
    Verbindung einer Anwendung zur Datenbank von derjenigen zu einem
    Cache oder Load-Balancer.
:   Physikalisch getrenntes Netzwerk zur Kommunikation der Anwendungen untereinander.
In diesem Netzwerk lassen sich VLANs aufschalten, um den Traffic zwischen verschiedenen Anwendungskomponenten sicher übertragen zu können.
Darüberhinaus können auch verschiedene Traffic-Arten einer Anwendung separiert werden, so z.B.
die Verbindung einer Anwendung zur Datenbank von derjenigen zu einem Cache oder Load-Balancer.
Speichernetzwerk
:   Dieses Netzwerk wird verwendet für Storage-Traffic. Es basiert auf
    dedizierten Punkt-zu-Punkt-Verkabelungen, die von außen nicht
    erreichbar sind. Das Netzwerk nutzt private IPv4-Adressen und ist
    nicht nur von außen nicht erreichbar, sondern auch nur zugänglich
    für die Backup-Server, nicht jedoch für die Managed Server.
:   Dieses Netzwerk wird verwendet für Storage-Traffic.
Es basiert auf dedizierten Punkt-zu-Punkt-Verkabelungen, die von außen nicht erreichbar sind.
Das Netzwerk nutzt private IPv4-Adressen und ist nicht nur von außen nicht erreichbar, sondern auch nur zugänglich für die Backup-Server, nicht jedoch für die Managed Server.
Management-Netzwerk
:   Dieses physikalische Netzwerk wird verwendet für den Zugang zu
    IPMI-Controllern (Intelligent Platform Management Interface
    Controller), RAC (Remote Access Controller), Switches und Routern.
    Es verwendet private IPv4-Adressen, die von außen nicht erreichbar
    sind. Es wird auch noch verfügbar sein, wenn Probleme in den anderen
    Netzen auftauchen.
:   Dieses physikalische Netzwerk wird verwendet für den Zugang zu IPMI-Controllern (Intelligent Platform Management Interface Controller), RAC (Remote Access Controller), Switches und Routern.
Es verwendet private IPv4-Adressen, die von außen nicht erreichbar sind.
Es wird auch noch verfügbar sein, wenn Probleme in den anderen Netzen auftauchen.
source/plattform/rechenzentren/index.md
@@ -2,36 +2,28 @@
## Berlin, primärer Standort
Die Hostsharing eG betreibt ihre Community Cloud im [Berlin 1 Data
Center](https://www.e-shelter.de/de/location/berlin-1-data-center) von
NTT Global Data Centers. Das Rechenzentrum ist nach ISO 9001, ISO 27001
und ISO 50001 zertifiziert.
Die Hostsharing eG betreibt ihre Community Cloud im [Berlin 1 Data Center](https://www.e-shelter.de/de/location/berlin-1-data-center) von NTT Global Data Centers.
Das Rechenzentrum ist nach ISO 9001, ISO 27001 und ISO 50001 zertifiziert.
Wachschutz
:   Das Rechenzentrum wird durch ein 7-stufiges Sicherheitssystem vor
    unbefugtem Zutritt geschützt. Wachschutz und Sicherheitspersonal
    sind 24 Stunden am Tag anwesend, an 365 Tagen im Jahr.
:   Das Rechenzentrum wird durch ein 7-stufiges Sicherheitssystem vor unbefugtem Zutritt geschützt.
Wachschutz und Sicherheitspersonal sind 24 Stunden am Tag anwesend, an 365 Tagen im Jahr.
Betriebssicherheit
:   Ebenfalls rund um die Uhr an sieben Tagen in der Woche vor Ort ist
    kompetentes Betriebspersonal, das die ausfallkritische Infrastruktur
    überwacht. Bei einer Störung kann es sofort eingreifen, sodass
    Ausfälle verhindert und maximale Verfügbarkeit gewährleistet ist.
:   Ebenfalls rund um die Uhr an sieben Tagen in der Woche vor Ort ist kompetentes Betriebspersonal, das die ausfallkritische Infrastruktur überwacht.
Bei einer Störung kann es sofort eingreifen, sodass Ausfälle verhindert und maximale Verfügbarkeit gewährleistet ist.
    Das Rechenzentrum bietet standardmäßig Tier 3. Auf Anfrage kann
    Hostsharing Tier 4 gewährleisten.
Georedundanz
:   Das Berlin 1 Data Center ist eins von 160 Rechenzentren von NTT in
    über 20 Ländern. Auf Anfrage können mit dem Rechenzentrumsbetreiber
    georedundante Lösungen realisiert werden.
:   Das Berlin 1 Data Center ist eins von 160 Rechenzentren von NTT in über 20 Ländern.
Auf Anfrage können mit dem Rechenzentrumsbetreiber georedundante Lösungen realisiert werden.
## Berlin, sekundärer Standort
Hostsharing erstellt jeden Tag eine Datensicherung (Backup) in einem
zweiten, entfernten Rechenzentrum. Es ist nach ISO/IEC 27001:2013
zertifiziert und wird von der Firma [I/P/B Internet Provider in Berlin
GmbH](https://www.ipb.de/) betrieben.
Hostsharing erstellt jeden Tag eine Datensicherung (Backup) in einem zweiten, entfernten Rechenzentrum.
Es ist nach ISO/IEC 27001:2013 zertifiziert und wird von der Firma [I/P/B Internet Provider in Berlin GmbH](https://www.ipb.de/) betrieben.
source/plattform/redundanz/index.md
@@ -1,10 +1,7 @@
# Redundanz
Hostsharing hält Hardware und aktive Netzwerkkomponenten, welche für den
Produktiv-Betrieb erforderlich sind, redundant vor. Entsprechendes gilt
für die Netzwerk- und Stromverkabelung.
Hostsharing hält Hardware und aktive Netzwerkkomponenten, welche für den Produktiv-Betrieb erforderlich sind, redundant vor.
Entsprechendes gilt für die Netzwerk- und Stromverkabelung.
Auch die Stromversorgung und Peerings mit den Carrieren sind redundant
ausgelegt, letztere sogar mehrfach. So hat das Versagen einer einzelnen
Komponente -- abgesehen von Umschaltzeiten -- keine Auswirkungen auf den
Produktivbetrieb.
Auch die Stromversorgung und Peerings mit den Carrieren sind redundant ausgelegt, letztere sogar mehrfach.
So hat das Versagen einer einzelnen Komponente -- abgesehen von Umschaltzeiten -- keine Auswirkungen auf den Produktivbetrieb.
source/plattform/replikation/index.md
@@ -1,11 +1,5 @@
# Replikation
Hostsharing repliziert mit Hilfe der Software DRBD die
Festplatteninhalte aller Produktivsysteme in Echtzeit auf ein
Standby-System (RAID 1 über das Netzwerk).
Hostsharing repliziert mit Hilfe der Software DRBD die Festplatteninhalte aller Produktivsysteme in Echtzeit auf ein Standby-System (RAID 1 über das Netzwerk).
Auf diese Weise stellt Hostsharing sicher, dass im Fall eines
Hardwareschadens der Betrieb mit allen persistent gespeicherten Daten
unverzüglich fortgesetzt werden kann, ohne dass durch das Einspielen des
Backups Datenänderungen, die sich in der Zwischenzeit ergeben haben -
etwa eingegangene E-Mails oder Datenbanktransaktionen - verloren gehen.
Auf diese Weise stellt Hostsharing sicher, dass im Fall eines Hardwareschadens der Betrieb mit allen persistent gespeicherten Daten unverzüglich fortgesetzt werden kann, ohne dass durch das Einspielen des Backups Datenänderungen, die sich in der Zwischenzeit ergeben haben - etwa eingegangene E-Mails oder Datenbanktransaktionen - verloren gehen.
source/referenz/backup/index.md
@@ -1,23 +1,17 @@
# Backup {#kap-backup}
Hostsharing führt nächtliche Sicherungen der Daten durch. In der Regel
können jeweils mindestens die letzten 15 nächtlichen Datensicherungen
wiederhergestellt werden.
Hostsharing führt nächtliche Sicherungen der Daten durch.
In der Regel können jeweils mindestens die letzten 15 nächtlichen Datensicherungen wiederhergestellt werden.
In der Datensicherung enthalten sind:
-   die Paket-Konfiguration
-   die Dateien im Paket selbst, sofern diese nicht vom Paket-Admin
    explizit ausgeschlossen wurden
-   die Dateien im Paket selbst, sofern diese nicht vom Paket-Admin explizit ausgeschlossen wurden
-   die zum Paket gehörigen Datenbanken
-   die zum Paket gehörigen eingegangenen E-Mails
-   die Logfiles
::: attention
::: title
Attention
:::
In der Datensicherung sind **nicht** enthalten:
-   ausgehende, aber noch nicht versandte E-Mails
@@ -27,26 +21,17 @@
## Datenbanken
Unmittelbar vor Beginn der Sicherung der Daten des Dateisystems werden
MySQL-, PostgreSQL-Datenbanken und `crontab`{.interpreted-text
role="file"}-Dateien in das Verzeichnis
`/home/pacs/xyz00/.bak/`{.interpreted-text role="file"} gesichert. Diese
Sicherungen fließen in die nachfolgende Dateisystemsicherung ein. Die
Rücksicherung von Datenbanken erfolgt durch den Paket-Admin auf Basis
der im Verzeichnis `/home/pacs/xyz00/.bak/`{.interpreted-text
role="file"} abgelegten Datenbanksicherungen.
Unmittelbar vor Beginn der Sicherung der Daten des Dateisystems werden MySQL-, PostgreSQL-Datenbanken und `crontab`-Dateien in das Verzeichnis `/home/pacs/xyz00/.bak/` gesichert.
Diese Sicherungen fließen in die nachfolgende Dateisystemsicherung ein.
Die Rücksicherung von Datenbanken erfolgt durch den Paket-Admin auf Basis der im Verzeichnis `/home/pacs/xyz00/.bak/` abgelegten Datenbanksicherungen.
## Rücksicherung
Für die Rücksicherung der Datenbestände ist ein Rücksicherungsauftrag
für die betroffene Sicherungsdatei in Auftrag zu geben. Der
Rücksicherungsauftrag erfolgt per E-Mail an <service@hostsharing.net>
und beinhaltet folgende Angaben:
Für die Rücksicherung der Datenbestände ist ein Rücksicherungsauftrag für die betroffene Sicherungsdatei in Auftrag zu geben.
Der Rücksicherungsauftrag erfolgt per E-Mail an <service@hostsharing.net> und beinhaltet folgende Angaben:
-   das betreffende Webpaket,
-   den Pfad des rückzusichernden Verzeichnisses oder alternativ den
    Pfad und den Dateinamen der rückzusichernden Datei
-   den Pfad des rückzusichernden Verzeichnisses oder alternativ den Pfad und den Dateinamen der rückzusichernden Datei
-   sowie das Datum des angeforderten Sicherungslaufs.
Die Rücksicherung wird vom Service unter:
`/home/restore/YYY-MM-DD`{.interpreted-text role="file"} bereitgestellt.
Die Rücksicherung wird vom Service unter: `/home/restore/YYY-MM-DD` bereitgestellt.
source/referenz/hostkeys/index.md
@@ -1,10 +1,8 @@
# SSH-Hostkeys
Wenn Sie sich zum ersten Mal mit der Secure Shell
(`ssh`{.interpreted-text role="command"}) bei Hostsharing anmelden,
fragt das Programm nach, ob Sie dem Hostkey des Servers vertrauen
möchten. Das Hostsharing-System identifiziert sich Ihnen gegenüber mit
dem Fingerabdruck des Hostkeys. Die Meldung sieht folgendermaßen aus:
Wenn Sie sich zum ersten Mal mit der Secure Shell (`ssh`) bei Hostsharing anmelden, fragt das Programm nach, ob Sie dem Hostkey des Servers vertrauen möchten.
Das Hostsharing-System identifiziert sich Ihnen gegenüber mit dem Fingerabdruck des Hostkeys.
Die Meldung sieht folgendermaßen aus:
``` console
$ ssh xyz00@xyz00.hostsharing.net
@@ -13,15 +11,9 @@
Are you sure you want to continue connecting (yes/no)? 
```
In der zweiten Zeile der Meldung zeigt die Secure Shell den
Fingerabdruck des Servers an:
`SHA256:rPqZO8FA+FQW/rQ1itbuNF9uWmBH82MSQp44fR1v6tQ` Diesen können Sie
mit dem in der folgenden Liste aufgeführten Fingerabdruck vergleichen,
um sicherzugehen, dass Sie sich wirklich auf einem Server der
Hostsharing eG anmelden. Wenn die Fingerabdrücke übereinstimmen, können
Sie die Frage mit [yes]{.title-ref} beantworten. Die Secure Shell setzt
dann den Prozess des Einloggens fort und fragt nach dem Passwort für den
angegebenen Benutzer.
In der zweiten Zeile der Meldung zeigt die Secure Shell den Fingerabdruck des Servers an: `SHA256:rPqZO8FA+FQW/rQ1itbuNF9uWmBH82MSQp44fR1v6tQ` Diesen können Sie mit dem in der folgenden Liste aufgeführten Fingerabdruck vergleichen, um sicherzugehen, dass Sie sich wirklich auf einem Server der Hostsharing eG anmelden.
Wenn die Fingerabdrücke übereinstimmen, können Sie die Frage mit `yes` beantworten.
Die Secure Shell setzt dann den Prozess des Einloggens fort und fragt nach dem Passwort für den angegebenen Benutzer.
    SHA256:N1CtFnS1BwJrYoXUqZO61SM8RIpkfdhPOw+XVOaiYQo h01.hostsharing.net (RSA)
    SHA256:HVgsVWEw6pxUFPGEIIuZOrd9bBiGQu0jVoq+sDFqpGk h02.hostsharing.net (RSA)
@@ -106,18 +98,13 @@
    SHA256:rPqZO8FA+FQW/rQ1itbuNF9uWmBH82MSQp44fR1v6tQ h97.hostsharing.net (RSA)
    SHA256:N0iSQTm3AFAhdgQ4OhSptQ0vhuURPUyAt33L72ZeLM8 h98.hostsharing.net (RSA)
Den Namen des Servers, auf dem Ihr Web-Paket liegt, erfahren Sie in
HSAdmin. Gehen Sie dazu in den Bereich `Web-Paket`{.interpreted-text
role="guilabel"}, wählen Sie Ihr Web-Paket aus (in unserem Beispiel
`xyz00`). Es öffnet sich rechts der Reiter `Web-Paket`{.interpreted-text
role="guilabel"} und es werden Informationen zu Ihrem Paket angezeigt.
In der Zeile Server/Hive finden Sie die Bezeichnung des Servers, auf dem
Ihr Webpaket sich befindet.
Den Namen des Servers, auf dem Ihr Web-Paket liegt, erfahren Sie in HSAdmin.
Gehen Sie dazu in den Bereich `Web-Paket`, wählen Sie Ihr Web-Paket aus (in unserem Beispiel `xyz00`).
Es öffnet sich rechts der Reiter `Web-Paket` und es werden Informationen zu Ihrem Paket angezeigt.
In der Zeile Server/Hive finden Sie die Bezeichnung des Servers, auf dem Ihr Webpaket sich befindet.
::: {#fig_hsadmin-paket-info}
![Informationen über das Web-Paket.](images/hsadmin-paket-infos.jpg)
![Informationen über das Web-Paket.](images/hsadmin-paket-infos.jpg){width="100%"}
:::
In unserem Beispiel müssten Sie den Fingerabdruck von
h97.hostsharing.net mit dem von der Secure Shell angezeigten
vergleichen.
In unserem Beispiel müssten Sie den Fingerabdruck von h97.hostsharing.net mit dem von der Secure Shell angezeigten vergleichen.
source/referenz/hsadmin/emailaddress/index.md
@@ -2,62 +2,48 @@
## Funktionen
::: option
emailaddress.search
`emailaddress.search`
Suche E-Mail-Adresse nach den im Befehlsausdruck angegebenen Feldern und
Werten
:::
: Suche E-Mail-Adresse nach den im Befehlsausdruck angegebenen Feldern und Werten
::: option
emailaddress.add
`emailaddress.add`
Füge eine neue E-Mail-Adresse nach den im Befehlsausdruck angegebenen
Feldern und Werten hinzu.
:::
: Füge eine neue E-Mail-Adresse nach den im Befehlsausdruck angegebenen Feldern und Werten hinzu.
::: option
emailaddress.update
`emailaddress.update`
Aktualisiere eine E-Mail-Adresse nach den im Befehlsausdruck angegebenen
Feldern und Werten.
:::
: Aktualisiere eine E-Mail-Adresse nach den im Befehlsausdruck angegebenen Feldern und Werten.
::: option
emailaddress.remove
`emailaddress.remove`
Lösche eine E-Mail-Adresse nach den im Befehlsausdruck angegebenen
Feldern und Werten.
:::
: Lösche eine E-Mail-Adresse nach den im Befehlsausdruck angegebenen Feldern und Werten.
## Editierbare Felder
Das HSAdmin-Modul `emailaddress` kann entsprechend der folgenden
Befehlssyntax von `HSAdmin`{.interpreted-text role="command"} Felder
setzen oder verändern:
Das HSAdmin-Modul `emailaddress` kann entsprechend der folgenden Befehlssyntax von `HSAdmin`{.interpreted-text role="command"} Felder setzen oder verändern:
    emailaddress.function({where:{field:'value',...}, set:{field:'value',...}})
Im Modul `emailaddress` stehen folgende Felder zur Verfügung.
domain
`domain`
:   Name einer Domain
localpart
`localpart`
:   Bezeichnung für den lokalen Teil einer E-Mail-Adresse: der Teil vor
    `@`.
target
`target`
:   Ziel einer E-Mail-Adresse, mehrere Ziele werden durch Kommata
    getrennt
## Beispiele
Mit dem folgenden Befehl erhalten Sie eine Liste aller E-Mail-Adressen
der Domain `hs-example.de`.
Mit dem folgenden Befehl erhalten Sie eine Liste aller E-Mail-Adressen der Domain `hs-example.de`.
``` console
xyz00@hsadmin> emailaddress.search({where:{domain:"hs-example.de"}})
@@ -70,8 +56,7 @@
xyz00@hsadmin> emailaddress.add ({set:{domain:'hs-example.de',localpart:'info',target:'xyz00-hs_example.de'}})
```
Das Programm gibt dann folgende Meldung als Quittierung des Befehls
zurück:
Das Programm gibt dann folgende Meldung als Quittierung des Befehls zurück:
``` console
[
@@ -90,9 +75,8 @@
]
```
Wenn später einmal der Wunsch aufkommt, die eintreffenden E-Mails
stattdessen an eine externe E-Mail-Adresse weiterzuleiten, kann man den
Eintrag aktualisieren. Das Ziel (`target`) lässt sich entweder ändern:
Wenn später einmal der Wunsch aufkommt, die eintreffenden E-Mails stattdessen an eine externe E-Mail-Adresse weiterzuleiten, kann man den Eintrag aktualisieren.
Das Ziel (`target`) lässt sich entweder ändern:
``` console
xyz00@hsadmin> emailaddress.update ({where:{domain:'hs-example.de',localpart:'info'}, set:{target:'andere@mail.de'}})
@@ -112,8 +96,8 @@
]
```
Oder man ergänzt die neue E-Mail-Adresse, indem man sie zusätzlich
einfügt. Mehrere Ziele werden mit Kommata abgegrenzt.
Oder man ergänzt die neue E-Mail-Adresse, indem man sie zusätzlich einfügt.
Mehrere Ziele werden mit Kommata abgegrenzt.
``` console
xyz00@hsadmin> emailaddress.update ({where:{domain:'hs-example.de',localpart:'info'}, set:{target:'andere@mail.de,xzy00-hs_example.de'}})
source/referenz/hsadmin/emailaliases/index.md
@@ -1,82 +1,62 @@
# Modul emailalias {#kap-modul-emailalias}
Mit diesem Modul können Sie ein E-Mail-Alias setzen. Ein typischer
Anwendungsfall wird in `kap-email-alias`{.interpreted-text
role="numref"} beschrieben.
Mit diesem Modul können Sie ein E-Mail-Alias setzen.
Ein typischer Anwendungsfall wird im Abschnitt [E-mail-Alias einrichten](#kap-email-alias) beschrieben.
## Funktionen
::: option
emailalias.search
`emailalias.search`
Suche E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern und
Werten
:::
: Suche E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern und Werten
::: option
emailalias.add
`emailalias.add`
Füge eine neue E-Mail-Alias nach den im Befehlsausdruck angegebenen
Feldern und Werten hinzu.
:::
Füge eine neue E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern und Werten hinzu.
::: option
emailalias.update
`emailalias.update`
Aktualisiere eine E-Mail-Alias nach den im Befehlsausdruck angegebenen
Feldern und Werten.
:::
Aktualisiere eine E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern und Werten.
::: option
emailalias.remove
`emailalias.remove`
Lösche eine E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern
und Werten.
:::
Lösche eine E-Mail-Alias nach den im Befehlsausdruck angegebenen Feldern und Werten.
## Editierbare Felder
Das HSAdmin-Modul `emailalias` kann entsprechend der folgenden
Befehlssyntax von `HSAdmin`{.interpreted-text role="command"} Felder
setzen oder verändern:
Das HSAdmin-Modul `emailalias` kann entsprechend der folgenden Befehlssyntax von `HSAdmin` Felder setzen oder verändern:
    emailalias.function({where:{field:'value',...}, set:{field:'value',...}})
Im Modul `emailalias` stehen folgende Felder zur Verfügung.
name
`name`
:   Name des E-Mail-Alias
target
`target`
:   Ziel einer E-Mail-Adresse; mehrere Ziele werden durch Kommata
    getrennt
## Beispiele
Das folgende E-Mail-Alias überschreibt die Voreinstellung für den
Paket-Admin `xyz00`. E-Mails an diesen Benutzer landen nicht mehr in
seinem Postfach, sondern werden an die E-Mailadresse
`webmaster@hs-example.de` weitergeleitet.
Das folgende E-Mail-Alias überschreibt die Voreinstellung für den Paket-Admin `xyz00`.
E-Mails an diesen Benutzer landen nicht mehr in seinem Postfach, sondern werden an die E-Mailadresse `webmaster@hs-example.de` weitergeleitet.
``` console
xyz00@hsadmin> emailalias.add ({set:{name:'xyz00',target:'webmaster@hs-example.de'}})
```
In dem nächsten beiden Beispielen wird zunächst nach der Konfiguration
für das E-Mail-Alias `xyz00` gesucht. Anschließend wird ein Postfach
`xyz00-mailbox` zusätzlich zu der bereits eingetragenen E-Mail-Adresse
hinzugefügt. Da das Programm die Felder komplett überschreibt, müssen
alle Werte angegeben werden.
In dem nächsten beiden Beispielen wird zunächst nach der Konfiguration für das E-Mail-Alias `xyz00` gesucht.
Anschließend wird ein Postfach `xyz00-mailbox` zusätzlich zu der bereits eingetragenen E-Mail-Adresse hinzugefügt.
Da das Programm die Felder komplett überschreibt, müssen alle Werte angegeben werden.
``` console
xyz00@hsadmin> emailalias.search ({where:{name:'xyz00'}})
xyz00@hsadmin> emailalias.update ({where:{name:'xyz00'},set:{target:'xyz00-mailbox,webmaster@hs-example.de'}})
```
Im letzten Beispiel wird das E-Mail-Alias wieder gelöscht, sodass
E-Mails an den Paket-Admin wieder an sein Postfach ausgeliefert werden.
Im letzten Beispiel wird das E-Mail-Alias wieder gelöscht, sodass E-Mails an den Paket-Admin wieder an sein Postfach ausgeliefert werden.
``` console
xyz00@hsadmin> emailalias.remove ({where:{name:'xyz00'}})
source/referenz/hsadmin/postgresqldb/index.md
@@ -2,69 +2,54 @@
## Funktionen
::: option
postgresqldb.search
`postgresqldb.search`
Suche Datenbank nach den im Befehlsausdruck angegebenen Feldern und
: Suche Datenbank nach den im Befehlsausdruck angegebenen Feldern und
Werten
:::
::: option
postgresqldb.add
`postgresqldb.add`
Füge eine neue Datenbank nach den im Befehlsausdruck angegebenen Feldern
und Werten hinzu.
:::
: Füge eine neue Datenbank nach den im Befehlsausdruck angegebenen Feldern und Werten hinzu.
::: option
postgresqldb.update
`postgresqldb.update`
Aktualisiere eine Datenbank nach den im Befehlsausdruck angegebenen
Feldern und Werten.
:::
: Aktualisiere eine Datenbank nach den im Befehlsausdruck angegebenen Feldern und Werten.
::: option
postgresqldb.remove
Lösche eine Datenbank nach den im Befehlsausdruck angegebenen Feldern
und Werten.
:::
`postgresqldb.remove`
: Lösche eine Datenbank nach den im Befehlsausdruck angegebenen Feldern und Werten.
## Editierbare Felder
Das HSAdmin-Modul `postgresqldb` kann entsprechend der folgenden
Befehlssyntax von `HSAdmin`{.interpreted-text role="command"} Felder
setzen oder verändern:
Das HSAdmin-Modul `postgresqldb` kann entsprechend der folgenden Befehlssyntax von `HSAdmin` Felder setzen oder verändern:
    postgresqldb.function({where:{field:'value',...}, set:{field:'value',...}})
Im Modul `postgresqldb` stehen folgende Felder zur Verfügung.
name
`name`
:   Datenbankname (z.B. xyz00_abc)
owner
`owner`
:   Datenbanknutzer (z.B. xyz00_owner)
encoding
`encoding`
:   Zeichensatz der Datenbank (Standard ist UTF-8)
## Beispiele
Im ersten Beispiel erzeugen wir die Datenbank `xyz00_abc` und übergeben
ihr als Besitzer den Datenbanknutzer `xyz00_owner`.
Im ersten Beispiel erzeugen wir die Datenbank `xyz00_abc` und übergeben ihr als Besitzer den Datenbanknutzer `xyz00_owner`.
``` console
xyz00@hsadmin> postgresqldb.add({set:{name:'xyz00_abc',owner:'xyz00_owner'}})
```
Die den beiden folgenden Beispielen lassen wir uns zunächst mit
`postgresqldb.search`{.interpreted-text role="option"} Informationen zur
Datenbank `xyz00_abc` anzeigen. Anschließend löschen wir sie mit
`postgresqldb.remove`{.interpreted-text role="option"}.
Die den beiden folgenden Beispielen lassen wir uns zunächst mit `postgresqldb.search` Informationen zur Datenbank `xyz00_abc` anzeigen.
Anschließend löschen wir sie mit `postgresqldb.remove`.
``` console
xyz00@hsadmin> postgresqldb.search({where:{name:'xyz00_abc'}})
source/referenz/hsadmin/postgresqluser/index.md
@@ -2,49 +2,37 @@
## Funktionen
::: option
postgresqluser.search
`postgresqluser.search`
Suche Datenbank-Benutzer nach den im Befehlsausdruck angegebenen Feldern
und Werten
:::
: Suche Datenbank-Benutzer nach den im Befehlsausdruck angegebenen Feldern und Werten
::: option
postgresqluser.add
`postgresqluser.add`
Füge einen neuen Datenbank-Benutzer nach den im Befehlsausdruck
angegebenen Feldern und Werten hinzu.
:::
: Füge einen neuen Datenbank-Benutzer nach den im Befehlsausdruck angegebenen Feldern und Werten hinzu.
::: option
postgresqluser.update
`postgresqluser.update`
Aktualisiere einen Datenbank-Benutzer nach den im Befehlsausdruck
angegebenen Feldern und Werten.
:::
: Aktualisiere einen Datenbank-Benutzer nach den im Befehlsausdruck angegebenen Feldern und Werten.
::: option
postgresqluser.remove
Lösche einen Datenbank-Benutzer nach den im Befehlsausdruck angegebenen
Feldern und Werten.
:::
`postgresqluser.remove`
: Lösche einen Datenbank-Benutzer nach den im Befehlsausdruck angegebenen Feldern und Werten.
## Editierbare Felder
Das HSAdmin-Modul `postgresqluser` kann entsprechend der folgenden
Befehlssyntax von `HSAdmin`{.interpreted-text role="command"} Felder
setzen oder verändern:
Das HSAdmin-Modul `postgresqluser` kann entsprechend der folgenden Befehlssyntax von `HSAdmin` Felder setzen oder verändern:
    postgresqluser.function({where:{field:'value',...}, set:{field:'value',...}})
Im Modul `postgresqluser` stehen folgende Felder zur Verfügung.
name
`name`
:   Name des Datenbank-Benutzers (z.B. `xyz00_owner`)
password
`password`
:   Passwort des Datenbank-Benutzers
@@ -57,26 +45,24 @@
xyz00@hsadmin> postgresqluser.add ({set:{name:'xyz00_owner',password:'!1?2-3aBc'}})
```
Mit `postgresqluser.search`{.interpreted-text role="option"} können wir
die Eigenschaften eines Benutzers anzeigen. Der gewünschte Benutzer wird
mit `where` ausgewählt.
Mit `postgresqluser.search` können wir die Eigenschaften eines Benutzers anzeigen.
Der gewünschte Benutzer wird mit `where` ausgewählt.
``` console
xyz00@hsadmin> postgresqluser.search ({where:{name:'xyz00_owner'}})
```
Mit `postgresqluser.update`{.interpreted-text role="option"} können
Eigenschaften eines Benutzers verändert werden. Der gewünschte Benutzer
wird mit `where` ausgewählt. Anschliend wird in unserem Beispiel mit
`set` ein neues Passwort gesetzt.
Mit `postgresqluser.update` können Eigenschaften eines Benutzers verändert werden.
Der gewünschte Benutzer wird mit `where` ausgewählt.
Anschliend wird in unserem Beispiel mit `set` ein neues Passwort gesetzt.
``` console
xyz00@hsadmin> postgresqluser.update ({where:{name:'xyz00_owner'},set:{password:'neues-passwort'}})
```
Und zuletzt können Datenbank-Benutzer auch wieder gelöscht werden. Dazu
benutzen wir den Befehl `postgresqluser.remove`{.interpreted-text
role="option"}. Der zu löschende Benutzer wird mit `where` ausgewählt.
Und zuletzt können Datenbank-Benutzer auch wieder gelöscht werden.
Dazu benutzen wir den Befehl `postgresqluser.remove`.
Der zu löschende Benutzer wird mit `where` ausgewählt.
``` console
xyz00@hsadmin> postgresqluser.remove ({where:{name:'xyz00_owner'}})
source/referenz/hsadmin/q/index.md
@@ -2,18 +2,15 @@
## Funktionen
::: option
q.search
`q.search`
Das HSAdmin-Modul hat nur die Funktion `search`. Hiermit ist die Ausgabe
der bereits ausgeführten HSAdmin-Aktionen möglich. Die Ausgabe zeigt an,
ob eine Aktion erfolgreich abgeschlossen werden konnte oder ob beim
Ausrollen der Konfiguration auf den Server Fehler aufgetreten sind. Im
Erfolgsfall wird als Status \'done\' angezeigt. Wenn Fehler aufgetreten
sind wird der Status \'error\' ausgegeben. Daneben wird eine interne
Fehlermeldung im Feld \'exception\' angezeigt. Wenden Sie sich im
Fehlerfall bitte an den Service.
:::
: Das HSAdmin-Modul hat nur die Funktion `search`.
Hiermit ist die Ausgabe der bereits ausgeführten HSAdmin-Aktionen möglich.
Die Ausgabe zeigt an, ob eine Aktion erfolgreich abgeschlossen werden konnte oder ob beim Ausrollen der Konfiguration auf den Server Fehler aufgetreten sind.
Im Erfolgsfall wird als Status ›done‹ angezeigt.
Wenn Fehler aufgetreten sind wird der Status ›error‹ ausgegeben.
Daneben wird eine interne Fehlermeldung im Feld ›exception‹ angezeigt.
Wenden Sie sich im Fehlerfall bitte an den Service.
## Beispiele
source/referenz/hsadmin/skript/createall.py
source/referenz/hsadmin/skript/createdomain.js
source/referenz/hsadmin/skript/createdomain.py
source/referenz/hsadmin/skript/createdomainandadmin.js
source/referenz/hsadmin/skript/createuseranddb.js
source/referenz/hsadmin/skript/createuseranddb.py
source/referenz/hsadmin/skript/index.md
@@ -1,39 +1,29 @@
# HSAdmin über Skripte steuern {#kap-hsscript-skript}
In `kap-hsadmin-syntax`{.interpreted-text role="numref"} wurde die
Option `-f`{.interpreted-text role="option"} erwähnt, die gesetzt werden
kann, um HSAdmin eine Datei zu übergeben, in der sich die Befehle
befinden. Die Option ermöglicht es, ohne großen Aufwand Skriptdateien zu
pflegen, mit denen wiederkehrende Aufgaben bequem erledigt werden
können. Dieses Kapitel zeigt, wie Sie die Anlage einer neuen
Wordpress-Website mit Hilfe eines solchen Skripts vereinfachen können.
Im Abschnitt [Syntax](#kap-hsadmin-syntax) wurde die Option `-f` erwähnt, die gesetzt werden kann, um HSAdmin eine Datei zu übergeben, in der sich die Befehle befinden.
Die Option ermöglicht es, ohne großen Aufwand Skriptdateien zu pflegen, mit denen wiederkehrende Aufgaben bequem erledigt werden können.
Dieses Kapitel zeigt, wie Sie die Anlage einer neuen Wordpress-Website mit Hilfe eines solchen Skripts vereinfachen können.
Bevor Sie die eigentliche Wordpress-Software installiert, müssen mehrere
Schritte auf der Hostsharing-Plattform erledigt sein.
Bevor Sie die eigentliche Wordpress-Software installiert, müssen mehrere Schritte auf der Hostsharing-Plattform erledigt sein.
1.  Es existiert ein `Domain-Admin`{.interpreted-text role="role"} bzw.
    es wird ein neuer Domain-Admin angelegt.
2.  Es wird eine Domain erstellt und dem Domain-Admin zugewiesen.
3.  Es wird ein `Datenbank-Nutzer`{.interpreted-text role="role"}
    angelegt.
4.  Es wird eine Datenbank angelegt und dem Datenbank-Nutzer zugewiesen.
1. Es existiert ein Domain-Admin bzw. es wird ein neuer Domain-Admin angelegt.
2. Es wird eine Domain erstellt und dem Domain-Admin zugewiesen.
3. Es wird ein Datenbank-Nutzer angelegt.
4. Es wird eine Datenbank angelegt und dem Datenbank-Nutzer zugewiesen.
Mit der folgenden Skript-Datei kann man diese vier Schritte mit einem
Befehl ausführen.
Mit der folgenden Skript-Datei kann man diese vier Schritte mit einem Befehl ausführen.
``` {.text linenos=""}
```bash
user.add ({set:{name:'xyz00-domains',comment:'Domain-Admin',password:'!1?2-3aBc',shell:'/bin/bash'}})
domain.add ({set:{name:'beispiel.de',user:'xyz00-domains'}})
mysqluser.add  ({set:{name:'xyz00_owner',password:'?2?3-4cVg'}})
mysqldb.add ({set:{name:'xyz00_abc',owner:'xyz00_owner'}})
```
In Zeile 1 wird der Domain-Admin erzeugt, in Zeile 2 die Domain
`beispiel.de` angelegt, in Zeile 3 der Datenbank-Nutzer und in Zeile 4
die Datenbank. Es ist möglich, die Datei lesbarer zu formatieren, indem
man jedem Key-Value-Paar eine eigene Zeile zuweist.
In Zeile 1 wird der Domain-Admin erzeugt, in Zeile 2 die Domain `beispiel.de` angelegt, in Zeile 3 der Datenbank-Nutzer und in Zeile 4 die Datenbank.
Es ist möglich, die Datei lesbarer zu formatieren, indem man jedem Key-Value-Paar eine eigene Zeile zuweist.
``` {.text linenos=""}
```bash
user.add ({set:{
name:'xyz00-domains',
comment:'Domain-Admin',
@@ -54,66 +44,69 @@
}})
```
Wenn Sie die Datei unter dem Namen `befehlsskript.txt`{.interpreted-text
role="file"} im Verzeichnis des `Paket-Admin`{.interpreted-text
role="role"} speichern, können Sie alle Befehle mit einem HSAdmin-Aufruf
abarbeiten:
Wenn Sie die Datei unter dem Namen `befehlsskript.txt` im Verzeichnis des `Paket-Admin` speichern, können Sie alle Befehle mit einem HSAdmin-Aufruf abarbeiten:
``` console
xyz00@h50:~$ hsscript -f befehlsskript.txt
```
Wenn Sie beispielsweise häufig Wordpress-Websites installieren, können
Sie für jede Website eine solche Befehlsdatei anlegen und unter einem
sinnvollen Namen (z.B. `wordpress-beispiel_de.txt`{.interpreted-text
role="file"}) abspeichern.
Wenn Sie beispielsweise häufig Wordpress-Websites installieren, können Sie für jede Website eine solche Befehlsdatei anlegen und unter einem sinnvollen Namen (z.B. `wordpress-beispiel_de.txt`) abspeichern.
::: admonition
:::admonition
Beachten Sie die richtige Reihenfolge
Bei der Anlage von Benutzern, Datenbanken und Domains ist die im
Beispiel gezeigt Reihenfolge einzuhalten. Um eine Domain anzulegen, muss
der Domain-Admin bereits existieren. Eine Datenbank kann nur erzeugt
werden, wenn der Datenbank-Nutzer bereits angelegt ist.
Bei der Anlage von Benutzern, Datenbanken und Domains ist die im Beispiel gezeigt Reihenfolge einzuhalten.
Um eine Domain anzulegen, muss der Domain-Admin bereits existieren.
Eine Datenbank kann nur erzeugt werden, wenn der Datenbank-Nutzer bereits angelegt ist.
Beim Löschen müssen Sie die Reihenfolge umkehren: Datenbank löschen,
Datenbank-Nutzer löschen, Domain löschen, Domain-Admin löschen.
Beim Löschen müssen Sie die Reihenfolge umkehren: Datenbank löschen, Datenbank-Nutzer löschen, Domain löschen, Domain-Admin löschen.
:::
Noch bequemer ist es, die notwendigen Benutzer, Domains und Datenbanken
mit Hilfe eines ausführlicheren JS-Skripts oder über die Python-API
anzulegen.
Noch bequemer ist es, die notwendigen Benutzer, Domains und Datenbanken mit Hilfe eines ausführlicheren JS-Skripts oder über die Python-API anzulegen.
## HSAdmin mit Javascript ansprechen
Im Folgenden zeigen wir zwei JS-Skripts, die in der Regel im Verzeichnis
des `Paket-Admin`{.interpreted-text role="role"} mit dessen
Benutzerrechten aufgerufen werden. Mit dem ersten Skript erstellen wir
eine Domain und weisen ihr einen eigenen Domain-Admin zu, dessen Name
aus dem Namen der Domain abgeleitet wird. Mit dem zweiten Skript
erzeugen wir eine Datenbank und einen Datenbank-Nutzer, sodass wir unter
der gewünschten Domain zum Beispiel eine PHP-Anwendung wie Wordpress
einrichten können.
Im Folgenden zeigen wir zwei JS-Skripts, die in der Regel im Verzeichnis des Paket-Admin mit dessen Benutzerrechten aufgerufen werden.
Mit dem ersten Skript erstellen wir eine Domain und weisen ihr einen eigenen Domain-Admin zu, dessen Name aus dem Namen der Domain abgeleitet wird.
Mit dem zweiten Skript erzeugen wir eine Datenbank und einen Datenbank-Nutzer, sodass wir unter der gewünschten Domain zum Beispiel eine PHP-Anwendung wie Wordpress einrichten können.
### JS-Skript zur Anlage einer Domain
Ein Skript, um eine Domain mit einem gesonderten Domain-Admin anzulegen,
könnte so aussehen:
Ein Skript, um eine Domain mit einem gesonderten Domain-Admin anzulegen, könnte so aussehen:
::: {.literalinclude linenos=""}
createdomainandadmin.js
:::
```bash
#!/usr/local/bin/hsscript -f
Die Funktion `pwGen()` erzeugt ein achtstelliges Passwort aus einer
Reihe von vorgegebenen Zeichen. Empfehlenswert sind längere Passworte.
Die Funktion `createDomainAndDomainAdmin(args)` erzeugt die Domain und
den Domain-Admin. Der Namen des Domain-Admin ergibt sich aus dem Namen
der Domain. Bei einer Domain, die einen Bindestrich enthält, muss dieser
durch einen Unterstrich ersetzt werden, da Benutzernamen nur einen
Bindestrich enthalten dürfen.
createDomainAndDomainAdmin(arguments);
Das Skript wird im Benutzerverzeichnis des Paket-Admin gespeichert und
ausführbar gemacht:
function pwGen() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_#%&+!?=";
    var pwLength = 12;
    var randomstring = '';
    for (var i=0; i<pwLength; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    return randomstring;
}
function createDomainAndDomainAdmin(args) {
    var domainName = args[0];
    var userName = 'xyz00-' + args[0].replace("-","_");
    var randomPassword = pwGen();
    var createdUser = user.add({set:{name:userName,password:randomPassword,shell:'/bin/bash'}});
    var createdDomain = domain.add({set:{name:domainName,user:userName}});
    print("created domain " + createdDomain[0].name + " with domainadmin " + createdUser[0].name + " and password " + randomPassword);
}
```
Die Funktion `pwGen()` erzeugt ein achtstelliges Passwort aus einer Reihe von vorgegebenen Zeichen.
Empfehlenswert sind längere Passworte.
Die Funktion `createDomainAndDomainAdmin(args)` erzeugt die Domain und den Domain-Admin.
Der Namen des Domain-Admin ergibt sich aus dem Namen der Domain.
Bei einer Domain, die einen Bindestrich enthält, muss dieser durch einen Unterstrich ersetzt werden, da Benutzernamen nur einen Bindestrich enthalten dürfen.
Das Skript wird im Benutzerverzeichnis des Paket-Admin gespeichert und ausführbar gemacht:
``` console
xyz00@h50:~$ chmod u+x createdomainandadmin.js
@@ -126,29 +119,69 @@
created domain my-domain.de with domainadmin xyz00-my_domain.de and password slo%haY=
```
Wenn Sie alle Domains mit einem einzigen Domain-Admin verwalten, können
Sie den Benutzernamen des Domain-Admin hart kodieren. Zeile 18 lautet
dann:
Wenn Sie alle Domains mit einem einzigen Domain-Admin verwalten, können Sie den Benutzernamen des Domain-Admin hart kodieren.
::: {.literalinclude lines="18"}
createdomain.js
:::
```bash
#!/usr/local/bin/hsscript -f
createDomainAndDomainAdmin(arguments);
function pwGen() {
       var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_#%&+!?=";
       var string_length = 12;
       var randomstring = '';
       for (var i=0; i<string_length; i++) {
                  var rnum = Math.floor(Math.random() * chars.length);
                  randomstring += chars.substring(rnum,rnum+1);
              }
       return randomstring;
}
function createDomainAndDomainAdmin(args) {
       var domainName = args[0];
       var userName = 'xyz00-doms';
       var randomPassword = pwGen();
       var createdUser = user.add({set:{name:userName,password:randomPassword,shell:'/bin/bash'}});
       var createdDomain = domain.add({set:{name:domainName,user:userName}});
       print("created domain " + createdDomain[0].name + " with domainadmin " + createdUser[0].name + " and password " + randomPassword);
```
### JS-Skript zur Anlage einer Datenbank
Das Skript zur Anlage einer Datenbank und eines Datenbank-Nutzers sieht
ähnlich aus.
::: {.literalinclude linenos=""}
createuseranddb.js
:::
```bash
#!/usr/local/bin/hsscript -f
Die Funktion `createMySQLUserAndDB(args)` erzeugt den Datenbank-Nutzer
und die Datenbank. Da sich Datenbank und Datenbank-Nutzer nicht in die
Quere kommen, haben sie der Einfachheit halber den gleichen Namen.
createMySQLUserAndDB(arguments);
Beim Aufruf des Skripts muss eine Zeichenkette übergeben werden, die
Bestandteil der Namen von Datenbank und Datenbank-Nutzer wird.
function pwGen() {
   var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_#%&+!?=";
   var pwLength = 18;
   var randomstring = '';
   for (var i=0; i<pwLength; i++) {
       var rnum = Math.floor(Math.random() * chars.length);
       randomstring += chars.substring(rnum,rnum+1);
   }
   return randomstring;
}
function createMySQLUserAndDB(args) {
   var userName = 'xyz00_' + args[0];
   var dbName = userName;
   var randomPassword = pwGen();
   var createdUser = mysqluser.add({set:{name:userName,password:randomPassword}});
   var createdDatabase = mysqldb.add({set:{name:dbName,owner:userName}});
   print("created user " + createdUser[0].name + " and database " + createdDatabase[0].name + " with password " + randomPassword);
```
Die Funktion `createMySQLUserAndDB(args)` erzeugt den Datenbank-Nutzer und die Datenbank.
Da sich Datenbank und Datenbank-Nutzer nicht in die Quere kommen, haben sie der Einfachheit halber den gleichen Namen.
Beim Aufruf des Skripts muss eine Zeichenkette übergeben werden, die Bestandteil der Namen von Datenbank und Datenbank-Nutzer wird.
``` console
xyz00@h50:~$ ./createuseranddb.js my_domain_wordpress
@@ -156,10 +189,6 @@
```
::: attention
::: title
Attention
:::
Merken Sie sich die Passworte, da Sie diese später benötigen. Bei einer
Datenbank-Anwendungen müssen Sie bei der Konfiguration den
Datenbank-Benutzer und sein Passwort angeben.
@@ -167,20 +196,20 @@
## Nutzung der Python-API {#kap-python-api}
Sie können HSAdmin auch remote über die Python-API des Programms
ansprechen. Das ermöglicht es Ihnen von einem entfernten Rechner aus
HSAdmin zu bedienen. Um mit der Python-API zu arbeiten müssen Sie
zunächst die Python-Bindings für HSAdmin installieren.
Sie können HSAdmin auch remote über die Python-API des Programms ansprechen.
Das ermöglicht es Ihnen von einem entfernten Rechner aus HSAdmin zu bedienen.
Um mit der Python-API zu arbeiten müssen Sie zunächst die Python-Bindings für HSAdmin installieren.
### Installation von hs.admin.api
Wir installieren die Python-Bindings in einer virtuellen
Python-Umgebung, sodass wir diese zunächst einrichten und aktivieren.
Wir installieren die Python-Bindings in einer virtuellen Python-Umgebung, sodass wir diese zunächst einrichten und aktivieren.
``` console
$ python3 -m venv /hsadmin
$ . /hsadmin/bin/activate
```
<!-- todo: pipenv? -->
Anschließend klonen wir die Python-Bindings und installieren sie.
@@ -190,62 +219,69 @@
$ python setup.py install 
```
Nun steht uns das Modul mit dem Python-Bindings in der virtuellen
Umgebung zur Verfügung, sodass wir es in einem Skript importieren
können.
Nun steht uns das Modul mit dem Python-Bindings in der virtuellen Umgebung zur Verfügung, sodass wir es in einem Skript importieren können.
### Python-Skript
Um die API in einem Skript nutzen zu können, müssen wir mit folgendem
Code ein API-Objekt erzeugen.
Um die API in einem Skript nutzen zu können, müssen wir mit folgendem Code ein API-Objekt erzeugen.
::: {.literalinclude linenos="" lines="1-9"}
createdomain.py
:::
```python
from hs.admin.api import API
Nun ist es möglich, mit der üblichen Syntax HSAdmin im Skript
anzusprechen.
api = API(cas=dict(
    uri='https://login.hostsharing.net/cas/v1/tickets',
    service='https://config.hostsharing.net:443/hsar/backend'),
    credentials=dict(username='xyz00', password='sehr-geheim'),
    backends=[
        'https://config.hostsharing.net:443/hsar/xmlrpc/hsadmin',
        'https://config2.hostsharing.net:443/hsar/xmlrpc/hsadmin'])
Mit diesen beiden Befehlen legen wir beispielsweise einen Domain-Admin
und eine neue Domain an.
api.user.add(set={'name': 'xyz00-domain.de', 'password': 'geheim', 'shell': '/bin/bash'})
api.domain.add(set={'name': 'domain.de', 'user': 'xyz00-domain.de'})
```
::: {.literalinclude lines="11-12"}
createdomain.py
:::
Nun ist es möglich, mit der üblichen Syntax HSAdmin im Skript anzusprechen.
Mit diesen beiden Befehlen legen wir beispielsweise einen Domain-Admin und eine neue Domain an.
```python
api.user.add(set={'name': 'xyz00-domain.de', 'password': 'geheim', 'shell': '/bin/bash'})
api.domain.add(set={'name': 'domain.de', 'user': 'xyz00-domain.de'})
```
Eine Datenbank lässt sich folgendermaßen anlegen.
::: {.literalinclude lines="11-12"}
createuseranddb.py
:::
```python
from hs.admin.api import API
Nun wollen wir diese Befehle in ein Skript einbauen, das noch einige
andere nützliche Dinge für uns erledigt. Reseller und Webmaster, die
viele Anwendungen betreuen, buchen häufig mehrere Pakete bei
Hostsharing, sodass sie gerne ein Skript hätten, dem sie auch das Kürzel
für das Paket übergeben können, in dem sie eine Domain mit Datenbank
einrichten möchten. Außerdem wäre es hilfreich, wenn das Skript dafür
sorgt, dass Benutzernamen und Datenbankenname immer nach einem
einheitlichen Schema erzeugt werden, sodass die Orientierung leichter
fällt. In unserem Beispielskript übergeben wir daher dem Skript drei
Argumente:
api = API(cas=dict(
    uri='https://login.hostsharing.net/cas/v1/tickets',
    service='https://config.hostsharing.net:443/hsar/backend'),
    credentials=dict(username='xyz00', password='sehr-geheim'),
    backends=[
        'https://config.hostsharing.net:443/hsar/xmlrpc/hsadmin',
        'https://config2.hostsharing.net:443/hsar/xmlrpc/hsadmin'])
api.mysqluser.add(set={'name': 'xyz00_domain_de', 'password': 'geheim'})
api.mysqldb.add(set={'name': 'xyz00_domain_de', 'owner': 'xyz00_domain_de'})
```
Nun wollen wir diese Befehle in ein Skript einbauen, das noch einige andere nützliche Dinge für uns erledigt.
Reseller und Webmaster, die viele Anwendungen betreuen, buchen häufig mehrere Pakete bei Hostsharing, sodass sie gerne ein Skript hätten, dem sie auch das Kürzel für das Paket übergeben können, in dem sie eine Domain mit Datenbank einrichten möchten.
Außerdem wäre es hilfreich, wenn das Skript dafür sorgt, dass Benutzernamen und Datenbankenname immer nach einem einheitlichen Schema erzeugt werden, sodass die Orientierung leichter fällt.
In unserem Beispielskript übergeben wir daher dem Skript drei Argumente:
1.  das Kürzel für das Paket
2.  den Domainnamen
3.  eine Projekt-ID
Die Projekt-ID darf nicht mehr als 10 Zeichen umfassen, da sie zusammen
mit dem fünfstelligen Paketkürzel in den Namen für Datenbank und
Datenbank-Nutzer verwendet wird. Diese dürfen aber nicht länger als 16
Zeichen sein. Als Schema für eine Projekt-ID kommt also beispielsweise
eine Kombination aus einer Kundennummer und einer Abkürzung in Frage.
Wir verwenden in unserem Beispiel dafür eine dreistellige Kundennummer
und die Abkürzung `wp` für Wordpress. Die Elemente trennen wir mit dem
Unterstrich, da nur dieser als Namensbestandteil erlaubt ist.
Die Projekt-ID darf nicht mehr als 10 Zeichen umfassen, da sie zusammen mit dem fünfstelligen Paketkürzel in den Namen für Datenbank und Datenbank-Nutzer verwendet wird.
Diese dürfen aber nicht länger als 16 Zeichen sein.
Als Schema für eine Projekt-ID kommt also beispielsweise eine Kombination aus einer Kundennummer und einer Abkürzung in Frage.
Wir verwenden in unserem Beispiel dafür eine dreistellige Kundennummer und die Abkürzung `wp` für Wordpress.
Die Elemente trennen wir mit dem Unterstrich, da nur dieser als Namensbestandteil erlaubt ist.
Wenn wir für den Kunden mit der Kundennummer 23 im Paket `xyz00` eine
Domain für einen Wordpress-Blog einrichten möchten, lautet der Aufruf
des Skripts folgendermaßen:
Wenn wir für den Kunden mit der Kundennummer 23 im Paket `xyz00` eine Domain für einen Wordpress-Blog einrichten möchten, lautet der Aufruf des Skripts folgendermaßen:
``` console
$ python createall.py xyz00 hs-example.de 023_wp
@@ -253,42 +289,72 @@
Der Code des Skripts sieht so aus:
::: {.literalinclude linenos=""}
createall.py
:::
```python
import random
import string
import sys
from hs.admin.api import API
from subprocess import check_output
In den ersten fünf Zeilen importieren wir einige Module bzw. Funktionen,
die wir benötigen. In den Zeilen 7 bis 9 lesen wir die übergebenen
Argumente aus und speichern die Werte in entsprechenden Variablen.
paketadmin = sys.argv[1]
domainname = sys.argv[2]
projektid = sys.argv[3]
Um das API-Objekt zu erzeugen, benötigen wir das Passwort für den
übergebenen Paket-Admin. Wir lesen in Zeile 11 das Passwort aus dem
verschlüsselten Passwort-Tresor des Kommandozeilenprogramms
`pass`{.interpreted-text role="command"} aus und speichern es in der
Variablen `pw`. Weitere Informationen zu dem Programm finden Sie auf der
Website <https://www.passwordstore.org/>. Sie können natürlich andere
Programme wählen, um ein Passwort aus einem Passwort-Tresor auszulesen.
Falls Sie nur ein Paket bei Hostsharing verwalten, können Sie das
Passwort auch direkt ins Skript eintragen. Aus Sicherheitsgründen
sollten Sie dies möglichst vermeiden.
pw = check_output(["pass", "hostsharing/"+paketadmin]).decode("utf-8").strip("\n")
Anschließend erzeugt das Skript das API-Objekt, wobei es als Credentials
den Namen des Paket-Admin und sein Passwort übergibt. Der Namen des
Paket-Admin ist identisch mit dem Paket, in dem die Domain angelegt
werden soll.
api = API(cas=dict(
    uri='https://login.hostsharing.net/cas/v1/tickets',
    service='https://config.hostsharing.net:443/hsar/backend'),
    credentials=dict(username=paketadmin, password=pw),
    backends=[
        'https://config.hostsharing.net:443/hsar/xmlrpc/hsadmin',
        'https://config2.hostsharing.net:443/hsar/xmlrpc/hsadmin'])
Danach wird ein Zufallsgenerator definiert, mit die Passworte erzeugt
werden, die später benötigt werden. In Zeile 27 und 28 werden die
Passworte für den Domain-Admin und den Datenbank-Nutzer erzeugt und in
Variablen gespeichert. Direkt anschließend erzeugt das Skript aus den
beim Aufruf übergebenen Werten die Namen für den Domain-Admin, den
Datenbank-Nutzer und die Datenbank.
def pwGen(stringLength=12):
    """Function to generate a random password """
In den Zeilen 33 bis 36 werden der Domain-Admin, die Domain, den
Datenbank-Nutzer und die Datenbank angelegt.
    password_characters = string.ascii_letters + string.digits
    return ''.join(random.choice(password_characters) for i in range(stringLength))
pw_dadmin = pwGen()
pw_dbuser = pwGen()
dadmin = paketadmin+'-'+domainname.replace("-", "_")
dbuser = paketadmin+'_'+projektid
dbname = paketadmin+'_'+projektid
api.user.add(set={'name': dadmin, 'password': pw_dadmin, 'shell': '/bin/bash'})
api.domain.add(set={'name': domainname, 'user': dadmin})
api.mysqluser.add(set={'name': dbuser, 'password': pw_dbuser})
api.mysqldb.add(set={'name': dbname, 'owner': dbuser})
print("Domainname:" +domainname)
print("Domain-Admin: " + dadmin + " mit dem Passwort:" +pw_dadmin)
print("Datenbank-Nutzer: " +dbuser + " Passwort:" +pw_dbuser)
print("Datenbankname: " +dbname)
```
In den ersten fünf Zeilen importieren wir einige Module bzw.
Funktionen, die wir benötigen.
In den Zeilen 7 bis 9 lesen wir die übergebenen Argumente aus und speichern die Werte in entsprechenden Variablen.
Um das API-Objekt zu erzeugen, benötigen wir das Passwort für den übergebenen Paket-Admin.
Wir lesen in Zeile 11 das Passwort aus dem verschlüsselten Passwort-Tresor des Kommandozeilenprogramms `pass` aus und speichern es in der Variablen `pw`.
Weitere Informationen zu dem Programm finden Sie auf der Website <https://www.passwordstore.org/>.
Sie können natürlich andere Programme wählen, um ein Passwort aus einem Passwort-Tresor auszulesen.
Falls Sie nur ein Paket bei Hostsharing verwalten, können Sie das Passwort auch direkt ins Skript eintragen.
Aus Sicherheitsgründen sollten Sie dies möglichst vermeiden.
Anschließend erzeugt das Skript das API-Objekt, wobei es als Credentials den Namen des Paket-Admin und sein Passwort übergibt.
Der Namen des Paket-Admin ist identisch mit dem Paket, in dem die Domain angelegt werden soll.
Danach wird ein Zufallsgenerator definiert, mit die Passworte erzeugt werden, die später benötigt werden.
In Zeile 27 und 28 werden die Passworte für den Domain-Admin und den Datenbank-Nutzer erzeugt und in Variablen gespeichert.
Direkt anschließend erzeugt das Skript aus den beim Aufruf übergebenen Werten die Namen für den Domain-Admin, den Datenbank-Nutzer und die Datenbank.
In den Zeilen 33 bis 36 werden der Domain-Admin, die Domain, den Datenbank-Nutzer und die Datenbank angelegt.
Und zum Schluss gibt das Skript alle Daten aus.
Idealerweise würde ein solches Skript die neuen Benutzernamen mit den
jeweiligen Passworten in den Passwort-Tresor eintragen, sodass dies
nicht mit der Hand erledigt werden muss.
Idealerweise würde ein solches Skript die neuen Benutzernamen mit den jeweiligen Passworten in den Passwort-Tresor eintragen, sodass dies nicht mit der Hand erledigt werden muss.
<!-- todo: Im Text werden Zeilennummern erwähnt. Wir brauchen eine Lösung dafür -->
source/referenz/hsadmin/webfrontend/index.md
@@ -1,8 +1,5 @@
# HSAdmin-Webfrontend
HSAdmin verfügt über ein Webfrontend <https://admin.hostsharing.net> zur
Verwaltung eines
`Web-Pakets</referenz/webpaket/index>`{.interpreted-text role="doc"}.
HSAdmin verfügt über ein Webfrontend <https://admin.hostsharing.net> zur Verwaltung eines Web-Pakets.
Die Bedienung wurde in `kap-hsadmin-einstieg`{.interpreted-text
role="numref"} beschrieben.
Die Bedienung wurde im Abschnitt [Einführung in HSAdmin](#kap-hsadmin-einstieg) beschrieben.
source/referenz/htaccess/index.md
@@ -1,22 +1,15 @@
# htaccess {#kap-htaccess}
Das Verhalten des Apache Webservers lässt sich durch
`.htaccess`{.interpreted-text role="file"}-Dateien im Verzeichnis einer
Domain steuern. Die zentrale Konfiguration lässt sich damit für einzelne
Verzeichnisse überschreiben. Eine `.htaccess`{.interpreted-text
role="file"}-Datei wirkt sich auf das Verzeichnis aus, in dem sie sich
befindet, und auf alle Unterverzeichnisse. Konfigurationen, die es
ermöglichen, dass der Webserver Rechte anderer User erhalten kann, sind
dabei nicht erlaubt.
Das Verhalten des Apache Webservers lässt sich durch `.htaccess`-Dateien im Verzeichnis einer Domain steuern.
Die zentrale Konfiguration lässt sich damit für einzelne Verzeichnisse überschreiben.
Eine `.htaccess`-Datei wirkt sich auf das Verzeichnis aus, in dem sie sich befindet, und auf alle Unterverzeichnisse.
Konfigurationen, die es ermöglichen, dass der Webserver Rechte anderer User erhalten kann, sind dabei nicht erlaubt.
## Bereiche einer Website mit Passwort schützen
Ein typischer Anwendungsfall ist der Schutz eines bestimmten
Verzeichnisses mit einem Passwort. Dazu muss zunächst eine
Passwort-Datei mit dem Namen `.htpasswd`{.interpreted-text role="file"}
im `etc`{.interpreted-text role="file"}-Verzeichnis der Domain angelegt
werden. Dies erfolgt mit dem Programm `htpasswd`{.interpreted-text
role="command"}.
Ein typischer Anwendungsfall ist der Schutz eines bestimmten Verzeichnisses mit einem Passwort.
Dazu muss zunächst eine Passwort-Datei mit dem Namen `.htpasswd` im `etc`-Verzeichnis der Domain angelegt werden.
Dies erfolgt mit dem Programm `htpasswd`.
``` console
xyz00-doms@h97:~$ cd ~/doms/hs-example.de/etc
@@ -26,13 +19,10 @@
xyz00-doms@h97:~$
```
Statt der Sternchen geben Sie das gewünschte Passwort ein. Es wird
verschlüsselt gespeichert. Die Option `-c` wird nur bei der ersten
Anlage der Passwort-Datei gesetzt. Wenn ein Passwort für einen zweiten
Benutzer eingerichtet wird, muss `htpasswd`{.interpreted-text
role="command"} ohne die Option aufgerufen werden, da sonst die Datei
komplett überschrieben würde und das Passwort für den ersten Benutzer
verloren ginge.
Statt der Sternchen geben Sie das gewünschte Passwort ein.
Es wird verschlüsselt gespeichert.
Die Option `-c` wird nur bei der ersten Anlage der Passwort-Datei gesetzt.
Wenn ein Passwort für einen zweiten Benutzer eingerichtet wird, muss `htpasswd` ohne die Option aufgerufen werden, da sonst die Datei komplett überschrieben würde und das Passwort für den ersten Benutzer verloren ginge.
``` console
xyz00-doms@h97:~$ cd ~/doms/hs-example.de/etc
@@ -42,10 +32,8 @@
xyz00-doms@h97:~$
```
Diese Passwort-Datei kann nun für beliebige Verzeichnisse der Domain
genutzt werden. Um ein Verzeichnis mit einem Passwort zu schützen, legen
Sie dazu einfach eine `htaccess`{.interpreted-text role="file"}-Datei
mit folgendem Inhalt in dem betreffenden Verzeichnis an.
Diese Passwort-Datei kann nun für beliebige Verzeichnisse der Domain genutzt werden.
Um ein Verzeichnis mit einem Passwort zu schützen, legen Sie dazu einfach eine `htaccess`-Datei mit folgendem Inhalt in dem betreffenden Verzeichnis an.
``` text
order allow,deny
@@ -56,19 +44,14 @@
AuthUserFile /home/doms/hs-example.de/etc/.htpasswd
```
Beim Aufruf des Bereichs im Webbrowser wird der Besucher aufgefordert,
den Benutzernamen (in unserem Beispiel `peter` oder `paula`) sowie das
jeweilige Passwort einzugeben.
Beim Aufruf des Bereichs im Webbrowser wird der Besucher aufgefordert, den Benutzernamen (in unserem Beispiel `peter` oder `paula`) sowie das jeweilige Passwort einzugeben.
## Weiterleitungen (Redirects)
Ein anderer typischer Anwendungsfall sind Redirects. Weiterleitungen
werden benötigt, wenn alte Inhalte verschoben werden, sodass sie unter
einer neuen Webadresse erreichbar sind. Weiterleitungen verhindern, dass
Links, die von anderen Webseiten auf den verschobenen Inhalt gesetzt
wurden, ins Leere gehen. Dazu können Sie eine
`htaccess`{.interpreted-text role="file"}-Datei im obersten Verzeichnis
anlegen, in dem Sie alle Weiterleitungen aufführen.
Ein anderer typischer Anwendungsfall sind Redirects.
Weiterleitungen werden benötigt, wenn alte Inhalte verschoben werden, sodass sie unter einer neuen Webadresse erreichbar sind.
Weiterleitungen verhindern, dass Links, die von anderen Webseiten auf den verschobenen Inhalt gesetzt wurden, ins Leere gehen.
Dazu können Sie eine `htaccess`-Datei im obersten Verzeichnis anlegen, in dem Sie alle Weiterleitungen aufführen.
``` text
Redirect permanent /alte-url-1/ /neue-url-1/ 
@@ -78,17 +61,12 @@
## Eigene 404-Datei festlegen
Wenn ein Benutzer auf Ihrer Website eine ungültige Webadresse aufruft,
zeigt der Browser eine 404-Meldung an. Sie können diese Standardanzeige
anpassen, indem Sie den Webserver anweisen, bei einem 404-Fehler eine
besondere Webseite anzuzeigen.
Wenn ein Benutzer auf Ihrer Website eine ungültige Webadresse aufruft, zeigt der Browser eine 404-Meldung an.
Sie können diese Standardanzeige anpassen, indem Sie den Webserver anweisen, bei einem 404-Fehler eine besondere Webseite anzuzeigen.
``` text
ErrorDocument 403 /404.html
```
Weitere Möglichkeiten, das Verhalten des Webservers über
`htaccess`{.interpreted-text role="file"}-Dateien zu steuern, finden Sie
in der [Apache-Dokumentation](https://httpd.apache.org/docs/2.4/). Eine
deutschsprachige Anleitung und Beispielkonfigurationen finden Sie unter:
<https://wiki.selfhtml.org/wiki/Webserver/htaccess>
Weitere Möglichkeiten, das Verhalten des Webservers über `htaccess`-Dateien zu steuern, finden Sie in der [Apache-Dokumentation](https://httpd.apache.org/docs/2.4/).
Eine deutschsprachige Anleitung und Beispielkonfigurationen finden Sie unter: <https://wiki.selfhtml.org/wiki/Webserver/htaccess>
source/referenz/logging/index.md
@@ -2,33 +2,20 @@
## Traffic {#kap-traffic}
Im Web-Paket wird jeden Monat eine Traffic-Log-Datei für den erzeugten
Traffic erzeugt, die den Verbrauch eines jeden Tages pro Zeile enthält.
Der Traffic setzt sich aus HTTP-, FTP- und Mail-Traffic (POP3, IMAP)
zusammen. Bei Überschreitung des gebuchten Traffics wird der
`Paket-Admin`{.interpreted-text role="role"} automatisch per E-Mail
informiert.
Im Web-Paket wird jeden Monat eine Traffic-Log-Datei für den erzeugten Traffic erzeugt, die den Verbrauch eines jeden Tages pro Zeile enthält.
Der Traffic setzt sich aus HTTP-, FTP- und Mail-Traffic (POP3, IMAP) zusammen.
Bei Überschreitung des gebuchten Traffics wird der Paket-Admin automatisch per E-Mail informiert.
Der Traffic für einzelne Benutzer innerhalb eines Pakets kann nicht
beschränkt werden.
Der Traffic für einzelne Benutzer innerhalb eines Pakets kann nicht beschränkt werden.
## Traffic-Log-File {#kap-traffic-log}
Der im Web-Paket erzeugte Traffic wird dem Paket-Admin unter
`/home/pacs/xyz00/var/traffic-iptables-YYYY-MM.log`{.interpreted-text
role="file"} zugänglich gemacht. Das Logfile hat folgenden Aufbau:
Der im Web-Paket erzeugte Traffic wird dem Paket-Admin unter `/home/pacs/xyz00/var/traffic-iptables-YYYY-MM.log` zugänglich gemacht.
Das Logfile hat folgenden Aufbau:
+-----+----+-------+-------+--------+---------+-----+--------+-----+
| Da  | P  | M     | Tages | Traffi | IP-     | T   | IP-A   | T   |
| tum | ak | onats | limit | csumme | Adresse | raf | dresse | raf |
|     | et | limit |       |        | 1       | fic | 2      | fic |
|     |    |       |       |        |         | 1   |        | 2   |
+=====+====+=======+=======+========+=========+=====+========+=====+
| 2   | x  | >     | 34    | >      | 83.223  | 89. |        | 0.  |
| 020 | yz | 10240 | 1.333 | 89.367 | .79.125 | 367 |        | 000 |
| -01 | 00 |       |       |        |         |     |        |     |
| -01 |    |       |       |        |         |     |        |     |
+-----+----+-------+-------+--------+---------+-----+--------+-----+
| Datum      | Paket | Monatslimit | Tageslimit | Trafficsumme | IP 1          | Traffic 1 | IP 2 | Traffic 2 |
|------------|-------|-------------|------------|--------------|---------------|-----------|------|-----------|
| 2020-01-01 | xyz00 | 10240       | 341.333    | 89.367       | 83.223.79.125 | 89.367    |      | 0.000     |
Die Bedeutung der einzelnen Spalten:
@@ -56,15 +43,7 @@
## HTTP-Log {#kap-http-log}
Das in kurzen Abständen aktualisierte Logfile
`web.log`{.interpreted-text role="file"} des Webservers steht im
Paketverzeichnis `/home/pacs/xyz00/var/`{.interpreted-text role="file"}
dem Paket-Admin zur Verfügung. Aus dem Logfile werden nach Ablauf des
Tages einzelne Logfiles für alle abgerufenen Domains und Sub-Domains
generiert und unter
`/home/pacs/xyz00/var/web-www.example.org-YYYYMMDD-HHMI.log.gz`{.interpreted-text
role="file"} gespeichert. Diese Dateien werden 48 Tage archiviert und
nach Ablauf dieser Frist automatisch gelöscht. Das Error-Logfile
`web.err` des Webservers steht unter
`/home/pacs/xyz00/var`{.interpreted-text role="file"} dem Paket-Admin
zur Verfügung.
Das in kurzen Abständen aktualisierte Logfile `web.log` des Webservers steht im Paketverzeichnis `/home/pacs/xyz00/var/` dem Paket-Admin zur Verfügung.
Aus dem Logfile werden nach Ablauf des Tages einzelne Logfiles für alle abgerufenen Domains und Sub-Domains generiert und unter `/home/pacs/xyz00/var/web-www.example.org-YYYYMMDD-HHMI.log.gz` gespeichert.
Diese Dateien werden 48 Tage archiviert und nach Ablauf dieser Frist automatisch gelöscht.
Das Error-Logfile `web.err` des Webservers steht unter `/home/pacs/xyz00/var` dem Paket-Admin zur Verfügung.
source/referenz/php/index.md
@@ -1,19 +1,14 @@
# PHP {#kap-php}
PHP ist standardmäßig über FastCGI konfiguriert. In den Ordnern
`fastcgi` und `fastcgi-ssl` unterhalb des Domainordners findet sich eine
phpstub-Datei; der Webserver liefert php-Dateien mit den Rechten des
Users aus.
PHP ist standardmäßig über FastCGI konfiguriert.
In den Ordnern `fastcgi` und `fastcgi-ssl` unterhalb des Domainordners findet sich eine phpstub-Datei; der Webserver liefert php-Dateien mit den Rechten des Users aus.
## Eigene PHP Konfiguration
Im Ordner `fastcgi` oder `fastcgi-ssl` wird die Datei php.ini angelegt.
In dieser Datei werden die Änderungen gegenüber den Standardwerten
eingetragen.
In dieser Datei werden die Änderungen gegenüber den Standardwerten eingetragen.
Eine Übersicht über die Standardwerte von PHP können unter
`/etc/php/7.4/cgi/php.ini`{.interpreted-text role="file"} eingesehen
werden.
Eine Übersicht über die Standardwerte von PHP können unter `/etc/php/7.4/cgi/php.ini` eingesehen werden.
## PHP Prozesse stoppen
@@ -25,19 +20,14 @@
## phpstub
Die Datei `phpstub` ist standardmäßig vorhanden, alternativ kann sie aus
dem Ordner `/usr/local/src/phpstub` wiederhergestellt werden.
Die Datei `phpstub` ist standardmäßig vorhanden, alternativ kann sie aus dem Ordner `/usr/local/src/phpstub` wiederhergestellt werden.
## Vorinstallierte PHP Version wechseln
Hostsharing bietet neben der vom Betriebssystem vorinstallierten
Standardversion 7.4 auch PHP 7.0, 7.1, 7.2, und 7.3 an.
Hostsharing bietet neben der vom Betriebssystem vorinstallierten Standardversion 7.4 auch PHP 7.0, 7.1, 7.2, und 7.3 an.
Um die Version zu wechseln, genügt es, den jeweiligen phpstub
auszutauschen. Version 7.3 liegt unter
`/usr/local/src/phpstub/phpstub73`{.interpreted-text role="file"}; das
Versionformat ist entsprechend
`/usr/local/src/phpstub/phpstubXX`{.interpreted-text role="file"}.
Um die Version zu wechseln, genügt es, den jeweiligen phpstub auszutauschen.
Version 7.3 liegt unter `/usr/local/src/phpstub/phpstub73`; das Versionformat ist entsprechend `/usr/local/src/phpstub/phpstubXX`.
### phpstub für PHP 7.3 kopieren
@@ -58,4 +48,4 @@
verwendet.
Auf die gleiche Weise können auch PHP 7.2, PHP 7.1 oder PHP 7.0
aktiviert werden
aktiviert werden.
source/referenz/wartungsfenster/index.md
@@ -1,26 +1,19 @@
# Wartungsfenster
Es gibt Standard-Wartungsfenster von 1 bis 2 Uhr (*früh*) und von 4 bis
5 Uhr (*spät*). Hives/Server mit ungeraden Nummern (h01, h03, ... h99)
werden im Rahmen des frühen Wartungsfensters gewartet, Hives/Server mit
geraden Nummern (h02, h04, ... h98) werden im späten Wartungsfenster
gewartet.
Es gibt Standard-Wartungsfenster von 1 bis 2 Uhr (*früh*) und von 4 bis 5 Uhr (*spät*).
Hives/Server mit ungeraden Nummern (h01, h03, ...
h99) werden im Rahmen des frühen Wartungsfensters gewartet, Hives/Server mit geraden Nummern (h02, h04, ...
h98) werden im späten Wartungsfenster gewartet.
Im Fall von Managed Servern haben die Mitglieder folgende
Wahlmöglichkeiten:
Im Fall von Managed Servern haben die Mitglieder folgende Wahlmöglichkeiten:
-   Tausch des Wartungsfensters *früh* gegen *spät* oder umgekehrt. Die
    Festlegung kann individuell je Managed Server getroffen werden.
    Dieser Service ist kostenfrei.
-   Tausch des Wartungsfensters *früh* gegen *spät* oder umgekehrt.
Die Festlegung kann individuell je Managed Server getroffen werden.
Dieser Service ist kostenfrei.
-   Vereinbarung individueller Wartungsfenster, Vorankündigungsfristen,
    Absprachen und Vorgehensweisen. Die Berechnung erfolgt dann abhängig
    vom konkreten Aufwand im Wartungsfall gemäß unseres gültigen
    Abrechnungssatzes.
-   Vereinbarung individueller Wartungsfenster, Vorankündigungsfristen, Absprachen und Vorgehensweisen.
Die Berechnung erfolgt dann abhängig vom konkreten Aufwand im Wartungsfall gemäß unseres gültigen Abrechnungssatzes.
    Mit dieser Änderung ermöglichen wir den Mitgliedern weitreichende
    Flexibilität und die Möglichkeit, individuelle Prozesse verbindlich
    festzulegen.
    Mit dieser Änderung ermöglichen wir den Mitgliedern weitreichende Flexibilität und die Möglichkeit, individuelle Prozesse verbindlich festzulegen.
Selbstverständlich werden auch im Falle der kostenfreien Standardwartung
angemessene Ankündigungsfristen eingehalten.
Selbstverständlich werden auch im Falle der kostenfreien Standardwartung angemessene Ankündigungsfristen eingehalten.