{"id":10281,"date":"2026-08-15T01:13:34","date_gmt":"2026-08-14T23:13:34","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/traefik-label-compose-generator\/"},"modified":"2026-08-15T01:13:34","modified_gmt":"2026-08-14T23:13:34","slug":"traefik-label-compose-generator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/","title":{"rendered":"Traefik-Etiketten und Compose-Abschnitt erzeugen"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Traefik wird \u00fcber Etiketten eingerichtet, und ein einziges falsches gen\u00fcgt, damit der Container unsichtbar bleibt oder die Passwortabfrage alles durchl\u00e4sst. Dieser Generator schreibt den ganzen Block und zeigt auf die Stellen, an denen es \u00fcblicherweise schiefgeht.<\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap;\">\n<div style=\"flex: 1; min-width: 170px;\">\n            <label for=\"tr-dienst\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Name des Dienstes<\/label><br \/>\n            <input type=\"text\" id=\"tr-dienst\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"grafana\">\n        <\/div>\n<div style=\"flex: 2; min-width: 220px;\">\n            <label for=\"tr-host\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Domain<\/label><br \/>\n            <input type=\"text\" id=\"tr-host\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"grafana.example.com\">\n        <\/div>\n<div style=\"flex: 1; min-width: 130px;\">\n            <label for=\"tr-port\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Port im Container<\/label><br \/>\n            <input type=\"text\" id=\"tr-port\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"3000\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"tr-netz\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Gemeinsames Netz<\/label><br \/>\n            <input type=\"text\" id=\"tr-netz\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"proxy\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 1; min-width: 180px;\">\n            <label for=\"tr-resolver\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Zertifikatsverwalter<\/label><br \/>\n            <input type=\"text\" id=\"tr-resolver\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"letsencrypt\">\n        <\/div>\n<div style=\"flex: 1; min-width: 180px;\">\n            <label for=\"tr-pfad\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Pfadanfang (optional)<\/label><br \/>\n            <input type=\"text\" id=\"tr-pfad\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" placeholder=\"\/metrics\">\n        <\/div>\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"tr-auth\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Basic Auth, Benutzer:Hash (optional)<\/label><br \/>\n            <input type=\"text\" id=\"tr-auth\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" placeholder=\"admin:$apr1$xyz$abc...\">\n        <\/div>\n<\/p><\/div>\n<div id=\"tr-optionen\" style=\"display: flex; flex-wrap: wrap; gap: 6px 24px; margin-top: 15px;\"><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"tr-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Etiketten erzeugen<\/button>\n    <\/div>\n<div id=\"tr-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Traefik wird \u00fcber Etiketten eingerichtet, und ein einziges falsches gen\u00fcgt, damit der Container unsichtbar bleibt oder die Passwortabfrage alles durchl\u00e4sst. Dieser Generator schreibt den ganzen Block und zeigt auf die Stellen, an denen es \u00fcblicherweise schiefgeht.\",\"label_dienst\":\"Name des Dienstes\",\"label_host\":\"Domain\",\"label_port\":\"Port im Container\",\"label_netz\":\"Gemeinsames Netz\",\"label_resolver\":\"Zertifikatsverwalter\",\"label_pfad\":\"Pfadanfang (optional)\",\"label_auth\":\"Basic Auth, Benutzer:Hash (optional)\",\"o_weiterleitung\":\"http auf https umleiten\",\"o_kompression\":\"Kompression\",\"o_kopfzeilen\":\"Sicherheitskopfzeilen\",\"o_ratenbremse\":\"Ratenbremse\",\"knopf\":\"Etiketten erzeugen\",\"fehler_dienst\":\"Der Name des Dienstes fehlt.\",\"fehler_dienst_zeichen\":\"Der Name darf nur Kleinbuchstaben, Ziffern, Bindestrich und Unterstrich enthalten.\",\"fehler_host\":\"Die Domain fehlt.\",\"fehler_host_form\":\"Das ist keine g\u00fcltige Domain.\",\"fehler_port\":\"Der Port muss eine Zahl zwischen 1 und 65535 sein.\",\"fehler_pfad\":\"Der Pfadanfang muss mit einem Schr\u00e4gstrich beginnen.\",\"h_compose\":\"Dienst in der docker-compose.yml\",\"h_befunde\":\"Worauf zu achten ist\",\"b_dollar\":\"Jedes Dollarzeichen im Hash steht oben doppelt. Compose liest ein einfaches als Variable und ersetzt es durch nichts, der Hash ist damit kommentarlos kaputt - die Abfrage nimmt dann gar nichts mehr an.\",\"b_kein_hash\":\"Der Eintrag tr\u00e4gt kein Dollarzeichen, dahinter steckt vermutlich ein Klartextpasswort statt eines Hashes aus htpasswd.\",\"b_ohne_doppelpunkt\":\"Dem Eintrag fehlt der Doppelpunkt. Die Form lautet Benutzer:Hash.\",\"b_ohne_tls\":\"Kein Zertifikatsverwalter: der Router h\u00f6rt auf dem sicheren Eingang ohne Zertifikat, damit kommt nichts durch.\",\"b_resolver\":\"Der Verwalter %s muss in der statischen Konfiguration von Traefik vorhanden sein. Die Etiketten verweisen nur darauf, sie erzeugen ihn nicht.\",\"b_ohne_weiterleitung\":\"Ohne die Umleitung antwortet der Dienst nur auf https. Ein Aufruf \u00fcber http l\u00e4uft ins Leere und sieht wie ein Ausfall aus.\",\"b_ohne_kopfzeilen\":\"Ohne die Kopfzeilen-Middleware antwortet der Dienst ohne HSTS und ohne Schutz vor Einbettung.\",\"b_netz\":\"Container und Traefik m\u00fcssen im Netz %s liegen. Traefik liest die Etiketten jedes Containers, erreichen kann es aber nur die, mit denen es ein Netz teilt.\",\"b_port\":\"Das Port-Etikett meint den Port im Container, nicht einen ver\u00f6ffentlichten. Ihn zus\u00e4tzlich zu ver\u00f6ffentlichen \u00f6ffnet den Dienst am Proxy vorbei.\",\"b_enable\":\"traefik.enable=true braucht es nur, wenn Traefik mit exposedByDefault=false l\u00e4uft - und genau so geh\u00f6rt es eingestellt.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    const OPTIONEN = ['weiterleitung', 'kompression', 'kopfzeilen', 'ratenbremse'];<\/p>\n<p>    function text(wert) { return String(wert === undefined || wert === null ? '' : wert).trim(); }<\/p>\n<p>    function bauen(e) {\n        const ergebnis = { ok: false, fehler: '', etiketten: [], compose: '', befunde: [] };\n        const eingabe = e || {};<\/p>\n<p>        const dienst = text(eingabe.dienst);\n        const host = text(eingabe.host);\n        const port = text(eingabe.port);\n        const netz = text(eingabe.netz) || 'proxy';\n        const resolver = text(eingabe.resolver);\n        const pfad = text(eingabe.pfad);\n        const auth = text(eingabe.auth);<\/p>\n<p>        if (dienst === '') { ergebnis.fehler = T.fehler_dienst; return ergebnis; }\n        if (!\/^[a-z0-9][a-z0-9_-]*$\/.test(dienst)) { ergebnis.fehler = T.fehler_dienst_zeichen; return ergebnis; }\n        if (host === '') { ergebnis.fehler = T.fehler_host; return ergebnis; }\n        if (!\/^[a-z0-9.-]+\\.[a-z]{2,}$\/i.test(host)) { ergebnis.fehler = T.fehler_host_form; return ergebnis; }\n        if (!\/^[0-9]+$\/.test(port) || parseInt(port, 10) < 1 || parseInt(port, 10) > 65535) { ergebnis.fehler = T.fehler_port; return ergebnis; }\n        if (pfad !== '' && pfad.charAt(0) !== '\/') { ergebnis.fehler = T.fehler_pfad; return ergebnis; }<\/p>\n<p>        const regel = 'Host(`' + host + '`)' + (pfad !== '' ? ' && PathPrefix(`' + pfad + '`)' : '');\n        const mittel = [];\n        const etiketten = [];<\/p>\n<p>        etiketten.push('traefik.enable=true');\n        etiketten.push('traefik.docker.network=' + netz);\n        etiketten.push('traefik.http.routers.' + dienst + '.rule=' + regel);\n        etiketten.push('traefik.http.routers.' + dienst + '.entrypoints=websecure');\n        etiketten.push('traefik.http.services.' + dienst + '.loadbalancer.server.port=' + port);<\/p>\n<p>        if (resolver !== '') {\n            etiketten.push('traefik.http.routers.' + dienst + '.tls=true');\n            etiketten.push('traefik.http.routers.' + dienst + '.tls.certresolver=' + resolver);\n        }<\/p>\n<p>        if (eingabe.weiterleitung) {\n            etiketten.push('traefik.http.routers.' + dienst + '-web.rule=' + regel);\n            etiketten.push('traefik.http.routers.' + dienst + '-web.entrypoints=web');\n            etiketten.push('traefik.http.routers.' + dienst + '-web.middlewares=' + dienst + '-nach-https');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-nach-https.redirectscheme.scheme=https');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-nach-https.redirectscheme.permanent=true');\n        }\n        if (eingabe.kompression) {\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kompression.compress=true');\n            mittel.push(dienst + '-kompression');\n        }\n        if (eingabe.kopfzeilen) {\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kopfzeilen.headers.stsSeconds=31536000');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kopfzeilen.headers.stsIncludeSubdomains=true');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kopfzeilen.headers.contentTypeNosniff=true');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kopfzeilen.headers.frameDeny=true');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-kopfzeilen.headers.referrerPolicy=strict-origin-when-cross-origin');\n            mittel.push(dienst + '-kopfzeilen');\n        }\n        if (eingabe.ratenbremse) {\n            etiketten.push('traefik.http.middlewares.' + dienst + '-bremse.ratelimit.average=50');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-bremse.ratelimit.burst=100');\n            mittel.push(dienst + '-bremse');\n        }\n        if (auth !== '') {\n            \/\/ In einer compose-Datei muss jedes Dollarzeichen verdoppelt\n            \/\/ werden, sonst h\u00e4lt compose es f\u00fcr eine Variable und ersetzt es\n            \/\/ durch nichts - der Hash ist dann still kaputt.\n            const geschuetzt = auth.replace(\/\\$\/g, '$$$$');\n            etiketten.push('traefik.http.middlewares.' + dienst + '-auth.basicauth.users=' + geschuetzt);\n            mittel.push(dienst + '-auth');\n        }\n        if (mittel.length) {\n            etiketten.push('traefik.http.routers.' + dienst + '.middlewares=' + mittel.join(','));\n        }<\/p>\n<p>        ergebnis.etiketten = etiketten;<\/p>\n<p>        const zeilen = [];\n        zeilen.push('services:');\n        zeilen.push('  ' + dienst + ':');\n        zeilen.push('    image: ' + dienst + ':latest');\n        zeilen.push('    container_name: ' + dienst);\n        zeilen.push('    restart: unless-stopped');\n        zeilen.push('    networks:');\n        zeilen.push('      - ' + netz);\n        zeilen.push('    labels:');\n        etiketten.forEach(function (l) { zeilen.push('      - \"' + l + '\"'); });\n        zeilen.push('');\n        zeilen.push('networks:');\n        zeilen.push('  ' + netz + ':');\n        zeilen.push('    external: true');\n        ergebnis.compose = zeilen.join('\\n');<\/p>\n<p>        \/\/ --- Befunde ---\n        if (auth !== '') {\n            ergebnis.befunde.push({ schwer: true, text: T.b_dollar });\n            if (auth.indexOf('$') === -1) {\n                ergebnis.befunde.push({ schwer: true, text: T.b_kein_hash });\n            }\n            if (auth.indexOf(':') === -1) {\n                ergebnis.befunde.push({ schwer: true, text: T.b_ohne_doppelpunkt });\n            }\n        }\n        if (resolver === '') {\n            ergebnis.befunde.push({ schwer: true, text: T.b_ohne_tls });\n        } else {\n            ergebnis.befunde.push({ schwer: false, text: T.b_resolver.replace('%s', resolver) });\n        }\n        if (!eingabe.weiterleitung) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_ohne_weiterleitung });\n        }\n        if (!eingabe.kopfzeilen) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_ohne_kopfzeilen });\n        }\n        ergebnis.befunde.push({ schwer: false, text: T.b_netz.replace('%s', netz) });\n        ergebnis.befunde.push({ schwer: false, text: T.b_port });\n        ergebnis.befunde.push({ schwer: false, text: T.b_enable });<\/p>\n<p>        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.TR = { bauen: bauen, OPTIONEN: OPTIONEN };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('tr-btn');\n    const out = document.getElementById('tr-ergebnis');\n    const optionenFeld = document.getElementById('tr-optionen');\n    if (!btn || !out || !optionenFeld) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, inhalt) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (inhalt !== undefined && inhalt !== null) { knoten.textContent = inhalt; }\n        return knoten;\n    }<\/p>\n<p>    function wert(id) {\n        const knoten = document.getElementById(id);\n        return knoten ? knoten.value : '';\n    }<\/p>\n<p>    OPTIONEN.forEach(function (name) {\n        const zeile = el('label', 'display: flex; gap: 8px; align-items: center; cursor: pointer; min-width: 210px;');\n        const kasten = document.createElement('input');\n        kasten.type = 'checkbox';\n        kasten.id = 'tr-o-' + name;\n        kasten.checked = name === 'weiterleitung' || name === 'kopfzeilen';\n        zeile.appendChild(kasten);\n        zeile.appendChild(el('span', 'color: var(--text-primary, #e8e8ee); font-size: 0.88rem;', T['o_' + name]));\n        optionenFeld.appendChild(zeile);\n    });<\/p>\n<p>    btn.addEventListener('click', function () {\n        const eingabe = {\n            dienst: wert('tr-dienst'), host: wert('tr-host'), port: wert('tr-port'),\n            netz: wert('tr-netz'), resolver: wert('tr-resolver'), pfad: wert('tr-pfad'), auth: wert('tr-auth')\n        };\n        OPTIONEN.forEach(function (name) {\n            const knoten = document.getElementById('tr-o-' + name);\n            eingabe[name] = knoten ? knoten.checked : false;\n        });<\/p>\n<p>        const erg = bauen(eingabe);\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_compose));\n        out.appendChild(el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.78rem; line-height: 1.5; white-space: pre; margin-bottom: 18px;', erg.compose));<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        const befunde = el('div', KASTEN);\n        erg.befunde.forEach(function (b) {\n            const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n            z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n            z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n            befunde.appendChild(z);\n        });\n        out.appendChild(befunde);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Schreibt die Traefik-Etiketten f\u00fcr einen Container &#8211; Router, Dienst, TLS und Middlewares &#8211; und benennt die Stolperstellen, an denen ein Dienst unerreichbar oder ungesch\u00fctzt bleibt.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92217,92211,92071],"class_list":["post-10281","page","type-page","status-publish","hentry","tag-docker-de","tag-self-hosting-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Schreibt die Traefik-Etiketten f\u00fcr einen Container - Router, Dienst, TLS und Middlewares - und benennt die Stolperstellen, an denen ein Dienst unerreichbar oder ungesch\u00fctzt bleibt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/traefik-label-compose-generator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/traefik-label-compose-generator\\\/\",\"name\":\"Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T23:13:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/traefik-label-compose-generator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/traefik-label-compose-generator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/traefik-label-compose-generator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Traefik-Etiketten und Compose-Abschnitt erzeugen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/","og_locale":"en_US","og_type":"article","og_title":"Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog","og_description":"Schreibt die Traefik-Etiketten f\u00fcr einen Container - Router, Dienst, TLS und Middlewares - und benennt die Stolperstellen, an denen ein Dienst unerreichbar oder ungesch\u00fctzt bleibt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/","name":"Traefik-Etiketten und Compose-Abschnitt erzeugen - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T23:13:34+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/traefik-label-compose-generator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Traefik-Etiketten und Compose-Abschnitt erzeugen"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10281"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10281\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10281"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}