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

  1. In .env ein Einmal-Passwort setzen: S3G_REGISTRATION_OTP=mein-geheimes-passwort
  2. Container neu erstellen: docker compose up -d --force-recreate php
  3. Unter /register den Passkey mit dem OTP anlegen
  4. Unter /login mit 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:

  1. Unter http://localhost:8081/register registrieren
  2. 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