Multiuser-Setup per SVN/Subversion

Hier verraten JVerein-Benutzer ihre Tricks und Tips zur JVerein

Moderator: heiner

Antworten
phfeustel
Beiträge: 7
Registriert: Montag 7. September 2015, 19:29
Verein: Junge Verlagsmenschen e.V.
Mitglieder: 650
JVerein-Version: 2.8.11
Betriebssystem: Mac OSX

Multiuser-Setup per SVN/Subversion

Beitrag von phfeustel »

Hallo zusammen,
an dieser Stelle möchte ich vorab dem JVerein-Entwicklungsteam aber auch der Community für diese super Opensource-Software danken.

tl;dr / Management Summary:
Zentrales Subersion-Respository enthält jverein.h2.db. Working-Copy sitzt auf Benutzerordner/jameica/jverein/h2db. Anwender führen Lock-Modify-Write-Workflow aus.

Wir setzen JVerein jetzt seit über einem Jahr ein und die Arbeit damit ist wirklich großartig. Aber genauso lange versuchen wir schon ein stabiles Multiuser-Setup hinzubekommen.

Dieser Post soll den Ansatz per zentralem Subversion-Repository vorstellen und als Erfahrungsbericht dienen. Ich würde mich aber auch sehr freuen, wenn von der Community noch Feedback kommt. Evtl. haben wir bei unseren Überlegungen ja noch etwas Entscheidendes vergessen/übersehen. Falls dieser Ansatz Euch geeignet erscheint, kann man ihn gerne in die Multiuser-Seite im JVerein-Wiki integrieren.

Bezüglich dem Multiuser von JVerein gibt es bekanntlich schon einigen Input:
- http://www.jverein.de/wiki/index.php?title=Multiuser
- http://www.jverein.de/forum/viewtopic.php?f=4&t=1085

Um die darin enthaltenen Vorschläge zum Multiuser-Einsatz(MySQL, Cloud, USB-Stick, etc.) besser bewerten zu können, haben wir bei uns erst mal unsere Anforderungen erfasst:
  • Es gibt mehrere Personen, die schreibenden Zugriff benötigen, da die Aufgaben der Mitgliederverwaltung, der Kasse/Schatzmeister auf mehrere Personen verteilt sind.
  • Darüber hinaus gibt es mehrere Personen, die Nur-Lese-Zugriff z.B. für umfangreiche Auswertungen benötigen
  • Der Zugriff auf die Daten muss personalisiert erfolgen und für einzelne Personen leicht entzogen werden können (Ausrollen eines Master-Passworts sollte vermieden werden).
  • Der Zugriff auf die Daten muss aus mehreren Städten in Deutschland (und außerhalb) funktionieren.
  • Die Daten müssen mehrmals die Woche verteilt werden, da Änderungen mehrmals die Woche vorgenommen werden.
  • Es muss sicher gestellt sein, dass immer nur eine Person zu einem Zeitpunkt schreibenden Zugriff auf die Master-JVerein-Datenbank hat (Lock-Modify-Write-Workflow).
  • Es soll einfach möglich sein alte Stände der Datenbank wiederherzustellen. Dabei soll nachvollziehbar sein, welcher Anwender welchen Stand der Datenbank erzeugt hat.
  • Die Daten sollen vor allem aus Gründen des Datenschutzes (personenbezogene Daten wie Adressen, Geburtstage, Teilnahme an Veranstaltungen etc) aber auch zum Schutz der Daten des Vereins (Buchführung wird genutzt) nicht irgendwo (Cloud) gespeichert sein, sondern bei einem Hoster mit Serverstandort in Deutschland.
