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

126 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:
```powershell
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)
```powershell
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
```powershell
git clone -b hotel/no-telemetry-docker https://gitea.hephex.de/Daniel/hotel.git C:\hotel
cd C:\hotel
```
## 3. Einrichten (ein Befehl)
```powershell
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:
```powershell
New-NetFirewallRule -DisplayName "QloApps from nginx" -Direction Inbound -Protocol TCP -LocalPort 8080 -RemoteAddress <IP-des-nginx> -Action Allow
```
## 4. nginx
Vorlage: [`nginx-qloapps.conf`](nginx-qloapps.conf). Domain, Zertifikat und `APP_HOST` anpassen, Passwortdatei anlegen:
```bash
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:
```powershell
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:
```powershell
# 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).