diff --git a/README.md b/README.md index 4430ed9..f11434b 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/Website/docker-compose.yml b/Website/docker-compose.yml index 641f369..d1f2130 100644 --- a/Website/docker-compose.yml +++ b/Website/docker-compose.yml @@ -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 diff --git a/Website/launch.sh b/Website/launch.sh new file mode 100755 index 0000000..cf9d331 --- /dev/null +++ b/Website/launch.sh @@ -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." \ No newline at end of file diff --git a/Website/launch_dev.sh b/Website/launch_dev.sh index 1a3336b..b66a068 100755 --- a/Website/launch_dev.sh +++ b/Website/launch_dev.sh @@ -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." \ No newline at end of file +# Backward-compatible wrapper: the canonical launcher is now launch.sh +exec "$SCRIPT_DIR/launch.sh" "$@" diff --git a/Website/stop.sh b/Website/stop.sh new file mode 100755 index 0000000..a109e4b --- /dev/null +++ b/Website/stop.sh @@ -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"