Danach haben wir die bisher vorgeschlagenen Setups bewertet/getestet:
  • MySQL: Eine von außen erreichbare MySQL-Datenbank haben wir bei unserem Webhoster, aber:
    • Der parallel schreibende Zugriff auf die Datenbank kann nicht (sinnvoll) ausgeschlossen werden. Und wenn eine Software, das in ihrer Architektur nicht vorsieht, halte ich das für keine gute Idee.
    • Die Performance gerade bei Mitgliederabfragen (> 600) Datensätze war nicht tragbar.
    • Zugriff per SSL wird vom Provider nicht unterstützt ("have_openssl -> DISABLED und have_ssl -> DISABLED").
    • Der Aufbau einer verschlüsselten Verbindung ohne SSL (use:encryption) hat die Performance noch weiter in den Keller getrieben.
    • Verbindung durch einen VPN-Tunnel, war von der Performance nicht geeignet.
    • Eine MySQL-Datenbank bei einem anderen Provider (AWS) würde zwar das Verschlüsselungsproblem lösen, aber vermutlich nicht die Performanzprobleme und sicher nicht das des parallel schreibenden Zugriff.
  • DropBox / SharedDrive / Cloud-Lösungen: Parallel schreibender Zugriff kann nicht ausgeschlossen + aus Datenzschutzgesichtspunkten teilweise nicht zu empfehlen.
  • Austausch per Email/USB-Sticks: Funktioniert bei Anwendern in unterschiedlichen Städten in Deutschland nicht / Ist für die Anwender zu aufwändig.
  • Terminal-Server und Co: Vom Administrationsaufwand vom Verein nicht zu leisten.
Am Ende hatten wir also noch nicht die passende Lösung gefunden. Wenn man aber auf das Problem ein wenig abstrakter blickt, haben wir festgestellt, dass unsere Anforderungen bereits von bestehenden Softwarelösungen erfüllt werden: Versionsverwaltungssystemen (VCS)
Wenn man dann noch auf einen Lock-Modify-Write-Workflow besteht und bedenkt, dass die jverein.h2.db eigentlich wie eine Binärdatei behandelt werden muss, kann man dezentrale VCS (Git, Mecurial, Bazaar) ausschließen, da diese keinen Lock-Mechanismus haben und man mit Mergen nicht weiterkommt haben. Am Ende sind wir also bei Subversion gelandet.

Unser Subversion-Setup sieht wie folgt aus:
  • Das Repository liegt bei einem deutschen SVN-Hoster und enthält nur die jverein.h2.db. (Das Repository könnte auch auf einem beliebigen anderen SVN-Server z.B. NAS daheim, bestehender Vereinsserver liegen)
  • Die jverein.h2.db erhält die Property svn:needs-lock. Damit kann ein Commit(Hochladen) auf diese Datei nur erfolgen, wenn vorher ein Lock auf die Datei gesetzt wurde. Für den Zeitraum, während dessen ein Anwender den Lock gesetzt hat, kann kein anderer den Lock setzen und damit auch keinen neuen Stand der jverein.h2.db "zwischendrin" hochladen. Dies führt übrigens zumindest unter Mac OSX und Windows auch dazu, dass ohne einen Lock Speichern in JVerein selbst nicht mehr möglich ist. D.h. die Benutzer bekommen auch ein Feedback, dass ohne Lock keine Änderungen durchführen können.
  • Bei jedem Anwender wird das Verzeichnis Benutzerordner/jameica/jverein/h2db als Working-Copy eingerichtet und dem zentralen Repository verbunden.
  • Als Client kommt SmartSVN zum Einsatz, da es unter Mac OSX und Windows läuft, eine kostenlose Lizenzversion gibt und für uns mit am benutzerfreundlichsten ist. Generell kann man aber auch jeden anderen SVN-Client verwenden, der Locking unterstützt.
  • Die Benutzerverwaltung erfolgt durch personalisierte Accounts im SVN-Repository, dort kann man schreibende und Nur-Lese-Zugriffe vergeben. Außerdem kann man einzelnen Benutzer so leicht den Zugriff wieder entziehen und es ist immer nachvollziehbar von welchem Nutzer welcher Stand der Datenbank stammt.
  • Wir haben das Subversion schon einige Zeit im Einsatz. Der Speicherplatzverbrauch im Repository und die Upload-/Downloadzeiten halten sich in Grenzen, da das SVN Binär-Diffs erstellt. Damit machen einzelne Commits (Upload) / Updates (Download) nur wenige KB aus, natürlich in Abhängigkeit davon wieviel in der DB geändert wurde.
Den Lock-Modify-Write-Workflow in Verbindung mit JVerein habe ich zum besseren Verständnis in der angehängten Datei dargestellt.

