From 2a6216c0decb07c27513576386b4c8cab3aaa75d Mon Sep 17 00:00:00 2001 From: Blink1986 Date: Tue, 28 Jul 2026 10:13:42 +0000 Subject: [PATCH] Dateien nach "/" hochladen --- README.md | 139 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 23 ++++++++ 2 files changed, 162 insertions(+) create mode 100644 README.md create mode 100644 docker-compose.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..00f9093 --- /dev/null +++ b/README.md @@ -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://: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) +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..28a58ac --- /dev/null +++ b/docker-compose.yml @@ -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: