Inhaltsverzeichnis
Installation
Schnellstart
git clone https://github.com/Wachhund/S3-image-gallery.git
cd S3-image-gallery
cp .env.example .env
# Optional: .env anpassen (Ports, Credentials, OTP)
docker compose up --build -d
Testdaten laden
# Bucket scannen und Bilder katalogisieren
docker compose exec php php bin/scan.php
# Thumbnails erzeugen
docker compose exec php php bin/thumbs.php
Passkey einrichten
- In
.envein Einmal-Passwort setzen:S3G_REGISTRATION_OTP=mein-geheimes-passwort - Container neu erstellen:
docker compose up -d --force-recreate php - Unter
/registerden Passkey mit dem OTP anlegen - Unter
/loginmit dem Passkey anmelden
Docker-Services
| Service | Basis | Port | Beschreibung |
|---|---|---|---|
| nginx | Alpine | 8080 | Reverse Proxy, Security Headers, Gzip |
| php | PHP 8.4 FPM | — | Anwendung (GD, EXIF, PDO) |
| db | MariaDB 11 | 3306 | Datenbank (persistentes Volume) |
| storage | RustFS | 9001 (Console) | S3-kompatibler Objektspeicher |
| storage-init | AWS CLI | — | Bucket-Erstellung (einmalig) |
| battle-php | PHP 8.4 FPM | — | FotoBattle-Anwendung |
| battle-nginx | Alpine | 8081 | FotoBattle-Frontend |
FotoBattle aktivieren
FotoBattle muss als Geschwister-Verzeichnis neben der Gallery liegen:
├── S3-image-gallery/
└── photo_battles/
# FotoBattle-Container starten
docker compose up -d --build battle-php battle-nginx
Erster Admin-Account:
- Unter
http://localhost:8081/registerregistrieren - In der Datenbank:
UPDATE users SET role='admin' WHERE email='...'
Umgebungsvariablen
Gallery
| Variable | Standard | Beschreibung |
|---|---|---|
PHP_VERSION |
8.5 | Docker-Image-Tag |
DB_HOST |
db | MariaDB-Hostname |
DB_NAME |
s3gallery | Datenbankname |
DB_USER |
s3gallery | DB-Benutzer |
DB_PASSWORD |
changeme | DB-Passwort |
S3_ENDPOINT |
http://storage:9000 | RustFS-API-Endpoint |
S3_ACCESS_KEY |
rustfsadmin | RustFS-Zugangsdaten |
S3_SECRET_KEY |
rustfsadmin | RustFS-Zugangsdaten |
S3_BUCKET |
gallery | S3-Bucket-Name |
NGINX_PORT |
8080 | Host-Port für Gallery |
RUSTFS_CONSOLE_PORT |
9001 | Host-Port für RustFS-Console |
APP_DEBUG |
false | Fehlerdetails anzeigen |
APP_SECURE_COOKIES |
true | HTTPS-only Session-Cookies |
S3G_REGISTRATION_OTP |
(leer) | Einmal-Passwort für Passkey-Registrierung |
S3G_RP_ID |
localhost | WebAuthn Relying Party ID |
FotoBattle
| Variable | Standard | Beschreibung |
|---|---|---|
BATTLE_PORT |
8081 | Host-Port für FotoBattle |
BATTLE_URL |
http://localhost:8081 | FotoBattle-Basis-URL |
BATTLE_SUBMIT_SECRET |
changeme | Shared HMAC-Secret (min. 32 Zeichen) |
DB- und S3-Variablen werden von der Gallery geteilt.
Quality Gates
# Tests
docker compose exec php composer test
# Statische Analyse (PHPStan Level 6)
docker compose exec php composer analyse
# Code Style
docker compose exec php composer cs-check
Constraints
- Demo-Projekt — Nicht für Produktion vorgesehen
- Single-Node — Docker Compose, kein Kubernetes
- Kein CDN — Bilder über PHP-Proxy direkt aus RustFS
- Kein WebSocket — Kein Live-Battle-Feed
- Synchrone Projektionen — Kein Message Broker im MVP