Files
geburtsverein-website/README.md
T
2026-07-28 10:13:42 +00:00

140 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
```