No description
  • PHP 88.3%
  • Blade 11.5%
Find a file
Markus Thiel a61cad412c
All checks were successful
i18n Check / i18n (push) Successful in 9s
Tests / phpunit (push) Successful in 4m29s
Build & Push Docker Image / build (push) Successful in 38s
Build & Push Docker Image / Trigger Portainer redeploy (push) Has been skipped
M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vz1qj8JJzJNdN36zmSPD1U
2026-08-11 10:41:45 +00:00
.forgejo/workflows ci: trigger Portainer redeploy on main push instead of tag 2026-07-09 12:32:39 +00:00
app M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0) 2026-08-11 10:41:45 +00:00
bootstrap v1.428.0: Integrations-API (tool-agnostisch) fuer gekoppelte Tools - versionierte /api/v1 (ping/catalog/contacts/invoices/payments); Integration-Clients mit Token-Auth (nur Hash) + Scopes + Herkunft; generische polymorphe integration_links fuer Idempotenz/Herkunft ueber beliebige Ressourcen; CLI vereo:integration:token; Positionen erben Konto/Sphaere ueber Katalog-Leistung -> DATEV/EUER; Doku 2026-06-19 22:01:33 +00:00
config M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0) 2026-08-11 10:41:45 +00:00
database Migrate pre-existing employee accounts to contacts (Person) and relink 2026-08-04 20:19:24 +00:00
docker Infra: Servermodus per VEREO_SERVER_MODE waehlbar (Default classic), Octane opt-in (v1.195.0) 2026-06-10 08:18:10 +00:00
docs M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0) 2026-08-11 10:41:45 +00:00
lang Separate Kontakte nav group with filter tabs and count badge (v1.540.0) 2026-08-05 06:33:50 +00:00
public Mittelfluss: ECharts lokal ausliefern statt CDN (v1.305.0) 2026-06-12 09:01:21 +00:00
resources Telefonbuch-Sync nach Microsoft 365: Teams-/Handy-Anruferkennung über Outlook-Kontakteordner, E.164-Normalisierung (v1.546.0) 2026-08-11 08:42:19 +00:00
routes Telefonbuch-Sync nach Microsoft 365: Teams-/Handy-Anruferkennung über Outlook-Kontakteordner, E.164-Normalisierung (v1.546.0) 2026-08-11 08:42:19 +00:00
scripts QS: Uebersetzungs-Verwendungspruefung (undefinierte/ungenutzte vereo.*-Keys) + CI-Schritt 2026-06-07 14:57:54 +00:00
storage App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00
tests M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0) 2026-08-11 10:41:45 +00:00
.editorconfig App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00
.env.example Doku: .env.example um Rechnungs-/Angebots-/Automatik-/Bezahl-Variablen erweitert; Rechnungs-Doku um Katalog, Angebote, Abos, Abschlagsrechnungen und Online-Bezahlung (Stripe) ergaenzt 2026-06-10 20:42:26 +00:00
.gitattributes App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00
.gitignore feat: Backup-Wiederherstellung (vereo:restore + UI-Aktion) - DB via psql + Dateien zurueck nach storage/app 2026-06-08 05:18:56 +00:00
artisan App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00
CHANGELOG.md M365-Telefonbuch: optional auch reine E-Mail-Kontakte synchronisieren (v1.550.0) 2026-08-11 10:41:45 +00:00
CLAUDE.md Doku: schlanke CLAUDE.md mit Release-Workflow, Verifikation und Fallen fuer KI-Assistenten 2026-06-12 23:55:16 +00:00
composer.json feat: konfigurierbares Zusatzmenue im Benutzermenue (App-Wechsel) mit Icon-Picker + Import/Export 2026-06-24 06:31:10 +00:00
composer.lock feat: konfigurierbares Zusatzmenue im Benutzermenue (App-Wechsel) mit Icon-Picker + Import/Export 2026-06-24 06:31:10 +00:00
DECISIONS.md Versionierung: SemVer + CHANGELOG (Keep a Changelog), Releases als annotierte Tags 2026-06-06 17:59:37 +00:00
docker-compose.quickstart.yml fix: automatische Sicherungen - eigener Scheduler-Container statt 'schedule:work & queue:work'; Backup-Tasks immer registriert (->when); DEPLOY-Doku 2026-06-08 12:58:43 +00:00
docker-compose.yml v1.428.1: Compose - worker/scheduler healthcheck.disable (geerbter FrankenPHP-Healthcheck schlug fehl), Postgres gehaertet (DB_PASSWORD Pflicht, Defaults, start_period). Reines Compose-Update. 2026-06-19 23:05:18 +00:00
Dockerfile v1.334.0: Beleg-Auslesen (OCR) beim Upload - Betrag/Datum automatisch, Lieferant bei eindeutigem Treffer (Tesseract+poppler im Image), Vorschlag mit Kontrolle 2026-06-14 11:28:19 +00:00
package.json App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00
PHASE1.md Phase-1-Schnitt (MVP) festgezurrt 2026-06-06 17:49:22 +00:00
phpunit.xml Tests: erste PHPUnit-Suite (16 Tests) + CI tests.yml Workflow 2026-06-07 15:33:22 +00:00
README.md docs: add Screenshots section (README + docs/SCREENSHOTS.md) with placeholders 2026-07-08 20:15:07 +00:00
ROADMAP.md feat: eigene Felder fuer Kontakte (Form/Tabelle/Self-Service) 2026-06-07 16:32:23 +00:00
SCOPE.md Unabhaengigkeit/Datensouveraenitaet als Prinzip; zentrales SSO verworfen, Auth pro Instanz 2026-06-06 17:15:58 +00:00
vite.config.js App-Geruest: Laravel 13 + Filament 5, Modul Mitglieder (Person/Org, Soft delete), vereo:ensure-admin; Dockerfile/Entrypoint aktiviert 2026-06-06 17:55:37 +00:00

