diff --git a/Dockerfile b/Dockerfile index def1526..1cb9cec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,20 @@ -# Basis-Image mit Python -FROM python:3.11-slim +# === Bluemap Reverse Proxy (Nginx) === +# Liefert http://devanturas.net:8100 über HTTPS (via Coolify-Proxy) +# als iframe-fähige Karte auf map.devanturas.net aus. +# +# HTTPS & Domain übernimmt der Coolify-eigene Proxy (Traefik/Caddy). +# Dieser Container läuft dahinter auf HTTP/Port 80. -# Arbeitsverzeichnis erstellen -WORKDIR /app +FROM nginx:1.27-alpine -# System-Dependencies: DejaVu-Schriftarten für PDF-Export (Umlaute) -RUN apt-get update && apt-get install -y --no-install-recommends \ - fonts-dejavu-core \ - && rm -rf /var/lib/apt/lists/* +# Statische Nginx-Proxy-Konfiguration in den Container kopieren +# (inerv /etc/nginx/conf.d/default.conf -> automatisch geladen) +COPY nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf -# Kopiere die requirements-Datei und installiere die Abhängigkeiten -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +# Konfiguration beim Build validieren (fail-fast) +RUN nginx -t -# Kopiere den gesamten Projektinhalt in das Arbeitsverzeichnis -COPY . . +# Port, an dem der Nginx lauscht (Coolify klinkt hier HTTP an) +EXPOSE 80 -# Umgebungsvariablen von Coolify / docker-compose übernehmen (zur Laufzeit) -ENV SECRET_KEY=$SECRET_KEY - - -# Nicht-root Benutzer aus Sicherheitsgründen -RUN useradd --create-home appuser && chown -R appuser:appuser /app -USER appuser - -# Port für Gunicorn -EXPOSE 8000 - -# Startbefehl (Production: Gunicorn) -CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "app:app"] +# Standard-Startbefehl des nginx-Images wird beibehalten (nginx -g "daemon off;") diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index fef827b..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,23 +0,0 @@ -services: - bluemap-proxy: - image: nginx:1.27-alpine - container_name: bluemap-proxy - restart: unless-stopped - ports: - # Wenn Coolify den Traffic serviert, reicht Port 80. - # -> Traefik/Caddy (Coolify) verkabelt die Domain map.devanturas.net - # und sichert sie mit HTTPS ab, dann reicht er HTTP an diesen Port weiter. - - "8080:80" - environment: - # Adresse des Bluemap-Servers. Setze das auf den DNS-Namen/Container - # von Bluemap, falls er im selben Docker-Netzwerk läuft (z.B. "bluemap"), - # oder auf die öffentliche IP/den Hostnamen. - UPSTREAM_HOST: "devanturas.net" - UPSTREAM_PORT: "8100" - # Erlaubt das Einbetten als iframe. Setze hier die erlaubten Quellen - # (kommagetrennt), z.B. "https://devanturas.net" - FRAME_ANCESTORS: "*" - # Maximale Upload-/Request-Größe (Bluemap verwendet ggf. größere Responses) - CLIENT_MAX_BODY_SIZE: "50m" - volumes: - - ./nginx/templates:/etc/nginx/templates:ro \ No newline at end of file diff --git a/nginx/templates/default.conf.template b/nginx/conf.d/default.conf similarity index 62% rename from nginx/templates/default.conf.template rename to nginx/conf.d/default.conf index 79085be..f224ef8 100644 --- a/nginx/templates/default.conf.template +++ b/nginx/conf.d/default.conf @@ -1,27 +1,26 @@ -# Reverse Proxy für Bluemap (http://devanturas.net:8100 -> https://map.devanturas.net) -# Konfiguration als Template: Der offizielle nginx-Container ersetzt die -# ${VAR}-Platzhalter automatisch per envsubst mit den Umgebungsvariablen -# aus docker-compose.yml. +# === Bluemap Reverse Proxy Konfiguration === +# Liefert die Bluemap (http://devanturas.net:8100) über den Coolify-Proxy +# (HTTPS = map.devanturas.net) als iframe-fähige Karte aus. server { listen 80; server_name map.devanturas.net; - # --- Iframe-Einbettung über HTTPS erlauben --- - # CSP frame-ancestors legt fest, WELCHE Seiten die Karte einbetten dürfen. - # "${FRAME_ANCESTORS}" wird durch die Umgebungsvariable ersetzt. - # Achtung nginx-Image: Leere envsubst-Mengen. Daher hier vorsichtig setzen. + # --- Iframe-Einbettung erlauben --- + # CSP frame-ancestors: Welche Seiten dürfen die Karte einbetten? + # Für die Produktion auf deine echte(n) Seite(n) einschränken, z.B.: + # frame-ancestors https://devanturas.net; add_header Content-Security-Policy "frame-ancestors https://* http://*; upgrade-insecure-requests" always; add_header X-Frame-Options "ALLOWALL" always; # Puffer für große Bluemap-Responses - client_max_body_size "${CLIENT_MAX_BODY_SIZE}"; + client_max_body_size 50m; # --- WebSocket / HTTP-Proxy zu Bluemap --- location / { - proxy_pass http://"${UPSTREAM_HOST}":"${UPSTREAM_PORT}"; + proxy_pass http://devanturas.net:8100; - # HTTP/1.1 + Upgrade-Header notwendig für WebSockets (Live-Karten-Updates) + # HTTP/1.1 + Upgrade-Header für WebSockets (Live-Karten-Updates) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; @@ -36,7 +35,7 @@ server { proxy_send_timeout 3600s; proxy_read_timeout 3600s; - # Puffergrößen für Streaming (Bluemap sendet große Datenblöcke) + # Streaming/Puffer für große Datenblöcke (Bluemap) proxy_buffering off; proxy_buffer_size 128k; proxy_buffers 4 256k;