Für uns stellt diese Setup bisher die Lösung dar, die die meisten unserer Anforderungen (siehe oben) erfüllt. Natürlich sehen wir auch noch einige Nachteile dieser Lösung:
  • Die Benutzer müssen den SVN-Workflow und ein extra Programm beherrschen: Diesen Nachteil hat man bei Cloud/Dropbox-Diensten an sich auch. Aber zum einen haben wir dies durch eine umfangreiche Anleitung für SmartSVN unter Mac OSX und Windows gelöst (Bei Interesse einfach melden). Zum anderen hat dieser explizite Workflow den Vorteil, dass eigentlich keine Datenmissstände (halbe Uploads auf denen andere weiterarbeiten, Konflikte) auftreten können.
  • Man hat zwei Brüche im Arbeitsworklow: Vor dem Starten von JVerein und nach dem Beenden von JVerein muss man jeweils den SVN-Client bedienen. Dabei muss man beachten, dass man JVerein nicht zu früh startet und man muss das saubere Beenden von JVerein abwarten.
  • Man braucht Zugriff auf ein zentrales SVN-Repository auf einem SVN-Server: Wie oben beschrieben kam für uns eine Self-Hosting-Lösung (Vereinsserver, NAS/Server bei Vereinsmitglied daheim) nicht in Frage. Aber neben vielen kostenlosen SVN-Hostern (vor allem in den USA) gibt es auch Hoster mit deutschem Serverstandort, die ein einzelnen Repository für einen kleinen einstelligen Euro-Betrag im Monat anbieten.
  • Die jverein.h2.db mit allen Daten (Mitgliederdaten, Buchführung) liegen in einer ungesicherten Datenbank im Netz. Der Zugriff ist nur durch die Zugriffsteuerung des SVN geschützt.
Als Notiz am Rande: Aufgrund dieser Nachteile habe ich in Java ein eigens Wrapper-Programm für JVerein erstellt. Dieses führt das Update aus dem Repository durch, holt einen Lock, startet JVerein und führt nach dem Beenden von JVerein den den Upload ins Repository durch. Dabei funktioniert die Versionsverwaltung und das Locking ohne SVN sondern einfach auf einem Server, der per SFTP bzw. SSH erreichbar ist durchführt. Man kann also im Verein ohnehin bestehende Infrastruktur nutzen. Weiterer Vorteil ist, dass die jverein.h2.db vor dem Upload verschlüsselt (und gepackt) wird. Aufgrund des Wartungsaufwandes und der noch nicht stabilen Funktionsweise sind wir jetzt aber bei SVN-Lösung. Bei Interesse von mehreren Vereinen kann man aber gerne darüber nachdenken, ob man dies gemeinschaftlich weiter entwickelt. D.h. bei Interesse kann ich das in einem anderen Post gerne vertieft vorstellen.

Wie Eingangs beschrieben, soll diese Vorstellung als Inspiration für alle dienen, die ähnliche Anforderungen an ein Multiuser-Setup haben. Aber ich freue mich auch sehr über Feedback oder Fragen, falls die nach diesem langen Beitrag doch noch aufkommen ;)

Viele Grüße
Philipp
Dateianhänge
jverein_svn_workflow.jpg
jverein_svn_workflow.jpg (44.72 KiB) 16646 mal betrachtet
Benutzeravatar
DIG
Beiträge: 478
Registriert: Freitag 11. Januar 2013, 00:02
Verein: Deutsch-Isländische Gesellschaft e.V.
Mitglieder: 250
JVerein-Version: aktuellste
Betriebssystem: Win
Wohnort: Krefeld

Re: Multiuser-Setup per SVN/Subversion

Beitrag von DIG »

Hallo Philipp,
interessante Lösung, die ich -mit Verweis auf diesen Forums-Beitrag- der Dokumentation hinzugefügt habe.
Gruß,
Carsten
Viele Grüße,
Carsten
phfeustel
Beiträge: 7
Registriert: Montag 7. September 2015, 19:29
Verein: Junge Verlagsmenschen e.V.
Mitglieder: 650
JVerein-Version: 2.8.11
Betriebssystem: Mac OSX

Re: Multiuser-Setup per SVN/Subversion

Beitrag von phfeustel »

Hi Carsten,
vielen Dank für die Aufnahem in die Multiuser-Doku.

Bezüglich der Disziplin beim Ablauf (SVN-Jameica-SVN): Ja, damit es funktioniert muss man sich natürlich an diesen Ablauf halten. Aber die Lösung ist aus meiner Sicht ziemlich robust oder anders formuliert: Es kann wenig kaputt gehen.
  • Vergessen einen Lock vor dem Start von Jameica zu holen? -> In Jameica/JVerein wird ein Fehler angezeigt, dass die Daten nicht gespeichert werden können (Getestet unter Windows 7/10 und Mac OSX; technisch wird die jverein.h2.db auf Filesystem-Ebene auf read-only gesetzt).
  • Vergessen ein Update zu machen bevor man den Lock anfordert? -> Lock wird nicht ausgegeben. Die meisten SVN-Clients machen ohnehin vor dem Lock automatisch ein Update.
  • Vergessen nach dem Schließen von Jameica den Commit durchzuführen -> Die anderen Nutzer können die jverein.h2.db im Repository nicht überschreiben, da der Lock immer noch gesetzt ist.
