LogShip
Entwurf v0.1 · 01.11.2026

LogShip Cloud
Betriebskonzept für den SaaS-Betrieb

Dedizierte 3PL-Instanzen und geteilte Händler-Instanzen auf Proxmox – zentral provisioniert, ausgerollt, überwacht und über LogShip abgerechnet.
Betriebsformen
Dedicated – eine VM je Logistiker (3PL)
Shared – eine VM, viele Händler, je eine Organisation
Steuerungsebene
Neues Repo logship-cloud: Inventar + Ansible-Playbooks + eigene Nuxt-4 Cloud Console auf separater VM
Abrechnung
Preis- und Feature-Matrix bleibt in LogShip (Prod-iDempiere). Console misst Nutzung, legt Rechnungsentwürfe auf Prod an; Lexoffice/SEPA wie bisher
Grundsatz
Keine Flotten-/SaaS-Logik im ERP-Code. Nur ein später definierter, minimaler Berührungspunkt für die Feature-Buchung im Einstellungsbereich
LogYou GmbH · intern · Grundlage: Repo erp-nuxt-frontend (reference/template-cleanup, reference/edge-proxy, reference/ci), Golden-VM 115, Edge-Proxy VM 116, Jenkins deploy-instance
LogShip
Betriebskonzept SaaS · Zusammenfassung
1 · Zusammenfassung

Was gebaut werden soll – auf einer Seite

LogShip wird in zwei Formen als SaaS angeboten. Beide laufen als vollständige Instanz (iDempiere + PostgreSQL + Nuxt-Frontend + Strapi + Elasticsearch) in je einer VM, geklont von der Golden-VM. Neu ist die Steuerungsebene, die alle Instanzen kennt, erzeugt, aktualisiert und abrechnet.

Dedizierte Instanz (3PL)

Ein Logistiker = eine VM, eigener Mandant 1000000, Händler als Organisationen – exakt das heutige Modell von app.logship.de. Vollständige Datentrennung je Kunde, individuelle Domain möglich.

Geteilte Händler-Instanz

Eine VM, Betreiber LogYou, jeder Händler = eine Organisation mit eigenem Lager, eigener eingeschränkter Rolle (Ergebnis des bestehenden Onboarding-Assistenten). Für kleine Händler ohne eigenen 3PL.

Drei Entscheidungen (01.11.2026)

FrageEntscheidung
Onboarding der HändlerVertriebsgeführt über den vorhandenen Assistenten; Self-Service von der Landingpage später über dieselbe Schnittstelle
AbrechnungIm LogYou-Prod-iDempiere: Software-Katalog (Pakete, Features, Add-ons) wird dort gepflegt; Console liest ihn nur, misst Nutzung und erzeugt Rechnungsentwürfe. Lexoffice, SEPA, OPOS unverändert
SteuerungsebeneEigenes Repo logship-cloud: Inventar als Quelle der Wahrheit, Ansible-Playbooks für jeden Lebenszyklus-Schritt, eigene Nuxt-4 Cloud Console auf separater VM. Kein Flotten-Code im ERP

Vorhanden und wiederverwendet

  • Golden-VM 115 + clone-logship-instance.sh, Skripte 03/04/05, sync-from-prod.sh
  • Edge-Proxy VM 116 (Nginx Proxy Manager) + add-instance.sh, IONOS-DNS-Plugin
  • Jenkins erp-frontend-deploy-instance: Build, rsync, pm2-Swap, /signin-Check, Rollback
  • Händler-Onboarding-Orchestrator (9 Schritte), Vorlagenrolle 1000006
  • Software-Katalog (CUST_SoftwarePlan, Katalogpositionen) mit Einstellungsseite; Gebührenrechnungen, Lexoffice, SEPA
  • Check_MK, Proxmox Backup Server, Sentry

Lücken, die das Konzept schließt

  • Kein Instanz-Register – Wissen verteilt auf READMEs, NPM-Datenbank, qm list
  • Rund acht Handschritte nach jedem Klon (Zugangsdaten, Secrets, Benutzer, Crons, SMTP, Monitoring, DNS)
  • Instanzen erhalten nach dem Klonen keine iDempiere-Schema-/Dictionary-Änderungen mehr
  • Service-Tokens laufen nach 7 Tagen ab
  • Laravel-Middleware kennt nur ein iDempiere; AG-Grid-Lizenz ist Single-Application
  • Keine Nutzungsmessung, keine Feature-Steuerung, keine automatische Abrechnung
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 2
LogShip
Betriebskonzept SaaS · Zielarchitektur
2 · Zielarchitektur

Organigramm der Zielumgebung

