Wenn du Nextcloud schon für dich selbst betreibst, stellt sich meist schnell die Frage, ob die Instanz ihre eigene Festplatte bezahlen kann. Cashier, ein Plugin von MediaLab Works, macht aus deiner Instanz einen kleinen kostenpflichtigen Dienst: Besucher wählen einen Tarif, zahlen per Karte über dein eigenes Stripe-Konto und erhalten sofort ein Konto mit dem richtigen Kontingent und den richtigen Gruppen, direkt eingeloggt. Keine Ausweisprüfung, keine manuelle Freigabe, keine Tabelle darüber, wer bis wann bezahlt hat.
In dieser Anleitung geht es um die kostenpflichtige Cloud: Tarife mit Speicherkontingent und Gruppen, Konten bei Zahlung, Upgrades für bestehende Nutzer, die Kulanzfrist bei einer fehlgeschlagenen Karte und MwSt. über Stripe Tax oder Managed Payments. Vorausgesetzt wird, dass du mit occ, cron und dem Stripe-Dashboard vertraut bist. Die vollständige Referenz findest du im Cashier-Leitfaden; dies hier ist der praktische Weg durch das Thema. Mehr über das Plugin erfährst du auf der Produktseite.
Bevor du etwas verkaufst: Rechte, MwSt. und dein eigenes Stripe-Konto
Zwei Dinge kommen vor jeder Konfiguration.
Erstens die rechtliche Seite. Cashier berechnet deinen Nutzern Gebühren über dein eigenes Stripe-Konto, und allein du bist dafür verantwortlich, die Rechte an den Inhalten oder dem Dienst zu besitzen, für den du Geld nimmst. MediaLab Works stellt die Software bereit und ist nicht Partei deiner Verkäufe. Stripe führt eine Liste eingeschränkter Geschäftsbereiche und kann ein Konto schließen oder einschränken, das für Inhalte ohne die nötigen Rechte Geld nimmt. Beschränke dein Angebot also auf Medien, die du besitzt oder für die du lizenziert bist.
Zweitens die finanzielle Seite. Eröffne ein Stripe-Konto (kostenlos; Stripe erhebt eine eigene Gebühr pro Zahlung) und stelle sicher, dass deine Instanz per HTTPS erreichbar ist, denn Stripe muss den Webhook aufrufen. Preise in Cashier sind in der Währung deines Stripe-Kontos. Wenn du Stripe Tax oder Managed Payments aktivierst, wird die MwSt. auf der Stripe-Zahlungsseite berechnet und hinzugefügt: Tarife werden mit einem Steuercode angelegt, und die Registrierungsseite zeigt den Preis ohne Steuer und weist darauf hin.
Voraussetzungen
- Nextcloud 30 bis 34, PHP 8.1 oder neuer und ein funktionierender cron für Hintergrundjobs.
- Eine Registrierungs-App von MediaLab Works, installiert, aktiviert und lizenziert: Sign-up 1.0 oder neuer oder IDRegister 2.1 oder neuer. Cashier nutzt deren Registrierungsseite, E-Mail-Bestätigung und Kontoerstellung. Ohne eine davon hat Cashier nur eine eigene einfache Registrierungsseite.
- Eine Cashier-Lizenz (eine pro Nextcloud-Instanz, 30 Tage kostenlos testen).
- Ein Stripe-Konto und HTTPS, wie oben beschrieben.
Schritt 1: Cashier installieren und lizenzieren
Lade das Archiv cashier-x.y.z.tar.gz unter Lizenzen in deinem MediaLab-Works-Konto herunter, entpacke es so, dass apps/cashier/ dem Web-Server-Benutzer gehört, und aktiviere es dann:
sudo -u www-data php occ app:enable cashier
Öffne Administrationseinstellungen → Cashier → Lizenz, füge deinen Schlüssel ein und speichere. Die App bindet sich an diese Instanz und zeigt Aktiv an. Die Lizenz wird einmal pro Tag geprüft; offline funktioniert sie noch 7 Tage nach der letzten erfolgreichen Prüfung.
Wichtig zu wissen, bevor du dich darauf verlässt: Ohne gültige Lizenz werden keine neuen kostenpflichtigen Anmeldungen oder Checkouts angenommen, und der Hintergrundjob läuft nicht, aber bestehende Konten und Abos bleiben unberührt. Stripe berechnet weiter, der Webhook erfasst weiterhin Verlängerungen, fehlgeschlagene Zahlungen und Kündigungen, und Abonnenten behalten ihre Abo-Seite und das Stripe-Kundenportal. Nichts wird gelöscht. Dasselbe gilt, wenn die Registrierungs-App ihre Lizenz verliert: Neue kostenpflichtige Anmeldungen stoppen, bestehende Abonnenten bleiben, und eine bereits laufende Zahlung erhält trotzdem ihr Konto.
Schritt 2: Stripe verbinden
Öffne im Stripe-Dashboard Entwickler → API-Schlüssel, kopiere den Publishable Key und erstelle einen eingeschränkten Schlüssel mit Schreibzugriff auf Customers, Checkout Sessions, Customer Portal, Products, Prices, Subscriptions und Webhook Endpoints sowie Lesezugriff auf Invoices (optional Account, Lesen, damit die Einstellungsseite Kontoname und Währung anzeigen kann).
Füge beide Schlüssel unter Administrationseinstellungen → Cashier → Stripe ein. Beginne mit Testschlüsseln (pk_test_…, rk_test_…) und wechsle zu Live-Schlüsseln, wenn alles funktioniert.
Drücke dann Webhook erstellen. Cashier registriert https://<deine-cloud>/index.php/apps/cashier/webhook in Stripe mit den benötigten Events und speichert das Signaturgeheimnis. Wenn du es lieber von Hand machst, füge den Endpunkt selbst hinzu und trage das Geheimnis whsec_… ein.
Die Einrichtungsprüfung Cashier (Stripe) unter Administration → Übersicht wird grün, sobald ein verifiziertes Event eingegangen ist. Führe eine Testzahlung durch oder löse eine aus, mit der Stripe CLI (stripe trigger checkout.session.completed) oder über die Webhook-Seite im Dashboard.
Schritt 3: Tarife definieren
Gehe zu Administrationseinstellungen → Cashier → Tarife → Tarif hinzufügen. Für jeden Tarif legst du fest:
- Name und Beschreibung auf Englisch und Rumänisch.
- Preis: monatlich, jährlich oder beides, in der Währung deines Stripe-Kontos. Mit Stripe Tax oder Managed Payments wird die MwSt. auf der Zahlungsseite hinzugefügt.
- Speicherkontingent, zum Beispiel 100 GB, und die Gruppen, denen der Abonnent beitritt.
- Kostenlose Testtage, optional – die Karte wird trotzdem erfasst.
- Sichtbar auf der Registrierungsseite oder verborgen und nur über einen direkten Link erreichbar, was sich für ein Firmenangebot anbietet.
Tarife werden automatisch in Stripe angelegt. Eine Preisänderung erzeugt einen neuen Stripe-Preis und lässt bestehende Abonnenten beim alten, bis sie den Tarif wechseln; so kannst du Preise erhöhen, ohne allen Abos über Nacht neue Preise zu verpassen.
Schritt 4: Registrierungsseite wählen
Mit Sign-up (empfohlen für reine kostenpflichtige Anmeldung) bietet die Seite unter /index.php/apps/signup/ deine Tarife neben dem kostenlosen Konto oder an dessen Stelle an (Sign-up → Registrierung). Der Besucher wählt einen Tarif, füllt das Formular von Sign-up mit persönlichen Daten und Passwort aus, bestätigt die Adresse, zahlt auf der Stripe-Seite und kommt eingeloggt in ein von Sign-up erstelltes Konto mit dem Kontingent und den Gruppen des Tarifs zurück.
Mit IDRegister bietet die Registrierungsseite unter /index.php/apps/idregister/, sobald Cashier lizenziert ist und mindestens ein Tarif sichtbar ist, unter der Option für den Personalausweis „Tarif bezahlen statt Ausweis scannen" an, auf Handys wie auf Computern. Der Besucher wählt einen Tarif und Abrechnungszeitraum, gibt eine E-Mail-Adresse ein, akzeptiert die Bedingungen und bestätigt sie mit dem sechsstelligen Code von IDRegister, zahlt bei Stripe und kehrt zu einer Seite zurück, die einige Sekunden auf Stripes Bestätigung wartet. IDRegister legt dann das Konto mit dem Vermerk per Zahlung verifiziert an, mit dem Kontingent und den Gruppen des Tarifs; Benutzername und ein Passwort werden einmal angezeigt, der Browser meldet sich an, und eine Willkommens-E-Mail mit einem Link zur Passwortwahl folgt. Diese Konten überspringen den Personalausweis, das Selfie und die Freigabe durch den Administrator; die E-Mail-Adresse ist gesperrt, und der Name kann vom Nutzer geändert werden.
Unter Administrationseinstellungen → IDRegister → Kostenpflichtige Registrierung kannst du das kostenpflichtige Angebot abschalten oder „Ausweisprüfung nur für den kostenlosen Weg verlangen" deaktivieren, sodass auch zahlende Besucher zuerst ihr Dokument zeigen und das Selfie machen. Sind beide Apps installiert, entscheidet Regeln → Kostenpflichtige Anmeldeseite, wohin Cashiers eigene Links zeigen (/index.php/apps/cashier/signup und der direkte Link eines verborgenen Tarifs …/signup/plan/<token>, mit bereits gewähltem Tarif). Ein Besucher, der auf der Stripe-Seite abbricht, kehrt zu den Tarifen zurück, und es wird nichts berechnet.
Schritt 5: Upgrades für bestehende Nutzer
Ein kostenloses oder ID-verifiziertes Konto kann einen Tarif kaufen, um mehr Platz zu bekommen. Bestehende Nutzer gehen nicht über die Registrierungsseite: Sie kaufen unter Persönliche Einstellungen → Abo, wo sie auch ihren aktuellen Tarif, die nächste Zahlung und Rechnungen sehen und über das Stripe-Kundenportal den Tarif wechseln, die Karte aktualisieren oder kündigen können. Verweise in deinen Support-Antworten auf diese Seite; das spart viel Hin und Her.
Schritt 6: Verlängerungen, fehlgeschlagene Zahlungen und Kulanzfrist
Verlängerungen verlängern das Konto automatisch. Wenn eine Zahlung fehlschlägt, versucht Stripe die Karte gemäß deinen Stripe-Einstellungen erneut, und der Nutzer erhält eine Benachrichtigung und eine E-Mail mit einem Link zum Aktualisieren der Karte. Während der Kulanzfrist funktioniert das Konto weiter; sie wird unter Administration → Cashier → Regeln von 0 bis 90 Tagen eingestellt (Standard: 7); bei 0 greift die nächste Regel, sobald eine Zahlung fehlschlägt.
Nach der Kulanzfrist wird das Konto schreibgeschützt (Kontingent auf den belegten Speicher reduziert) oder gesperrt, je nachdem, was du gewählt hast. Über Sign-up registrierte Konten folgen der Regel von Sign-up, die standardmäßig gesperrt ist. Der Nutzer erhält eine E-Mail mit dem Link zum Bezahlen der offenen Rechnung. Ein gesperrter Nutzer, der diesen Link verloren hat, kann ihn auf der öffentlichen Seite /index.php/apps/cashier/billing erneut anfordern, die von der Seite von Sign-up aus verlinkt ist. Eine erfolgreiche Zahlung stellt das Konto sofort wieder her, mit einer E-Mail.
Das wichtige Versprechen an deine Nutzer: Für eine unbezahlte Rechnung wird nie etwas gelöscht. Dateien, Freigaben und Daten bleiben, wie sie sind.
Schritt 7: Die Admin-Seite im Blick behalten
Administration → Cashier listet deine Abonnenten und den monatlichen Umsatz und lässt dich ein Abo manuell verlängern oder einem Nutzer einen kostenlosen Tarif geben. Jeder Eintrag verlinkt auf die Zahlung in Stripe. Die Prüfungen unter Administration → Übersicht decken sowohl Stripe als auch die Registrierungsseite ab, sodass ein defekter Webhook oder eine fehlende Registrierungs-App dort auffällt statt in einem Support-Ticket.
Tipps und Fehlerbehebung
- Die Einrichtungsprüfung bleibt rot. Es ist noch kein verifiziertes Stripe-Event eingegangen. Führe eine Testzahlung durch oder löse eine mit der Stripe CLI aus, und prüfe, ob die Webhook-URL per HTTPS erreichbar ist.
- Es erscheinen keine kostenpflichtigen Anmeldungen. Prüfe die Cashier-Lizenz und die Lizenz von Sign-up oder IDRegister und stelle sicher, dass mindestens ein Tarif sichtbar ist. Der Abschnitt Registrierungsseite in den Cashier-Einstellungen sagt, was fehlt.
- Ein Besucher hat bezahlt, aber kein Konto. Suche die Zahlung in Stripe und prüfe die Webhook-Zustellungen. Eine Zahlung, die lief, als die Registrierungs-App ihre Lizenz verlor, erhält trotzdem ihr Konto, weil Cashier es selbst anlegt.
- Die MwSt. auf der Registrierungsseite sieht falsch aus. Diese Seite zeigt Preise ohne Steuer, wenn Stripe Tax oder Managed Payments aktiv ist – das ist so gewollt; die Steuer wird auf der Stripe-Zahlungsseite hinzugefügt.
- Du hast einen Preis geändert. Bestehende Abonnenten bleiben beim alten Stripe-Preis, bis sie den Tarif wechseln. Das ist erwartetes Verhalten, kein Fehler.
- Datenschutzfragen. Kartendaten werden ausschließlich von Stripe verarbeitet. Cashier speichert die Stripe-Kunden- und Abo-Kennungen, den Tarif und die Zahlungstermine, und über Zahlung erstellte Konten sind mit „per Zahlung verifiziert" markiert, nicht per Ausweisdokument.
Fazit
Cashier ist ein schmales Werkzeug mit einer Aufgabe: Es verbindet eine Nextcloud-Registrierungsseite mit deinem eigenen Stripe-Konto, sodass aus einem Tarif ein Konto mit dem richtigen Kontingent und den richtigen Gruppen wird und aus einer fehlgeschlagenen Karte eine Kulanzfrist statt eines gelöschten Nutzers. Lege ein paar Tarife an, teste mit Stripes Testschlüsseln, sieh zu, wie die Prüfungen in der Übersicht grün werden, und du hast eine kleine kostenpflichtige Cloud, die auf Infrastruktur läuft, die du bereits kennst. Wenn etwas nicht zusammenpasst, sind die Wissensdatenbank und die FAQ der nächste Halt, und du kannst uns jederzeit kontaktieren. Versionshinweise stehen im Changelog.