Insgesamt wird sich das mit der Robustheit noch weiter zeigen, aber erstmal sieht das bei uns ganz gut aus.

Und wie oben schon geschrieben, bin ich aktuell am testen, ob sich diese Nachteile evtl. durch eine darauf aufsetzende, eigenentwickelte Lösung in den Griff kriegen lassen.

Viele Grüße
Philipp
KlausB
Beiträge: 65
Registriert: Mittwoch 3. August 2011, 01:52
Verein: Diagnose-Funk e.V.
Mitglieder: 1100
JVerein-Version: 2.8.20
Betriebssystem: Win10
Kontaktdaten:

Re: Multiuser-Setup per SVN/Subversion

Beitrag von KlausB »

Hallo Philipp,

eine äußerst interessante Lösung, die gut zu uns passen würde.
Wie hoch ist die Gefahr des Datenklaus einzuschätzen?
Welche Erfahrungen habt Ihr inzwischen gemacht, hat es sich bewährt oder ergaben sich noch Hindernisse?

Gruß
KlausB
phfeustel
Beiträge: 7
Registriert: Montag 7. September 2015, 19:29
Verein: Junge Verlagsmenschen e.V.
Mitglieder: 650
JVerein-Version: 2.8.11
Betriebssystem: Mac OSX

Re: Multiuser-Setup per SVN/Subversion

Beitrag von phfeustel »

Hallo KlausB,
zum "Klauen" der Daten:
Wir haben uns explizit für diese Lösung entschieden, weil wir nicht wollten, dass die Finanzdaten und insbesondere die Mitgliederdaten auf irgendeinem uns nicht bekannten Server oder aber in der Cloud liegen. Der SVN-Server steht bei einem Provider unseres Vertrauens und unserer Wahl (in Deutschland).
Bei der Verwaltung / Nutzung selbst, gibt es ja mehrere Angriffsvektoren:
Die Administratoren des SVN-Servers machen einen Fehler: z.B. kaputte TLS-Verschlüsselung oder falsche Serveradministration. Eher unwahrscheinlich, da man jetzt schon seit Jahren bzw. Jahrzehnten weiß, wie man SVN-Server konfigurieren und administrieren muss. Wir haben uns da bewusst auch für "Profis" und nicht z.B. eine Lösung in Eigenregie entschieden. Kostest uns aktuell 2,50€ pro Monat.
Viel wahrscheinlicher ist, dass "meine" Nutzer ein zu schwaches Passwort wählen, die Passwörter unsicher speichern, Account-Sharing betreiben etc. Zum Teil kann ich das selber beeinflussen (Passwortlängen), zum großen Teil aber auch nicht und nur Aufklärung betreiben. Am Ende ist es aber wie bei jedem anderen Account auch: Man muss halt abwägen, was die Nutzer selber im Stande sind sicher zu bedienen und wieviel der Mehraufwand einer komplizierteren Bedienung zum Schutzziel beiträgt. In unserem Beispiel habe ich auf Zwei-Faktor-Authentifizierung oder (SSH-)Client-Zertifikate verzichtet; das ist komplett "Old-School" Benutzername + Passwort.
Also insgesamt: Ich kann mit der aktuellen Lösung sehr gut leben und gut schlafen ;-)