Alle Instanzen stehen hinter dem zentralen Edge-Proxy. Die Cloud Console ist eine eigene, kleine VM außerhalb jeder Kundeninstanz und spricht über APIs mit Proxmox, Proxy, DNS, Jenkins, Monitoring und mit jeder Instanz. LogYou-Prod bleibt gewöhnliche Instanz und Buchhaltungs-Ledger.

Internet OPNsense · NAT 5.9.170.82Ports 80/443 → 192.168.12.52 edge-proxy-1 · Nginx Proxy Manager (VM 116)Wildcard-Zertifikat *.logship.cloud (Let's Encrypt, DNS-01 IONOS) · Standard-Host je Instanz app.logship.de LogYou als 3PL · VM 105 · Ring 3 iDempiere · PostgreSQLNuxt · Strapi · Elasticsearch + Abrechnungs-Ledger <3pl>.logship.cloud Dedizierte 3PL-VMs · Ring 2 Klon der Golden-VM 115Mandant = der 3PLHändler = Organisationen shared-1.logship.cloud Geteilte Händler-VM · Ring 1 Klon der Golden-VM 115 (größer)Mandant = LogShip Cloudje Händler eine Organisation Golden-VM 115 (Template)gestoppt · Quelle aller Klone Cloud Console · logship-cloud-1 (neue VM) Nuxt 4 + SQLite · Ansible-Runner · cloud.logship.de (nur LogYou-Mitarbeiter) Inventarinstances.ymlGit-versioniert Playbooksprovision · deploymigrate · rotate BillingNutzung · AbosRechnungslauf Unterstützende Dienste (vorhanden) Proxmox prox2API · qm clone Jenkins .65Build einmal IONOS DNSAPI · Wildcard Check_MK .9.52REST · Agent PBS BackupJob je VM SentryTag instance Katalog lesen ·Rechnungsentwürfe REST + SSH: Health, Nutzung, Playbooks

Legende: blaue Rahmen = Instanzen bzw. Dienste, dunkel = Netzwerk-/Steuerungsebene, grau = Template und Infrastruktur. Ringe 1–3 = Reihenfolge beim Ausrollen (Kapitel 5). Grüner Doppelpfeil = einziger Berührungspunkt mit LogShip: Katalog lesen, Rechnungen schreiben.

LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 3
LogShip
Betriebskonzept SaaS · Mandantenmodell
3 · Mandantenmodell

Dedicated und Shared im iDempiere-Datenmodell

Beide Formen nutzen denselben Mandanten 1000000 aus der Golden-VM, weil die Anwendung diesen voraussetzt (Belegarten, Preisliste, Partnergruppe sind je Mandant konfiguriert). Die Trennung der Händler erfolgt über Organisationen und Rollen – das Modell, das heute schon zwischen LogYou und seinen Händlern gilt.

Dedizierte Instanz (eine VM je 3PL) AD_Client 1000000 = der LogistikerBelegarten · Preislisten · Versanddienstleister · Drucker AD_Org Betreiber (3PL)Rolle: Admin · alle Orgs AD_Org Händler ALager · Partner · Rolle „Merchant“ AD_Org Händler Beingeschränkt auf eigene Org … weitere Händler des 3PL Verwaltung: Admin-Rolle des 3PL (Onboarding-Assistent) Abrechnung: ein Rechnungsempfänger (der 3PL) auf LogYou-Prod Beispiele heute: app.logship.de, blut24, Musterlager-Demo Geteilte Händler-Instanz (shared-1) AD_Client 1000000 = „LogShip Cloud“ (Betreiber LogYou)Konfiguration gehört dem Betreiber AD_Org BetreiberLogYou-Mitarbeiter · Service-User AD_Org Händler 1eigenes Lager · eigene Rolle AD_Org Händler 2IsAccessAllOrgs = N … je Händler ein Abo Verwaltung: LogYou über den Assistenten; Händler sieht nur seine Org Abrechnung: je Händler-Org ein Rechnungsempfänger auf LogYou-Prod Carrier-/Marktplatz-Zugänge je Org (m_shipper, c_ordersource)

Regeln für geteilte Instanzen

LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 4
LogShip
Betriebskonzept SaaS · Steuerungsebene
4 · Steuerungsebene

Repo logship-cloud: Inventar, Playbooks, Console

Ein Repo neben erp-nuxt-frontend. Das Inventar ist die einzige Quelle der Wahrheit über die Flotte und wird per Git nachvollziehbar geändert. Jede Lebenszyklus-Aktion ist ein Playbook, das dieses Inventar liest. Die Console ist die Bedienoberfläche für genau diese Playbooks – nicht mehr.

logship-cloud/
  inventory/
    instances.yml      # Quelle der Wahrheit
    group_vars/        # dedicated / shared / all
  playbooks/
    provision.yml      # Klon → Identität → Env
                       # → Secrets → DNS → Proxy
                       # → Monitoring → Abnahme
    deploy.yml         # Ring-Deploy, ein Build
    migrate.yml        # Schema-Migrationen
    rotate-service-token.yml
    os-update.yml · snapshot.yml
    decommission.yml
  roles/               # proxmox_clone, instance_env,
                       # npm_host, ionos_dns,
                       # checkmk_register, pbs_job,
                       # idempiere_migrate,
                       # frontend_deploy
  migrations/          # 0000-baseline.sql, 0001-…
  console/             # Nuxt 4 Cloud Console
  CLAUDE.md · README.md
- slug: shared-1
  kind: shared        # dedicated | shared
                      # demo | internal
  vmid: 119
  node: prox2
  ip: 192.168.12.69
  fqdn: shared-1.logship.cloud
  client_name: LogShip Cloud
  company: LogYou GmbH
  sizing: {memory_mb: 24576, cores: 4}
  app_ring: 1         # 0 Demo · 1 Shared
                      # 2 Dedicated · 3 Prod
  schema_version: 2026.11.0
  state: active       # provisioning |
                      # suspended | decommissioned
  created: 2026-11-05

Inventar-Eintrag. Nur Infrastrukturfakten. Abonnements, Add-ons und Nutzungsdaten liegen in der Console-Datenbank, weil Händler sie später selbst ändern (Kapitel 8).

Inventar

Jede VM der Flotte, auch Prod, Demo, Edge-Proxy und Dev-VM, bekommt einen Eintrag. Prüfungen (VMID/IP frei, Slug eindeutig) laufen gegen diese Datei und gegen Proxmox.

Playbooks

Phase 1 kapselt die vorhandenen Shell-Skripte (Klon, 03/05/04, add-instance.sh, deploy-instance.sh) unverändert; die Portierung in echte Ansible-Tasks folgt schrittweise. Idempotent: ein zweiter Lauf ändert nichts.

Console

Startet Playbooks als Prozess auf derselben VM, streamt das Protokoll live, hält den Zustand langer Läufe in SQLite und committet Inventar-Änderungen ins Repo.

Grundsatz: Das ERP bleibt schlank

Weder Inventar noch Playbooks noch Nutzungsmessung oder Rechnungslauf berühren den Code von erp-nuxt-frontend. Die Console nutzt ausschließlich, was jede Instanz ohnehin bereitstellt: die iDempiere-REST-API und SSH. Einzige geplante Ausnahme ist die Feature-Buchung im Einstellungsbereich (Kapitel 8), die der Nutzer ausdrücklich im Frontend des Händlers haben möchte – und auch dort nur als dünne Seite plus Weiche, die Logik liegt in der Console.
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 5
LogShip
Betriebskonzept SaaS · Provisionierung
5 · Provisionierung

Von der Golden-VM zur fertigen Instanz in zehn Schritten

Ein Lauf von provision.yml ersetzt den heutigen Klon plus rund acht Handschritte. Ergebnis: eine erreichbare, überwachte, gesicherte Instanz mit frischen Secrets und einem Eintrag im Inventar.

Console /Ansible Proxmoxprox2 NeueInstanz-VM Edge-Proxy /DNS Monitoring /Backup 1PrüfenVMID/IP frei, Slug, Template aus 2Klonen + Startqm clone 115, cloud-init IP 3Identität + Env04 Mandant/Org umbenennen.env + 05 NUXT_-Overrides 4SecretsREST-Secret rotierenService-User + Token (lang) 5Benutzer + CronsVorlagen-Staff deaktivierenKunden-Admin, Crontab je Typ 6DNS (IONOS)Wildcard; Eigen-Domain A-Record 7Proxy-Host (NPM)add-instance.sh, Wildcard-Cert 8Check_MKAgent registrieren, Host anlegen 9VMID in den PBS-JobBackup-Job 10Abnahme/signin 200, REST-Login, Inventar

Wichtige Details

  • Env-Overrides (Schritt 3): runtimeConfig wird beim Build eingebacken; 05-apply-env-overrides.sh plus pm2 delete/start bleibt in jedem Pfad Pflicht.
  • Secrets (Schritt 4): iDempiere nach Rotation wirklich durchstarten lassen, erst dann Token ausstellen (bekannte Falle aus der Demo). Token-Laufzeit je Instanz lang setzen oder wöchentlich rotieren.
  • Wildcard: *.logship.cloud macht DNS und Zertifikat je Instanz zum Nullschritt; nur Eigen-Domains der 3PL brauchen A-Record + eigenes Let's-Encrypt-Zertifikat.

Danach: Händler auf shared-Instanzen

Jeder Händler wird im Onboarding-Assistenten der Instanz angelegt (Partner, Adresse, Org, Benutzer, Lager, Lagerplatz, Rolle). Die Console liest die entstandenen Organisationen live per REST und ordnet sie einem Rechnungsempfänger und Paket zu. Später kann die Landingpage denselben Weg automatisch auslösen.

Rückbau: decommission.yml = Proxy-Host deaktivieren, letztes Backup, VM stoppen, nach Frist löschen, Inventar-Status decommissioned.

LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 6
LogShip
Betriebskonzept SaaS · Ausrollen
6 · Ausrollen

Ein Build, vier Ringe, ein Schema-Gate

Heute baut Jenkins je Zielhost neu. Künftig wird ein Build einmal auf dem Controller erzeugt, als Artefakt abgelegt und in fester Reihenfolge an alle Instanzen verteilt. Zwischen den Ringen stoppt der Lauf beim ersten Fehler; je Host bleiben Swap, /signin-Prüfung und automatischer Rollback wie im bestehenden Skript.

Jenkins Buildnpm ci · build · sqlite3einmal je Release Artefakt<githash>.tar.zst Schema-GateRelease = githash+ schema_versionInstanz zu alt?→ erst migrate.yml Ring 0Demo / Canary musterlager-demo Fehler hier =niemand betroffen Ring 1Shared shared-1 shared-2 … Ring 2Dedicated 3PL <3pl-a> <3pl-b> blut24 (eig. Branch) Ring 3Produktion LogYou app.logship.de tritt nach dem Edge-Proxy-Umzug dem Ring bei je Host: rsync Artefakt → .env/data behalten → 05 Overrides → pm2 delete/start → /signin = 200? sonst Rollback → bei Fehler Stopp vor dem nächsten Ring

Release-Begriff

Ein Release ist das Paar githash + schema_version (Git-Tag im ERP-Repo, kein Code). deploy.yml verweigert einen Build, dessen benötigte Schema-Version neuer ist als die der Instanz, bis migrate.yml gelaufen ist. Branch main = Flotten-Release.

Übergang

Phase 1 ruft den vorhandenen Jenkins-Job erp-frontend-deploy-instance je Ziel auf. Das „Build einmal“-Artefakt und der Ring-Lauf ersetzen ihn, sobald die Flotte mehr als zwei Instanzen hat. Produktion behält ihren eigenen Job bis zum DNS-Umzug auf den Edge-Proxy (Runbook vorhanden).
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 7
LogShip
Betriebskonzept SaaS · Migrationen
7 · Schema- und Dictionary-Migrationen

Die größte Lücke: Instanzen müssen Änderungen nachziehen

Heute entstehen neue Spalten, Listenwerte und Fenster direkt auf Produktion; die Golden-VM holt sie per sync-from-prod.sh nach, bereits geklonte Instanzen nie. Für eine Flotte braucht jede Änderung eine versionierte, wiederholbar anwendbare Datei.

Änderung auf Prodneue Spalte / Liste /Fenster / View Migrationsdateimigrations/0007-dhl-insurance.sqlidempotent: IF NOT EXISTS, Upsertsauf ad_column / ad_field / _trl, 2Pack migrate.ymlpsql in einer TransaktionCache-Reset · Version schreiben Golden-VM 115 Demo, shared-1 alle 3PL-Instanzen Versionsstand je Instanz ad_sysconfig LOGSHIP_SCHEMA_VERSION = 2026.11.0 zusätzlich im Inventar; deploy.yml vergleicht mit der Release-Anforderung Generatorsync-from-prod.sh erzeugtDateien statt direkt anzuwenden

Regeln

  • Baseline 0000-baseline.sql = aktueller Stand der Golden-VM; alles danach nummeriert.
  • Migration immer vor dem App-Build, der sie braucht (Release = Paar).
  • Ein zweiter Lauf ist ein Nullschritt; Fehler rollen die gesamte Transaktion zurück.
  • Nach Dictionary-Änderungen REST-Cache leeren (DELETE /api/v1/caches), sonst „Spalte existiert nicht“.

Was sich dadurch vereinfacht

  • Die Golden-VM ist nur noch ein weiteres Ziel; sync-from-prod.sh schrumpft auf OS-/Paket-Drift.
  • Template-Refresh wird zur Routine statt zum 45-Minuten-Eingriff.
  • Konfigurationszeilen, die heute nur „gemeldet“ werden (Fenster, Menüs, Prozesse), werden als 2Pack mitgeführt.
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 8
LogShip
Betriebskonzept SaaS · Abrechnung
8 · Zentrale Abrechnung

Katalog in LogShip, Messung in der Console, Rechnung auf Prod

Pakete, Features, Add-ons und Preise werden weiterhin in LogShip gepflegt (Einstellungen → Software-Katalog). Die Console liest diesen Katalog nur, misst die Nutzung jeder Instanz bzw. Händler-Org per REST-Zähler, rechnet und legt je Rechnungsempfänger einen Rechnungsentwurf auf LogYou-Prod an. Ab dort gelten die vorhandenen Prozesse.

LogYou Prod (iDempiere) Software-KatalogCUST_SoftwarePlanCUST_SoftwareCatalogItemgepflegt in /settings/software-catalog RechnungsentwürfeC_Invoice + C_InvoiceLineStatus Drafted → Freigabe → CO bestehende ProzessePDF/ZUGFeRD · E-Mail · LexofficeSEPA-Einzug · OPOS Cloud Console Katalog-Spiegel (nur lesen)Preise je Rechnungslauf eingefroren Abos je Mandant/OrgPaket · Zyklus · Add-ons · Partner-ID Nutzungs-SnapshotsBestellungen · Benutzer je Monat Rechnungslauf (monatlich) Instanzen <3pl>.logship.cloud1 Zeile = der Mandant shared-11 Zeile je Händler-Org iDempiere REST, Service-Tokenc_order $top=1 → row-countad_user · ad_org · m_productkeine Zeilen übertragen,kein Code in der InstanzSSH: pm2, Version, Platte lesen Entwürfe anlegen zählen
Betrag je Mandant und Monat =
Grundpreis (PriceMonthly bzw. PriceYearly / 12)
+ max(0, Bestellungen − IncludedOrders) × ExtraOrderPrice
+ max(0, aktive Benutzer − IncludedUsers) × ExtraUserPrice
+ Σ gebuchte Add-ons (PriceUnit = Monat, anteilig im Buchungsmonat)

Alle Feldnamen existieren bereits in CUST_SoftwarePlan; die Formel bildet genau das heutige Paketmodell ab: Monatspreis mit inkludierten Bestellungen, jede weitere Transaktion zum festen Satz.

LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 9
LogShip
Betriebskonzept SaaS · Abrechnung
8 · Zentrale Abrechnung · Definitionen

Was gezählt wird und wie die Rechnung aussieht

MessgrößeDefinitionQuelle
BestellungenVerkaufsaufträge, die im Monat abgeschlossen wurden: IsSOTrx = Y, DocStatus CO oder CL, DateOrdered im Zeitraum, Org = Händler-Org. Erzeugte Gebührenaufträge (IsFulfillmentOrder = N) zählen nicht.REST models/c_order, $top=1, Wert aus row-count
Aktive BenutzerBenutzer der Org mit Passwort und mindestens einer Rolle; Service-Benutzer ausgenommen.REST models/ad_user
Paket / ZyklusZuordnung je Mandant bzw. Händler-Org; monatlich oder jährlich (Jahrespreis / 12 je Monat ausgewiesen oder jährlich in einer Rechnung).Console-Datenbank (Abo)
Add-onsKatalogpositionen mit PriceUnit = Monat, Zeitraum aus der Buchung (Kapitel 9). Einmal-/Stundenpositionen bleiben manuell.Katalog + Console-Abo
IndividualpreisIncludedOrders = 0 oder PriceMonthly = 0 bedeutet „individuell“: die Console verlangt einen manuellen Preis am Abo und rechnet sonst nicht ab.Console-Abo

Beispiel: Rechnungsentwurf für einen Händler auf shared-1 (Oktober 2026)

PositionTextMengeEinzelpreisBetrag
1LogShip Cloud Abo „Business“ · 01.–31.10.2026 · shared-1 / Org Muster Shop1189,00 €189,00 €
2Zusätzliche Bestellungen (1 240 − 1 000 inkludiert)2400,19 €45,60 €
3Zusätzliche Benutzer (7 − 5 inkludiert)29,00 €18,00 €
4Zusatzfunktion „Retourenportal“ · 12.–31.10.2026 (20/31 Tage)129,00 €18,71 €
Netto271,31 €

Preise sind Platzhalter aus dem aktuellen Katalog-Default. Jede Zeile trägt den beim Lauf gültigen Katalogpreis als Snapshot (Nachvollziehbarkeit bei späteren Preisänderungen).

Ablauf des Rechnungslaufs

1Katalog von Prod lesen und einfrieren
2Nutzung aller aktiven Instanzen/Orgs zählen, Snapshot speichern
3Positionen je Rechnungsempfänger bilden, Vorschau in der Console
4Je Empfänger eine C_Invoice als Entwurf anlegen
5Freigabe auf der Rechnungsseite; Versand, Lexoffice, SEPA wie heute

Sicherungen

  • Idempotenz: Console merkt sich C_Invoice_ID je Mandant und Monat; ein zweiter Lauf legt nichts doppelt an.
  • Nur Entwürfe: Die Console schließt keine Rechnung ab; der Mensch gibt frei.
  • Partner-Zuordnung: Rechnungsempfänger ist der Partner auf Prod, den der Lead-/Angebotsprozess ohnehin anlegt.
  • Rundung: zwei Nachkommastellen je Position, kaufmännisch.
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 10
LogShip
Betriebskonzept SaaS · Feature-Buchung
9 · Feature-Buchung durch den Kunden

Zuschalten, anteilig zahlen, bis Monatsende behalten

Künftig schaltet ein Kunden-Admin kostenpflichtige Funktionen im Einstellungsbereich selbst ein und aus. Eine Funktion wird monatlich berechnet; bei Aktivierung mitten im Monat nur anteilig nach Tagen; nach Deaktivierung bleibt sie bis zum Ende des bezahlten Monats aktiv. Noch nicht umgesetzt – hier als Zustandsmodell festgehalten, damit Daten und Abrechnung von Anfang an dazu passen.

Auskein Abo-Eintrag Aktivstart_at gesetzt, end_at leer Gekündigt,aktiv bis Monatsendeend_at = letzter Tag aktivierensofort nutzbaranteilig: Resttage / Monatstage deaktivierenkeine Rückerstattungkeine weitere Berechnung erneut aktivieren vor MonatsendeKündigung aufgehoben · keine neue Berechnung jeden Monat voller Preis Monatsende erreichtBerechtigung endet automatisch · nächster Monat ohne Position

Rechenregeln

  • Anteil im Aktivierungsmonat: Preis × verbleibende Tage / Kalendertage des Monats; der Aktivierungstag zählt mit (Zeitzone Berlin).
  • Folgemonate: voller Monatspreis, solange kein end_at gesetzt ist.
  • Kündigung: end_at = letzter Tag des laufenden Monats; der Monat ist bereits bezahlt oder wird voll berechnet; danach nichts mehr.
  • Reaktivierung vor end_at: Kündigung wird gelöscht, kein neuer Eintrag, keine zweite Position.
  • Paketwechsel (später): Upgrade sofort mit anteiliger Differenz, Downgrade zum 1. des Folgemonats.

Beispiel

DatumAktionWirkung
12.10.„Retourenportal“ aktivierensofort aktiv · Okt.: 29 € × 20/31 = 18,71 €
01.11.–Nov.: 29,00 €
18.11.deaktivierenaktiv bis 30.11. · keine Erstattung
25.11.erneut aktivierenKündigung aufgehoben · Dez.: 29,00 €
03.12.deaktivierenaktiv bis 31.12. · Januar: keine Position, Funktion aus
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 11
LogShip
Betriebskonzept SaaS · Feature-Buchung
9 · Feature-Buchung · Technik

Logik in der Console, dünne Oberfläche im ERP

ERP-Instanz des Kunden (minimaler Berührungspunkt) Einstellungen → Abopages/settings/subscription.vuePaket, Add-on-Liste, Schalter, Vorschau Feature-WeicheuseFeatures() · hasFeature(key)Menü, Seiten, Server-Routen Proxy-Routen server/api/cloud/*Instanz-Schlüssel aus .env · Org aus Cookie · Cache 10 min, fail-open eine Seite, ein Composable, drei Proxy-Routen – keine Preislogik Cloud Console · API für Instanzen GET tenant/entitlementsPaket-Features ∪ offene Add-ons, activeUntil GET tenant/itemsbuchbare Add-ons, Zustand, Anteil „heute aktivieren“ POST tenant/items/<value> {activate|deactivate}schreibt subscription_item, Audit-Log Abo-Tabellen · Anteilsrechnung · Rechnungslauf HTTPS, Instanz-Schlüssel

Vertrag mit dem Katalog

  • Der Feature-Schlüssel ist CUST_SoftwareCatalogItem.Value; das ERP prüft genau diesen Schlüssel. Value gilt als unveränderlich.
  • Neue buchbare Funktion = Katalogposition auf Prod anlegen (Preis, Einheit Monat, Mindestpaket) und im ERP an der Stelle, die sie schützt, hasFeature('…') prüfen.
  • Paket-Features (Mindestpaket ≤ gebuchtes Paket) sind ohne Buchung berechtigt; Add-ons nur mit offenem Abo-Eintrag.

Robustheit

  • Berechtigungen werden in der Instanz zwischengespeichert; ist die Console nicht erreichbar, gilt der letzte bekannte Stand (kein Ausfall beim Kunden).
  • Der Instanz-Schlüssel verlässt den Server nie; der Browser spricht nur mit der eigenen Instanz.
  • Menü ausblenden ist nicht die einzige Sperre – Server-Routen prüfen dieselbe Berechtigung.
  • Jede Buchung landet im Audit-Log der Console (Benutzer, Org, Zeitpunkt, Aktion).

Einordnung: Das ist die einzige geplante Code-Berührung des ERP für den SaaS-Betrieb, ausdrücklich gewünscht, weil der Kunde die Buchung in seinem Frontend vornehmen soll. Sie kommt in Phase 7, nachdem Flotte, Migrationen und Rechnungslauf stehen.

LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 12
LogShip
Betriebskonzept SaaS · Cloud Console
10 · Cloud Console

Eine kleine Nuxt-4-Anwendung auf eigener VM

Nuxt 4 mit Nuxt UI (keine AG-Grid-Lizenzfrage), SQLite im data/-Verzeichnis, Zugang nur für LogYou-Mitarbeiter (YubiKey/WebAuthn, LAN/VPN bzw. IP-Allowlist am Edge-Proxy). Läuft mit pm2 wie die Instanzen, hat eigenen Backup-Job und Monitoring. VM-Vorschlag: logship-cloud-1, 2 vCPU / 4 GB, Debian 12 cloud-init.

LogShip Cloud Console FlotteReleasesAbrechnungKatalogProtokoll younes · Abmelden Flotte ● app.logship.de● shared-1● <3pl-a>● musterlager-demo● blut24○ logship-template-3 + Instanz anlegen Instanzen SlugTypVersionSchemaZustandBackupAktionen app.logship.dededicated52e3abbc92026.11.0OKheute 00:30Deploy · Migrieren · … shared-1shared52e3abbc92026.11.0OKheute 00:34Deploy · Migrieren · … <3pl-a>dedicateddf668409f2026.10.2Schema altheute 00:41Migrieren musterlager-demodemo52e3abbc92026.11.0OKgesternZurücksetzen ▶ provision.yml · shared-2 · läuft seit 04:12 TASK [proxmox_clone] qm clone 115 → 120 … ok TASK [instance_env] 05-apply-env-overrides.sh … changed TASK [npm_host] add-instance.sh shared-2.logship.cloud … ok TASK [checkmk_register] warte auf Agent …

Seiten

  • Flotte: Inventar + Live-Zustand (Version, Schema, Platte, Backup-Alter, Zertifikat)
  • Instanz: Händler-Orgs, Nutzung, Tokens, Aktionen
  • Releases: githash je Ring
  • Abrechnung: Vorschau → Entwürfe
  • Protokoll: jede Aktion mit Wer/Wann

Aktionen

  • Instanz anlegen (provision)
  • Ring ausrollen (deploy)
  • Migrieren (migrate)
  • Token rotieren
  • Snapshot · Pausieren/Fortsetzen (Proxy-Host aus + VM stopp)
  • Rückbau

Technik

  • Playbook als Kindprozess, Log per SSE live
  • Lauf-Zustand in SQLite, überlebt Neustart
  • Inventar-Änderungen werden ins Repo committet
  • Secrets (Tokens, API-Schlüssel) verschlüsselt auf der Console-VM
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 13
LogShip
Betriebskonzept SaaS · Fahrplan
11 · Fahrplan

Sieben Phasen, jede für sich nutzbar

1FundamentRepo, Inventar,provision/deploy,shared-1, Wildcard 2MigrationenBaseline, migrate.yml,Schema-Version 3MessungREST-Zähler, SSH-Checks in SQLite 4Console v1VM, Flotte, Health,Aktionen, Live-Log 5AbrechnungSnapshots, Entwürfeauf Prod, Probelauf 6HärtungOS-Updates, Agenten,Sentry, Template-Refresh 7Feature-BuchungConsole-API, ERP-Seite,Anteilsrechnung Erst Flotte beherrschen (1–4), dann Geld (5), dann Komfort für den Kunden (7). Jede Phase endet mit einer prüfbaren Abnahme.
#PhaseInhaltAbnahme
1FundamentRepo logship-cloud, Inventar der heutigen Flotte (Prod 105, blut24 114, Demo 118, Edge 116, Dev 130), provision.yml und deploy.yml als Hülle um die vorhandenen Skripte, Token-Rotation; shared-1 damit anlegen; Wildcard-DNS und -Zertifikat; app.logship.de auf den Edge-Proxy umziehenshared-1 ohne Handschritt erreichbar, überwacht, gesichert; Eintrag im Inventar
2MigrationenBaseline, nummerierte Dateien, migrate.yml, Schema-Version in ad_sysconfig, Generator aus sync-from-prod.shTest-Spalte auf Demo + shared-1, zweiter Lauf ohne Änderung
3MessungREST-Zähler und SSH-Checks je Instanz in die Console-DatenbankZahlen einmal von Hand gegen die Demo geprüft
4Console v1VM, Flottenliste, Instanzseite, Aktionen mit Live-Protokoll, Monitoring/Backup der Console selbstAlle Aktionen aus der Oberfläche, Protokoll vollständig
5AbrechnungKatalog-Spiegel, Abos, Rechnungslauf mit Vorschau, Entwürfe auf ProdEin echter Entwurf für den Testpartner, dann storniert
6HärtungOS-Update-Playbook, Check_MK-Agenten in allen Gästen, Sentry je Instanz, vierteljährlicher Template-RefreshFlotte auf gleichem Patch- und Schemastand
7Feature-BuchungConsole-API, Abo-Positionen mit Anteilsrechnung, ERP-Seite + Weiche + Proxy-Routen, erste geschützte FunktionAktivieren am 12. → 20/31; Kündigung bis Monatsende aktiv; Console aus → Cache greift
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 14
LogShip
Betriebskonzept SaaS · Offene Punkte
12 · Offene Punkte und Grenzen

Was vor dem ersten zahlenden SaaS-Kunden geklärt sein muss

ThemaSachstandEmpfehlungStufe
Laravel-Middlewaredata.logship.de kennt genau ein iDempiere. Marktplatz-Importe, Versandbestätigungen und Finanzimporte laufen nur für Prod.Mandantenfähig machen (Instanz → URL + Token, Queue je Instanz), sobald ein SaaS-Kunde Marktplätze braucht; sonst Laravel je dedizierter VMhoch
AG-Grid-LizenzSingle-Application-Lizenz für „logyou“, Version 35.2.1 festgepinnt.Beim Anbieter bestätigen, dass mehrere Deployments derselben Anwendung abgedeckt sind; blut24 als eigene Marke vermutlich nichtmittel
REST-Token-LaufzeitService-Tokens laufen nach 7 Tagen ab; Hintergrundaufrufe brechen dann ab.Je Instanz lange Laufzeit für den Service-Benutzer oder wöchentliche Rotation aus der Consolemittel
Feste Mandanten-IDsBelegart, Preisliste, Partnergruppe kommen aus der Umgebung und sind auf allen Klonen identisch.Unkritisch, solange die Golden-VM diese IDs nie neu vergibt – als Regel festhaltenniedrig
KapazitätRund 20 GB RAM je vollständiger Instanz (JVM, Elasticsearch, Strapi, Node). prox2 trägt eine Handvoll.shared-1 mit 24–32 GB; ab etwa zehn Instanzen ES je Knoten teilen oder kleine Stufe ohne ES; auf prox1/prox2 verteilenmittel
Integrationen je OrgNicht alle Carrier-/Marktplatz-Zugriffe sind nachweislich org-gebunden.Vor dem Verkauf dieser Funktionen auf shared-Instanzen jede Integration prüfenmittel
Edge-Proxy-UmzugProduktionshostnamen zeigen noch auf ISPConfig (.81); nur edge.logship.de läuft über NPM.Umzug je Hostname nach vorhandenem Runbook; Rückweg = DNS zurückniedrig
Self-ServiceLandingpage → Instanz ist für blut24 gekoppelt (Service-Token-Gleichheit), für LogShip nicht.Später über die Console-API, nicht direkt Landingpage → Instanzspäter

Bewusst nicht Teil des Konzepts

  • Kubernetes / Container: kein Nutzen bei unter zehn VMs, hoher Umbau der Golden-VM-Pipeline.
  • Ein AD_Client je Händler: stärkere Trennung, aber Anwendungsumbau.
  • Stripe als Rechnungssteller: iDempiere bleibt Ledger; Zahlungsarten später ergänzbar.
  • Terraform neben Ansible: ein Werkzeug reicht.

Nächster Schritt

Freigabe dieses Entwurfs, dann Phase 1: Repo anlegen, Inventar der heutigen Flotte erzeugen, shared-1 als erste vollautomatisch provisionierte Instanz aufsetzen. Keine Phase verlangt Änderungen am Produktivsystem außer dem geplanten Edge-Proxy-Umzug.
LogShip Cloud · Betriebskonzept SaaS · Entwurf v0.1Seite 15