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>
126 lines
5.7 KiB
Markdown
126 lines
5.7 KiB
Markdown
# 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).
|