# 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://: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) ```