Dateien nach "/" hochladen
This commit is contained in:
@@ -0,0 +1,139 @@
|
|||||||
|
# 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)
|
||||||
|
```
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
services:
|
||||||
|
php:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: docker/php.Dockerfile
|
||||||
|
volumes:
|
||||||
|
- .:/var/www/html
|
||||||
|
- geburtsverein-data:/var/www/html/data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:alpine
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
volumes:
|
||||||
|
- .:/var/www/html
|
||||||
|
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
|
depends_on:
|
||||||
|
- php
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
geburtsverein-data:
|
||||||
Reference in New Issue
Block a user