- docker-compose.server.yml: app on APP_BIND for an existing nginx proxy, QLO_SSL passed to the container - docker/setup-testserver.ps1: one-shot setup for Docker Desktop/WSL (random .env secrets, CLI install that never reinstalls over an existing shop, German texts, optional demo content, hardening) - docker/harden-test-server.php: delete demo customer pub@qloapps.com, disable webservice API keys, set SSL mode, deny module log folders - docker/nginx-qloapps.conf: HTTPS + basic auth + X-Forwarded-Proto - apache: deny /modules/*/logs/ (qlocmconnector logs API secrets) - docker/TESTSERVER.md: Windows Server guide (German) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.7 KiB
Testserver auf Windows Server
Shop mit Wasserrad-Design auf einem Windows Server, erreichbar über den vorhandenen nginx-Reverse-Proxy. nginx übernimmt HTTPS und schützt die ganze Seite mit einem Passwort.
Browser ──HTTPS──> nginx (Zertifikat, Passwort) ──HTTP──> Windows Server :8080 ──> Docker: app (Apache/PHP) + db (MariaDB)
1. Docker auf dem Windows Server
Variante A: Docker Desktop (bevorzugt)
- WSL 2 aktivieren (PowerShell als Administrator), danach neu starten:
wsl --install --no-distribution - Docker Desktop installieren, Einstellung „Use the WSL 2 based engine“ aktiv lassen.
- Unter Settings → General „Start Docker Desktop when you sign in“ aktivieren.
Hinweis: Docker Desktop ist offiziell für Windows 10/11 gedacht; auf Windows Server 2022/2025 läuft es mit WSL 2 in der Regel, wird aber von Docker nicht unterstützt. Docker Desktop startet erst, wenn sich ein Benutzer anmeldet. Ab 250 Mitarbeitenden oder 10 Mio. $ Umsatz braucht Docker Desktop eine kostenpflichtige Lizenz.
Variante B: Docker Engine direkt in WSL (falls Docker Desktop nicht startet)
wsl --install -d Ubuntu-24.04
In Ubuntu: curl -fsSL https://get.docker.com | sh, dann die Schritte unten in Ubuntu mit docker compose … ausführen
(statt des PowerShell-Skripts die Befehle aus docker-compose.yml nutzen).
2. Code holen
git clone -b hotel/no-telemetry-docker https://gitea.hephex.de/Daniel/hotel.git C:\hotel
cd C:\hotel
3. Einrichten (ein Befehl)
powershell -ExecutionPolicy Bypass -File docker\setup-testserver.ps1 -ShopDomain test.example.de
Das Skript
- legt
.envmit zufälligen Passwörtern an (Admin-Login steht dort:ADMIN_EMAIL/ADMIN_PASSWORD), - baut und startet die Container,
- installiert QloApps auf Deutsch (überspringt das, wenn schon installiert, also kein versehentliches Löschen),
- ergänzt fehlende deutsche Texte, lädt die Wasserrad-Demo (
-NoDemozum Weglassen), - räumt auf: Demo-Kunde gelöscht, API-Schlüssel abgeschaltet, Log-Ordner gesperrt.
Ohne Zertifikat im LAN: -NoSsl.
Port und Adresse der App stehen in .env unter APP_BIND (Standard 0.0.0.0:8080).
Läuft nginx auf demselben Server: APP_BIND=127.0.0.1:8080. Sonst die Windows-Firewall für Port 8080 nur für die IP des nginx-Servers öffnen:
New-NetFirewallRule -DisplayName "QloApps from nginx" -Direction Inbound -Protocol TCP -LocalPort 8080 -RemoteAddress <IP-des-nginx> -Action Allow
4. nginx
Vorlage: nginx-qloapps.conf. Domain, Zertifikat und APP_HOST anpassen, Passwortdatei anlegen:
htpasswd -c /etc/nginx/.htpasswd-hotel tester
nginx -t && systemctl reload nginx
Wichtig ist proxy_set_header X-Forwarded-Proto $scheme; – daran erkennt QloApps HTTPS. Ohne die Zeile gibt es Umleitungsschleifen.
Betrieb
| Aufgabe | Befehl (im Repo-Ordner) |
|---|---|
| Status | docker compose -f docker-compose.yml -f docker-compose.server.yml ps |
| Logs | docker compose -f docker-compose.yml -f docker-compose.server.yml logs -f app |
| Update | git pull, dann das Setup-Skript erneut ausführen |
| Stoppen | docker compose -f docker-compose.yml -f docker-compose.server.yml down (Daten bleiben im Volume db_data) |
| Backup DB | docker compose exec db mariadb-dump -uroot -p<DB_ROOT_PASSWORD> qloapps > backup.sql |
Vor echtem Betrieb
Der Testserver ist für Design- und Ablauftests gedacht. Für echte Buchungen fehlen noch: eigene Rechtstexte (Impressum, Datenschutz, AGB), E-Mail-Versand (SMTP), Zahlungsart, regelmäßige Backups und QloApps-Updates (der automatische Update-Hinweis ist abgeschaltet).