Files
hotel/docker/TESTSERVER.md
DanielS 43a0b96fdf Test server: code in a Docker volume instead of a C:\ bind mount
With Docker Desktop on Windows the bind-mounted C:\hotel made every page
take ~5-7 s; with the code on the Linux filesystem it takes ~0.1 s.

- docker/Dockerfile.server bakes the repo into the image (.dockerignore
  keeps .env, settings.inc.php and caches out)
- docker/server-entrypoint.sh copies the code into the app_code volume on
  start: pass 1 updates code but skips runtime folders (uploads, generated
  images, caches, downloaded translations, settings.inc.php), pass 2 adds
  missing files without overwriting
- docker/php-server.ini: OPcache without timestamp checks, larger
  realpath cache
- setup script waits for the container and checks the install marker
  inside the volume; .gitattributes keeps *.sh LF on Windows checkouts
- TESTSERVER.md: speed section and one-time switch from the first version

Tested with a fresh stack: full install + demo + hardening, re-run keeps
DB/uploads, rebuilt image delivers code changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 22:40:07 +01:00

5.7 KiB
Raw Blame History

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)

  1. WSL 2 aktivieren (PowerShell als Administrator), danach neu starten:
    wsl --install --no-distribution
    
  2. Docker Desktop installieren, Einstellung „Use the WSL 2 based engine“ aktiv lassen.
  3. 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 .env mit 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 (-NoDemo zum 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.

Geschwindigkeit

Der Code wird ins Image gebaut und beim Start in das Docker-Volume app_code (Linux-Dateisystem) kopiert. C:\hotel dient nur als Git-Checkout. Liegt der Code dagegen per Bind-Mount auf C:\, braucht jede Seite mehrere Sekunden statt ~0,1 s (gemessen: 4,7 s gegenüber 0,13 s).

Umstieg von der ersten Version (Code noch auf C:\hotel eingebunden): einmal komplett neu aufsetzen, die Testdaten gehen dabei verloren:

cd C:\hotel
git pull
docker compose -f docker-compose.yml -f docker-compose.server.yml down -v
powershell -ExecutionPolicy Bypass -File docker\setup-testserver.ps1 -ShopDomain 192.168.178.20:8080 -NoSsl

Fehlersuche

QloApps speichert Domain und HTTPS-Modus in der Datenbank und leitet jeden Aufruf dorthin um. Steht dort eine falsche Domain oder https, obwohl nginx (noch) kein HTTPS liefert, endet der Browser bei ERR_SSL_PROTOCOL_ERROR oder einer fremden Seite.

Domain/HTTPS ändern: in .env SHOP_DOMAIN und QLO_SSL anpassen und das Setup-Skript erneut starten, oder direkt:

# hinter nginx mit HTTPS
docker compose -f docker-compose.yml -f docker-compose.server.yml exec -u www-data app php docker/set-domain.php hotel-test.example.de 1
# direkter Test im LAN ohne nginx (http://<IP>:8080)
docker compose -f docker-compose.yml -f docker-compose.server.yml exec -u www-data app php docker/set-domain.php 192.168.1.50:8080 0
Symptom Ursache
ERR_SSL_PROTOCOL_ERROR beim Aufruf von http://<IP>:8080 Shop steht auf HTTPS + Domain → Umleitung auf https://…. Für den Direkttest set-domain.php <IP>:8080 0
ERR_SSL_PROTOCOL_ERROR beim Aufruf der Domain nginx liefert auf Port 443 kein TLS (listen 443 ssl; fehlt) oder DNS zeigt auf einen anderen Server. Prüfen: curl -vk https://<domain>
Endlose Umleitung proxy_set_header X-Forwarded-Proto $scheme; fehlt in nginx
Seite lädt, aber ohne Bilder/CSS Domain in der DB passt nicht zur aufgerufenen Adresse → set-domain.php

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 (baut das Image neu, Daten bleiben)
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).