first release

This commit is contained in:
2026-05-12 11:04:17 +02:00
parent d49cebf616
commit e8ef2081ed
13 changed files with 1403 additions and 0 deletions
+211
View File
@@ -0,0 +1,211 @@
# 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
```