Files
deploy-email-plesk-kerio-ne…/README.md
T
2026-05-12 11:04:17 +02:00

212 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# deploy-email-plesk-kerio-nextcloud
Tool, um neue Mitarbeiter:innen-Konten in **einem** Rutsch über drei Systeme
auszurollen und am Ende eine PDF mit den Zugangsdaten zu erzeugen:
1. **Plesk** Mailpostfach anlegen (nur Mailserver-Login, keine Plesk-GUI).
2. **Kerio Connect** Benutzer anlegen + POP3-Sammler einrichten, der die
Mails alle paar Minuten vom Plesk-Server abholt
(14 Tage auf dem Server belassen, SSL).
3. **Nextcloud** Benutzer (Username = `vorname.nachname`, lowercase,
Umlaute transliteriert) mit Gruppe und Speicherquota anlegen.
4. **PDF** pro Benutzer eine PDF + eine Sammel-PDF mit allen Zugangsdaten.
CLI **und** Tkinter-GUI mit „+ Zeile"-Endlosfeldern.
---
## Installation
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
$EDITOR .env
```
Tkinter ist Teil der Python-Standardbibliothek, unter Debian/Ubuntu ggf.
`sudo apt install python3-tk`.
## Konfiguration (`.env`)
### Plesk-Backend wählen (`PLESK_BACKEND`)
Dreistufige Wahl, je nachdem welchen Zugriff du auf das Plesk hast:
| Backend | Wann? | Was passiert |
| -------- | ---------------------------------------------------------- | ------------------------------------------------------------------------- |
| `manual` | **Shared-Host beim Kunden** kein API, kein SSH (Default) | Tool legt nichts in Plesk an. Im Webinterface manuell anlegen, dann Tool laufen lassen (oder andersrum Kerio-POP3-Sammler funktioniert erst, wenn das Postfach existiert). |
| `api` | Eigener/dedizierter Plesk mit REST-API | Anlegen via `/api/v2/cli/mail/call` (entspricht `plesk bin mail`). Auth über `PLESK_API_KEY` (bevorzugt) oder `PLESK_USER` / `PLESK_PASSWORD`. |
| `ssh` | Eigener Plesk, API blockiert, aber SSH offen | `paramiko` öffnet SSH und ruft `plesk bin mail` direkt. Auth über Key (`PLESK_SSH_KEY`) oder Passwort (`PLESK_SSH_PASSWORD`). Bei Bedarf `PLESK_SSH_USE_SUDO=true`. |
> SSH-Backend braucht zusätzlich `paramiko`: `pip install paramiko`.
> Für `manual` reicht das Standard-`requirements.txt`.
### Restliche Variablen
| Variable | Beschreibung |
| -------------------------- | ------------------------------------------------------------------- |
| `KERIO_ADMIN_USER` | i.d.R. `Admin` |
| `KERIO_ADMIN_PASSWORD` | Adminpasswort |
| `KERIO_ADMIN_PORT` | Standard `4040` |
| `NEXTCLOUD_ADMIN_USER` | Admin-User (App-Passwort empfohlen) |
| `NEXTCLOUD_ADMIN_PASSWORD` | Admin- oder App-Passwort |
| `POP3_PORT` | POP3-Sammler in Kerio (default `995` = POP3S) |
| `POP3_KEEP_DAYS` | Tage, die Mails auf Plesk verbleiben (default `14`) |
| `SMTP_PORT` | Nur für die PDF-Anzeige (default `465`) |
| `VERIFY_TLS` | `false` nur bei Test/selbst signierten Zertifikaten |
---
## Plesk-API-Key per SSH erzeugen (nur für `PLESK_BACKEND=api`)
Plesk lässt das Anlegen von API-Keys **nicht** in der Web-GUI zu.
Per SSH auf dem Plesk-Host:
```bash
# Login als root oder Plesk-Admin
plesk bin secret_key --create -ip-address 0.0.0.0/0 -description "deploy-tool"
# Ausgabe-Beispiel:
# API key was successfully generated. Key:
# 1a2b3c4d-1234-5678-9abc-deadbeef0001
```
Den Key in `.env` als `PLESK_API_KEY=…` eintragen.
Tipp: `-ip-address` möglichst auf die IP einschränken, von der das Tool
ausgeführt wird (z.B. `-ip-address 192.0.2.10`).
Vorhandene Keys listen / löschen:
```bash
plesk bin secret_key --list
plesk bin secret_key --delete <key>
```
---
## CSV-Format
UTF-8, Trennzeichen `;` *oder* `,` (wird automatisch erkannt). Kopfzeile
case-insensitive. Beispiel: [`example.csv`](./example.csv).
| Spalte | Pflicht | Bedeutung |
| --------------------- | :-----: | ------------------------------------------------------------------ |
| `Vorname` | ja | Vorname |
| `Name` | ja | Nachname |
| `emailadresse` | ja | volle Mailadresse, ist Login bei Plesk + Kerio |
| `pleskhost` | ja | Hostname Plesk-Mailserver (auch POP3-Server für Kerio-Sammler) |
| `keriohost` | ja | Hostname Kerio Connect (Admin-API auf Port 4040, Webmail auf 443) |
| `nextcloudhost` | ja | Nextcloud-Hostname |
| `kerioemailkennwort` | ja | Passwort für den Kerio-User |
| `pleskemailkennwort` | ja | Passwort für das Plesk-Mailpostfach |
| `nextcloudgruppe` | nein | Gruppe in Nextcloud (wird angelegt falls nicht vorhanden) |
| `nextcloudspeicher` | nein | Speicher in **GB**. Leer = unlimitiert |
| `nextcloudkennwort` | ja | Passwort für den Nextcloud-User |
> Der **Nextcloud-Username** wird aus Vor-/Nachname abgeleitet
> (`vorname.nachname`, lowercase, ä→ae, ö→oe, ü→ue, ß→ss). Die Emailadresse
> aus der CSV wird im Nextcloud-Profil als E-Mail eingetragen.
---
## Aufruf
### CLI
```bash
python deploy.py --csv example.csv --output ./output
```
Exit-Code `0` wenn alle Konten ohne Fehler verarbeitet wurden, sonst `1`.
### GUI
```bash
python deploy.py --gui
# oder einfach
python deploy.py
```
In der GUI:
- Per **+ Zeile** beliebig viele Konten hinzufügen.
- **CSV laden** füllt die Felder aus einer bestehenden CSV.
- **Ausgabeordner** wählen, dann **Ausführen ▶**.
- Log unten zeigt Fortschritt; bei jedem Konto entsteht eine
Einzel-PDF, am Ende eine Sammel-PDF mit Zeitstempel.
---
## Ablauf je Konto
```
Plesk: Mailpostfach anlegen
- PLESK_BACKEND=manual → übersprungen (manuell in Plesk-GUI anlegen)
- PLESK_BACKEND=api/ssh → automatisch
Kerio: User anlegen + POP3-Sammler eintragen, der vom Plesk-Host abholt
(Port aus POP3_PORT=995, SSL, 14 Tage auf Server belassen).
Kennwort-ändern ist für den User gesperrt (mayChangePassword=False).
Nextcloud: User vorname.nachname mit Gruppe + Quota anlegen
PDF (einzeln) schreiben
```
Am Ende:
- eine **Einzel-PDF** pro Konto + eine **Sammel-PDF** beide enthalten
ausschließlich Zugangsdaten und sind 1:1 an den Kunden weitergebbar.
- ein **`_admin_report_<timestamp>.txt`** mit Status pro Konto
(✓ angelegt / · übersprungen / ⚠ manuell / ✗ Fehler) **NICHT für
den Kunden**, das ist deine Admin-Übersicht.
Bestehende Konten werden **übersprungen** (kein Fehler) und im
Admin-Report entsprechend markiert. Damit kann eine CSV gefahrlos
zweimal laufen.
## Workflow bei `PLESK_BACKEND=manual` (Shared Host)
1. CSV vorbereiten / in der GUI eintippen.
2. Tool laufen lassen → Kerio-User + POP3-Sammler + Nextcloud-User werden
angelegt, PDFs geschrieben, Admin-Report aufgelistet welche Mailpostfächer
manuell anzulegen sind.
3. Im Plesk-Webinterface des Kunden für jeden Eintrag die Mailadresse mit
exakt dem in der CSV vergebenen Plesk-Mail-Passwort einrichten.
4. Sobald das Postfach existiert, holt der Kerio-Sammler automatisch
eingehende Mails ab.
---
## Hinweise / Caveats
- **Kerio API-Methoden**: die JSON-RPC-Methodennamen für POP3-Sammler
(`Pop3Accounts.create`) entsprechen Kerio Connect 9.x. Falls deine
Version andere Methoden nutzt, ist die Originalmeldung von Kerio in
der Fehlerausgabe (mit Methodenname) sichtbar dann in
[`clients/kerio.py`](clients/kerio.py) anpassen.
- **Plesk REST-CLI-Wrapper**: nutzt `/api/v2/cli/mail/call` (entspricht
`plesk bin mail`). Verfügbar ab Plesk Obsidian.
- **Nextcloud OCS**: die Admin-Credentials brauchen das Recht „Benutzer
verwalten". App-Passwort empfohlen, damit der Account nicht 2FA-geschützt
bleibt.
- **TLS**: `VERIFY_TLS=false` nur in Testumgebungen. Self-signed
Zertifikate gehören in einen lokalen Trust-Store, nicht ignoriert.
- **Passwörter** stehen sowohl in der CSV als auch in den PDFs im Klartext.
CSV nach erfolgreichem Lauf löschen, PDFs verschlüsselt versenden.
## Dateien
```
deploy.py CLI-Entry + Orchestrierung
gui.py Tkinter-GUI mit Endlosfeldern
config.py .env-Loader
models.py Account / Result Datentypen
pdf.py ReportLab PDF-Erzeugung (kunden-tauglich)
clients/plesk.py Plesk REST-CLI-Wrapper (PLESK_BACKEND=api)
clients/plesk_ssh.py Plesk SSH-Wrapper, paramiko (PLESK_BACKEND=ssh)
clients/kerio.py Kerio JSON-RPC Admin-Client
clients/nextcloud.py Nextcloud OCS-Client
example.csv Beispiel-Eingabedatei
.env.example Beispiel-Konfiguration
```