advncements i the starting nd stopping
This commit is contained in:
@@ -19,10 +19,12 @@ Dieses Repository ist auf einen schlanken, Docker-first Betrieb ausgerichtet.
|
||||
- Nginx-Konfiguration anwenden/deaktivieren
|
||||
- [Website/provision_instance.sh](Website/provision_instance.sh)
|
||||
- Instanz-Provisioning für Inventarsystem (release-basiert, Multiinstancing-aware)
|
||||
- [Website/launch.sh](Website/launch.sh)
|
||||
- Start der Website (kanonisches Startskript)
|
||||
- [Website/launch_dev.sh](Website/launch_dev.sh)
|
||||
- Dev-Start der Website inkl. Host-Sync
|
||||
- [Website/launch_prod.sh](Website/launch_prod.sh)
|
||||
- Prod-Start der Website inkl. Host-Sync
|
||||
- Kompatibilitäts-Wrapper auf launch.sh
|
||||
- [Website/stop.sh](Website/stop.sh)
|
||||
- Stoppt den Website-Stack (docker compose down)
|
||||
- [Website/start_docker_build.sh](Website/start_docker_build.sh)
|
||||
- Build/Start-Helfer für Website-Container
|
||||
- [Website/sync_dev_hosts.sh](Website/sync_dev_hosts.sh)
|
||||
@@ -61,9 +63,10 @@ Wichtige Ports:
|
||||
|
||||
- Gitea intern: 127.0.0.1:3001
|
||||
- Gitea SSH: 2222
|
||||
- Website Upstream: 4999
|
||||
- Website Upstream: 127.0.0.1:4999
|
||||
- MongoDB Host-Port: 127.0.0.1:27018 (oder `MONGO_PUBLISHED_PORT`)
|
||||
|
||||
Hinweis: Die Website nutzt in Docker Compose intern den Service-Namen `mongodb` als MongoDB-Host. Wenn du die Website lokal mit `python` oder außerhalb des Containers startest, muss `MONGO_URI` auf einen hostzugänglichen MongoDB-Endpunkt zeigen oder `mongodb` über `27017:27017` erreichbar sein.
|
||||
Hinweis: Die Website nutzt in Docker Compose intern den Service-Namen `mongodb` als MongoDB-Host. Wenn du die Website lokal mit `python` oder außerhalb des Containers startest, muss `MONGO_URI` auf einen hostzugänglichen MongoDB-Endpunkt zeigen. Standardmäßig ist MongoDB am Host auf `27018` veröffentlicht (konfigurierbar via `MONGO_PUBLISHED_PORT`).
|
||||
|
||||
### Nginx
|
||||
|
||||
@@ -131,14 +134,14 @@ Hinweis:
|
||||
|
||||
- Wenn die Website ohne Zugriff auf systemd/journalctl läuft (z. B. in eingeschränkten Containern), bleiben Core-Docker-Logs verfügbar, während Service-Logs als nicht verfügbar angezeigt werden können.
|
||||
|
||||
## Betriebsmodi Website
|
||||
## Startskript Website
|
||||
|
||||
- Development: [Website/launch_dev.sh](Website/launch_dev.sh)
|
||||
- Production: [Website/launch_prod.sh](Website/launch_prod.sh)
|
||||
- Standard: [Website/launch.sh](Website/launch.sh)
|
||||
- Kompatibel (alt): [Website/launch_dev.sh](Website/launch_dev.sh)
|
||||
|
||||
### Neues: Start-Health-Check im `launch_dev.sh`
|
||||
### Neues: Start-Health-Check im `launch.sh`
|
||||
|
||||
`Website/launch_dev.sh` führt jetzt vor dem Build eine kurze Prüfung durch und wartet nach dem Start auf eine erreichbare HTTP-Antwort:
|
||||
`Website/launch.sh` führt jetzt vor dem Build eine kurze Prüfung durch und wartet nach dem Start auf eine erreichbare HTTP-Antwort:
|
||||
|
||||
- Vor dem Build wird geprüft, ob `gunicorn.conf.py` im `Website/`-Verzeichnis vorhanden ist; falls nicht, bricht das Skript mit einer erklärenden Fehlermeldung ab.
|
||||
- Nach `docker compose up -d` wartet das Skript bis zu 60 Sekunden (Intervall 2s) auf einen erfolgreichen HTTP-Request (`/`) auf `127.0.0.1:4999`.
|
||||
@@ -170,14 +173,14 @@ docker exec -it website-website-1 curl -v http://127.0.0.1:4999/ || \
|
||||
|
||||
Wenn du möchtest, passe ich das Timeout oder den Health-Endpoint (`/health`) an.
|
||||
|
||||
Beispiel Production:
|
||||
Beispiel Start:
|
||||
|
||||
```bash
|
||||
cd Website
|
||||
export INSTANCE_PARENT_DOMAIN=example.de
|
||||
export INSTANCE_WILDCARD_CERT_FILE=/etc/nginx/certs/wildcard.example.de.crt
|
||||
export INSTANCE_WILDCARD_KEY_FILE=/etc/nginx/certs/wildcard.example.de.key
|
||||
./launch_prod.sh
|
||||
./launch.sh
|
||||
```
|
||||
|
||||
## SEO & LLM-Optimierung
|
||||
|
||||
@@ -13,7 +13,7 @@ services:
|
||||
environment:
|
||||
MONGO_INITDB_DATABASE: Invario_Website
|
||||
ports:
|
||||
- "27017:27017"
|
||||
- "127.0.0.1:${MONGO_PUBLISHED_PORT:-27018}:27017"
|
||||
volumes:
|
||||
- mongo_data:/data/db
|
||||
healthcheck:
|
||||
@@ -45,7 +45,7 @@ services:
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
ports:
|
||||
- "4999:4999"
|
||||
- "127.0.0.1:4999:4999"
|
||||
mem_limit: 256m
|
||||
mem_reservation: 128m
|
||||
|
||||
|
||||
Executable
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
DOCKER_CMD=()
|
||||
|
||||
resolve_docker_cmd() {
|
||||
if docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
if sudo -n docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(sudo docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
if command -v sudo >/dev/null 2>&1 && [ -t 0 ]; then
|
||||
echo "Docker-Zugriff ohne Gruppe erkannt. Verwende sudo docker (ggf. Passwortabfrage)."
|
||||
if sudo docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(sudo docker)
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "[FEHLER] Kein Zugriff auf den Docker Daemon (/var/run/docker.sock)." >&2
|
||||
echo "Führe das Script mit sudo aus oder füge deinen User zur docker-Gruppe hinzu:" >&2
|
||||
echo " sudo usermod -aG docker $USER" >&2
|
||||
echo "Danach neu einloggen und Script erneut starten." >&2
|
||||
exit 3
|
||||
}
|
||||
|
||||
export SESSION_COOKIE_SECURE="0"
|
||||
export INSTANCE_TLS_MODE="development"
|
||||
export INSTANCE_PARENT_DOMAIN="${INSTANCE_PARENT_DOMAIN:-meine-domain}"
|
||||
export DEV_HOSTS_REFRESH_INTERVAL="${DEV_HOSTS_REFRESH_INTERVAL:-30}"
|
||||
|
||||
echo "Launching WEBSITE stack"
|
||||
echo " SESSION_COOKIE_SECURE=$SESSION_COOKIE_SECURE"
|
||||
echo " INSTANCE_TLS_MODE=$INSTANCE_TLS_MODE"
|
||||
echo " INSTANCE_PARENT_DOMAIN=$INSTANCE_PARENT_DOMAIN"
|
||||
echo " DEV_HOSTS_REFRESH_INTERVAL=$DEV_HOSTS_REFRESH_INTERVAL"
|
||||
|
||||
# Ensure required runtime files exist before building
|
||||
if [ ! -f "$SCRIPT_DIR/gunicorn.conf.py" ]; then
|
||||
echo "[FEHLER] gunicorn.conf.py fehlt in $SCRIPT_DIR. Bitte prüfen." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
resolve_docker_cmd
|
||||
|
||||
"${DOCKER_CMD[@]}" compose build website
|
||||
"${DOCKER_CMD[@]}" compose up -d
|
||||
|
||||
# Wait for website to become healthy (simple HTTP check)
|
||||
check_url="http://localhost:4999"
|
||||
timeout_seconds=60
|
||||
interval=2
|
||||
elapsed=0
|
||||
|
||||
echo "Warte auf Website (${check_url}) bis ${timeout_seconds}s..."
|
||||
while [ $elapsed -lt $timeout_seconds ]; do
|
||||
if curl -sS --max-time 2 "$check_url" >/dev/null 2>&1; then
|
||||
echo "Website erreichbar nach ${elapsed}s"
|
||||
break
|
||||
fi
|
||||
sleep $interval
|
||||
elapsed=$((elapsed + interval))
|
||||
done
|
||||
|
||||
if [ $elapsed -ge $timeout_seconds ]; then
|
||||
echo "[FEHLER] Website nicht erreichbar nach ${timeout_seconds}s. Sammle Diagnosedaten..."
|
||||
echo "--- docker compose ps ---"
|
||||
"${DOCKER_CMD[@]}" compose ps || true
|
||||
echo "--- docker logs website (tail 200) ---"
|
||||
"${DOCKER_CMD[@]}" logs --tail 200 website-website-1 || true
|
||||
echo "Bitte prüfe Container-Logs und nginx-Konfiguration."
|
||||
fi
|
||||
|
||||
echo "Website stack is running on http://localhost:4999"
|
||||
echo "Provisioning creates self-signed certs per subdomain when needed."
|
||||
+2
-70
@@ -2,74 +2,6 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
DOCKER_CMD=()
|
||||
|
||||
resolve_docker_cmd() {
|
||||
if docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
if sudo -n docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(sudo docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "[FEHLER] Kein Zugriff auf den Docker Daemon (/var/run/docker.sock)." >&2
|
||||
echo "Führe das Script mit sudo aus oder füge deinen User zur docker-Gruppe hinzu:" >&2
|
||||
echo " sudo usermod -aG docker $USER" >&2
|
||||
echo "Danach neu einloggen und Script erneut starten." >&2
|
||||
exit 3
|
||||
}
|
||||
|
||||
export SESSION_COOKIE_SECURE="0"
|
||||
export INSTANCE_TLS_MODE="development"
|
||||
export INSTANCE_PARENT_DOMAIN="${INSTANCE_PARENT_DOMAIN:-meine-domain}"
|
||||
export DEV_HOSTS_REFRESH_INTERVAL="${DEV_HOSTS_REFRESH_INTERVAL:-30}"
|
||||
|
||||
echo "Launching DEVELOPMENT stack"
|
||||
echo " SESSION_COOKIE_SECURE=$SESSION_COOKIE_SECURE"
|
||||
echo " INSTANCE_TLS_MODE=$INSTANCE_TLS_MODE"
|
||||
echo " INSTANCE_PARENT_DOMAIN=$INSTANCE_PARENT_DOMAIN"
|
||||
echo " DEV_HOSTS_REFRESH_INTERVAL=$DEV_HOSTS_REFRESH_INTERVAL"
|
||||
|
||||
# Ensure required runtime files exist before building
|
||||
if [ ! -f "$SCRIPT_DIR/gunicorn.conf.py" ]; then
|
||||
echo "[FEHLER] gunicorn.conf.py fehlt in $SCRIPT_DIR. Bitte prüfen." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
resolve_docker_cmd
|
||||
|
||||
"${DOCKER_CMD[@]}" compose build website
|
||||
"${DOCKER_CMD[@]}" compose up -d
|
||||
|
||||
# Wait for website to become healthy (simple HTTP check)
|
||||
check_url="http://localhost:4999"
|
||||
timeout_seconds=60
|
||||
interval=2
|
||||
elapsed=0
|
||||
|
||||
echo "Warte auf Website (${check_url}) bis ${timeout_seconds}s..."
|
||||
while [ $elapsed -lt $timeout_seconds ]; do
|
||||
if curl -sS --max-time 2 "$check_url" >/dev/null 2>&1; then
|
||||
echo "Website erreichbar nach ${elapsed}s"
|
||||
break
|
||||
fi
|
||||
sleep $interval
|
||||
elapsed=$((elapsed + interval))
|
||||
done
|
||||
|
||||
if [ $elapsed -ge $timeout_seconds ]; then
|
||||
echo "[FEHLER] Website nicht erreichbar nach ${timeout_seconds}s. Sammle Diagnosedaten..."
|
||||
echo "--- docker compose ps ---"
|
||||
"${DOCKER_CMD[@]}" compose ps || true
|
||||
echo "--- docker logs website (tail 200) ---"
|
||||
"${DOCKER_CMD[@]}" logs --tail 200 website-website-1 || true
|
||||
echo "Bitte prüfe Container-Logs und nginx-Konfiguration."
|
||||
fi
|
||||
|
||||
echo "Development stack is running on http://localhost:4999"
|
||||
echo "Provisioning creates self-signed certs per subdomain when needed."
|
||||
# Backward-compatible wrapper: the canonical launcher is now launch.sh
|
||||
exec "$SCRIPT_DIR/launch.sh" "$@"
|
||||
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
DOCKER_CMD=()
|
||||
|
||||
resolve_docker_cmd() {
|
||||
if docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
if sudo -n docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(sudo docker)
|
||||
return 0
|
||||
fi
|
||||
|
||||
if command -v sudo >/dev/null 2>&1 && [ -t 0 ]; then
|
||||
echo "Docker-Zugriff ohne Gruppe erkannt. Verwende sudo docker (ggf. Passwortabfrage)."
|
||||
if sudo docker info >/dev/null 2>&1; then
|
||||
DOCKER_CMD=(sudo docker)
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "[FEHLER] Kein Zugriff auf den Docker Daemon (/var/run/docker.sock)." >&2
|
||||
echo "Führe das Script mit sudo aus oder füge deinen User zur docker-Gruppe hinzu:" >&2
|
||||
echo " sudo usermod -aG docker $USER" >&2
|
||||
echo "Danach neu einloggen und Script erneut starten." >&2
|
||||
exit 3
|
||||
}
|
||||
|
||||
resolve_docker_cmd
|
||||
|
||||
echo "Stopping WEBSITE stack"
|
||||
"${DOCKER_CMD[@]}" compose down
|
||||
|
||||
echo "Website stack stopped"
|
||||
Reference in New Issue
Block a user