Erfahrungen:
In unserem Setup nutzten aktuell ungefähr 10 Personen über ganz Deutschland verteilt die Lösung parallel. Davon haben wir eine Schatzmeisterin die JVerein in Verbindung mit Hibiscus nutzt. Von den restlichen 9 arbeiten 4 circa alle 1-2 Tage damit. Der Rest eher so 1-2 mal im Monat.
Seit 2015 habe ich da ca. 5 mal mit einem Aufwand von ca. 30 Minuten per Screensharing-Call (TeamViewer, Skype, etc.) zusammen mit den Nutzer etwas auflösen müssen. Das waren aber immer eher Verständnis-Probleme: Warum kann ich gerade nicht Updaten? Der Lock geht nicht mehr weg? Im Verzeichnis liegt noch eine jverein.h2.db.lock Datei.
Ein einziges mal hat tatsächlich eine Nutzerin mit Ihren alten Datenstand die in der Zwischenzeit gemachten Änderungen der anderen überschrieben. Das hat mich dann so 1-2 Stunden Analyse- und Wiederherstellungsaufwand gekostet. Rückblickend sehe ich das aber eher positiv: Ich konnte aus den SVN-Historie die letzte "saubere" Version mit zwei Klicks wiederherstellen und schon war das Problem gelöst. Aufwändig in den 1-2 Stunden war, die "saubere" Version zu finden (mit Hilfe der JVerein-Diagnose-Backups und XML-Vergleichen).
Wenn ich mir das Szenario mit einer geteilten MySQL-DB vorstelle (nach meinen Erfahrungen sind Backups beim Provider anfordern und einspielen lassen "kein Spaß") oder mit einer in Dropbox oder was auch immer geteilten H2-DB vorstelle, bin ich echt glücklich das so gebaut zu haben.

Falls Du da mehr Infos zum konkreten Setup oder z.B. unsere Benutzerhandbücher mit den Ablaufdiagrammen haben willst, sag Bescheid.

Viele Grüße
Philipp
KlausB
Beiträge: 65
Registriert: Mittwoch 3. August 2011, 01:52
Verein: Diagnose-Funk e.V.
Mitglieder: 1100
JVerein-Version: 2.8.20
Betriebssystem: Win10
Kontaktdaten:

Re: Multiuser-Setup per SVN/Subversion

Beitrag von KlausB »

Hallo Philipp,
vielen herzlichen Dank für deine ausführliche Antwort. Ich bin mir jetzt sicher, dass das genau die Lösung für uns ist, die wir brauchen und umsetzen können. Auch wir brauchen quer verteilt in Deutschland Zugriff auf die Daten.

Sehr, sehr gerne hätten wir da mehr Infos zum Setup und Benutzerhandbücher :-)

Gruß
KlausB
phfeustel
Beiträge: 7
Registriert: Montag 7. September 2015, 19:29
Verein: Junge Verlagsmenschen e.V.
Mitglieder: 650
JVerein-Version: 2.8.11
Betriebssystem: Mac OSX

Re: Multiuser-Setup per SVN/Subversion

Beitrag von phfeustel »

Hi KlausB,
aus unserem IT-Wiki habe ich die relevanten Installationsanleitungen / Handbücher als PDF bereitgestellt:

Für Admins / zum Setup
Jameica / JVerein / Hibiscus Setup

Für Benutzer: @Carsten: Kann ich / kannst Du bitte die Links in der Dokumentation bzw. im Handbuch auf GitBook ergänzen?

Viele Grüße und ein frohes Fest
Philipp
Benutzeravatar
DIG
Beiträge: 478
Registriert: Freitag 11. Januar 2013, 00:02
Verein: Deutsch-Isländische Gesellschaft e.V.
Mitglieder: 250
JVerein-Version: aktuellste
Betriebssystem: Win
Wohnort: Krefeld

Re: Multiuser-Setup per SVN/Subversion

Beitrag von DIG »

@phfeustel: Gerne habe ich im (bisherigen) Wiki/Handbuch die Verweise auf Deine Ableitungen nachgetragen.
Für GitBook habe ich kein Login.

=>
@Heiner: Magst Du das auch im GitBook nachtragen?

@Alle: Schöne Weihnachten!
Viele Grüße,
Carsten
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Multiuser-Setup per SVN/Subversion

Beitrag von heiner »

Hallo,

ich habe die Änderungen in die Gitbook-Doku übernommen.

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
KlausB
Beiträge: 65
Registriert: Mittwoch 3. August 2011, 01:52
Verein: Diagnose-Funk e.V.
Mitglieder: 1100
JVerein-Version: 2.8.20
Betriebssystem: Win10
Kontaktdaten:

Re: Multiuser-Setup per SVN/Subversion

Beitrag von KlausB »

Hallo zusammen,
hallo Phillip,

vielen Dank für die Anleitungen, wir werden das vermutlich im Januar/Februar angehen. Bin gespannt, freue mich auf die Möglichkeit Aufgaben zu teilen. :-) Werde berichten, ob und wie gut es klappt.

Euch ein schönes, neues Jahr, herzlichen Gruß
Klaus
Antworten