Files
it-know-how/Computerkram/Webseiten, selbstgehostet/Flask Dummy Webseite über WWW (Chatbot Session).md
T
2026-03-27 12:41:00 +01:00

8.5 KiB

User: In diesem Skript starte ich eine Dummy Webseite. WIe kann ich diese mit den vorhandenen Werkzeugen (traefik) übers WWW verfügbar machen?

Workspace: Collecting workspace informationUm deine Flask-Dummy-Website über Traefik im WWW verfügbar zu machen, musst du sie containerisieren und mit Traefik-Labels konfigurieren. Hier ist die Lösung:

1. Dockerfile erstellen

FROM python:3.11-slim

WORKDIR /app

# Flask installieren
RUN pip install --no-cache-dir flask

# App-Code kopieren
COPY my_app/ /app/my_app/

# Port exponieren
EXPOSE 8000

# App starten
CMD ["python", "-m", "flask", "--app", "my_app", "run", "--host", "0.0.0.0", "--port", "8000"]

2. Docker Compose Konfiguration erstellen

services:
  dummy_website:
    build: .
    container_name: dummy_website
    restart: unless-stopped
    
    expose:
      - "8000"
    
    networks:
      - proxy
    
    labels:
      # Traefik aktivieren
      - "traefik.enable=true"
      
      # Router-Konfiguration
      - "traefik.http.routers.dummy.rule=Host(`demo.schneiderserver.site`)"
      - "traefik.http.routers.dummy.entrypoints=websecure"
      - "traefik.http.routers.dummy.tls.certresolver=myresolver"
      
      # Service-Konfiguration
      - "traefik.http.services.dummy.loadbalancer.server.port=8000"
      - "traefik.http.services.dummy.loadbalancer.server.scheme=http"
      
      # Optionale Sicherheits-Headers
      - "traefik.http.middlewares.dummy-headers.headers.customresponseheaders.X-Frame-Options=SAMEORIGIN"
      - "traefik.http.middlewares.dummy-headers.headers.customresponseheaders.X-Content-Type-Options=nosniff"
      - "traefik.http.routers.dummy.middlewares=dummy-headers"

networks:
  proxy:
    external: true
    name: traefik_proxy

3. Flask-App für Docker anpassen

from flask import Flask

from my_app import pages

def create_app():
    app = Flask(__name__)
    
    # Wichtig für Reverse-Proxy-Betrieb
    app.config['PREFERRED_URL_SCHEME'] = 'https'
    
    app.register_blueprint(pages.pages_bp)
    return app

4. Starten der Website

cd /opt/dummy_website
docker compose up -d

5. manage.sh erweitern (optional)

// ...existing code...

manage_single_service() {
    SERVICE=$1
    ACTION=$2
    
    case $SERVICE in
        traefik)
            cd /opt/traefik
            ;;
        nextcloud)
            cd /opt/nextcloud
            ;;
        navidrome)
            cd /opt/navidrome
            ;;
        dummy)
            cd /opt/dummy_website
            ;;
        *)
            echo -e "${RED}❌ Unbekannter Service: $SERVICE${NC}"
            exit 1
            ;;
    esac
    
    case $ACTION in
        start|stop|restart|logs)
            docker compose $ACTION
            ;;
        *)
            docker compose $ACTION
            ;;
    esac
}

// ...existing code...

    traefik|nextcloud|navidrome|dummy)
        if [ -n "$2" ]; then
            manage_single_service $1 $2
        else
            echo "Verwendung: $0 $1 [start|stop|restart|logs]"
        fi
        ;;

// ...existing code...

6. DNS-Eintrag erstellen

Erstelle einen A-Record für demo.schneiderserver.site mit der IP-Adresse deines Servers.

Zugriff

Nach erfolgreicher Konfiguration ist deine Website erreichbar unter:

  • URL: https://demo.schneiderserver.site
  • SSL: Automatisch via Let's Encrypt
  • HTTP → HTTPS: Automatische Weiterleitung

Verwaltung

# Status prüfen
docker ps | grep dummy_website

# Logs anzeigen
/opt/manage.sh dummy logs

# Neustart
/opt/manage.sh dummy restart

# Stoppen
/opt/manage.sh dummy stop

Wichtig: Ändere demo.schneiderserver.site in den Labels zu deiner gewünschten Domain und erstelle den entsprechenden DNS-Eintrag.

User: Geht es auch einfacher. ICh will (noch) nicht containerisieren. Erstmal nur test, ob und wie ich die Web App, die lokal auf Port 8000 läuft übers WWW erreichen kann, im Zweifel auch erstmal ohne traefik

