- Traefik fungiert als dynamischer Reverse-Proxy und löst TLS-Zertifikate auf, während Portainer eine grafische Benutzeroberfläche zur Verwaltung von Docker und Swarm bietet.
- Die Kombination aus traefik.yml, dynamic.yml und docker-compose.yml ermöglicht es Ihnen, Einstiegspunkte, Sicherheits-Middleware und labelbasiertes HTTP/HTTPS-Routing zu definieren.
- In Docker-Standalone- oder Swarm-Szenarien müssen Sie lediglich die Dienste dem Proxy-Netzwerk hinzufügen und sie taggen, damit Traefik sie erkennen und sicher bereitstellen kann.
- Die Verwendung von Let's Encrypt, dedizierten Netzwerken und grundlegender Authentifizierung auf dem Dashboard schafft eine robuste Umgebung für die Bereitstellung mehrerer Anwendungen auf einem einzigen Server.
Stellen Sie einen modernen Stack zusammen mit Docker, Traefik und Portainer Es ist derzeit eine der einfachsten Möglichkeiten, Container auf einem einzelnen Server zu verwalten und mehrere Dienste per HTTPS bereitzustellen, ohne sich in Konfigurationsdetails zu verlieren. Der Vorteil liegt darin, dass Traefik als dynamischer Reverse-Proxy fungiert, während Portainer eine sehr einfache Weboberfläche zur Verwaltung von Docker und optional auch von Swarm bietet.
In diesem Artikel erfahren Sie, wie Traefik als Reverse-Proxy vor Portainer einbinden Sowohl in einem "klassischen" Docker-Szenario (Standalone) als auch in einem Docker-Swarm-Cluster: Wie integriert man TLS (selbstsigniert oder Let's Encrypt) und welche Konfigurationsdateien spielen dabei eine Rolle?traefik.yml, dynamic.yml y docker-compose.yml) und einige gängige Tricks im Umgang mit Middleware, Netzwerken und typischen Tagging-Problemen in Traefik.
Welche Rolle spielen Docker, Traefik und Portainer in der Architektur?
Bei dieser Art von Konfiguration Docker Es ist die Basisschicht, auf der die Container laufen. Traefik fungiert als Reverse-Proxy und Load Balancer. der alle HTTP/HTTPS-Anfragen auf den Ports 80 und 443 empfängt und an den entsprechenden Container weiterleitet, und Portainer bietet eine grafische Benutzeroberfläche zur Verwaltung von Images, Containern, Volumes, Netzwerken und Docker- oder Swarm-Stacks.
Die Idee ist, einen einzelnen Host mit Docker zu haben, auf dem Traefik befindet sich am „Tor“.: an den Eingängen lauschen web (80) y websecure (443), löst TLS-Zertifikate auf (in der Regel mit Let's Encrypt) und erkennt dank der Integration mit dem Docker-Provider automatisch die Dienste, die Sie durch Hinzufügen von Labels zu den Containern bereitstellen.
Andererseits funktioniert Portainer wie ein ganz normaler Behälter, nur eben durch eine spezielle Vorrichtung zugänglich. eine bestimmte Subdomain, zum Beispiel portainer.tudominio.com, geschützt durch TLS und, falls gewünscht, durch eine zusätzliche Authentifizierungs-Middleware, die über die Portainer-eigene Anmeldung hinausgeht. All dies wird orchestriert mit einem Docker-komponieren das Traefik, Portainer und das gemeinsame Netzwerk vom Typ definiert proxy.
Ein klarer Vorteil dieses Ansatzes ist, dass man Neue Dienste lassen sich einfach durch Hinzufügen von Labels bereitstellen. In Ihren Containern: Traefik erkennt die Änderung in Docker, erstellt Router, Services und Middleware im laufenden Betrieb, und innerhalb von Sekunden haben Sie eine neue Subdomain oder Route, die ohne manuelle Bearbeitung statischer Konfigurationsdateien einsatzbereit ist.
Statische Traefik-Konfiguration: traefik.yml
Die statische Konfiguration von Traefik wird üblicherweise in einer Datei wie dieser gespeichert: traefik.ymlwelches im Inneren des Containers montiert ist. Hier ist es definiert Dashboard, Einstiegspunkte, Anbieter und Zertifikatsauflöser Let's Encrypt, unter anderem.
Eine typische YAML-Konfiguration beginnt mit der Aktivierung der API und des Kontrollpanels mit etwas wie: api: dashboard: trueDies ermöglicht den Zugriff auf die Weboberfläche, über die Sie Router, Dienste und Middleware einsehen können. Dieses Panel ist standardmäßig nicht authentifiziert; wir werden später sehen, wie Sie es mithilfe der dynamischen Konfiguration durch Basisauthentifizierung sichern können.
Als Nächstes werden die Einstiegspunkte definiert. Normalerweise gibt es ein Einstiegspunkt web am Hafen 80 und andere websecure in der 443. En el web Eine automatische Weiterleitung wird üblicherweise so konfiguriert, dass websecuresodass jeder HTTP-Zugriff auf HTTPS umgeleitet wird:
Ein typischer Aufbau würde einen Abschnitt enthalten http.redirections.entryPoint.to: websecure um diese Umleitung zu erzwingen und den gesamten verschlüsselten Datenverkehr am sicheren Zugangspunkt zu zentralisieren.
zu websecure Es wird darauf hingewiesen, dass TLS verwendet werden sollte, und ein entsprechender Link wird bereitgestellt. certResolver (Beispiel: letsencrypt) das für die automatische Verwaltung der Zertifikate zuständig sein wird. All dies wird unterstützt von ACME, das ist das Protokoll, das Let's Encrypt zur Ausstellung und Erneuerung von Zertifikaten verwendet.
Im Block Anbieter Der Docker-Provider ist konfiguriert und verweist auf den Socket. unix:///var/run/docker.sockmit einer Schlüsseloption: exposedByDefault: falseTraefik veröffentlicht daher nicht standardmäßig alle Container, sondern nur diejenigen, die das Label tragen. traefik.enable=trueSie können auch einen Dateianbieter konfigurieren (file) um eine zusätzliche dynamische Konfiguration zu laden, zum Beispiel von /configurations/dynamic.yml.
Schließlich enthält die statische Datei üblicherweise den Abschnitt certificatesResolverswo der ACME-Resolver definiert ist: Registrierungs-E-Mail, Speicherdatei (normalerweise acme.json), Schlüsseltyp (zum Beispiel EC384) und die Validierungsmethode (zum Beispiel httpChallenge am Eingang webEs ist wichtig, dass Richten Sie eine echte E-Mail-Adresse ein. in diesem Abschnitt, da Let's Encrypt ihn für Benachrichtigungen und Verlängerungen verwendet; wenn Sie einen Dummy- oder fehlerhaften Wert angeben, können beim Starten des Traefik-Containers Fehler auftreten.
Zusätzlich zu dieser YAML-Konfiguration gibt es Bereitstellungen, die Folgendes verwenden: TOML-Format (traefik.toml)Die Logik ist jedoch dieselbe: Sie sektionsauflöserzertifikate (zum Beispiel) [certificatesResolvers.main.acme]), Herausforderungen definieren (wie zum Beispiel dnsChallenge mit provider = "route53") und fügen Sie Standard-TLS-Optionen hinzu, wie z. B. Forzar minVersion = "VersionTLS13" oder eine Liste konfigurieren cipherSuites erlaubt.
Dynamische Konfiguration: Middleware, TLS und Sicherheit
Der dynamische Teil von Traefik befindet sich üblicherweise in einer Datei wie dieser: dynamic.yml, geladen vom Dateianbieter. Hier definieren Sie Middleware- und TLS-Optionen Diese Einstellungen können geändert werden, ohne den Traefik-Container neu starten zu müssen, was sehr nützlich ist, um die Sicherheit spontan anzupassen.
Ein typischer Anwendungsfall ist die Erstellung von Header-Middleware, zum Beispiel secureHeadersDadurch werden Richtlinien im Zusammenhang mit HSTS und der obligatorischen Verwendung von HTTPS hinzugefügt. In YAML finden Sie möglicherweise Parameter wie: sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true und stsSeconds hoch (zum Beispiel ein Jahr in Sekunden). Dies erhöht die Sicherheit des Datenverkehrs seitens des Browsers.
Eine weitere gängige Middleware ist beispielsweise eine für die Basisauthentifizierung. user-auth Typ basicAuth, wobei eine Liste von Benutzern im folgenden Format deklariert wird usuario:hashDer Hash wird üblicherweise generiert mit htpasswd und ist in die Datei eingebettet. Diese Middleware ist üblicherweise mit dem Traefik-Dashboard-Router verknüpft, sodass neben dem HTTPS-Zugriff auch ein Benutzername und ein Passwort erforderlich sind.
Innerhalb derselben dynamischen Konfiguration ist es üblich, einen Block zu sehen. tls.options mit einem Standardprofil (default) wo die unterstützten Verschlüsselungsverfahren und die minimale TLS-Version festgelegt sind, zum Beispiel VersionTLS12In einigen Bereitstellungen sind mehrere Optionen definiert (zum Beispiel ein Profil namens tls12 und andere default) um gegebenenfalls das Sicherheitsniveau an verschiedene Dienste anzupassen.
In Umgebungen, in denen die Verwendung erwünscht ist TLS auch intern Zwischen Traefik und Backend-Diensten (wie Portainer) kann ein Problem auftreten, wenn diese Dienste kein von einer öffentlichen Zertifizierungsstelle anerkanntes Zertifikat besitzen. Genau hier kommt die Option ins Spiel. insecureSkipVerify, die konfiguriert unter providers.http.tls Durch die Verwendung geeigneter TLS-Optionen kann Traefik die Backend-Zertifikatsvalidierung umgehen. Dies ist nützlich für Testumgebungen oder interne, selbstsignierte Zertifikate, sollte aber mit Vorsicht eingesetzt werden, da die Überprüfung dadurch weniger streng wird.
Ein praktisches Detail: die Datei dynamic.yml Es kann spontan bearbeitet werden.Traefik lädt die dynamische Konfiguration neu, ohne dass ein Neustart erforderlich ist. So können Sie Middleware hinzufügen oder entfernen, Sicherheitsheader ändern oder die Basisauthentifizierung modifizieren, ohne die Verfügbarkeit des Proxys zu beeinträchtigen.
docker-compose mit Traefik und Portainer in Docker standalone
In einem reinen Docker-Szenario ohne Swarm ist die gängigste Vorgehensweise, Folgendes zu starten: Traefik und Portainer mit einem einzigen docker-compose.yml die sowohl Dienste als auch ein gemeinsam genutztes Brückennetzwerk definiert, das beispielsweise so genannt wird proxy.
Der Service Traefik Es verwendet üblicherweise das offizielle Bild, zum Beispiel traefik:latest oder eine bestimmte Version wie traefik:v3.4Die Ports sind zugeordnet. 80 und 443 für Webverkehr und in einigen Beispielen Port 8080, um das Bedienfeld intern zugänglich zu machen. Zusätzlich wird die Option hinzugefügt. restart: unless-stopped und die Sicherheit wird verstärkt durch security_opt: - no-new-privileges:true um das Risiko einer Rechteausweitung innerhalb des Containers zu verringern.
Bezüglich der Volumes muss Traefik den schreibgeschützten Docker-Socket einbinden (/var/run/docker.sock:/var/run/docker.sock:ro) um Container zu entdecken, die statische Datei traefik.yml und das Verzeichnis, in dem die dynamische Konfiguration gespeichert wird (./traefik-data/configurations:/configurationsDie Datei ist ebenfalls eingebunden. acme.jsonHier speichert Traefik die von Let's Encrypt ausgestellten Zertifikate. Diese Datei wird auf dem Host erstellt und mit entsprechenden Berechtigungen versehen. 600 so dass nur der entsprechende Benutzer es lesen und schreiben kann; wenn Sie es auf 644 belassen, beschwert sich Traefik normalerweise.
Der Schlüssel zu Traefiks magischer Wirkung ist der DienstleistungslabelsUnter anderem finden Sie hier: traefik.enable=true (damit der Docker-Anbieter diesen Dienst bereitstellt), traefik.docker.network=proxy (gibt an, welches Netzwerk Traefik für die Kommunikation mit dem Container verwenden soll) und ein Router wie traefik.http.routers.traefik-secure, mit Bezeichnungen, die seinen Einstiegspunkt definieren (websecure), die Host-Regel (zum Beispiel Host(`traefik.tudominio.com`)), der zugehörige Dienst (api@internal) und die Authentifizierungs-Middleware (user-auth@file).
Service Portier in der gleichen docker-compose.yml im Allgemeinen verwendet portainer/portainer-ce:latest (oder die Enterprise Edition, falls Sie über eine Lizenz verfügen). Ähnliche Volumes werden eingebunden: der Docker-Socket, der Datenordner (./portainer-data:/dataund oft auch die /etc/localtime damit es die Zeitzone des Hosts übernimmt.
Portainers Etiketten registrieren es bei Traefik: traefik.enable=true, traefik.docker.network=proxyein Router der Art traefik.http.routers.portainer-secure mit Einstiegspunkt websecure und eine Host-Regel wie Host(`portainer.tudominio.com`)Zusätzlich wird der Dienst definiert, den Traefik verwenden soll, und verweist beispielsweise auf den internen Port von Portainer mit traefik.http.services.portainer.loadbalancer.server.port=9000.
Während all dies im Gange ist, nach dem Start docker compose up -d Im Stack-Verzeichnis lädt Traefik die Images herunter und erstellt das Netzwerk. proxy Wenn es als extern deklariert ist und beide Panels in den konfigurierten Subdomains zugänglich macht, mit Automatische HTTPS-Verschlüsselung dank Let's EncryptAb diesem Zeitpunkt ist das Hinzufügen neuer Dienste eine Frage des Klonens Ihres Projekts, des Hinzufügens einiger Traefik-Labels und der Verbindung mit dem Netzwerk. proxy.
Docker Swarm-Szenario: Portainer und Traefik in einem Cluster
Wenn Sie aktivieren Hafenschwarm Das Bild ändert sich leicht, da Dienste als Stacks bereitgestellt werden und Netzwerke üblicherweise Overlay-basiert sind. Die zugrundeliegende Logik von Traefik und Portainer ist jedoch sehr ähnlich: Traefik fungiert weiterhin als Reverse-Proxy und dynamischer Service-Discoverer, und Portainer kann sowohl im Standalone- als auch im Netzwerkmodus betrieben werden. Portainer + Agent zur Verwaltung entfernter Knoten innerhalb des Clusters.
Bei einer typischen Swarm-Bereitstellung wird der Stack erstellt, bevor er angewendet wird. zwei Overlay-Netzwerke Traefik nutzt diese Daten, um den Datenverkehr zwischen den Knoten zu routen. Zusätzlich wird ein Volume erstellt, um Portainer-Daten (zum Beispiel) zu speichern. portainer_data) und, falls Sie es benötigen, eines für acme.json oder das Verzeichnis, in dem Traefik Zertifikate und Konfigurationen speichert.
El docker-compose.yml (was sich dann mit docker stack deploy zum Beispiel -c portainer.yml) definiert üblicherweise zwei Dienste: Portainer-Agent, das im Modus läuft global auf allen Linux-Knoten und dem Haupt-Potainer-Dienst (CE oder EE), der normalerweise im Replikationsmodus verbleibt und nur auf Managern ausgeführt werden darf.
Der Portainer-Agent bindet den Docker-Socket und das Volume-Verzeichnis ein (/var/lib/docker/volumesUm Ressourcen überprüfen zu können, verbindet es sich beispielsweise mit dem Overlay-Netzwerk, das es mit Traefik teilt. traefik_publicDer Portainer-Hauptdienst kann so konfiguriert werden, dass er über TCP mit dem Agenten kommuniziert (tcp://tasks.agent:9001) und tatsächlich wird dieser Befehl in einigen Beispielen mit --tlsskipverify kommentierte, dass die TLS-Verifizierung gegebenenfalls übersprungen werden solle.
Auf demselben oder einem anderen Stack startet Traefik mit dem Docker-Provider im Swarm-Modus (swarmMode = true in TOML oder der entsprechenden Option in Flags), die die getaggten Dienste beobachten. Die Konfiguration umfasst eine certificatesResolvers.main.acme für Let's Encrypt, ein dnsChallenge mit einem Lieferanten wie Route53 Wenn Sie Zertifikate per DNS validieren möchten, und ein Block von tls.options wo es beispielsweise erzwungen wird minVersion = "VersionTLS13" für das Standardprofil und eine explizite Liste wird definiert von cipherSuites für ein TLS 1.2-Profil.
Die Etiketten von Portainer bei Swarm folgen der gleichen Philosophie: traefik.enable=trueein Router wie traefik.http.routers.portainer mit Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (der Namensgebung entsprechend) und traefik.http.routers.portainer.tls=true TLS auf diesem Router aktivieren. Zusätzlich können Sie Folgendes angeben: Zertifikatsauflöser mit traefik.http.routers.portainer.tls.certresolver=main und das Backend-Schema, falls der Dienst intern HTTPS verwendet. traefik.http.services.portainer.loadbalancer.server.scheme=https.
In den Traefik-Debug-Logs in Swarm sehen Sie die generierte Konfiguration: Router wie api y portainer, ermittelte Dienste (zum Beispiel portainer en http://10.0.1.12:9000 und ein Service traefik (Hinweis auf Port 8080 des Dashboards) und, falls ein Problem mit schlecht definierten Bezeichnungen auftritt, Meldungen wie "Der Dienstname für den Router konnte nicht definiert werden: zu viele Dienste"was in der Regel darauf hinweist, dass es einen Konflikt oder eine Duplizierung von Diensten gibt, die mit einem Router verbunden sind.
Minimalbeispiel: whoami, Routen und TLS mit Traefik
Bevor man Portainer ins Spiel bringt, ist es durchaus sinnvoll, Traefik mit einem sehr einfachen Backend wie dem Image auszuprobieren. traefik/whoamiDadurch werden Informationen über die Anfrage zurückgegeben. Dies hilft Ihnen zu überprüfen, ob Traefik korrekt konfiguriert ist und die Routing-Regeln funktionieren.
Un docker-compose.yml Basisleistungen können den Service umfassen traefik mit Bild traefik:v3.4, das Einbinden des Docker-Sockets und das Definieren der Boot-Flags als --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy und der Einstiegspunkt --entryPoints.web.address=:80Auf dem Host werden die Ports 80 und 8080 bekanntgegeben, und es wird ein Netzwerk erstellt. proxy wobei auch der Container verwendet wird whoami.
Der Service whoami Es startet im selben Netzwerk und ist gekennzeichnet mit traefik.enable=trueDann wird ein Router mit dem Label definiert. traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) und es wird angegeben, dass Ihr Einstiegspunkt ist webWenn Sie eine Anfrage stellen mit curl -H "Host: whoami.docker.localhost" http://localhost/Sie erhalten eine Antwort mit Hostnamen, IPs, Headern usw., die bestätigt, dass Traefik das Routing korrekt durchführt.
Von da an ist es ganz einfach. Routing über Pfade hinzufügenSie können beispielsweise einen weiteren Dienst erstellen. whoami-api mit demselben Bild, im selben Netzwerk, und kennzeichne es mit einer Regel des Typs Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Somit die Wurzel / gehe zu whoami Original und die Anfragen an /api wird ihnen dienen whoami-apiSie können dies überprüfen, indem Sie Anfragen an folgende Adresse stellen: / bereits /api mit demselben Host.
Aktivieren TLS In dieser lokalen Umgebung besteht eine Möglichkeit darin, ein selbstsigniertes Zertifikat für die Domain zu generieren. *.docker.localhost mit opensslSie erstellen ein Verzeichnis certs, generieren Sie local.key y local.crtund dann fügen Sie eine dynamische Datei hinzu (zum Beispiel dynamic/tls.yml) mit dem Abschnitt tls: und die Routen certFile y keyFile auf diese Dateien verweisen.
Als Nächstes aktualisieren Sie die Traefik-Dienstdefinition in docker-compose.yml den Ordner einbinden ./certs und der Ordner ./dynamic Innerhalb des Containers aktivieren Sie die sichere API mit --api.dashboard=trueSie erstellen den Einstiegspunkt websecure (--entryPoints.websecure.address=:443) und aktivieren Sie dort TLS mit --entryPoints.websecure.http.tls=trueSie beschriften außerdem den Dashboard-Router und die Router von whoami damit sie es benutzen können websecure und haben tls=true.
Sobald es online ist, können Sie darauf zugreifen. https://whoami.docker.localhost/ und zum Traefik-Panel mit einem selbstsignierten Zertifikat, wobei die Sicherheitswarnung des Browsers akzeptiert wird. Diese Vorgehensweise ähnelt sehr der späteren Verwendung von Let's Encrypt im Produktivbetrieb, jedoch ohne die Nutzung öffentlicher DNS-Server.
Bewährte Verfahren, App-Bereitstellung und Lösung typischer Probleme
Ein Muster, das sich in all diesen Beispielen wiederholt, ist folgendes: Traefik vereinfacht die Bereitstellung neuer Anwendungen erheblich.Sobald Sie Ihren Basis-Stack (Traefik + Portainer + Netzwerk) haben proxy (+ Zertifikate), die Hinzufügung eines neuen Dienstes lässt sich in der Regel wie folgt zusammenfassen:
Klonen Sie das Projekt oder kopieren Sie Ihre docker-compose.yml Um auf dem Server eine Subdomain auf die IP-Adresse des Hosts zu verweisen, verwenden Sie dazu einen Datensatz A in Ihrem DNS (zum Beispiel app.tudominio.com), und fügen Sie dann die Schlüsselbezeichnungen zum Dienst hinzu: traefik.enable=true, traefik.docker.network=proxy und ein Router mit einer Hostregel für diese Subdomain, die den sicheren Einstiegspunkt angibt. websecure und Dienst mit dem korrekten internen Port.
Viele Tutorials zeigten beispielsweise die Bereitstellung einer kleinen App. FastAPI Getrennt: Es werden vier Etiketten hinzugefügt, um sicherzustellen, dass es dem Netzwerk beitritt. proxy en la sección networks des Restaurants docker-compose.ymlund nachdem ich docker compose up -d Die App erscheint automatisch mit aktiviertem TLS im Traefik-Dashboard. Dank der automatischen Erkennung durch Traefik müssen Sie die statischen Einstellungen nicht einmal anpassen.
Damit alles reibungslos verläuft, ist es wichtig, auf einige Details zu achten: Verwenden Sie nicht dieselbe Router-Kennung wieder. Überprüfen Sie in verschiedenen Apps, ob jedem Router nur ein Dienst zugeordnet ist (um den Fehler „Zu viele Dienste“ zu vermeiden), und verwenden Sie einheitliche Netzwerknamen (z. B. …). proxy auf allen Stacks, die Sie offenlegen möchten), und wenn Sie Let's Encrypt verwenden, stellen Sie sicher, dass die acme.json Es verfügt über die Berechtigungen 600 und die konfigurierte E-Mail-Adresse ist gültig.
In Swarm-Umgebungen sollte außerdem geprüft werden, ob die Traefik-Konfiguration den Docker-Provider enthält. swarmMode=true y watch=trueund dass die Einschränkungen der Dienste (zum Beispiel node.role == manager (Für Portainer) gibt es keine Konflikte mit dem Einsatzort von Traefik. Die Debug-Protokolle sind zwar sehr ausführlich, aber entscheidend für die Lokalisierung von Routing- oder TLS-Problemen.
Zusammen kombinieren Docker, Traefik und Portainer Es ermöglicht Ihnen, eine komplette, leichtgewichtige Orchestrierungsumgebung auf einem einzigen Server einzurichten, mit grafischen Dashboards, automatischen Zertifikaten und einem sehr schnellen Bereitstellungsprozess, bei dem das Hinzufügen, Aktualisieren oder Entfernen von Diensten auf die Anpassung einiger weniger Zeilen YAML reduziert wird und Traefik die schmutzige Arbeit des Reverse-Proxying und TLS erledigt.
Inhaltsverzeichnis
- Welche Rolle spielen Docker, Traefik und Portainer in der Architektur?
- Statische Traefik-Konfiguration: traefik.yml
- Dynamische Konfiguration: Middleware, TLS und Sicherheit
- docker-compose mit Traefik und Portainer in Docker standalone
- Docker Swarm-Szenario: Portainer und Traefik in einem Cluster
- Minimalbeispiel: whoami, Routen und TLS mit Traefik
- Bewährte Verfahren, App-Bereitstellung und Lösung typischer Probleme
