2026-07-28 10:14:39 +00:00
2026-07-28 10:12:57 +00:00
2026-07-28 10:14:03 +00:00
2026-07-28 10:12:57 +00:00
2026-07-28 10:12:57 +00:00
2026-07-28 10:13:42 +00:00
2026-07-28 10:12:57 +00:00
2026-07-28 10:12:57 +00:00

Geburtsverein Ernsthausen Webseite mit Mitgliederbereich

Was das hier ist

Eine PHP-Webseite mit Login-Bereich: Jedes Mitglied bekommt einen eigenen Zugang und kann Termine und Neuigkeiten eintragen, bearbeiten und löschen. Diese erscheinen automatisch auf der Startseite unter „Aktuelles".

Es wird keine separate Datenbank benötigt die Daten werden in einer SQLite-Datei im Ordner data/ gespeichert, die automatisch angelegt wird. Das funktioniert bei praktisch jedem PHP-Hosting (Strato, IONOS, All-Inkl, u.a.), auch ohne MySQL-Zugang.

Voraussetzungen

  • PHP 8.0 oder neuer mit aktivierter PDO_SQLITE-Erweiterung (bei den meisten Hostern standardmäßig aktiv)
  • Der Ordner data/ muss vom Webserver beschreibbar sein (Rechte 755 oder notfalls 775)

Installation

  1. Alle Dateien und Ordner per FTP in das gewünschte Verzeichnis auf dem Webspace hochladen (z. B. in den Hauptordner oder einen Unterordner wie /verein).
  2. Falls vorhanden, GeburtsvereinSatzung.pdf und den Ordner foto/ (historisches Fotoalbum) mit hochladen bzw. aus der alten Seite übernehmen die Links in der Fußzeile erwarten sie im selben Verzeichnis.
  3. Im Browser die Seite aufrufen. Da noch kein Mitgliedskonto existiert, wirst du automatisch zur Ersteinrichtung (setup.php) weitergeleitet.
  4. Dort das erste Konto anlegen (z. B. für den Präsidenten). Diese Seite sperrt sich danach automatisch sie ist nur sichtbar, solange noch kein Konto existiert.
  5. Ab jetzt können im Mitgliederbereich (admin.php, Link „Mitglieder- Login" oben rechts) weitere Vereinsmitglieder eigene Zugänge erhalten.

Laufender Betrieb

  • Anmelden: über den Button „Mitglieder-Login" oben rechts.
  • Termin/Neuigkeit eintragen: im Mitgliederbereich links das Formular ausfüllen und veröffentlichen.
  • Eintrag bearbeiten/löschen: in der Liste rechts über die entsprechenden Buttons.
  • Neues Mitglied freischalten: im Mitgliederbereich unter „Neues Mitglied freischalten".

Betrieb per Docker (nginx + PHP-FPM)

nginx allein kann kein PHP ausführen dafür ist im Ordner docker/ ein fertiges Setup mit einem separaten PHP-FPM-Container dabei. Die docker-compose.yml liegt im Projekt-Hauptverzeichnis, damit alle Pfade (Build-Kontext, Bind-Mounts) relativ zum Projekt-Root funktionieren das ist auch die Voraussetzung für den Portainer-Weg weiter unten.

Lokal starten (ohne Portainer)

  1. Docker und Docker Compose müssen installiert sein.
  2. Im Projekt-Hauptverzeichnis ausführen:
    docker compose up -d --build
    
  3. Seite ist danach unter http://localhost:8080 erreichbar.
  4. Die SQLite-Datenbank liegt in einem Docker-Volume (geburtsverein-data) und bleibt beim Neustart der Container erhalten. Ein Backup lässt sich z. B. so ziehen:
    docker compose cp php:/var/www/html/data/geburtsverein.sqlite ./backup.sqlite
    

Hinweis: Die .htaccess-Datei in data/ wirkt nur bei Apache. Unter nginx übernimmt das die Regel location ^~ /data/ { deny all; } in docker/nginx/default.conf die ist hier bereits enthalten.

Mit Portainer deployen

Portainer kann Compose-Stacks am zuverlässigsten aus einem Git-Repository bauen, weil dann auch das Dockerfile und die nginx-Konfiguration mit heruntergeladen werden (nicht nur die docker-compose.yml).

  1. Projekt in ein Git-Repository legen (z. B. GitHub, GitLab oder ein selbst gehostetes Gitea) und den gesamten Ordnerinhalt dort hochladen inklusive docker/-Ordner und docker-compose.yml.
  2. In Portainer: Stacks → Add stack.
  3. Einen Namen vergeben (z. B. geburtsverein).
  4. Als Build method „Repository" auswählen:
    • Repository URL: die Git-URL des Projekts
    • Reference: z. B. refs/heads/main
    • Compose path: docker-compose.yml
    • Bei privatem Repository: Zugangsdaten bzw. Personal Access Token hinterlegen
  5. Deploy the stack klicken. Portainer klont das Repository, baut das PHP-Image anhand von docker/php.Dockerfile und startet beide Container inklusive des Datenvolumes automatisch.
  6. Die Seite ist danach über http://<server-ip>:8080 erreichbar. Läuft auf dem Server bereits ein Reverse Proxy (z. B. Nginx Proxy Manager oder Traefik, oft ebenfalls über Portainer verwaltet), lässt sich damit zusätzlich eine eigene Domain mit HTTPS davorschalten.
  7. Updates ausrollen: Änderungen ins Git-Repository pushen, dann im Stack in Portainer auf „Pull and redeploy" (bzw. „Update the stack" mit aktivierter „Re-pull image and redeploy"-Option) klicken.

Alternative ohne Git: Falls kein Git-Repository genutzt werden soll, lässt sich das PHP-Image auch vorab lokal bauen und in eine Registry (z. B. Docker Hub) pushen. Die docker-compose.yml würde dann statt build: einfach image: dein-benutzername/geburtsverein-php:latest verwenden. Die Projektdateien (für die Bind-Mounts) müssten in diesem Fall trotzdem manuell auf den Server kopiert werden, z. B. per SCP nach /opt/geburtsverein.

Sicherheitshinweise

  • Passwörter werden nur als sicherer Hash gespeichert (password_hash), nie im Klartext.
  • Der Ordner data/ ist per .htaccess vor direktem Zugriff über den Browser geschützt. Falls der Server nginx statt Apache nutzt, greift diese .htaccess-Regel nicht dann bitte den Ordner serverseitig zusätzlich sperren oder außerhalb des Web-Verzeichnisses ablegen (im Zweifel beim Hoster nachfragen).
  • Es lohnt sich, regelmäßig eine Kopie der Datei data/geburtsverein.sqlite zu sichern (z. B. per FTP herunterladen) das ist die komplette Datenbank mit allen Terminen, Neuigkeiten und Mitgliedskonten.

Dateiübersicht

index.php              Öffentliche Startseite (liest Aktuelles live aus der Datenbank)
login.php               Login-Formular
logout.php               Abmelden
setup.php                 Einmalige Ersteinrichtung des ersten Kontos
admin.php                  Mitgliederbereich: Termine/Neuigkeiten & Mitglieder verwalten
style.css                   Gemeinsames Design
includes/db.php               Datenbankverbindung, legt Tabellen automatisch an
includes/auth.php              Login-/Session-Verwaltung
includes/functions.php          Hilfsfunktionen
includes/nav.php, footer.php     Wiederverwendete Kopf-/Fußzeile
data/                              Ordner für die SQLite-Datenbank (wird automatisch befüllt)
S
Description
No description provided
Readme
60 KiB
Languages
PHP 82.2%
CSS 16.6%
Dockerfile 1.2%