GitHub Copilot: Ja, das geht viel einfacher! Hier sind die Optionen:

Option 1: Direkt mit Traefik (ohne Container)

Traefik kann auch auf lokale Services weiterleiten. Erstelle eine dynamische Konfiguration:

http:
  routers:
    dummy-local:
      rule: "Host(`demo.schneiderserver.site`)"
      entryPoints:
        - websecure
      service: dummy-local-service
      tls:
        certResolver: myresolver
      middlewares:
        - dummy-headers

  services:
    dummy-local-service:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1:8000"

  middlewares:
    dummy-headers:
      headers:
        customResponseHeaders:
          X-Frame-Options: "SAMEORIGIN"

Dann Traefik konfigurieren, um die Datei zu laden:

services:
  traefik:
    image: traefik:v3.6
    container_name: traefik
    restart: unless-stopped

    command:
      # ...existing code...
      - --providers.docker.network=traefik_proxy
      - --providers.docker.useBindPortIP=false
      - --providers.docker.defaultRule=Host(`{{ normalize .Name }}.schneiderserver.site`)
      
      # 📁 File Provider aktivieren
      - --providers.file.directory=/etc/traefik/dynamic
      - --providers.file.watch=true

      # ...existing code...
    
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
      - ./dynamic:/etc/traefik/dynamic:ro
# Ordner erstellen und Traefik neustarten
mkdir -p /opt/traefik/dynamic
# Datei erstellen (siehe oben)
docker compose -f /opt/traefik/docker-compose.yml restart

Option 2: Ohne Traefik - SSH Tunnel (schnellster Test)

Auf deinem lokalen Rechner:

ssh -L 8000:localhost:8000 user@schneiderserver.site
# Dann im Browser: http://localhost:8000

Option 3: Ohne Traefik - Flask direkt exponieren (UNSICHER!)

Nur zum Testen, NICHT für Produktion:

python -m flask --app my_app run --host 0.0.0.0 --port 8000 --debug
# Firewall-Regel temporär öffnen
sudo ufw allow 8000/tcp

# Zugriff dann über: http://schneiderserver.site:8000

⚠️ Achtung: Das ist unverschlüsselt (kein HTTPS) und unsicher!

Empfehlung

Option 1 (Traefik mit File Provider) ist ideal für deinen Use-Case:

  • Kein Docker für deine App nötig
  • Automatisches HTTPS
  • Professionell
  • Schnell umgesetzt

Nach der Konfiguration:

  1. DNS-Eintrag für demo.schneiderserver.site erstellen
  2. Flask-App starten: bash /opt/dummy_website/app.sh
  3. Zugriff: https://demo.schneiderserver.site

Welche Option möchtest du testen?

User: # Firewall-Regel temporär öffnen sudo ufw allow 8000/tcp

Zugriff dann über: http://schneiderserver.site:8000

wie schließe ich den Port nach Test wieder?

GitHub Copilot: Um den Port nach dem Test wieder zu schließen:

# Port 8000 wieder schließen
sudo ufw delete allow 8000/tcp

# Status überprüfen
sudo ufw status

Aber ich würde dir wirklich Option 1 empfehlen (Traefik mit File Provider). Das ist genauso schnell und du musst keine Firewall-Regeln ändern:

Schritt-für-Schritt:

1. Docker Compose erweitern

    command:
      # ...existing code...
      - --providers.docker.defaultRule=Host(`{{ normalize .Name }}.schneiderserver.site`)

      # 📁 File Provider aktivieren
      - --providers.file.directory=/etc/traefik/dynamic
      - --providers.file.watch=true

      # ------------------------
      # 🌍 EntryPoints
      # ------------------------
      # ...existing code...
    
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
      - ./dynamic:/etc/traefik/dynamic:ro

2. Dynamic Config erstellen

mkdir -p /opt/traefik/dynamic
nano /opt/traefik/dynamic/dummy-website.yml
http:
  routers:
    dummy-local:
      rule: "Host(`demo.schneiderserver.site`)"
      entryPoints:
        - websecure
      service: dummy-local-service
      tls:
        certResolver: myresolver

  services:
    dummy-local-service:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1:8000"

3. Traefik neustarten

cd /opt/traefik
docker compose restart

4. Flask-App starten

cd /opt/dummy_website
bash app.sh

5. Testen

# DNS-Eintrag für demo.schneiderserver.site erstellen
# Dann im Browser: https://demo.schneiderserver.site

Vorteile:

  • Kein Firewall-Port öffnen nötig
  • Automatisches HTTPS
  • Saubere Lösung
  • Einfach wieder zu entfernen (Datei löschen)

Möchtest du es so probieren?