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
- 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). - Falls vorhanden,
GeburtsvereinSatzung.pdfund den Ordnerfoto/(historisches Fotoalbum) mit hochladen bzw. aus der alten Seite übernehmen – die Links in der Fußzeile erwarten sie im selben Verzeichnis. - Im Browser die Seite aufrufen. Da noch kein Mitgliedskonto existiert,
wirst du automatisch zur Ersteinrichtung (
setup.php) weitergeleitet. - 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.
- 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)
- Docker und Docker Compose müssen installiert sein.
- Im Projekt-Hauptverzeichnis ausführen:
docker compose up -d --build - Seite ist danach unter
http://localhost:8080erreichbar. - 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).
- Projekt in ein Git-Repository legen (z. B. GitHub, GitLab oder ein
selbst gehostetes Gitea) und den gesamten Ordnerinhalt dort hochladen
– inklusive
docker/-Ordner unddocker-compose.yml. - In Portainer: Stacks → Add stack.
- Einen Namen vergeben (z. B.
geburtsverein). - 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
- Deploy the stack klicken. Portainer klont das Repository, baut das
PHP-Image anhand von
docker/php.Dockerfileund startet beide Container inklusive des Datenvolumes automatisch. - Die Seite ist danach über
http://<server-ip>:8080erreichbar. 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. - 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.htaccessvor 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.sqlitezu 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)