Vereo

Schlanke, eigenständige Vereinsverwaltung — eine Instanz pro Verein, self-hosted, kostenlos für nutzende Vereine.

Konzept, Grundsätze und Scope: siehe DECISIONS.md und SCOPE.md. Bitte vor dem Mitarbeiten lesen.

Schnellstart (lokal/Test)

Drei Schritte läuft direkt im Browser (App + Worker + PostgreSQL):

cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.quickstart.yml up -d
# Danach: http://localhost:8080
  • Anmeldung als Administrator: Das initiale Passwort steht im App-Log (docker compose logs app | grep Initial-Passwort), sofern ADMIN_EMAIL/ ADMIN_PASSWORD in der .env nicht gesetzt sind. Standard-Login ist dann admin@vereo.local.
  • APP_KEY darf leer bleiben er wird beim ersten Start erzeugt und im Storage-Volume persistiert (stabil über Neustarts).
  • Port änderbar über QUICKSTART_PORT in der .env (Standard 8080).
  • Migrationen, RBAC, Admin und Grundkonfiguration richtet der Container beim ersten Start automatisch ein.

Produktion: Hinter Coolify/Traefik ohne das Quickstart-Overlay starten (nur docker-compose.yml); dort übernimmt der Reverse-Proxy Port/TLS, und APP_KEY sollte fest in der Umgebung gesetzt werden.

Updates & Betrieb: Aktualisieren einer laufenden Instanz, Versions-Check und Fehlersuche bei „Update lädt nicht" siehe Deployment & Betrieb.

Dokumentation

Eine ausführliche Bedien- und Betriebsdokumentation liegt unter docs/ u. a. Beiträge, SEPA-Lastschrift inkl. Testfunktion, Self-Service & Portal, Spenden, Veranstaltungen, Mitteilungen & Newsletter, Rechnungen & Steuer und Dokumentvorlagen/PDF & E-Mail.

Stack

  • Laravel (PHP) + Filament (Admin-UI)
  • PostgreSQL
  • Jobs/Scheduler über Laravel (DB-Queue-Driver, kein Redis im Standard)
  • Deploy über Docker / Coolify

Begründung der Wahl (Zuverlässigkeit & Langlebigkeit, wenige bewegliche Teile): siehe DECISIONS.md → Tech-Stack.

Leitplanken (Kurzfassung)

  • Single-Tenant: eine Instanz = ein Verein. Keine Mandantentrennung.
  • Unabhängig & datensouverän: Betreiber sieht nicht in Vereinsdaten; Instanz ist eigenständig betreibbar.
  • Marginaler Wartungsaufwand ≈ 0: Migrations & Admin-Provisioning automatisch beim Start; Backups & Health je Instanz.
  • 12-Factor: alles über Env-Variablen; keine festen Ports; Reverse-Proxy-bewusst.

Funktionsumfang

