KC@FlessingLabs 1.0.0: Testmodus ohne Lizenz, Installationsanleitung, Nutzungsbedingungen
Testmodus (ohne gültige Lizenz): 1 Personal-Konto, 2 Kunden; Discord-Bot, E-Mail-Posteingang (IMAP), DATEV-Export und Backups auf externe Ziele nur mit Lizenz. Mit Lizenz gelten deren Grenzen und Module (Lizenz ohne Modulliste = voller Umfang). Bestehende Daten bleiben bei Ablauf vollständig nutzbar, nur Neuanlagen über die Grenzen und die Zusatzfunktionen pausieren. - Edition zentral in @kc/platform/license (getEdition, hasFeature, assertCustomerCapacity, assertStaffCapacity), auch in der CLI durchgesetzt - Einstellungen → Lizenz zeigt die Edition, Hinweisbanner im Testmodus - README mit Installation, Update und Betrieb; systemd-Units unter ops/systemd - .env.example bereinigt (Kommentare nicht mehr hinter Werten, veraltete SMTP/Discord-Variablen entfernt; beides wird in der Oberfläche eingestellt) - LICENSE.md: Nutzungsbedingungen Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fdd51b18e2
commit
17267b7c05
26 changed files with 368 additions and 73 deletions
128
README.md
128
README.md
|
|
@ -1,52 +1,110 @@
|
|||
# Kundencenter
|
||||
# KC@FlessingLabs – Kundencenter
|
||||
|
||||
Modulares Kundencenter für Hosting, Server und Lizenzen (Modularer Monolith, TypeScript).
|
||||
Selbst gehostetes Kundencenter für Hosting-Anbieter, Agenturen und Software-Hersteller: Kunden, Produkte, Bestellungen,
|
||||
Verträge, Rechnungen, Support-Tickets und Lizenzen in einer Oberfläche – mit Anbindung an KeyHelp und an das
|
||||
FlessingLabs-Lizenzsystem. Modularer Monolith in TypeScript (Fastify, Next.js, MariaDB).
|
||||
|
||||
| Prozess | Pfad | Port (nur 127.0.0.1) | Aufgabe |
|
||||
|---|---|---|---|
|
||||
| `kc-api` | `apps/api` | 4100 | Fastify-API (`/v1/*`), Module, Policy, Audit |
|
||||
| `kc-worker` | `apps/worker` | 4102 (Health) | Persistente Aufträge, Discord-Bot |
|
||||
| `kc-web` | `apps/web` | 4101 | Next.js-Oberfläche, Proxy `/api/*` → API |
|
||||
| `kc-api` | `apps/api` | 4100 | Fastify-API (`/v1/*`), Module, Rechte, Audit |
|
||||
| `kc-worker` | `apps/worker` | 4102 (Health) | Persistente Aufträge, Discord-Bot, E-Mail-Posteingang |
|
||||
| `kc-web` | `apps/web` | 4101 | Next.js-Oberfläche, leitet `/api/*` an die API weiter |
|
||||
|
||||
## Stand (Grundsystem)
|
||||
Login mit Passwort + TOTP, Wiederherstellungscodes, Sitzungsverwaltung, Passwort-Reset, Einladungen, Benutzerverwaltung (Mitarbeiterrollen),
|
||||
Kunden/Organisationen anlegen und verwalten, Rechnungsanschrift, Audit-Protokoll mit Hash-Kette, persistente Job-Queue, Discord-Bot (optional).
|
||||
Produkte (versioniert), Bestellungen mit Freigabe und unveränderlichem Preis-Snapshot, Verträge mit Kündigung/Verlängerung, Provisionierung über Connectoren (`docs/produkte-bestellungen-vertraege.md`), Connector-Framework (`docs/connector-vertrag.md`).
|
||||
Support-Tickets (je Kunde, mit internen Notizen für Personal, Dateianhänge als Bild/PDF, Discord-Benachrichtigung).
|
||||
Rechnungen (`docs/rechnungen.md`): Entwurf → Ausstellen (unveränderlich) → Bezahlt/Storno, PDF-Erzeugung, Firmenstammdaten unter Einstellungen → Firma.
|
||||
Noch **nicht** vorhanden: Zahlungsanbieter-Anbindung, automatische wiederkehrende Rechnungsstellung, E-Mail-Versand von Rechnungen, Selbstregistrierung, Plesk-Connector, Domain-Registrierung über eine Registrar-API (aktuell manuell über die Domain-Aufstellung).
|
||||
## Funktionen
|
||||
- **Konten und Sicherheit:** Login mit Passwort + TOTP, Wiederherstellungscodes, Sitzungsverwaltung, Einladungen, Rollen für Personal und Kunden, Audit-Protokoll mit Hash-Kette.
|
||||
- **Kunden:** Privat- und Geschäftskunden, Rechnungsanschrift, Übernahme aus KeyHelp, Kundenansicht („Als Kunde ansehen“).
|
||||
- **Produkte, Bestellungen, Verträge:** versionierte Produkte, Bestellungen mit Freigabe und unveränderlichem Preis-Snapshot, Laufzeiten, Kündigung, automatische Verlängerung mit Erinnerung (`docs/produkte-bestellungen-vertraege.md`).
|
||||
- **Bereitstellung über Connectoren:** KeyHelp (Hosting-Konten, Domains, Postfächer, Datenbanken) und Lizenzsystem (`docs/connector-vertrag.md`, `docs/connector-keyhelp.md`).
|
||||
- **Lizenzverwaltung:** Übersicht, Vergabe mit Vertrag oder ohne Berechnung (Lizenz, Test, Add-on), Geräte freigeben, Sperren/Verlängern/Widerrufen, Limits und Funktionsumfang; Kunden sehen ihre Lizenzen und geben eigene Geräte frei.
|
||||
- **Rechnungen:** Entwurf → Ausstellen (unveränderlich) → Bezahlt/Storno, PDF, DATEV-Export (`docs/rechnungen.md`).
|
||||
- **Support:** Tickets je Kunde mit internen Notizen und Anhängen, E-Mail-Posteingang (IMAP), Discord-Bot mit eigenem Kanal je Ticket.
|
||||
- **Betrieb:** verschlüsselte tägliche Backups mit automatischem Wiederherstellungstest (`docs/betrieb-backup-restore.md`).
|
||||
|
||||
## Modularität
|
||||
API-Module liegen in `apps/api/src/modules/<name>` und implementieren `KcModule` (`core/module.ts`).
|
||||
Sie werden in `modules/index.ts` eingetragen, registrieren Routen und Rechte und sprechen nur über `core/*` und Jobs miteinander.
|
||||
Neue Fähigkeiten (Connectoren, Rechnungen, Tickets) kommen als weitere Module hinzu.
|
||||
## Testmodus und Lizenz
|
||||
Ohne Lizenzschlüssel läuft das Kundencenter im **Testmodus**:
|
||||
|
||||
## Konfiguration
|
||||
Geheimnisse liegen **nicht** im Repo, sondern in `/etc/kundencenter/*.env` (chmod 600): `db.env`, `app.env`, `discord.env`, optional SMTP in `app.env`.
|
||||
Vorlage: `.env.example`. Wichtig: `KC_BASE_URL` muss exakt der Browser-URL entsprechen (Origin-Prüfung gegen CSRF).
|
||||
| | Testmodus | Mit Lizenz |
|
||||
|---|---|---|
|
||||
| Personal-Konten | 1 | laut Lizenz |
|
||||
| Kunden | 2 | laut Lizenz |
|
||||
| Discord-Bot, E-Mail-Posteingang (IMAP), DATEV-Export, Backups auf externe Ziele | – | ✓ |
|
||||
|
||||
Alles andere ist im Testmodus voll nutzbar. Eine Lizenz gibt es bei FlessingLabs (https://flessinglabs.com); den Schlüssel
|
||||
unter **Einstellungen → Lizenz** eintragen, er wird regelmäßig bei licensing.flessinglabs.com geprüft (7 Tage offline
|
||||
möglich). Läuft eine Lizenz ab, gilt wieder der Testmodus – bestehende Daten bleiben vollständig erhalten und nutzbar,
|
||||
nur Neuanlagen über die Grenzen hinaus und die Zusatzfunktionen pausieren. Nutzungsbedingungen: `LICENSE.md`.
|
||||
|
||||
## Installation (Debian/Ubuntu)
|
||||
Voraussetzungen: Node.js ≥ 22, pnpm 10, MariaDB ≥ 10.6, ein Reverse-Proxy mit HTTPS (Apache, nginx, Caddy …),
|
||||
für Backups `gpg` und `rclone`.
|
||||
|
||||
```bash
|
||||
# 1. Benutzer und Code
|
||||
useradd --system --home-dir /var/lib/kundencenter --shell /usr/sbin/nologin kundencenter
|
||||
git clone https://forge.flessinghome.de/flessinglabs/kundencenter.git /srv/kundencenter
|
||||
chown -R kundencenter: /srv/kundencenter
|
||||
cd /srv/kundencenter && sudo -u kundencenter pnpm install --frozen-lockfile && sudo -u kundencenter pnpm build
|
||||
|
||||
# 2. Datenbank (Zeichensatz utf8mb4 / utf8mb4_unicode_ci ist wichtig)
|
||||
mysql -e "CREATE DATABASE kundencenter CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE USER 'kundencenter'@'localhost' IDENTIFIED BY '<passwort>';
|
||||
GRANT ALL ON kundencenter.* TO 'kundencenter'@'localhost';
|
||||
GRANT ALL ON kundencenter_restoretest.* TO 'kundencenter'@'localhost';"
|
||||
|
||||
# 3. Konfiguration (Vorlage: .env.example; Kommentare nie hinter einen Wert schreiben)
|
||||
install -d -m 700 /etc/kundencenter
|
||||
install -d -o kundencenter -m 755 /var/lib/kundencenter/requests
|
||||
install -d -o kundencenter -m 750 /var/lib/kundencenter/ticket-attachments
|
||||
install -d -m 700 /var/backups/kundencenter
|
||||
# /etc/kundencenter/db.env und /etc/kundencenter/app.env anlegen, chmod 600
|
||||
|
||||
# 4. Schema und erster Superadmin (Passwort wird abgefragt)
|
||||
cd /srv/kundencenter && pnpm migrate
|
||||
pnpm cli create-superadmin --email=admin@example.de --name="Vorname Nachname"
|
||||
|
||||
# 5. Dienste
|
||||
cp ops/systemd/kc-* /etc/systemd/system/ && systemctl daemon-reload
|
||||
systemctl enable --now kc-api kc-web kc-worker kc-backup.timer kc-restore-test.timer kc-backup-request.path
|
||||
```
|
||||
|
||||
Reverse-Proxy: alles auf `http://127.0.0.1:4101` weiterleiten und `X-Forwarded-Proto: https` setzen. Beispiel Apache:
|
||||
```apache
|
||||
ProxyPass / http://127.0.0.1:4101/
|
||||
ProxyPassReverse / http://127.0.0.1:4101/
|
||||
RequestHeader set X-Forwarded-Proto "https"
|
||||
```
|
||||
Danach anmelden, 2FA einrichten, unter **Einstellungen** Firma, E-Mail (SMTP) und Backup-Passwort hinterlegen.
|
||||
|
||||
## Update
|
||||
```bash
|
||||
cd /srv/kundencenter && systemctl start kc-backup # vorher sichern
|
||||
sudo -u kundencenter git pull && sudo -u kundencenter pnpm install --frozen-lockfile && sudo -u kundencenter pnpm build
|
||||
pnpm migrate && systemctl restart kc-api kc-web kc-worker
|
||||
```
|
||||
|
||||
## Betrieb
|
||||
```bash
|
||||
systemctl status kc-api kc-worker kc-web # Dienste (Autostart, Restart=always)
|
||||
journalctl -u kc-api -f # Logs
|
||||
pnpm install && pnpm build # Update: danach chown -R kundencenter und systemctl restart kc-*
|
||||
pnpm migrate # Migrationen (migrations/*.sql, einmalig je Datei)
|
||||
pnpm cli create-superadmin --email=… --name=… --password=…
|
||||
pnpm cli reset-password --email=… # Passwort zurücksetzen
|
||||
```
|
||||
Health: `GET :4100/v1/health`, `GET :4100/v1/ready`, `GET :4102/health`.
|
||||
|
||||
## Tests
|
||||
`cd apps/api && pnpm test` – Integrationstests gegen eine **separate** Datenbank `kundencenter_test` (wird bei jedem Lauf neu erstellt).
|
||||
Abgedeckt: Login, Sperre, CSRF, 2FA-Pflicht, Sitzungen, Kundenanlage, Mandantentrennung, Rechte, Audit-Kette/Maskierung.
|
||||
Geheimnisse liegen nie im Repo, sondern in `/etc/kundencenter/*.env` (chmod 600). `KC_BASE_URL` muss exakt der Browser-Adresse entsprechen.
|
||||
|
||||
## Discord-Bot
|
||||
In `/etc/kundencenter/discord.env` setzen: `DISCORD_BOT_TOKEN`, `DISCORD_GUILD_ID`, `DISCORD_ADMIN_CHANNEL_ID`, `DISCORD_STAFF_USER_IDS` (kommagetrennt), dann `systemctl restart kc-worker`.
|
||||
Befehle: `/kc-status`, `/kc-kunde suche:<Text>` (nur für freigegebene Discord-User, Antworten nur für sie sichtbar). In Kanäle gehen nur Ereignisse ohne personenbezogene Daten (z. B. „Neuer Kunde angelegt: K-10001“).
|
||||
Unter **Einstellungen → Discord** Bot-Token, Server-ID und Kanäle eintragen (Anleitung auf der Seite). Mit einer
|
||||
Ticket-Kategorie bekommt jedes offene Ticket einen eigenen Kanal, sichtbar nur für die Support-Rollen und den Kunden.
|
||||
Kunden und Personal verknüpfen ihr Discord-Konto unter „Mein Konto“. Erfordert eine Lizenz.
|
||||
|
||||
## Backup / Restore (Datenbank)
|
||||
```bash
|
||||
set -a; . /etc/kundencenter/db.env; set +a
|
||||
MYSQL_PWD=$DB_PASSWORD mysqldump -h127.0.0.1 -u$DB_USER --single-transaction --routines $DB_NAME | gzip > kundencenter-$(date +%F).sql.gz
|
||||
gunzip -c kundencenter-DATUM.sql.gz | MYSQL_PWD=$DB_PASSWORD mysql -h127.0.0.1 -u$DB_USER $DB_NAME # Restore in leere DB
|
||||
```
|
||||
Automatisiertes, verschlüsseltes Backup mit Restore-Test ist noch offen (siehe Plane).
|
||||
## Modularität
|
||||
API-Module liegen in `apps/api/src/modules/<name>` und implementieren `KcModule` (`core/module.ts`). Sie werden in
|
||||
`modules/index.ts` eingetragen, registrieren Routen und Rechte und sprechen nur über `core/*` und Jobs miteinander.
|
||||
Neue Anbieter kommen als Connector unter `packages/connector-*` hinzu (`docs/connector-vertrag.md`).
|
||||
|
||||
## Tests
|
||||
`cd apps/api && pnpm test` – Integrationstests gegen eine **separate** Datenbank `kundencenter_test` (wird bei jedem Lauf
|
||||
neu erstellt). Abgedeckt: Login, Sperre, CSRF, 2FA-Pflicht, Sitzungen, Kundenanlage, Mandantentrennung, Rechte, Audit-Kette.
|
||||
|
||||
## Interne Werkzeuge
|
||||
`ops/night-agent.mjs` und `docs/lizenzsystem-erweiterung/` sind Werkzeuge für die Entwicklung bei FlessingLabs und für
|
||||
den Betrieb einer eigenen Installation nicht nötig.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue