140 lines
6.4 KiB
Markdown
140 lines
6.4 KiB
Markdown
# 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)
|
||
```
|