Vereo ist eine vollständige Vereinsverwaltung. Wesentliche Module:

  • Mitglieder & CRM: Mitglieder, Konten und Personen, Ansprechpartner mit Funktionen/Rollen, eigene Felder (Custom Fields), CSV-Import/-Export, Serienbrief-Adressexport, Mitglieds-Stammblatt (PDF), 360°-Blick je Mitglied.
  • Beiträge & SEPA: Beitragsmodelle, Sollstellung (Jahreslauf mit Vorschau, Einzel- und Sammel-Sollstellung), SEPA-Lastschrift-Lauf, Rücklastschrift, Mahnwesen, Beitragsbescheinigung & -quittung (PDF, einzeln und als Jahres-ZIP).
  • Rechnungen: Rechnungsstellung mit GoBD-Nummernkreis, PDF inkl. ZUGFeRD, Mahnautomatik, Versand per E-Mail.
  • Veranstaltungen: Events mit Kapazität/Warteliste, öffentliche und Portal- Anmeldung (einbettbar), Teilnehmerlisten (PDF/CSV), Anmelde-Benachrichtigung.
  • Self-Service-Portal: Login für Kontakte, Profil-/Kontodaten-Pflege, Event-An-/Abmeldung, Belege (Rechnungen, Beitragsbescheinigungen, freigegebene Dokumente), Übersichts-Dashboard.
  • Newsletter: Segmente, Double-Opt-in mit Anmeldeformular (einbettbar), Abmeldung/Opt-out, Abonnenten-Verwaltung, Versand über die Queue.
  • Spenden: Erfassung (Mitglied oder extern), Zuwendungsbestätigung (§ 10b EStG, einzeln und als Jahres-Sammelbestätigung), Dankesmail, Import/Export.
  • Dashboards: Kennzahlen-Kacheln und Diagramme (Mitgliederentwicklung, Beitrags- und Spendeneinnahmen).
  • Auswertungen/Export: Offene-Posten-Liste, Jahresabschluss-Export (ZIP), globale Suche, Audit-Log mit Filtern.

Lokales Setup

cp .env.example .env
# Container bauen & starten
docker compose up -d --build
# Migrations, RBAC und Konfigurationslisten laufen automatisch über den Entrypoint

Deploy via Coolify

  • Repo als Quelle, docker-compose.yml verwenden.
  • APP_URL auf die externe Domain/Subdomain setzen — wird respektiert, damit Cookies, Redirects, absolute Links und OIDC-Redirects funktionieren.
  • Routing/TLS macht Coolify/Traefik. Die App bindet keine festen Host-Ports.
  • Persistente Daten liegen in Volumes (DB + hochgeladene Dokumente).

Konfiguration pro Verein (wichtig)

Jede Instanz gehört genau einem Verein. Mindestens setzen:

  • APP_URL — die externe HTTPS-Adresse der Instanz.
  • ADMIN_EMAIL / ADMIN_PASSWORD — initialer Admin (ohne Passwort wird eines generiert und einmalig ins Container-Log geschrieben).
  • ORG_NAME (+ optional ORG_ADDRESS, ORG_ZIP_CITY) — Branding/PDF.

Für den SEPA-Lastschrift-Lauf zusätzlich (Daten des einziehenden Vereins):

  • SEPA_CREDITOR_NAME — Vereinsname.
  • SEPA_CREDITOR_IBAN — Konto, von dem eingezogen wird.
  • SEPA_CREDITOR_IDGläubiger-Identifikationsnummer (Format DE…ZZZ…), bei der Deutschen Bundesbank zu beantragen.
  • SEPA_CREDITOR_BIC — optional.

Ohne die SEPA_CREDITOR_*-Werte stoppt der SEPA-Knopf bewusst mit einem Hinweis, statt eine unbrauchbare Datei zu erzeugen.

Rollen & Rechte

Zugriffe werden über Berechtigungen (spatie/permission) gesteuert. Die Rolle super_admin umgeht alle Prüfungen. Vorhandene Berechtigungen:

  • Mitglieder verwalten
  • Finanzen verwalten
  • Veranstaltungen verwalten
  • Newsletter versenden
  • Benutzer verwalten
  • Audit-Log einsehen

Geplante Aufgaben (Scheduler)

Beim Containerstart aktiv (über den Laravel-Scheduler, gesteuert per Einstellungen unter Konfiguration → Automatik):

  • vereo:contributions-run — Beitrags-Sollstellung
  • vereo:sepa-run — SEPA-Lastschrift-Lauf
  • vereo:invoice-dunning-run — Rechnungs-Mahnungen
  • vereo:dunning-run — Beitrags-Mahnungen

Wartungsbefehle

  • php artisan vereo:ensure-rbac — Berechtigungen/Rollen sicherstellen
  • php artisan vereo:ensure-config — Konfigurationslisten (Lookups) sicherstellen

Beide laufen automatisch über den Entrypoint und sind idempotent.

Versionierung

Es gilt Semantic Versioning; Änderungen werden in CHANGELOG.md nach dem Format Keep a Changelog gepflegt. Die laufende Version steht in config/vereo.php (version) und erscheint im Footer.

Screenshots

Ein visueller Überblick. Die vollständige Galerie findest du in docs/SCREENSHOTS.md.

Mitgliederliste Beitraege Rechnung (PDF)
Mitgliederliste Beitraege Rechnung (PDF)

Screenshots noch nicht vorhanden? Lege die PNGs unter docs/screenshots/ ab (Dateinamen siehe docs/SCREENSHOTS.md). Bitte nur anonymisierte Demo-Daten verwenden.