[{"data":1,"prerenderedAt":23587},["ShallowReactive",2],{"content-query-EFfVDwsVzA":3,"content-query-w8qtEh68yX":275,"content-query-KtO3wftRle":1504,"content-query-hQiL1tjAhV":1600,"content-query-G9vendBux1":3967,"content-query-K9Z9yOwvGV":5041,"content-query-TVldk4ROTj":9374,"content-query-UKDfBsQuK3":10844,"content-query-speOOs7jne":11377,"content-query-vhr2h3d1hs":12885,"content-query-6QVNjLYhQR":12957,"content-query-8gtQ467ucJ":15870,"content-query-us0rrbF4qc":17165,"content-query-YkijYFcsFd":18427,"content-query-1PFeYVQSzn":18502,"content-query-L6Pt7i9jc4":18575,"content-query-ChH556dtBR":19127,"content-query-yFFm3xXL85":19656,"content-query-By4ba3Yg5D":20135,"content-query-IyVdAveXkZ":20369,"content-query-MWnpLsXRMt":20885,"content-query-Iuoicz9R1n":21055,"content-query-EC7xcJJMAZ":22597,"content-query-dxbwY6hLCY":22630,"content-query-3n6qEDbVTx":23441,"content-query-Nu6UamZA4E":23483},[4,26,40,50,60,71,83,98,110,121,132,148,162,174,187,199,212,224,239,251,262],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"author":11,"image":12,"releaseDate":13,"blogCategories":14,"articleTags":17,"tags":18,"_type":20,"_id":21,"_source":22,"_file":23,"_stem":24,"_extension":25},"/blog/traefik-magic","blog",false,"","Verwendung von Traefik als Reverse Proxy - Convention over Configuration","Wie man den Traefik Reverse Proxy so konfiguriert, dass man auf Traefik-spezifische Labels verzichten kann und automatisch Subdomains passend zum Namen des Compose-Projekts geroutet werden.","robert-juzak","/images/dev-ops-dark.svg","2026-03-13",[15,16],"Was uns bewegt","DevOps",[16],[19],"devops","markdown","common:blog:21.traefik-magic.md","common","blog/21.traefik-magic.md","blog/21.traefik-magic","md",{"_path":27,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":28,"description":29,"author":11,"image":12,"releaseDate":30,"blogCategories":31,"articleTags":32,"tags":35,"_type":20,"_id":37,"_source":22,"_file":38,"_stem":39,"_extension":25},"/blog/shopware-plugin-gitlab-pipeline-test","Testen, Bauen und Veröffentlichen eines Shopware 6 Plugins mit GitLab CI - Teil 3: Testen","Teil 3: Testen - Verwendung von GitLab zum Testen, Bauen und Veröffentlichen eines Shopware 6 Plugins","2026-02-26",[15,16],[16,33,34],"Open Source","Shopware",[36,19],"shopware","common:blog:20.shopware-plugin-gitlab-pipeline-test.md","blog/20.shopware-plugin-gitlab-pipeline-test.md","blog/20.shopware-plugin-gitlab-pipeline-test",{"_path":41,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":42,"description":43,"author":11,"image":12,"releaseDate":30,"blogCategories":44,"articleTags":45,"tags":46,"_type":20,"_id":47,"_source":22,"_file":48,"_stem":49,"_extension":25},"/blog/shopware-plugin-gitlab-pipeline-build","Testen, Bauen, und Veröffentlichen eines Shopware 6 Plugins mit GitLab CI - Teil 2: Bauen","Teil 2: Bauen - Verwendung von GitLab zum Testen, Erstellen und Releasen eines Shopware 6 Plugins",[15,16],[16,33,34],[36,19],"common:blog:19.shopware-plugin-gitlab-pipeline-build.md","blog/19.shopware-plugin-gitlab-pipeline-build.md","blog/19.shopware-plugin-gitlab-pipeline-build",{"_path":51,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":52,"description":53,"author":11,"image":12,"releaseDate":30,"blogCategories":54,"articleTags":55,"tags":56,"_type":20,"_id":57,"_source":22,"_file":58,"_stem":59,"_extension":25},"/blog/shopware-plugin-gitlab-pipeline-release","Testen, Bauen, und Veröffentlichen von Shopware 6 Plugin mit GitLab CI - Teil 1: Veröffentlichen","Teil 1: Veröffentlichen - Verwendung von GitLab zum Testen, Bauen und Veröffentlichen eines Shopware 6 Plugins",[15,16],[16,33,34],[36,19],"common:blog:18.shopware-plugin-gitlab-pipeline-release.md","blog/18.shopware-plugin-gitlab-pipeline-release.md","blog/18.shopware-plugin-gitlab-pipeline-release",{"_path":61,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":62,"description":63,"author":11,"image":12,"releaseDate":64,"blogCategories":65,"articleTags":66,"tags":67,"_type":20,"_id":68,"_source":22,"_file":69,"_stem":70,"_extension":25},"/blog/gitops-docker-renovate","Softwareverwaltung mit GitLab, Renovate Bot und Docker","Software auf einem Server zu verwalten ist nicht einfach. Oder doch?","2025-10-30",[15,16],[16,33],[19],"common:blog:17.gitops-docker-renovate.md","blog/17.gitops-docker-renovate.md","blog/17.gitops-docker-renovate",{"_path":72,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":73,"description":74,"author":11,"image":12,"releaseDate":75,"blogCategories":76,"articleTags":78,"tags":79,"_type":20,"_id":80,"_source":22,"_file":81,"_stem":82,"_extension":25},"/blog/shopware-renovate-bot","Konfiguration von Renovate für die ordnungsgemäße Behandlung von Shopware-Paketen","Shopware verwendet ein benutzerdefiniertes Versionierungsschema. Um Renovate die automatische Erstellung von PR's zu ermöglichen, müssen wir die Renovate-Konfiguration anpassen","2025-09-08",[77,16],"Das bewegt uns",[16,33],[36,19],"common:blog:16.shopware-renovate-bot.md","blog/16.shopware-renovate-bot.md","blog/16.shopware-renovate-bot",{"_path":84,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":85,"description":86,"author":87,"image":88,"releaseDate":89,"blogCategories":90,"articleTags":91,"tags":93,"_type":20,"_id":95,"_source":22,"_file":96,"_stem":97,"_extension":25},"/blog/accessibility-legal-statement-template","Erklärung zur Barrierefreiheit (EzB) – Wie Sie das BFSG umsetzen und eine mögliche Abmahnung vermeiden","Barrierefreiheitserklärung nach BFSG: Vorlage und Anleitung zur Erklärung zur Barrierefreiheit. Schützen Sie sich vor Abmahnungen mit unserer Vorlage für eine individuelle Barrierefreiheitsstärkung. Die Bestimmungen des Barrierefreiheitsstärkungsgesetzes müssen umgesetzt werden. Sie können sich vor Prüfverfahren durch die Behörde zusätzlich schützen, indem Sie eine ausführliche Erklärung zur Barrierefreiheit abgeben.","jens-bornschein","/images/Accessibility.png","2025-09-05",[77],[92],"Accessibility",[94],"frontend","common:blog:15.accessibility-legal-statement-template.md","blog/15.accessibility-legal-statement-template.md","blog/15.accessibility-legal-statement-template",{"_path":99,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":100,"description":101,"author":11,"image":12,"releaseDate":102,"blogCategories":103,"articleTags":105,"tags":106,"_type":20,"_id":107,"_source":22,"_file":108,"_stem":109,"_extension":25},"/blog/gitlab-behind-traefik","Installation von Gitlab hinter Traefik","Es ist super einfach, GitLab mit Docker auf einem dedizierten Server zu installieren. Aber was, wenn Sie es neben Ihren anderen Deployments bereitstellen müssen?","2025-07-16",[15,104],"Infrastruktur",[16],[19],"common:blog:14.gitlab-behind-traefik.md","blog/14.gitlab-behind-traefik.md","blog/14.gitlab-behind-traefik",{"_path":111,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":112,"description":113,"author":87,"image":88,"releaseDate":114,"blogCategories":115,"articleTags":116,"tags":117,"_type":20,"_id":118,"_source":22,"_file":119,"_stem":120,"_extension":25},"/blog/accessibility-will-be-recommended","Barrierefreiheitsstärkungsgesetz - Barrierefreie Web-Dienste ab Juli 2025 für fast alle Pflicht!","Ab dem 28. Juni 2025 gilt in Deutschland das Barrierefreiheitsstärkungsgesetz (BFSG). Dieses Gesetz verpflichtet erstmals private Unternehmen, bestimmte digitale Produkte und Dienstleistungen barrierefrei anzubieten. Für viele Betreiber von Websites, Online-Shops und Apps bedeutet das, dass sie ihre digitalen Angebote bis zum Stichtag auf Zugänglichkeit trimmen müssen.","2025-04-13",[77],[92],[94],"common:blog:13.accessibility-will-be-recommended.md","blog/13.accessibility-will-be-recommended.md","blog/13.accessibility-will-be-recommended",{"_path":122,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":123,"description":124,"author":87,"image":12,"releaseDate":125,"blogCategories":126,"articleTags":127,"tags":128,"_type":20,"_id":129,"_source":22,"_file":130,"_stem":131,"_extension":25},"/blog/a-tribute-to-our-dev-ops","A Tribute to our Dev Ops","Web-Anwendungen werden meistens in einer Dev-Umgebung entwickelt und getestet – doch der eigentliche Härtetest kommt in der Praxis auf den Prod-Systemen.","2025-03-31",[77],[16],[19],"common:blog:12.a-tribute-to-our-dev-ops.md","blog/12.a-tribute-to-our-dev-ops.md","blog/12.a-tribute-to-our-dev-ops",{"_path":133,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":134,"description":135,"author":136,"image":137,"releaseDate":138,"blogCategories":139,"articleTags":140,"tags":142,"_type":20,"_id":145,"_source":22,"_file":146,"_stem":147,"_extension":25},"/blog/amazon-mws-sp-api-wrapper-de","Amazon MWS zu SP API Wrapper","Wir haben einen Wrapper veröffentlicht, der Amazon MWS in SP API umwandelt, um Entwicklern mit veralteten Systemen eine einfache Lösung anzubieten. Dieses Open-Source-Projekt bietet eine praktische Alternative zur Neuentwicklung und unterstützt die Fortführung bestehender Anwendungen.","bernd-helm","/blog/thumbnails/AWS.svg","2024-02-21",[77,16],[141,33],"Amazon",[143,144],"e-commerce","backend","common:blog:11.amazon-mws-sp-api-wrapper-de.md","blog/11.amazon-mws-sp-api-wrapper-de.md","blog/11.amazon-mws-sp-api-wrapper-de",{"_path":149,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":150,"description":151,"author":136,"image":152,"releaseDate":153,"blogCategories":154,"articleTags":155,"tags":158,"_type":20,"_id":159,"_source":22,"_file":160,"_stem":161,"_extension":25},"/blog/wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet","Wie man verschiedene DNS-Server für die Namensauflösung bestimmter Domänen verwendet - VPN Use-Case","Wie man ausgewählte Domains über VPN unter Linux auflöst. In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist es jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu leiten.","/blog/thumbnails/VPN.png","2022-04-21",[77,16],[156,157],"VPN","Linux",[19],"common:blog:10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet",{"_path":163,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":164,"description":165,"author":136,"image":166,"releaseDate":167,"blogCategories":168,"articleTags":169,"tags":170,"_type":20,"_id":171,"_source":22,"_file":172,"_stem":173,"_extension":25},"/blog/shopware-5-parallele-miniaturbildererstellung","Shopware 5 - Parallele Hochgeschwindigkeits-Miniaturbildererstellung","Wie man den integrierten SW5-Mechanismus so abstimmt, dass er mehr als 22 Mal schneller arbeitet! Shopware 5 - Parallele Thumbnail-Generierung nach dem Umzug eines Shopware 5 Systems auf einen anderen Server Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-Server umziehen musste ...","/images/shopware.svg","2021-04-29",[34,16],[156],[36],"common:blog:9.shopware-5-parallele-miniaturbildererstellung.md","blog/9.shopware-5-parallele-miniaturbildererstellung.md","blog/9.shopware-5-parallele-miniaturbildererstellung",{"_path":175,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":176,"description":177,"author":136,"image":178,"releaseDate":179,"blogCategories":180,"articleTags":181,"tags":183,"_type":20,"_id":184,"_source":22,"_file":185,"_stem":186,"_extension":25},"/blog/btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien","BTRFS: Auffinden und Reparieren stark fragmentierter Dateien","Die meisten der besten BTRFS-Funktionen werden durch die Copy-on-Write-Technologie ermöglicht. Wenn eine Anwendung einen Teil einer Datei umschreiben will, wie z.B. das erste MegaByte, werden die Daten nicht an Ort und Stelle geschrieben, sondern in einer sogenannten Erweiterung. Dadurch ist BTRFS in der Lage, mehrere Versionen von teilweise umgeschriebenen Dateien aufzubewahren, wobei nur die ...","/blog/thumbnails/BTRFS_white.png","2020-10-21",[77,104],[182],"BTRFS",[19],"common:blog:8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien.md","blog/8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien.md","blog/8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien",{"_path":188,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":189,"description":190,"author":136,"image":191,"releaseDate":192,"blogCategories":193,"articleTags":194,"tags":195,"_type":20,"_id":196,"_source":22,"_file":197,"_stem":198,"_extension":25},"/blog/richtiges-chroot-im-rettungsmodues-mit-arch-chroot","Richtiges CHROOT im Rettungsmodus mit arch-chroot","Die meisten Sysadmins wissen, wie man ein einfaches chroot auf einem gemounteten Dateisystem einrichtet (mount-binding dev, proc und sys), aber das funktioniert nicht in jedem Fall; für ein vollständiges chroot-Setup benötigen Sie außerdem dev/pts dev/shm, run, tmp, eine funktionierende resolve.conf und mehr. Nachdem Sie es eingerichtet haben und es in Betrieb nehmen wollen ...","/images/linux_os-mono.svg","2020-04-17",[77,104],[157],[19],"common:blog:7.richtiges-chroot-im-rettungsmodues-mit-arch-chroot.md","blog/7.richtiges-chroot-im-rettungsmodues-mit-arch-chroot.md","blog/7.richtiges-chroot-im-rettungsmodues-mit-arch-chroot",{"_path":200,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":201,"description":202,"author":136,"image":203,"releaseDate":204,"blogCategories":205,"articleTags":206,"tags":208,"_type":20,"_id":209,"_source":22,"_file":210,"_stem":211,"_extension":25},"/blog/warum-wir-keine-samsung-nvme-pro-ssds-mehr-verwenden","Warum wir keine Samsung NVME Pro SSDs mehr verwenden","Wenn es darum geht, eine NVME-SSD für eine Softwareentwickler-Workstation zu kaufen, steht man vor der Wahl: eine billige oder eine teure zu kaufen. Bisher habe ich mich für die teureren entschieden, weil sie eine bessere Leistung und längere Lebensdauer versprachen - jetzt sehe ich, wie falsch ich lag...","/blog/thumbnails/SSD_white.png","2020-04-16",[77,104],[207],"SSD",[19],"common:blog:6.warum-wir-keine-samsung-nvme-pro-ssds-mehr-verwenden.md","blog/6.warum-wir-keine-samsung-nvme-pro-ssds-mehr-verwenden.md","blog/6.warum-wir-keine-samsung-nvme-pro-ssds-mehr-verwenden",{"_path":213,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":214,"description":215,"author":136,"image":216,"releaseDate":217,"blogCategories":218,"articleTags":219,"tags":220,"_type":20,"_id":221,"_source":22,"_file":222,"_stem":223,"_extension":25},"/blog/raid5-vs-raid10-leistungsbenchmark-mdadm","RAID5 vs. Raid10 Leistungsbenchmark MDADM","Kommentar und Untersuchung zur RAID-Performance RAID 5 vs. RAID10 wird schon seit Ewigkeiten diskutiert; es ist allgemein bekannt, dass RAID10 eine bessere Leistung bietet - aber wie viel, hängt von der tatsächlichen Implementierung, Hardware und dem Anwendungsfall ab. Ich habe gerade einen Server mit 4 x 16TB ...","/blog/thumbnails/RAID_white.png","2019-11-06",[77,104],[207],[19],"common:blog:5.raid5-vs-raid10-leistungsbenchmark-mdadm.md","blog/5.raid5-vs-raid10-leistungsbenchmark-mdadm.md","blog/5.raid5-vs-raid10-leistungsbenchmark-mdadm",{"_path":225,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":226,"description":227,"author":228,"image":229,"releaseDate":230,"blogCategories":231,"articleTags":233,"tags":234,"_type":20,"_id":236,"_source":22,"_file":237,"_stem":238,"_extension":25},"/blog/riak-kompaktiert-eleveldb-tombstones-und-gewinnt-plattenplatz-zurueck","RIAK kompaktiert e/leveldb Tombstones und gewinnt Plattenplatz zurück","Wenn man versucht, Speicherplatz zurückzugewinnen, scheint das Löschen von Daten der naheliegende erste Schritt zu sein. In Riak ist dies jedoch nicht unbedingt die beste Lösung, wenn die Festplatte fast voll ist...","daniel-walter","/blog/thumbnails/RIAK_white.png","2017-09-26",[77,232],"Datenbanken",[207],[235,19],"databases","common:blog:4.riak-kompaktiert-eleveldb-tombstones-und-gewinnt-plattenplatz-zurueck.md","blog/4.riak-kompaktiert-eleveldb-tombstones-und-gewinnt-plattenplatz-zurueck.md","blog/4.riak-kompaktiert-eleveldb-tombstones-und-gewinnt-plattenplatz-zurueck",{"_path":240,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":241,"description":242,"author":136,"image":178,"releaseDate":243,"blogCategories":244,"articleTags":246,"tags":247,"_type":20,"_id":248,"_source":22,"_file":249,"_stem":250,"_extension":25},"/blog/backup-der-naechsten-generation-mit-btrfs-snapshots-fuer-root-fs-und-datenbanken","Backup der nächsten Generation mit BTRFS-Snapshots für Root-Fs und Datenbanken","Next-Gen-Backup mit BTRFS-Snapshots für Root-Fs und DatenbankenLinux / Von Bernd Helm / 6. September 2017Wofür es gut istDieser Artikel handelt von der Verwendung von BTRFS-Snapshots als Backup-Lösung, verwendbar für Datenbanken und vollständige Root-Partitions-Backups. Dies ist keine detaillierte Schritt-für-Schritt-Anleitung und setzt einige Linux-Kenntnisse voraus. Dieser Beitrag zielt darauf ab, meine Erfahrungen zu teilen und zu speichern ...","2017-09-06",[77,245],"Datenbank",[207],[19,235],"common:blog:3.backup-der-naechsten-generation-mit-btrfs-snapshots-fuer-root-fs-und-datenbanken.md","blog/3.backup-der-naechsten-generation-mit-btrfs-snapshots-fuer-root-fs-und-datenbanken.md","blog/3.backup-der-naechsten-generation-mit-btrfs-snapshots-fuer-root-fs-und-datenbanken",{"_path":252,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":253,"description":254,"image":229,"author":228,"releaseDate":255,"blogCategories":256,"articleTags":257,"tags":258,"_type":20,"_id":259,"_source":22,"_file":260,"_stem":261,"_extension":25},"/blog/basho-riak-dokumentation-mirror","Basho RIAK KV TS CS Dokumentations Mirror","Da die Basho RIAK KV TS CS Dokumentation im Moment nicht erreichbar ist, haben wir eine Kopie erstellt ...","2017-08-08",[77,245],[207],[235,19],"common:blog:2.basho-riak-dokumentation-mirror.md","blog/2.basho-riak-dokumentation-mirror.md","blog/2.basho-riak-dokumentation-mirror",{"_path":263,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":264,"description":265,"image":266,"author":136,"releaseDate":267,"blogCategories":268,"articleTags":270,"tags":271,"_type":20,"_id":272,"_source":22,"_file":273,"_stem":274,"_extension":25},"/blog/unsere-lieblinge-php-cpp-java-scala-dhtmlx-infinidb-zend","PHP & Co.: Unsere Lieblinge","Für Entwickler, Für Shopbetreiber - Wir arbeiten nicht mit beliebigen Frameworks, Bibliotheken, Plugins und Programmiersprachen. Wir lieben es professionell. Software, die bei Helm & Walter entsteht, soll leistungsfähig und schlank sein. Hier unsere Favoriten: PHP (rekursives Akronym für PHP: Hypertext Preprocessor) ist eine weit verbreitete und für den …","/blog/thumbnails/PHP.png","2017-06-27",[77,269],"Frontend",[269],[144,235],"common:blog:1.unsere-lieblinge-php-cpp-java-scala-dhtmlx-infinidb-zend.md","blog/1.unsere-lieblinge-php-cpp-java-scala-dhtmlx-infinidb-zend.md","blog/1.unsere-lieblinge-php-cpp-java-scala-dhtmlx-infinidb-zend",{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"author":11,"image":12,"releaseDate":13,"blogCategories":276,"articleTags":277,"tags":278,"body":279,"_type":20,"_id":21,"_source":22,"_file":23,"_stem":24,"_extension":25},[15,16],[16],[19],{"type":280,"children":281,"toc":1494},"root",[282,297,302,451,456,531,538,566,571,599,612,631,637,654,755,760,765,790,836,840,845,1210,1215,1251,1258,1266,1320,1324,1331,1359,1365,1370,1376,1381,1393,1401,1407,1419,1488],{"type":283,"tag":284,"props":285,"children":286},"element","p",{},[287,295],{"type":283,"tag":288,"props":289,"children":291},"a",{"href":290},"https://doc.traefik.io/traefik/",[292],{"type":293,"value":294},"text","Traefik",{"type":293,"value":296}," ist ein Reverse Proxy mit exzellenter Docker-Integration. Er verwendet Labels, die an Containern angebracht sind, um den Datenverkehr zu ihnen zu leiten.",{"type":283,"tag":284,"props":298,"children":299},{},[300],{"type":293,"value":301},"Ein typisches Set an Labels sieht ungefähr so aus:",{"type":283,"tag":303,"props":304,"children":315},"pre",{"code":305,"filename":306,"highlights":307,"language":313,"meta":8,"className":314,"style":8},"services:\n  whoami:\n    image: traefik/whoami\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.whoami.rule=Host(`whoami.example.com`)\"\n      - \"traefik.http.routers.whoami.entrypoints=websecure\"\n      - \"traefik.http.routers.whoami.tls=true\"\n      - \"traefik.http.routers.whoami.tls.certresolver=letsencrypt\"\n","whoami/docker-compose.yaml",[308,309,310,311,312],5,6,7,8,9,"yaml","language-yaml shiki shiki-themes github-dark github-dark monokai",[316],{"type":283,"tag":317,"props":318,"children":319},"code",{"__ignoreMap":8},[320,338,351,371,384,399,412,425,438],{"type":283,"tag":321,"props":322,"children":325},"span",{"class":323,"line":324},"line",1,[326,332],{"type":283,"tag":321,"props":327,"children":329},{"style":328},"--shiki-default:#85E89D;--shiki-dark:#85E89D;--shiki-sepia:#F92672",[330],{"type":293,"value":331},"services",{"type":283,"tag":321,"props":333,"children":335},{"style":334},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2",[336],{"type":293,"value":337},":\n",{"type":283,"tag":321,"props":339,"children":341},{"class":323,"line":340},2,[342,347],{"type":283,"tag":321,"props":343,"children":344},{"style":328},[345],{"type":293,"value":346},"  whoami",{"type":283,"tag":321,"props":348,"children":349},{"style":334},[350],{"type":293,"value":337},{"type":283,"tag":321,"props":352,"children":354},{"class":323,"line":353},3,[355,360,365],{"type":283,"tag":321,"props":356,"children":357},{"style":328},[358],{"type":293,"value":359},"    image",{"type":283,"tag":321,"props":361,"children":362},{"style":334},[363],{"type":293,"value":364},": ",{"type":283,"tag":321,"props":366,"children":368},{"style":367},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74",[369],{"type":293,"value":370},"traefik/whoami\n",{"type":283,"tag":321,"props":372,"children":374},{"class":323,"line":373},4,[375,380],{"type":283,"tag":321,"props":376,"children":377},{"style":328},[378],{"type":293,"value":379},"    labels",{"type":283,"tag":321,"props":381,"children":382},{"style":334},[383],{"type":293,"value":337},{"type":283,"tag":321,"props":385,"children":388},{"class":386,"line":308},[323,387],"highlight",[389,394],{"type":283,"tag":321,"props":390,"children":391},{"style":334},[392],{"type":293,"value":393},"      - ",{"type":283,"tag":321,"props":395,"children":396},{"style":367},[397],{"type":293,"value":398},"\"traefik.enable=true\"\n",{"type":283,"tag":321,"props":400,"children":402},{"class":401,"line":309},[323,387],[403,407],{"type":283,"tag":321,"props":404,"children":405},{"style":334},[406],{"type":293,"value":393},{"type":283,"tag":321,"props":408,"children":409},{"style":367},[410],{"type":293,"value":411},"\"traefik.http.routers.whoami.rule=Host(`whoami.example.com`)\"\n",{"type":283,"tag":321,"props":413,"children":415},{"class":414,"line":310},[323,387],[416,420],{"type":283,"tag":321,"props":417,"children":418},{"style":334},[419],{"type":293,"value":393},{"type":283,"tag":321,"props":421,"children":422},{"style":367},[423],{"type":293,"value":424},"\"traefik.http.routers.whoami.entrypoints=websecure\"\n",{"type":283,"tag":321,"props":426,"children":428},{"class":427,"line":311},[323,387],[429,433],{"type":283,"tag":321,"props":430,"children":431},{"style":334},[432],{"type":293,"value":393},{"type":283,"tag":321,"props":434,"children":435},{"style":367},[436],{"type":293,"value":437},"\"traefik.http.routers.whoami.tls=true\"\n",{"type":283,"tag":321,"props":439,"children":441},{"class":440,"line":312},[323,387],[442,446],{"type":283,"tag":321,"props":443,"children":444},{"style":334},[445],{"type":293,"value":393},{"type":283,"tag":321,"props":447,"children":448},{"style":367},[449],{"type":293,"value":450},"\"traefik.http.routers.whoami.tls.certresolver=letsencrypt\"\n",{"type":283,"tag":284,"props":452,"children":453},{},[454],{"type":293,"value":455},"In diesem Beispiel:",{"type":283,"tag":457,"props":458,"children":459},"ul",{},[460,472,488,493,505,510],{"type":283,"tag":461,"props":462,"children":463},"li",{},[464,470],{"type":283,"tag":317,"props":465,"children":467},{"className":466},[],[468],{"type":293,"value":469},"whoami",{"type":293,"value":471}," ist der Name des \"Haupt\"-Dienstes (2)",{"type":283,"tag":461,"props":473,"children":474},{},[475,480,482],{"type":283,"tag":317,"props":476,"children":478},{"className":477},[],[479],{"type":293,"value":469},{"type":293,"value":481}," ist auch der Standard-",{"type":283,"tag":288,"props":483,"children":485},{"href":484},"https://docs.docker.com/compose/how-tos/project-name/",[486],{"type":293,"value":487},"Name des Compose-Projekts",{"type":283,"tag":461,"props":489,"children":490},{},[491],{"type":293,"value":492},"Traefik wird aktiviert (5)",{"type":283,"tag":461,"props":494,"children":495},{},[496,498,503],{"type":293,"value":497},"Der Dienst wird unter der Subdomain ",{"type":283,"tag":317,"props":499,"children":501},{"className":500},[],[502],{"type":293,"value":469},{"type":293,"value":504}," bereitgestellt (6)",{"type":283,"tag":461,"props":506,"children":507},{},[508],{"type":293,"value":509},"Die Auslieferung erfolgt über HTTPS (7)",{"type":283,"tag":461,"props":511,"children":512},{},[513,515,521,523,529],{"type":293,"value":514},"Ein vorkonfigurierter Certresolver namens ",{"type":283,"tag":317,"props":516,"children":518},{"className":517},[],[519],{"type":293,"value":520},"letsencrypt",{"type":293,"value":522}," wird für ",{"type":283,"tag":317,"props":524,"children":526},{"className":525},[],[527],{"type":293,"value":528},"tls",{"type":293,"value":530}," verwendet (8-9)",{"type":283,"tag":532,"props":533,"children":535},"h2",{"id":534},"das-problem",[536],{"type":293,"value":537},"Das Problem",{"type":283,"tag":284,"props":539,"children":540},{},[541,543,548,550,556,558,564],{"type":293,"value":542},"In meinem ",{"type":283,"tag":288,"props":544,"children":545},{"href":61},[546],{"type":293,"value":547},"anderen Beitrag über GitOps mit Docker",{"type":293,"value":549}," habe ich das Konzept eingeführt,\n",{"type":283,"tag":317,"props":551,"children":553},{"className":552},[],[554],{"type":293,"value":555},"git",{"type":293,"value":557}," als „Source of Truth“ für Docker-Deployments mittels ",{"type":283,"tag":288,"props":559,"children":561},{"href":560},"https://docs.docker.com/compose/",[562],{"type":293,"value":563},"Docker Compose",{"type":293,"value":565}," zu nutzen.",{"type":283,"tag":284,"props":567,"children":568},{},[569],{"type":293,"value":570},"Dabei gibt es einige Anforderungen:",{"type":283,"tag":457,"props":572,"children":573},{},[574,587],{"type":283,"tag":461,"props":575,"children":576},{},[577,579,585],{"type":293,"value":578},"Jeder Stack ist unter ",{"type":283,"tag":317,"props":580,"children":582},{"className":581},[],[583],{"type":293,"value":584},"\u003Cstack_name>.\u003Cyour_domain>",{"type":293,"value":586}," erreichbar",{"type":283,"tag":461,"props":588,"children":589},{},[590,592,597],{"type":293,"value":591},"Jeder Stack ist mit ",{"type":283,"tag":317,"props":593,"children":595},{"className":594},[],[596],{"type":293,"value":528},{"type":293,"value":598}," geschützt",{"type":283,"tag":284,"props":600,"children":601},{},[602,604,610],{"type":293,"value":603},"Wir könnten zwar in jeder ",{"type":283,"tag":317,"props":605,"children":607},{"className":606},[],[608],{"type":293,"value":609},"docker-compose.yaml",{"type":293,"value":611}," die Labels manuell hinzufügen, doch dabei zeigt sich schnell,\ndass wir die Konfiguration redundant wiederholen.",{"type":283,"tag":613,"props":614,"children":615},"ol",{},[616,621,626],{"type":283,"tag":461,"props":617,"children":618},{},[619],{"type":293,"value":620},"Traefik aktivieren",{"type":283,"tag":461,"props":622,"children":623},{},[624],{"type":293,"value":625},"Eine Subdomain zuweisen",{"type":283,"tag":461,"props":627,"children":628},{},[629],{"type":293,"value":630},"HTTPS aktivieren",{"type":283,"tag":532,"props":632,"children":634},{"id":633},"die-lösung",[635],{"type":293,"value":636},"Die Lösung",{"type":283,"tag":284,"props":638,"children":639},{},[640,642,652],{"type":293,"value":641},"Mit hilfe der ",{"type":283,"tag":288,"props":643,"children":645},{"href":644},"https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_project_name",[646],{"type":283,"tag":317,"props":647,"children":649},{"className":648},[],[650],{"type":293,"value":651},"$COMPOSE_PROJECT_NAME",{"type":293,"value":653},"\nVariable können wir ein generisches Template für eine solche Konfiguration erstellen.\nDadurch stellen wir sicher, dass die Traefik-Regeln einheitlich sind.",{"type":283,"tag":303,"props":655,"children":658},{"code":656,"filename":657,"language":313,"meta":8,"className":314,"style":8},"services:\n  \u003Cmain_service>:\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.$COMPOSE_PROJECT_NAME.rule=Host(`\u003Cstack_name>.example.com`)\"\n      - \"traefik.http.routers.$COMPOSE_PROJECT_NAME.entrypoints=websecure\"\n      - \"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls=true\"\n      - \"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls.certresolver=letsencrypt\"\n","\u003Cstack_name>/docker-compose.yaml",[659],{"type":283,"tag":317,"props":660,"children":661},{"__ignoreMap":8},[662,673,685,696,707,719,731,743],{"type":283,"tag":321,"props":663,"children":664},{"class":323,"line":324},[665,669],{"type":283,"tag":321,"props":666,"children":667},{"style":328},[668],{"type":293,"value":331},{"type":283,"tag":321,"props":670,"children":671},{"style":334},[672],{"type":293,"value":337},{"type":283,"tag":321,"props":674,"children":675},{"class":323,"line":340},[676,681],{"type":283,"tag":321,"props":677,"children":678},{"style":328},[679],{"type":293,"value":680},"  \u003Cmain_service>",{"type":283,"tag":321,"props":682,"children":683},{"style":334},[684],{"type":293,"value":337},{"type":283,"tag":321,"props":686,"children":687},{"class":323,"line":353},[688,692],{"type":283,"tag":321,"props":689,"children":690},{"style":328},[691],{"type":293,"value":379},{"type":283,"tag":321,"props":693,"children":694},{"style":334},[695],{"type":293,"value":337},{"type":283,"tag":321,"props":697,"children":698},{"class":323,"line":373},[699,703],{"type":283,"tag":321,"props":700,"children":701},{"style":334},[702],{"type":293,"value":393},{"type":283,"tag":321,"props":704,"children":705},{"style":367},[706],{"type":293,"value":398},{"type":283,"tag":321,"props":708,"children":709},{"class":323,"line":308},[710,714],{"type":283,"tag":321,"props":711,"children":712},{"style":334},[713],{"type":293,"value":393},{"type":283,"tag":321,"props":715,"children":716},{"style":367},[717],{"type":293,"value":718},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.rule=Host(`\u003Cstack_name>.example.com`)\"\n",{"type":283,"tag":321,"props":720,"children":721},{"class":323,"line":309},[722,726],{"type":283,"tag":321,"props":723,"children":724},{"style":334},[725],{"type":293,"value":393},{"type":283,"tag":321,"props":727,"children":728},{"style":367},[729],{"type":293,"value":730},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.entrypoints=websecure\"\n",{"type":283,"tag":321,"props":732,"children":733},{"class":323,"line":310},[734,738],{"type":283,"tag":321,"props":735,"children":736},{"style":334},[737],{"type":293,"value":393},{"type":283,"tag":321,"props":739,"children":740},{"style":367},[741],{"type":293,"value":742},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls=true\"\n",{"type":283,"tag":321,"props":744,"children":745},{"class":323,"line":311},[746,750],{"type":283,"tag":321,"props":747,"children":748},{"style":334},[749],{"type":293,"value":393},{"type":283,"tag":321,"props":751,"children":752},{"style":367},[753],{"type":293,"value":754},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls.certresolver=letsencrypt\"\n",{"type":283,"tag":284,"props":756,"children":757},{},[758],{"type":293,"value":759},"Die gute Nachricht ist, dass Traefik es uns ermöglicht, einige Standardwerte zu konfigurieren, die den oben genannten Boilerplate-Code abdecken!",{"type":283,"tag":284,"props":761,"children":762},{},[763],{"type":293,"value":764},"Führen wir zwei einfache Konventionen ein:",{"type":283,"tag":613,"props":766,"children":767},{},[768,779],{"type":283,"tag":461,"props":769,"children":770},{},[771,777],{"type":283,"tag":317,"props":772,"children":774},{"className":773},[],[775],{"type":293,"value":776},"app",{"type":293,"value":778}," als Name des \"Hauptcontainers\", damit Traefik den Datenverkehr dorthin leitet",{"type":283,"tag":461,"props":780,"children":781},{},[782,788],{"type":283,"tag":317,"props":783,"children":785},{"className":784},[],[786],{"type":293,"value":787},"\u003Cstack_name>",{"type":293,"value":789}," (der Name des Compose-Projekts) in der Subdomain",{"type":283,"tag":303,"props":791,"children":794},{"code":792,"filename":793,"language":313,"meta":8,"className":314,"style":8},"services:\n  app:\n    image: traefik/whoami\n","(1) whoami/docker-compose.yaml",[795],{"type":283,"tag":317,"props":796,"children":797},{"__ignoreMap":8},[798,809,821],{"type":283,"tag":321,"props":799,"children":800},{"class":323,"line":324},[801,805],{"type":283,"tag":321,"props":802,"children":803},{"style":328},[804],{"type":293,"value":331},{"type":283,"tag":321,"props":806,"children":807},{"style":334},[808],{"type":293,"value":337},{"type":283,"tag":321,"props":810,"children":811},{"class":323,"line":340},[812,817],{"type":283,"tag":321,"props":813,"children":814},{"style":328},[815],{"type":293,"value":816},"  app",{"type":283,"tag":321,"props":818,"children":819},{"style":334},[820],{"type":293,"value":337},{"type":283,"tag":321,"props":822,"children":823},{"class":323,"line":353},[824,828,832],{"type":283,"tag":321,"props":825,"children":826},{"style":328},[827],{"type":293,"value":359},{"type":283,"tag":321,"props":829,"children":830},{"style":334},[831],{"type":293,"value":364},{"type":283,"tag":321,"props":833,"children":834},{"style":367},[835],{"type":293,"value":370},{"type":283,"tag":837,"props":838,"children":839},"hr",{},[],{"type":283,"tag":284,"props":841,"children":842},{},[843],{"type":293,"value":844},"Nun konfigurieren wir Traefik, um \"die Magie\" wirken zu lassen:",{"type":283,"tag":303,"props":846,"children":849},{"code":847,"filename":848,"language":313,"meta":8,"className":314,"style":8},"volumes:\n  letsencrypt:\n    \nservices:\n  traefik:\n    container_name: traefik\n    restart: always\n    image: traefik:3\n    network_mode: host\n    command:\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true\n      - --certificatesresolvers.letsencrypt.acme.email=\u003Cyour_email_here>\n      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n\n      - --entrypoints.web.address=:80\n      - --entrypoints.websecure.address=:443\n      \n      - --entrypoints.web.http.redirections.entrypoint.to=websecure\n      - --entrypoints.web.http.redirections.entrypoint.scheme=https\n      - --entrypoints.websecure.http.tls.certresolver=letsencrypt\n\n      - --providers.docker\n      - --providers.docker.defaultrule=Host(`{{ trimPrefix `app-` .Name }}.example.com`)\n      - --providers.docker.constraints=Label(`com.docker.compose.service`,`app`)\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - /letsencrypt:/letsencrypt\n","(2) traefik/docker-compose.yaml",[850],{"type":283,"tag":317,"props":851,"children":852},{"__ignoreMap":8},[853,865,877,885,896,908,925,942,958,975,988,1001,1014,1027,1040,1050,1063,1076,1085,1098,1111,1124,1132,1145,1158,1171,1184,1197],{"type":283,"tag":321,"props":854,"children":855},{"class":323,"line":324},[856,861],{"type":283,"tag":321,"props":857,"children":858},{"style":328},[859],{"type":293,"value":860},"volumes",{"type":283,"tag":321,"props":862,"children":863},{"style":334},[864],{"type":293,"value":337},{"type":283,"tag":321,"props":866,"children":867},{"class":323,"line":340},[868,873],{"type":283,"tag":321,"props":869,"children":870},{"style":328},[871],{"type":293,"value":872},"  letsencrypt",{"type":283,"tag":321,"props":874,"children":875},{"style":334},[876],{"type":293,"value":337},{"type":283,"tag":321,"props":878,"children":879},{"class":323,"line":353},[880],{"type":283,"tag":321,"props":881,"children":882},{"style":334},[883],{"type":293,"value":884},"    \n",{"type":283,"tag":321,"props":886,"children":887},{"class":323,"line":373},[888,892],{"type":283,"tag":321,"props":889,"children":890},{"style":328},[891],{"type":293,"value":331},{"type":283,"tag":321,"props":893,"children":894},{"style":334},[895],{"type":293,"value":337},{"type":283,"tag":321,"props":897,"children":898},{"class":323,"line":308},[899,904],{"type":283,"tag":321,"props":900,"children":901},{"style":328},[902],{"type":293,"value":903},"  traefik",{"type":283,"tag":321,"props":905,"children":906},{"style":334},[907],{"type":293,"value":337},{"type":283,"tag":321,"props":909,"children":910},{"class":323,"line":309},[911,916,920],{"type":283,"tag":321,"props":912,"children":913},{"style":328},[914],{"type":293,"value":915},"    container_name",{"type":283,"tag":321,"props":917,"children":918},{"style":334},[919],{"type":293,"value":364},{"type":283,"tag":321,"props":921,"children":922},{"style":367},[923],{"type":293,"value":924},"traefik\n",{"type":283,"tag":321,"props":926,"children":927},{"class":323,"line":310},[928,933,937],{"type":283,"tag":321,"props":929,"children":930},{"style":328},[931],{"type":293,"value":932},"    restart",{"type":283,"tag":321,"props":934,"children":935},{"style":334},[936],{"type":293,"value":364},{"type":283,"tag":321,"props":938,"children":939},{"style":367},[940],{"type":293,"value":941},"always\n",{"type":283,"tag":321,"props":943,"children":944},{"class":323,"line":311},[945,949,953],{"type":283,"tag":321,"props":946,"children":947},{"style":328},[948],{"type":293,"value":359},{"type":283,"tag":321,"props":950,"children":951},{"style":334},[952],{"type":293,"value":364},{"type":283,"tag":321,"props":954,"children":955},{"style":367},[956],{"type":293,"value":957},"traefik:3\n",{"type":283,"tag":321,"props":959,"children":960},{"class":323,"line":312},[961,966,970],{"type":283,"tag":321,"props":962,"children":963},{"style":328},[964],{"type":293,"value":965},"    network_mode",{"type":283,"tag":321,"props":967,"children":968},{"style":334},[969],{"type":293,"value":364},{"type":283,"tag":321,"props":971,"children":972},{"style":367},[973],{"type":293,"value":974},"host\n",{"type":283,"tag":321,"props":976,"children":978},{"class":323,"line":977},10,[979,984],{"type":283,"tag":321,"props":980,"children":981},{"style":328},[982],{"type":293,"value":983},"    command",{"type":283,"tag":321,"props":985,"children":986},{"style":334},[987],{"type":293,"value":337},{"type":283,"tag":321,"props":989,"children":991},{"class":323,"line":990},11,[992,996],{"type":283,"tag":321,"props":993,"children":994},{"style":334},[995],{"type":293,"value":393},{"type":283,"tag":321,"props":997,"children":998},{"style":367},[999],{"type":293,"value":1000},"--certificatesresolvers.letsencrypt.acme.httpchallenge=true\n",{"type":283,"tag":321,"props":1002,"children":1004},{"class":323,"line":1003},12,[1005,1009],{"type":283,"tag":321,"props":1006,"children":1007},{"style":334},[1008],{"type":293,"value":393},{"type":283,"tag":321,"props":1010,"children":1011},{"style":367},[1012],{"type":293,"value":1013},"--certificatesresolvers.letsencrypt.acme.email=\u003Cyour_email_here>\n",{"type":283,"tag":321,"props":1015,"children":1017},{"class":323,"line":1016},13,[1018,1022],{"type":283,"tag":321,"props":1019,"children":1020},{"style":334},[1021],{"type":293,"value":393},{"type":283,"tag":321,"props":1023,"children":1024},{"style":367},[1025],{"type":293,"value":1026},"--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\n",{"type":283,"tag":321,"props":1028,"children":1030},{"class":323,"line":1029},14,[1031,1035],{"type":283,"tag":321,"props":1032,"children":1033},{"style":334},[1034],{"type":293,"value":393},{"type":283,"tag":321,"props":1036,"children":1037},{"style":367},[1038],{"type":293,"value":1039},"--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n",{"type":283,"tag":321,"props":1041,"children":1043},{"class":323,"line":1042},15,[1044],{"type":283,"tag":321,"props":1045,"children":1047},{"emptyLinePlaceholder":1046},true,[1048],{"type":293,"value":1049},"\n",{"type":283,"tag":321,"props":1051,"children":1053},{"class":323,"line":1052},16,[1054,1058],{"type":283,"tag":321,"props":1055,"children":1056},{"style":334},[1057],{"type":293,"value":393},{"type":283,"tag":321,"props":1059,"children":1060},{"style":367},[1061],{"type":293,"value":1062},"--entrypoints.web.address=:80\n",{"type":283,"tag":321,"props":1064,"children":1066},{"class":323,"line":1065},17,[1067,1071],{"type":283,"tag":321,"props":1068,"children":1069},{"style":334},[1070],{"type":293,"value":393},{"type":283,"tag":321,"props":1072,"children":1073},{"style":367},[1074],{"type":293,"value":1075},"--entrypoints.websecure.address=:443\n",{"type":283,"tag":321,"props":1077,"children":1079},{"class":323,"line":1078},18,[1080],{"type":283,"tag":321,"props":1081,"children":1082},{"style":334},[1083],{"type":293,"value":1084},"      \n",{"type":283,"tag":321,"props":1086,"children":1088},{"class":323,"line":1087},19,[1089,1093],{"type":283,"tag":321,"props":1090,"children":1091},{"style":334},[1092],{"type":293,"value":393},{"type":283,"tag":321,"props":1094,"children":1095},{"style":367},[1096],{"type":293,"value":1097},"--entrypoints.web.http.redirections.entrypoint.to=websecure\n",{"type":283,"tag":321,"props":1099,"children":1101},{"class":323,"line":1100},20,[1102,1106],{"type":283,"tag":321,"props":1103,"children":1104},{"style":334},[1105],{"type":293,"value":393},{"type":283,"tag":321,"props":1107,"children":1108},{"style":367},[1109],{"type":293,"value":1110},"--entrypoints.web.http.redirections.entrypoint.scheme=https\n",{"type":283,"tag":321,"props":1112,"children":1114},{"class":323,"line":1113},21,[1115,1119],{"type":283,"tag":321,"props":1116,"children":1117},{"style":334},[1118],{"type":293,"value":393},{"type":283,"tag":321,"props":1120,"children":1121},{"style":367},[1122],{"type":293,"value":1123},"--entrypoints.websecure.http.tls.certresolver=letsencrypt\n",{"type":283,"tag":321,"props":1125,"children":1127},{"class":323,"line":1126},22,[1128],{"type":283,"tag":321,"props":1129,"children":1130},{"emptyLinePlaceholder":1046},[1131],{"type":293,"value":1049},{"type":283,"tag":321,"props":1133,"children":1135},{"class":323,"line":1134},23,[1136,1140],{"type":283,"tag":321,"props":1137,"children":1138},{"style":334},[1139],{"type":293,"value":393},{"type":283,"tag":321,"props":1141,"children":1142},{"style":367},[1143],{"type":293,"value":1144},"--providers.docker\n",{"type":283,"tag":321,"props":1146,"children":1148},{"class":323,"line":1147},24,[1149,1153],{"type":283,"tag":321,"props":1150,"children":1151},{"style":334},[1152],{"type":293,"value":393},{"type":283,"tag":321,"props":1154,"children":1155},{"style":367},[1156],{"type":293,"value":1157},"--providers.docker.defaultrule=Host(`{{ trimPrefix `app-` .Name }}.example.com`)\n",{"type":283,"tag":321,"props":1159,"children":1161},{"class":323,"line":1160},25,[1162,1166],{"type":283,"tag":321,"props":1163,"children":1164},{"style":334},[1165],{"type":293,"value":393},{"type":283,"tag":321,"props":1167,"children":1168},{"style":367},[1169],{"type":293,"value":1170},"--providers.docker.constraints=Label(`com.docker.compose.service`,`app`)\n",{"type":283,"tag":321,"props":1172,"children":1174},{"class":323,"line":1173},26,[1175,1180],{"type":283,"tag":321,"props":1176,"children":1177},{"style":328},[1178],{"type":293,"value":1179},"    volumes",{"type":283,"tag":321,"props":1181,"children":1182},{"style":334},[1183],{"type":293,"value":337},{"type":283,"tag":321,"props":1185,"children":1187},{"class":323,"line":1186},27,[1188,1192],{"type":283,"tag":321,"props":1189,"children":1190},{"style":334},[1191],{"type":293,"value":393},{"type":283,"tag":321,"props":1193,"children":1194},{"style":367},[1195],{"type":293,"value":1196},"/var/run/docker.sock:/var/run/docker.sock:ro\n",{"type":283,"tag":321,"props":1198,"children":1200},{"class":323,"line":1199},28,[1201,1205],{"type":283,"tag":321,"props":1202,"children":1203},{"style":334},[1204],{"type":293,"value":393},{"type":283,"tag":321,"props":1206,"children":1207},{"style":367},[1208],{"type":293,"value":1209},"/letsencrypt:/letsencrypt\n",{"type":283,"tag":284,"props":1211,"children":1212},{},[1213],{"type":293,"value":1214},"Erklären wir das ein wenig:",{"type":283,"tag":613,"props":1216,"children":1217},{},[1218,1231,1236,1241,1246],{"type":283,"tag":461,"props":1219,"children":1220},{},[1221,1223,1229],{"type":293,"value":1222},"Wir konfigurieren einen ",{"type":283,"tag":288,"props":1224,"children":1226},{"href":1225},"https://letsencrypt.org/",[1227],{"type":293,"value":1228},"Let's Encrypt",{"type":293,"value":1230}," Certificates Resolver (11-14)",{"type":283,"tag":461,"props":1232,"children":1233},{},[1234],{"type":293,"value":1235},"Wir hören auf Port 80 und 443 (16-17)",{"type":283,"tag":461,"props":1237,"children":1238},{},[1239],{"type":293,"value":1240},"Wir leiten den gesamten HTTP-Verkehr auf HTTPS um (19-20)",{"type":283,"tag":461,"props":1242,"children":1243},{},[1244],{"type":293,"value":1245},"Und binden den konfigurierten Certificates Resolver daran (21)",{"type":283,"tag":461,"props":1247,"children":1248},{},[1249],{"type":293,"value":1250},"Wir richten den Docker-Provider ein (23-25)",{"type":283,"tag":1252,"props":1253,"children":1255},"h3",{"id":1254},"erklärung-für-die-zeilen-24-25",[1256],{"type":293,"value":1257},"Erklärung für die Zeilen 24-25",{"type":283,"tag":303,"props":1259,"children":1261},{"code":1260},"--providers.docker.defaultrule=Host(`{{ trimPrefix 'app-'.Name }}.example.com`)\n",[1262],{"type":283,"tag":317,"props":1263,"children":1264},{"__ignoreMap":8},[1265],{"type":293,"value":1260},{"type":283,"tag":457,"props":1267,"children":1268},{},[1269,1303],{"type":283,"tag":461,"props":1270,"children":1271},{},[1272,1278,1280,1286,1288,1293,1295,1301],{"type":283,"tag":317,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":293,"value":1277},".Name",{"type":293,"value":1279}," wird automatisch als ",{"type":283,"tag":317,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":293,"value":1285},"\u003Cservice-name>-\u003Cstack_name>",{"type":293,"value":1287}," generiert. Für dein ",{"type":283,"tag":317,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":293,"value":469},{"type":293,"value":1294},"-Beispiel wäre das also ",{"type":283,"tag":317,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":293,"value":1300},"app-whoami",{"type":293,"value":1302},".",{"type":283,"tag":461,"props":1304,"children":1305},{},[1306,1312,1314,1319],{"type":283,"tag":317,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":293,"value":1311},"trimPrefix 'app-'.Name",{"type":293,"value":1313}," ergibt ",{"type":283,"tag":317,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":293,"value":469},{"type":293,"value":1302},{"type":283,"tag":1321,"props":1322,"children":1323},"br",{},[],{"type":283,"tag":303,"props":1325,"children":1326},{"code":1170},[1327],{"type":283,"tag":317,"props":1328,"children":1329},{"__ignoreMap":8},[1330],{"type":293,"value":1170},{"type":283,"tag":284,"props":1332,"children":1333},{},[1334,1336,1341,1343,1349,1351,1357],{"type":293,"value":1335},"Alle Dienste sollten standardmäßig verfügbar sein, aber sie sollten gefiltert werden, sodass nur ",{"type":283,"tag":317,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":293,"value":776},{"type":293,"value":1342},"-Dienste berücksichtigt werden. Das Label ",{"type":283,"tag":317,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":293,"value":1348},"com.docker.compose.service",{"type":293,"value":1350}," wird von ",{"type":283,"tag":317,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":293,"value":1356},"docker-compose",{"type":293,"value":1358}," automatisch zu allen Containern hinzugefügt.",{"type":283,"tag":532,"props":1360,"children":1362},{"id":1361},"bonus-konfiguration",[1363],{"type":293,"value":1364},"Bonus-Konfiguration",{"type":283,"tag":284,"props":1366,"children":1367},{},[1368],{"type":293,"value":1369},"Wir können diese Konfiguration noch weiter verfeinern.",{"type":283,"tag":1252,"props":1371,"children":1373},{"id":1372},"andere-dienste-im-stack-verfügbar-machen",[1374],{"type":293,"value":1375},"Andere Dienste im Stack verfügbar machen",{"type":283,"tag":284,"props":1377,"children":1378},{},[1379],{"type":293,"value":1380},"Manchmal möchte man mehr als nur den App-Container nach außen hin öffnen.",{"type":283,"tag":284,"props":1382,"children":1383},{},[1384,1386,1391],{"type":293,"value":1385},"Die aktuelle Konfiguration leitet den Datenverkehr nur an unsere ",{"type":283,"tag":317,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":293,"value":776},{"type":293,"value":1392},"-Dienste weiter.\nUm weiterhin die Standard-Konfigurationsmethode nutzen zu können, müssen wir diese wieder aktivieren:",{"type":283,"tag":303,"props":1394,"children":1396},{"code":1395},"--providers.docker.constraints=Label(`com.docker.compose.service`,`app`) || Label(`traefik.enable`, `true`)\n",[1397],{"type":283,"tag":317,"props":1398,"children":1399},{"__ignoreMap":8},[1400],{"type":293,"value":1395},{"type":283,"tag":1252,"props":1402,"children":1404},{"id":1403},"stack-name-weicht-vom-verzeichnisnamen-ab",[1405],{"type":293,"value":1406},"Stack-Name weicht vom Verzeichnisnamen ab",{"type":283,"tag":284,"props":1408,"children":1409},{},[1410,1412,1417],{"type":293,"value":1411},"Beim Deployment der Stacks wird der Name basierend auf dem Verzeichnisnamen generiert, in dem sich die ",{"type":283,"tag":317,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":293,"value":609},{"type":293,"value":1418}," Datei befindet.\nWir können den Namen auf verschiedene Arten ändern, aber hier ist die einfachste:",{"type":283,"tag":303,"props":1420,"children":1424},{"code":1421,"filename":1422,"highlights":1423,"language":313,"meta":8,"className":314,"style":8},"name: whoami # Projektname manuell setzen\nservices:\n  app:\n    image: traefik/whoami\n","whoami-example/docker-compose.yaml",[324],[1425],{"type":283,"tag":317,"props":1426,"children":1427},{"__ignoreMap":8},[1428,1451,1462,1473],{"type":283,"tag":321,"props":1429,"children":1431},{"class":1430,"line":324},[323,387],[1432,1437,1441,1445],{"type":283,"tag":321,"props":1433,"children":1434},{"style":328},[1435],{"type":293,"value":1436},"name",{"type":283,"tag":321,"props":1438,"children":1439},{"style":334},[1440],{"type":293,"value":364},{"type":283,"tag":321,"props":1442,"children":1443},{"style":367},[1444],{"type":293,"value":469},{"type":283,"tag":321,"props":1446,"children":1448},{"style":1447},"--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F",[1449],{"type":293,"value":1450}," # Projektname manuell setzen\n",{"type":283,"tag":321,"props":1452,"children":1453},{"class":323,"line":340},[1454,1458],{"type":283,"tag":321,"props":1455,"children":1456},{"style":328},[1457],{"type":293,"value":331},{"type":283,"tag":321,"props":1459,"children":1460},{"style":334},[1461],{"type":293,"value":337},{"type":283,"tag":321,"props":1463,"children":1464},{"class":323,"line":353},[1465,1469],{"type":283,"tag":321,"props":1466,"children":1467},{"style":328},[1468],{"type":293,"value":816},{"type":283,"tag":321,"props":1470,"children":1471},{"style":334},[1472],{"type":293,"value":337},{"type":283,"tag":321,"props":1474,"children":1475},{"class":323,"line":373},[1476,1480,1484],{"type":283,"tag":321,"props":1477,"children":1478},{"style":328},[1479],{"type":293,"value":359},{"type":283,"tag":321,"props":1481,"children":1482},{"style":334},[1483],{"type":293,"value":364},{"type":283,"tag":321,"props":1485,"children":1486},{"style":367},[1487],{"type":293,"value":370},{"type":283,"tag":1489,"props":1490,"children":1491},"style",{},[1492],{"type":293,"value":1493},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":8,"searchDepth":340,"depth":340,"links":1495},[1496,1497,1500],{"id":534,"depth":340,"text":537},{"id":633,"depth":340,"text":636,"children":1498},[1499],{"id":1254,"depth":353,"text":1257},{"id":1361,"depth":340,"text":1364,"children":1501},[1502,1503],{"id":1372,"depth":353,"text":1375},{"id":1403,"depth":353,"text":1406},{"_path":1505,"_dir":1506,"_draft":7,"_partial":7,"_locale":8,"slug":11,"teams":1507,"primaryTeam":1509,"firstName":1510,"lastName":1511,"prefixTitle":8,"suffixTitle":1512,"education":1513,"role":1518,"workingSince":1523,"inTheCompanySince":1524,"techSkills":1525,"skills":1562,"projects":1579,"contactDetails":1589,"_image":1593,"image":1594,"_id":1595,"_type":1596,"title":1597,"_source":1506,"_file":1598,"_stem":1599,"_extension":1596},"/employees/robert-juzak","employees",[1508,1509],"appDev","devOps","Robert","Juzak","B.Sc.",[1514],[1515,1516,1517],"Bachelor of Computer Science","Technische Universität Breslau","2016",[1519,1520,1521,1522],"softwareDeveloper","fullstackDeveloper","admin","consultant","2015","2018",[1526,1530,1532,1535,1538,1541,1543,1546,1547,1551,1554,1556,1559],{"name":1527,"level":1528,"icon":1529},"Docker","expert","/images/Docker.svg",{"name":1531,"level":1528},"GitLab",{"name":1533,"level":1528,"icon":1534},"Kubernetes","/images/Kubernetes.svg",{"name":1536,"level":1528,"icon":1537},"PHPUnit","/images/PHP-Unit.svg",{"name":1539,"level":1528,"icon":1540},"Portainer","/images/Portainer.svg",{"name":1542,"level":1528},"Sentry",{"name":1544,"level":1528,"icon":1545},"Sonarqube","/images/Sonarqube.svg",{"name":157,"level":1528,"icon":191},{"name":1548,"level":1549,"icon":1550},"CSS","advanced","/images/css.svg",{"name":1552,"level":1549,"icon":1553},"HTML","/images/html.svg",{"name":1555,"level":1549},"PHP",{"name":1557,"level":1549,"icon":1558},"SQL","/images/SQL.svg",{"name":1560,"level":1549,"icon":1561},"VueJS","/images/vuejs.svg",[1563,1565,1567,1568,1570,1572,1574,1575,1577],{"name":1564,"level":1528},"CI/CD",{"name":1566,"level":1528},"qualityAssurance",{"name":1509,"level":1528},{"name":1569,"level":1528},"testDrivenBugfix",{"name":1571,"level":1528},"testDrivenDevelopment",{"name":1573,"level":1549},"accessibility",{"name":235,"level":1549},{"name":1576,"level":1549},"linuxServerAdministration",{"name":1578,"level":1549},"softwareArchitect",[1580,1585,1587],{"project":1581,"position":1582},"Herole",[1583,1584],"Dev-Ops","Frontend Developer",{"project":1586,"position":1584},"Huawei-Calibration-aaS",{"project":1588,"position":1584},"Huawei-Inspect-3D",{"eMail":1590,"phone":1591,"visibility":1592},"robert.juzak@helmundwalter.de","+49 351 799 035 26","1","images/employees/Portraits/robert_juzak.webp","images/employees/Portraits/RobertJuzak_MS.webp","employees:employees:6.robert-juzak.json","json","Robert Juzak","employees/6.robert-juzak.json","employees/6.robert-juzak",{"_path":27,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":28,"description":29,"author":11,"image":12,"releaseDate":30,"blogCategories":1601,"articleTags":1602,"tags":1603,"body":1604,"_type":20,"_id":37,"_source":22,"_file":38,"_stem":39,"_extension":25},[15,16],[16,33,34],[36,19],{"type":280,"children":1605,"toc":3958},[1606,1614,1619,1670,1676,1688,1701,1749,1762,1770,1782,1788,1793,2075,2080,2085,2090,2095,2108,2113,2138,2144,2156,2968,2973,3001,3006,3012,3017,3954],{"type":283,"tag":1607,"props":1608,"children":1613},"img",{"alt":8,"aspect-ratio":1609,"height":1610,"object-fit":1611,"src":1612},"1.78",300,"fill","/blog/shopware-plugin-test.png",[],{"type":283,"tag":284,"props":1615,"children":1616},{},[1617],{"type":293,"value":1618},"Wenn es um das Testen eines Shopware 6 Plugins geht, gibt es zwei Arten von Tests, die durchgeführt werden können:",{"type":283,"tag":613,"props":1620,"children":1621},{},[1622,1658],{"type":283,"tag":461,"props":1623,"children":1624},{},[1625,1627,1633,1635],{"type":293,"value":1626},"Testen des Codes selbst (",{"type":283,"tag":288,"props":1628,"children":1630},{"href":1629},"https://developer.shopware.com/docs/guides/plugins/plugins/testing/",[1631],{"type":293,"value":1632},"mehr in der offiziellen Dokumentation",{"type":293,"value":1634},")\n",{"type":283,"tag":613,"props":1636,"children":1637},{},[1638,1643,1648,1653],{"type":283,"tag":461,"props":1639,"children":1640},{},[1641],{"type":293,"value":1642},"PHP-Unit-Tests",{"type":283,"tag":461,"props":1644,"children":1645},{},[1646],{"type":293,"value":1647},"Jest-Unit-Tests in Shopwares Storefront",{"type":283,"tag":461,"props":1649,"children":1650},{},[1651],{"type":293,"value":1652},"Jest-Unit-Tests in Shopwares Administration",{"type":283,"tag":461,"props":1654,"children":1655},{},[1656],{"type":293,"value":1657},"End-to-End (E2E) Testing",{"type":283,"tag":461,"props":1659,"children":1660},{},[1661,1663,1668],{"type":293,"value":1662},"Sicherstellen einer hohen Code-Qualität (",{"type":283,"tag":288,"props":1664,"children":1666},{"href":1665},"https://developer.shopware.com/docs/products/cli/validation.html",[1667],{"type":293,"value":1632},{"type":293,"value":1669},")",{"type":283,"tag":532,"props":1671,"children":1673},{"id":1672},"code-qualität",[1674],{"type":293,"value":1675},"Code-Qualität",{"type":283,"tag":284,"props":1677,"children":1678},{},[1679,1681,1686],{"type":293,"value":1680},"Fangen wir mit der Code-Qualität an, da es einfacher ist, diese außerhalb einer ",{"type":283,"tag":317,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":293,"value":1564},{"type":293,"value":1687},"-Umgebung auszuführen.",{"type":283,"tag":284,"props":1689,"children":1690},{},[1691,1693,1699],{"type":293,"value":1692},"Wir werden wieder das ",{"type":283,"tag":317,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":293,"value":1698},"shopware-cli",{"type":293,"value":1700}," verwenden.",{"type":283,"tag":303,"props":1702,"children":1706},{"code":1703,"language":1704,"meta":8,"className":1705,"style":8},"shopware-cli extension validate --full --reporter summary .\n","shell","language-shell shiki shiki-themes github-dark github-dark monokai",[1707],{"type":283,"tag":317,"props":1708,"children":1709},{"__ignoreMap":8},[1710],{"type":283,"tag":321,"props":1711,"children":1712},{"class":323,"line":324},[1713,1718,1723,1728,1734,1739,1744],{"type":283,"tag":321,"props":1714,"children":1716},{"style":1715},"--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E",[1717],{"type":293,"value":1698},{"type":283,"tag":321,"props":1719,"children":1720},{"style":367},[1721],{"type":293,"value":1722}," extension",{"type":283,"tag":321,"props":1724,"children":1725},{"style":367},[1726],{"type":293,"value":1727}," validate",{"type":283,"tag":321,"props":1729,"children":1731},{"style":1730},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF",[1732],{"type":293,"value":1733}," --full",{"type":283,"tag":321,"props":1735,"children":1736},{"style":1730},[1737],{"type":293,"value":1738}," --reporter",{"type":283,"tag":321,"props":1740,"children":1741},{"style":367},[1742],{"type":293,"value":1743}," summary",{"type":283,"tag":321,"props":1745,"children":1746},{"style":367},[1747],{"type":293,"value":1748}," .\n",{"type":283,"tag":284,"props":1750,"children":1751},{},[1752,1754,1760],{"type":293,"value":1753},"Dies wird alle Tests ausführen, die ",{"type":283,"tag":288,"props":1755,"children":1757},{"href":1756},"https://developer.shopware.com/docs/products/cli/validation.html#running-all-validation-tools",[1758],{"type":293,"value":1759},"hier",{"type":293,"value":1761}," beschrieben sind,\nund hoffentlich eine Ausgabe wie diese erzeugen:",{"type":283,"tag":303,"props":1763,"children":1765},{"code":1764},"✖ 0 problems (0 errors, 0 warnings)\n",[1766],{"type":283,"tag":317,"props":1767,"children":1768},{"__ignoreMap":8},[1769],{"type":293,"value":1764},{"type":283,"tag":284,"props":1771,"children":1772},{},[1773,1775,1780],{"type":293,"value":1774},"Falls Fehler auftreten, schaue in der Shopware-Dokumentation nach, wie diese zu beheben sind, und führe nur die fehlgeschlagenen Tests erneut aus, wie ",{"type":283,"tag":288,"props":1776,"children":1778},{"href":1777},"https://developer.shopware.com/docs/products/cli/validation.html#running-specific-tools",[1779],{"type":293,"value":1759},{"type":293,"value":1781}," beschrieben.",{"type":283,"tag":1252,"props":1783,"children":1785},{"id":1784},"code-qualität-pipeline",[1786],{"type":293,"value":1787},"Code-Qualität Pipeline",{"type":283,"tag":284,"props":1789,"children":1790},{},[1791],{"type":293,"value":1792},"Nun werden wir das Ganze in GitLab ausführen.",{"type":283,"tag":303,"props":1794,"children":1798},{"code":1795,"filename":1796,"highlights":1797,"language":313,"meta":8,"className":314,"style":8},"stages:\n  - test\n\ncode-quality:\n   image:\n      name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n      entrypoint: [\"\"]\n   stage: test\n   script:\n      - shopware-cli extension validate --full . | tee report.json\n   artifacts:\n      reports:\n         codequality: report.json\n   rules:\n      - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n        when: never\n      - if: $CI_COMMIT_BRANCH\n","\u003Cplugin-root>/.gitlab-ci.yml",[309,1029,1042,1052,1065,1078],[1799],{"type":283,"tag":317,"props":1800,"children":1801},{"__ignoreMap":8},[1802,1814,1827,1834,1846,1858,1876,1899,1915,1927,1939,1951,1963,1980,1993,2015,2036,2054],{"type":283,"tag":321,"props":1803,"children":1804},{"class":323,"line":324},[1805,1810],{"type":283,"tag":321,"props":1806,"children":1807},{"style":328},[1808],{"type":293,"value":1809},"stages",{"type":283,"tag":321,"props":1811,"children":1812},{"style":334},[1813],{"type":293,"value":337},{"type":283,"tag":321,"props":1815,"children":1816},{"class":323,"line":340},[1817,1822],{"type":283,"tag":321,"props":1818,"children":1819},{"style":334},[1820],{"type":293,"value":1821},"  - ",{"type":283,"tag":321,"props":1823,"children":1824},{"style":367},[1825],{"type":293,"value":1826},"test\n",{"type":283,"tag":321,"props":1828,"children":1829},{"class":323,"line":353},[1830],{"type":283,"tag":321,"props":1831,"children":1832},{"emptyLinePlaceholder":1046},[1833],{"type":293,"value":1049},{"type":283,"tag":321,"props":1835,"children":1836},{"class":323,"line":373},[1837,1842],{"type":283,"tag":321,"props":1838,"children":1839},{"style":328},[1840],{"type":293,"value":1841},"code-quality",{"type":283,"tag":321,"props":1843,"children":1844},{"style":334},[1845],{"type":293,"value":337},{"type":283,"tag":321,"props":1847,"children":1848},{"class":323,"line":308},[1849,1854],{"type":283,"tag":321,"props":1850,"children":1851},{"style":328},[1852],{"type":293,"value":1853},"   image",{"type":283,"tag":321,"props":1855,"children":1856},{"style":334},[1857],{"type":293,"value":337},{"type":283,"tag":321,"props":1859,"children":1861},{"class":1860,"line":309},[323,387],[1862,1867,1871],{"type":283,"tag":321,"props":1863,"children":1864},{"style":328},[1865],{"type":293,"value":1866},"      name",{"type":283,"tag":321,"props":1868,"children":1869},{"style":334},[1870],{"type":293,"value":364},{"type":283,"tag":321,"props":1872,"children":1873},{"style":367},[1874],{"type":293,"value":1875},"ghcr.io/shopware/shopware-cli:latest-php-8.2\n",{"type":283,"tag":321,"props":1877,"children":1878},{"class":323,"line":310},[1879,1884,1889,1894],{"type":283,"tag":321,"props":1880,"children":1881},{"style":328},[1882],{"type":293,"value":1883},"      entrypoint",{"type":283,"tag":321,"props":1885,"children":1886},{"style":334},[1887],{"type":293,"value":1888},": [",{"type":283,"tag":321,"props":1890,"children":1891},{"style":367},[1892],{"type":293,"value":1893},"\"\"",{"type":283,"tag":321,"props":1895,"children":1896},{"style":334},[1897],{"type":293,"value":1898},"]\n",{"type":283,"tag":321,"props":1900,"children":1901},{"class":323,"line":311},[1902,1907,1911],{"type":283,"tag":321,"props":1903,"children":1904},{"style":328},[1905],{"type":293,"value":1906},"   stage",{"type":283,"tag":321,"props":1908,"children":1909},{"style":334},[1910],{"type":293,"value":364},{"type":283,"tag":321,"props":1912,"children":1913},{"style":367},[1914],{"type":293,"value":1826},{"type":283,"tag":321,"props":1916,"children":1917},{"class":323,"line":312},[1918,1923],{"type":283,"tag":321,"props":1919,"children":1920},{"style":328},[1921],{"type":293,"value":1922},"   script",{"type":283,"tag":321,"props":1924,"children":1925},{"style":334},[1926],{"type":293,"value":337},{"type":283,"tag":321,"props":1928,"children":1929},{"class":323,"line":977},[1930,1934],{"type":283,"tag":321,"props":1931,"children":1932},{"style":334},[1933],{"type":293,"value":393},{"type":283,"tag":321,"props":1935,"children":1936},{"style":367},[1937],{"type":293,"value":1938},"shopware-cli extension validate --full . | tee report.json\n",{"type":283,"tag":321,"props":1940,"children":1941},{"class":323,"line":990},[1942,1947],{"type":283,"tag":321,"props":1943,"children":1944},{"style":328},[1945],{"type":293,"value":1946},"   artifacts",{"type":283,"tag":321,"props":1948,"children":1949},{"style":334},[1950],{"type":293,"value":337},{"type":283,"tag":321,"props":1952,"children":1953},{"class":323,"line":1003},[1954,1959],{"type":283,"tag":321,"props":1955,"children":1956},{"style":328},[1957],{"type":293,"value":1958},"      reports",{"type":283,"tag":321,"props":1960,"children":1961},{"style":334},[1962],{"type":293,"value":337},{"type":283,"tag":321,"props":1964,"children":1965},{"class":323,"line":1016},[1966,1971,1975],{"type":283,"tag":321,"props":1967,"children":1968},{"style":328},[1969],{"type":293,"value":1970},"         codequality",{"type":283,"tag":321,"props":1972,"children":1973},{"style":334},[1974],{"type":293,"value":364},{"type":283,"tag":321,"props":1976,"children":1977},{"style":367},[1978],{"type":293,"value":1979},"report.json\n",{"type":283,"tag":321,"props":1981,"children":1983},{"class":1982,"line":1029},[323,387],[1984,1989],{"type":283,"tag":321,"props":1985,"children":1986},{"style":328},[1987],{"type":293,"value":1988},"   rules",{"type":283,"tag":321,"props":1990,"children":1991},{"style":334},[1992],{"type":293,"value":337},{"type":283,"tag":321,"props":1994,"children":1996},{"class":1995,"line":1042},[323,387],[1997,2001,2006,2010],{"type":283,"tag":321,"props":1998,"children":1999},{"style":334},[2000],{"type":293,"value":393},{"type":283,"tag":321,"props":2002,"children":2003},{"style":328},[2004],{"type":293,"value":2005},"if",{"type":283,"tag":321,"props":2007,"children":2008},{"style":334},[2009],{"type":293,"value":364},{"type":283,"tag":321,"props":2011,"children":2012},{"style":367},[2013],{"type":293,"value":2014},"$CI_PIPELINE_SOURCE == \"merge_request_event\"\n",{"type":283,"tag":321,"props":2016,"children":2018},{"class":2017,"line":1052},[323,387],[2019,2023,2027,2031],{"type":283,"tag":321,"props":2020,"children":2021},{"style":334},[2022],{"type":293,"value":393},{"type":283,"tag":321,"props":2024,"children":2025},{"style":328},[2026],{"type":293,"value":2005},{"type":283,"tag":321,"props":2028,"children":2029},{"style":334},[2030],{"type":293,"value":364},{"type":283,"tag":321,"props":2032,"children":2033},{"style":367},[2034],{"type":293,"value":2035},"$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n",{"type":283,"tag":321,"props":2037,"children":2039},{"class":2038,"line":1065},[323,387],[2040,2045,2049],{"type":283,"tag":321,"props":2041,"children":2042},{"style":328},[2043],{"type":293,"value":2044},"        when",{"type":283,"tag":321,"props":2046,"children":2047},{"style":334},[2048],{"type":293,"value":364},{"type":283,"tag":321,"props":2050,"children":2051},{"style":367},[2052],{"type":293,"value":2053},"never\n",{"type":283,"tag":321,"props":2055,"children":2057},{"class":2056,"line":1078},[323,387],[2058,2062,2066,2070],{"type":283,"tag":321,"props":2059,"children":2060},{"style":334},[2061],{"type":293,"value":393},{"type":283,"tag":321,"props":2063,"children":2064},{"style":328},[2065],{"type":293,"value":2005},{"type":283,"tag":321,"props":2067,"children":2068},{"style":334},[2069],{"type":293,"value":364},{"type":283,"tag":321,"props":2071,"children":2072},{"style":367},[2073],{"type":293,"value":2074},"$CI_COMMIT_BRANCH\n",{"type":283,"tag":284,"props":2076,"children":2077},{},[2078],{"type":293,"value":2079},"Diese Pipeline wird auf dem Standard-Branch und bei Merge-Request-Pipelines ausgeführt.",{"type":283,"tag":284,"props":2081,"children":2082},{},[2083],{"type":293,"value":2084},"Das Ausführen auf dem Standard-Branch vor dem Bauen und Veröffentlichen verhindert, dass versehentlich ein Release mit geringer Qualität erstellt wird.",{"type":283,"tag":284,"props":2086,"children":2087},{},[2088],{"type":293,"value":2089},"Ein nettes Extra für die MR-Pipeline ist die Integration des Code-Quality-Reports!",{"type":283,"tag":532,"props":2091,"children":2093},{"id":2092},"php-unit-tests",[2094],{"type":293,"value":1642},{"type":283,"tag":284,"props":2096,"children":2097},{},[2098,2100,2106],{"type":293,"value":2099},"Zuerst müssen wir PHPUnit konfigurieren, indem wir der ",{"type":283,"tag":288,"props":2101,"children":2103},{"href":2102},"https://developer.shopware.com/docs/guides/plugins/plugins/testing/php-unit.html",[2104],{"type":293,"value":2105},"offiziellen Shopware-Dokumentation",{"type":293,"value":2107}," folgen.",{"type":283,"tag":284,"props":2109,"children":2110},{},[2111],{"type":293,"value":2112},"Wir werden uns hier nicht auf diesen Prozess konzentrieren. Wenn alles eingerichtet ist, sollten wir in der Lage sein, unseren Test wie folgt im Root-Verzeichnis unseres Shopware-Projekts auszuführen:",{"type":283,"tag":303,"props":2114,"children":2116},{"code":2115,"language":1704,"meta":8,"className":1705,"style":8},"./vendor/bin/phpunit --configuration=\"custom/static-plugins/SwagBasicExample\"\n",[2117],{"type":283,"tag":317,"props":2118,"children":2119},{"__ignoreMap":8},[2120],{"type":283,"tag":321,"props":2121,"children":2122},{"class":323,"line":324},[2123,2128,2133],{"type":283,"tag":321,"props":2124,"children":2125},{"style":1715},[2126],{"type":293,"value":2127},"./vendor/bin/phpunit",{"type":283,"tag":321,"props":2129,"children":2130},{"style":1730},[2131],{"type":293,"value":2132}," --configuration=",{"type":283,"tag":321,"props":2134,"children":2135},{"style":367},[2136],{"type":293,"value":2137},"\"custom/static-plugins/SwagBasicExample\"\n",{"type":283,"tag":1252,"props":2139,"children":2141},{"id":2140},"phpunit-pipeline",[2142],{"type":293,"value":2143},"PHPUnit Pipeline",{"type":283,"tag":284,"props":2145,"children":2146},{},[2147,2149,2154],{"type":293,"value":2148},"Das Ausführen von PHPUnit für ein Plugin erfordert eine vollständige Shopware-Instanz. Glücklicherweise kann uns das ",{"type":283,"tag":317,"props":2150,"children":2152},{"className":2151},[],[2153],{"type":293,"value":1698},{"type":293,"value":2155}," dabei helfen.",{"type":283,"tag":303,"props":2157,"children":2169},{"code":2158,"filename":1796,"highlights":2159,"language":313,"meta":8,"className":314,"style":8},"stages:\n   - test\n\nphpunit:\n  stage: test\n  image:\n    name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n    entrypoint: [\"\"]\n  services:\n    - name: mysql:8.3.0\n      alias: test_database\n      variables:\n        MYSQL_SKIP_TEST_DB: 'yes'\n        MYSQL_ALLOW_EMPTY_PASSWORD: yes\n  variables:\n    GIT_STRATEGY: none\n    SHOPWARE_ROOT: ${CI_PROJECT_DIR}/shopware\n    SHOPWARE_VERSION: 6.6.10.13\n    \n    APP_SECRET: def00000bb5acb32b54ff8ee130270586eec0e878f7337dc7a837acc31d3ff00f93a56b595448b4b29664847dd51991b3314ff65aeeeb761a133b0ec0e070433bff08e48\n    MESSENGER_TRANSPORT_DSN: sync://\n    DATABASE_URL: mysql://root@test_database/shopware\n    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer\n\n    XDEBUG_MODE: coverage\n  before_script:\n    - apk add --no-cache php-8.2-xdebug\n    - shopware-cli project create shopware ${SHOPWARE_VERSION}\n    - cd $SHOPWARE_ROOT\n    - composer req --dev shopware/dev-tools phpunit/phpunit\n    - git clone \"https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git\" \"custom/plugins/${CI_PROJECT_NAME}\"\n    - cd custom/plugins/${CI_PROJECT_NAME}\n    - git checkout ${CI_COMMIT_SHA}\n    - cd ${SHOPWARE_ROOT}\n    - composer require $(composer -d custom/plugins/${CI_PROJECT_NAME} config name)\n    - cd custom/plugins/${CI_PROJECT_NAME}\n  script:\n    - ${SHOPWARE_ROOT}/vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml\n\n  cache:\n    - key: $CI_JOB_NAME\n      paths:\n        - $COMPOSER_CACHE_DIR\n  coverage: /^\\s*Lines:\\s*\\d+.\\d+\\%/\n  artifacts:\n    reports:\n      coverage_report:\n        coverage_format: cobertura\n        path: coverage.cobertura.xml\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n",[312,977,990,1003,1016,1029,1052,1100,1113,1126,1134,1186,1199,2160,2161,2162,2163,2164,2165,2166,2167,2168],29,30,31,32,33,34,35,36,38,[2170],{"type":283,"tag":317,"props":2171,"children":2172},{"__ignoreMap":8},[2173,2184,2196,2203,2215,2231,2243,2259,2279,2292,2314,2332,2345,2363,2381,2393,2411,2428,2445,2452,2470,2488,2506,2524,2531,2548,2560,2573,2586,2599,2612,2625,2638,2651,2664,2677,2689,2702,2715,2723,2736,2758,2771,2785,2803,2816,2829,2842,2860,2878,2891,2911,2931,2948],{"type":283,"tag":321,"props":2174,"children":2175},{"class":323,"line":324},[2176,2180],{"type":283,"tag":321,"props":2177,"children":2178},{"style":328},[2179],{"type":293,"value":1809},{"type":283,"tag":321,"props":2181,"children":2182},{"style":334},[2183],{"type":293,"value":337},{"type":283,"tag":321,"props":2185,"children":2186},{"class":323,"line":340},[2187,2192],{"type":283,"tag":321,"props":2188,"children":2189},{"style":334},[2190],{"type":293,"value":2191},"   - ",{"type":283,"tag":321,"props":2193,"children":2194},{"style":367},[2195],{"type":293,"value":1826},{"type":283,"tag":321,"props":2197,"children":2198},{"class":323,"line":353},[2199],{"type":283,"tag":321,"props":2200,"children":2201},{"emptyLinePlaceholder":1046},[2202],{"type":293,"value":1049},{"type":283,"tag":321,"props":2204,"children":2205},{"class":323,"line":373},[2206,2211],{"type":283,"tag":321,"props":2207,"children":2208},{"style":328},[2209],{"type":293,"value":2210},"phpunit",{"type":283,"tag":321,"props":2212,"children":2213},{"style":334},[2214],{"type":293,"value":337},{"type":283,"tag":321,"props":2216,"children":2217},{"class":323,"line":308},[2218,2223,2227],{"type":283,"tag":321,"props":2219,"children":2220},{"style":328},[2221],{"type":293,"value":2222},"  stage",{"type":283,"tag":321,"props":2224,"children":2225},{"style":334},[2226],{"type":293,"value":364},{"type":283,"tag":321,"props":2228,"children":2229},{"style":367},[2230],{"type":293,"value":1826},{"type":283,"tag":321,"props":2232,"children":2233},{"class":323,"line":309},[2234,2239],{"type":283,"tag":321,"props":2235,"children":2236},{"style":328},[2237],{"type":293,"value":2238},"  image",{"type":283,"tag":321,"props":2240,"children":2241},{"style":334},[2242],{"type":293,"value":337},{"type":283,"tag":321,"props":2244,"children":2245},{"class":323,"line":310},[2246,2251,2255],{"type":283,"tag":321,"props":2247,"children":2248},{"style":328},[2249],{"type":293,"value":2250},"    name",{"type":283,"tag":321,"props":2252,"children":2253},{"style":334},[2254],{"type":293,"value":364},{"type":283,"tag":321,"props":2256,"children":2257},{"style":367},[2258],{"type":293,"value":1875},{"type":283,"tag":321,"props":2260,"children":2261},{"class":323,"line":311},[2262,2267,2271,2275],{"type":283,"tag":321,"props":2263,"children":2264},{"style":328},[2265],{"type":293,"value":2266},"    entrypoint",{"type":283,"tag":321,"props":2268,"children":2269},{"style":334},[2270],{"type":293,"value":1888},{"type":283,"tag":321,"props":2272,"children":2273},{"style":367},[2274],{"type":293,"value":1893},{"type":283,"tag":321,"props":2276,"children":2277},{"style":334},[2278],{"type":293,"value":1898},{"type":283,"tag":321,"props":2280,"children":2282},{"class":2281,"line":312},[323,387],[2283,2288],{"type":283,"tag":321,"props":2284,"children":2285},{"style":328},[2286],{"type":293,"value":2287},"  services",{"type":283,"tag":321,"props":2289,"children":2290},{"style":334},[2291],{"type":293,"value":337},{"type":283,"tag":321,"props":2293,"children":2295},{"class":2294,"line":977},[323,387],[2296,2301,2305,2309],{"type":283,"tag":321,"props":2297,"children":2298},{"style":334},[2299],{"type":293,"value":2300},"    - ",{"type":283,"tag":321,"props":2302,"children":2303},{"style":328},[2304],{"type":293,"value":1436},{"type":283,"tag":321,"props":2306,"children":2307},{"style":334},[2308],{"type":293,"value":364},{"type":283,"tag":321,"props":2310,"children":2311},{"style":367},[2312],{"type":293,"value":2313},"mysql:8.3.0\n",{"type":283,"tag":321,"props":2315,"children":2317},{"class":2316,"line":990},[323,387],[2318,2323,2327],{"type":283,"tag":321,"props":2319,"children":2320},{"style":328},[2321],{"type":293,"value":2322},"      alias",{"type":283,"tag":321,"props":2324,"children":2325},{"style":334},[2326],{"type":293,"value":364},{"type":283,"tag":321,"props":2328,"children":2329},{"style":367},[2330],{"type":293,"value":2331},"test_database\n",{"type":283,"tag":321,"props":2333,"children":2335},{"class":2334,"line":1003},[323,387],[2336,2341],{"type":283,"tag":321,"props":2337,"children":2338},{"style":328},[2339],{"type":293,"value":2340},"      variables",{"type":283,"tag":321,"props":2342,"children":2343},{"style":334},[2344],{"type":293,"value":337},{"type":283,"tag":321,"props":2346,"children":2348},{"class":2347,"line":1016},[323,387],[2349,2354,2358],{"type":283,"tag":321,"props":2350,"children":2351},{"style":328},[2352],{"type":293,"value":2353},"        MYSQL_SKIP_TEST_DB",{"type":283,"tag":321,"props":2355,"children":2356},{"style":334},[2357],{"type":293,"value":364},{"type":283,"tag":321,"props":2359,"children":2360},{"style":367},[2361],{"type":293,"value":2362},"'yes'\n",{"type":283,"tag":321,"props":2364,"children":2366},{"class":2365,"line":1029},[323,387],[2367,2372,2376],{"type":283,"tag":321,"props":2368,"children":2369},{"style":328},[2370],{"type":293,"value":2371},"        MYSQL_ALLOW_EMPTY_PASSWORD",{"type":283,"tag":321,"props":2373,"children":2374},{"style":334},[2375],{"type":293,"value":364},{"type":283,"tag":321,"props":2377,"children":2378},{"style":1730},[2379],{"type":293,"value":2380},"yes\n",{"type":283,"tag":321,"props":2382,"children":2383},{"class":323,"line":1042},[2384,2389],{"type":283,"tag":321,"props":2385,"children":2386},{"style":328},[2387],{"type":293,"value":2388},"  variables",{"type":283,"tag":321,"props":2390,"children":2391},{"style":334},[2392],{"type":293,"value":337},{"type":283,"tag":321,"props":2394,"children":2396},{"class":2395,"line":1052},[323,387],[2397,2402,2406],{"type":283,"tag":321,"props":2398,"children":2399},{"style":328},[2400],{"type":293,"value":2401},"    GIT_STRATEGY",{"type":283,"tag":321,"props":2403,"children":2404},{"style":334},[2405],{"type":293,"value":364},{"type":283,"tag":321,"props":2407,"children":2408},{"style":367},[2409],{"type":293,"value":2410},"none\n",{"type":283,"tag":321,"props":2412,"children":2413},{"class":323,"line":1065},[2414,2419,2423],{"type":283,"tag":321,"props":2415,"children":2416},{"style":328},[2417],{"type":293,"value":2418},"    SHOPWARE_ROOT",{"type":283,"tag":321,"props":2420,"children":2421},{"style":334},[2422],{"type":293,"value":364},{"type":283,"tag":321,"props":2424,"children":2425},{"style":367},[2426],{"type":293,"value":2427},"${CI_PROJECT_DIR}/shopware\n",{"type":283,"tag":321,"props":2429,"children":2430},{"class":323,"line":1078},[2431,2436,2440],{"type":283,"tag":321,"props":2432,"children":2433},{"style":328},[2434],{"type":293,"value":2435},"    SHOPWARE_VERSION",{"type":283,"tag":321,"props":2437,"children":2438},{"style":334},[2439],{"type":293,"value":364},{"type":283,"tag":321,"props":2441,"children":2442},{"style":1730},[2443],{"type":293,"value":2444},"6.6.10.13\n",{"type":283,"tag":321,"props":2446,"children":2447},{"class":323,"line":1087},[2448],{"type":283,"tag":321,"props":2449,"children":2450},{"style":334},[2451],{"type":293,"value":884},{"type":283,"tag":321,"props":2453,"children":2455},{"class":2454,"line":1100},[323,387],[2456,2461,2465],{"type":283,"tag":321,"props":2457,"children":2458},{"style":328},[2459],{"type":293,"value":2460},"    APP_SECRET",{"type":283,"tag":321,"props":2462,"children":2463},{"style":334},[2464],{"type":293,"value":364},{"type":283,"tag":321,"props":2466,"children":2467},{"style":367},[2468],{"type":293,"value":2469},"def00000bb5acb32b54ff8ee130270586eec0e878f7337dc7a837acc31d3ff00f93a56b595448b4b29664847dd51991b3314ff65aeeeb761a133b0ec0e070433bff08e48\n",{"type":283,"tag":321,"props":2471,"children":2473},{"class":2472,"line":1113},[323,387],[2474,2479,2483],{"type":283,"tag":321,"props":2475,"children":2476},{"style":328},[2477],{"type":293,"value":2478},"    MESSENGER_TRANSPORT_DSN",{"type":283,"tag":321,"props":2480,"children":2481},{"style":334},[2482],{"type":293,"value":364},{"type":283,"tag":321,"props":2484,"children":2485},{"style":367},[2486],{"type":293,"value":2487},"sync://\n",{"type":283,"tag":321,"props":2489,"children":2491},{"class":2490,"line":1126},[323,387],[2492,2497,2501],{"type":283,"tag":321,"props":2493,"children":2494},{"style":328},[2495],{"type":293,"value":2496},"    DATABASE_URL",{"type":283,"tag":321,"props":2498,"children":2499},{"style":334},[2500],{"type":293,"value":364},{"type":283,"tag":321,"props":2502,"children":2503},{"style":367},[2504],{"type":293,"value":2505},"mysql://root@test_database/shopware\n",{"type":283,"tag":321,"props":2507,"children":2509},{"class":2508,"line":1134},[323,387],[2510,2515,2519],{"type":283,"tag":321,"props":2511,"children":2512},{"style":328},[2513],{"type":293,"value":2514},"    COMPOSER_CACHE_DIR",{"type":283,"tag":321,"props":2516,"children":2517},{"style":334},[2518],{"type":293,"value":364},{"type":283,"tag":321,"props":2520,"children":2521},{"style":367},[2522],{"type":293,"value":2523},"${CI_PROJECT_DIR}/.composer\n",{"type":283,"tag":321,"props":2525,"children":2526},{"class":323,"line":1147},[2527],{"type":283,"tag":321,"props":2528,"children":2529},{"emptyLinePlaceholder":1046},[2530],{"type":293,"value":1049},{"type":283,"tag":321,"props":2532,"children":2533},{"class":323,"line":1160},[2534,2539,2543],{"type":283,"tag":321,"props":2535,"children":2536},{"style":328},[2537],{"type":293,"value":2538},"    XDEBUG_MODE",{"type":283,"tag":321,"props":2540,"children":2541},{"style":334},[2542],{"type":293,"value":364},{"type":283,"tag":321,"props":2544,"children":2545},{"style":367},[2546],{"type":293,"value":2547},"coverage\n",{"type":283,"tag":321,"props":2549,"children":2550},{"class":323,"line":1173},[2551,2556],{"type":283,"tag":321,"props":2552,"children":2553},{"style":328},[2554],{"type":293,"value":2555},"  before_script",{"type":283,"tag":321,"props":2557,"children":2558},{"style":334},[2559],{"type":293,"value":337},{"type":283,"tag":321,"props":2561,"children":2563},{"class":2562,"line":1186},[323,387],[2564,2568],{"type":283,"tag":321,"props":2565,"children":2566},{"style":334},[2567],{"type":293,"value":2300},{"type":283,"tag":321,"props":2569,"children":2570},{"style":367},[2571],{"type":293,"value":2572},"apk add --no-cache php-8.2-xdebug\n",{"type":283,"tag":321,"props":2574,"children":2576},{"class":2575,"line":1199},[323,387],[2577,2581],{"type":283,"tag":321,"props":2578,"children":2579},{"style":334},[2580],{"type":293,"value":2300},{"type":283,"tag":321,"props":2582,"children":2583},{"style":367},[2584],{"type":293,"value":2585},"shopware-cli project create shopware ${SHOPWARE_VERSION}\n",{"type":283,"tag":321,"props":2587,"children":2589},{"class":2588,"line":2160},[323,387],[2590,2594],{"type":283,"tag":321,"props":2591,"children":2592},{"style":334},[2593],{"type":293,"value":2300},{"type":283,"tag":321,"props":2595,"children":2596},{"style":367},[2597],{"type":293,"value":2598},"cd $SHOPWARE_ROOT\n",{"type":283,"tag":321,"props":2600,"children":2602},{"class":2601,"line":2161},[323,387],[2603,2607],{"type":283,"tag":321,"props":2604,"children":2605},{"style":334},[2606],{"type":293,"value":2300},{"type":283,"tag":321,"props":2608,"children":2609},{"style":367},[2610],{"type":293,"value":2611},"composer req --dev shopware/dev-tools phpunit/phpunit\n",{"type":283,"tag":321,"props":2613,"children":2615},{"class":2614,"line":2162},[323,387],[2616,2620],{"type":283,"tag":321,"props":2617,"children":2618},{"style":334},[2619],{"type":293,"value":2300},{"type":283,"tag":321,"props":2621,"children":2622},{"style":367},[2623],{"type":293,"value":2624},"git clone \"https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git\" \"custom/plugins/${CI_PROJECT_NAME}\"\n",{"type":283,"tag":321,"props":2626,"children":2628},{"class":2627,"line":2163},[323,387],[2629,2633],{"type":283,"tag":321,"props":2630,"children":2631},{"style":334},[2632],{"type":293,"value":2300},{"type":283,"tag":321,"props":2634,"children":2635},{"style":367},[2636],{"type":293,"value":2637},"cd custom/plugins/${CI_PROJECT_NAME}\n",{"type":283,"tag":321,"props":2639,"children":2641},{"class":2640,"line":2164},[323,387],[2642,2646],{"type":283,"tag":321,"props":2643,"children":2644},{"style":334},[2645],{"type":293,"value":2300},{"type":283,"tag":321,"props":2647,"children":2648},{"style":367},[2649],{"type":293,"value":2650},"git checkout ${CI_COMMIT_SHA}\n",{"type":283,"tag":321,"props":2652,"children":2654},{"class":2653,"line":2165},[323,387],[2655,2659],{"type":283,"tag":321,"props":2656,"children":2657},{"style":334},[2658],{"type":293,"value":2300},{"type":283,"tag":321,"props":2660,"children":2661},{"style":367},[2662],{"type":293,"value":2663},"cd ${SHOPWARE_ROOT}\n",{"type":283,"tag":321,"props":2665,"children":2667},{"class":2666,"line":2166},[323,387],[2668,2672],{"type":283,"tag":321,"props":2669,"children":2670},{"style":334},[2671],{"type":293,"value":2300},{"type":283,"tag":321,"props":2673,"children":2674},{"style":367},[2675],{"type":293,"value":2676},"composer require $(composer -d custom/plugins/${CI_PROJECT_NAME} config name)\n",{"type":283,"tag":321,"props":2678,"children":2680},{"class":2679,"line":2167},[323,387],[2681,2685],{"type":283,"tag":321,"props":2682,"children":2683},{"style":334},[2684],{"type":293,"value":2300},{"type":283,"tag":321,"props":2686,"children":2687},{"style":367},[2688],{"type":293,"value":2637},{"type":283,"tag":321,"props":2690,"children":2692},{"class":323,"line":2691},37,[2693,2698],{"type":283,"tag":321,"props":2694,"children":2695},{"style":328},[2696],{"type":293,"value":2697},"  script",{"type":283,"tag":321,"props":2699,"children":2700},{"style":334},[2701],{"type":293,"value":337},{"type":283,"tag":321,"props":2703,"children":2705},{"class":2704,"line":2168},[323,387],[2706,2710],{"type":283,"tag":321,"props":2707,"children":2708},{"style":334},[2709],{"type":293,"value":2300},{"type":283,"tag":321,"props":2711,"children":2712},{"style":367},[2713],{"type":293,"value":2714},"${SHOPWARE_ROOT}/vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml\n",{"type":283,"tag":321,"props":2716,"children":2718},{"class":323,"line":2717},39,[2719],{"type":283,"tag":321,"props":2720,"children":2721},{"emptyLinePlaceholder":1046},[2722],{"type":293,"value":1049},{"type":283,"tag":321,"props":2724,"children":2726},{"class":323,"line":2725},40,[2727,2732],{"type":283,"tag":321,"props":2728,"children":2729},{"style":328},[2730],{"type":293,"value":2731},"  cache",{"type":283,"tag":321,"props":2733,"children":2734},{"style":334},[2735],{"type":293,"value":337},{"type":283,"tag":321,"props":2737,"children":2739},{"class":323,"line":2738},41,[2740,2744,2749,2753],{"type":283,"tag":321,"props":2741,"children":2742},{"style":334},[2743],{"type":293,"value":2300},{"type":283,"tag":321,"props":2745,"children":2746},{"style":328},[2747],{"type":293,"value":2748},"key",{"type":283,"tag":321,"props":2750,"children":2751},{"style":334},[2752],{"type":293,"value":364},{"type":283,"tag":321,"props":2754,"children":2755},{"style":367},[2756],{"type":293,"value":2757},"$CI_JOB_NAME\n",{"type":283,"tag":321,"props":2759,"children":2761},{"class":323,"line":2760},42,[2762,2767],{"type":283,"tag":321,"props":2763,"children":2764},{"style":328},[2765],{"type":293,"value":2766},"      paths",{"type":283,"tag":321,"props":2768,"children":2769},{"style":334},[2770],{"type":293,"value":337},{"type":283,"tag":321,"props":2772,"children":2774},{"class":323,"line":2773},43,[2775,2780],{"type":283,"tag":321,"props":2776,"children":2777},{"style":334},[2778],{"type":293,"value":2779},"        - ",{"type":283,"tag":321,"props":2781,"children":2782},{"style":367},[2783],{"type":293,"value":2784},"$COMPOSER_CACHE_DIR\n",{"type":283,"tag":321,"props":2786,"children":2788},{"class":323,"line":2787},44,[2789,2794,2798],{"type":283,"tag":321,"props":2790,"children":2791},{"style":328},[2792],{"type":293,"value":2793},"  coverage",{"type":283,"tag":321,"props":2795,"children":2796},{"style":334},[2797],{"type":293,"value":364},{"type":283,"tag":321,"props":2799,"children":2800},{"style":367},[2801],{"type":293,"value":2802},"/^\\s*Lines:\\s*\\d+.\\d+\\%/\n",{"type":283,"tag":321,"props":2804,"children":2806},{"class":323,"line":2805},45,[2807,2812],{"type":283,"tag":321,"props":2808,"children":2809},{"style":328},[2810],{"type":293,"value":2811},"  artifacts",{"type":283,"tag":321,"props":2813,"children":2814},{"style":334},[2815],{"type":293,"value":337},{"type":283,"tag":321,"props":2817,"children":2819},{"class":323,"line":2818},46,[2820,2825],{"type":283,"tag":321,"props":2821,"children":2822},{"style":328},[2823],{"type":293,"value":2824},"    reports",{"type":283,"tag":321,"props":2826,"children":2827},{"style":334},[2828],{"type":293,"value":337},{"type":283,"tag":321,"props":2830,"children":2832},{"class":323,"line":2831},47,[2833,2838],{"type":283,"tag":321,"props":2834,"children":2835},{"style":328},[2836],{"type":293,"value":2837},"      coverage_report",{"type":283,"tag":321,"props":2839,"children":2840},{"style":334},[2841],{"type":293,"value":337},{"type":283,"tag":321,"props":2843,"children":2845},{"class":323,"line":2844},48,[2846,2851,2855],{"type":283,"tag":321,"props":2847,"children":2848},{"style":328},[2849],{"type":293,"value":2850},"        coverage_format",{"type":283,"tag":321,"props":2852,"children":2853},{"style":334},[2854],{"type":293,"value":364},{"type":283,"tag":321,"props":2856,"children":2857},{"style":367},[2858],{"type":293,"value":2859},"cobertura\n",{"type":283,"tag":321,"props":2861,"children":2863},{"class":323,"line":2862},49,[2864,2869,2873],{"type":283,"tag":321,"props":2865,"children":2866},{"style":328},[2867],{"type":293,"value":2868},"        path",{"type":283,"tag":321,"props":2870,"children":2871},{"style":334},[2872],{"type":293,"value":364},{"type":283,"tag":321,"props":2874,"children":2875},{"style":367},[2876],{"type":293,"value":2877},"coverage.cobertura.xml\n",{"type":283,"tag":321,"props":2879,"children":2881},{"class":323,"line":2880},50,[2882,2887],{"type":283,"tag":321,"props":2883,"children":2884},{"style":328},[2885],{"type":293,"value":2886},"  rules",{"type":283,"tag":321,"props":2888,"children":2889},{"style":334},[2890],{"type":293,"value":337},{"type":283,"tag":321,"props":2892,"children":2894},{"class":323,"line":2893},51,[2895,2899,2903,2907],{"type":283,"tag":321,"props":2896,"children":2897},{"style":334},[2898],{"type":293,"value":2300},{"type":283,"tag":321,"props":2900,"children":2901},{"style":328},[2902],{"type":293,"value":2005},{"type":283,"tag":321,"props":2904,"children":2905},{"style":334},[2906],{"type":293,"value":364},{"type":283,"tag":321,"props":2908,"children":2909},{"style":367},[2910],{"type":293,"value":2014},{"type":283,"tag":321,"props":2912,"children":2914},{"class":323,"line":2913},52,[2915,2919,2923,2927],{"type":283,"tag":321,"props":2916,"children":2917},{"style":334},[2918],{"type":293,"value":2300},{"type":283,"tag":321,"props":2920,"children":2921},{"style":328},[2922],{"type":293,"value":2005},{"type":283,"tag":321,"props":2924,"children":2925},{"style":334},[2926],{"type":293,"value":364},{"type":283,"tag":321,"props":2928,"children":2929},{"style":367},[2930],{"type":293,"value":2035},{"type":283,"tag":321,"props":2932,"children":2934},{"class":323,"line":2933},53,[2935,2940,2944],{"type":283,"tag":321,"props":2936,"children":2937},{"style":328},[2938],{"type":293,"value":2939},"      when",{"type":283,"tag":321,"props":2941,"children":2942},{"style":334},[2943],{"type":293,"value":364},{"type":283,"tag":321,"props":2945,"children":2946},{"style":367},[2947],{"type":293,"value":2053},{"type":283,"tag":321,"props":2949,"children":2951},{"class":323,"line":2950},54,[2952,2956,2960,2964],{"type":283,"tag":321,"props":2953,"children":2954},{"style":334},[2955],{"type":293,"value":2300},{"type":283,"tag":321,"props":2957,"children":2958},{"style":328},[2959],{"type":293,"value":2005},{"type":283,"tag":321,"props":2961,"children":2962},{"style":334},[2963],{"type":293,"value":364},{"type":283,"tag":321,"props":2965,"children":2966},{"style":367},[2967],{"type":293,"value":2074},{"type":283,"tag":284,"props":2969,"children":2970},{},[2971],{"type":293,"value":2972},"Lass uns das ein wenig erklären:",{"type":283,"tag":613,"props":2974,"children":2975},{},[2976,2981,2986,2991,2996],{"type":283,"tag":461,"props":2977,"children":2978},{},[2979],{"type":293,"value":2980},"Wir deaktivieren das automatische Klonen des Repositories (16)",{"type":283,"tag":461,"props":2982,"children":2983},{},[2984],{"type":293,"value":2985},"Wir binden einen Datenbank-Service ein (9-14)",{"type":283,"tag":461,"props":2987,"children":2988},{},[2989],{"type":293,"value":2990},"Wir setzen einige erforderliche Shopware-Umgebungsvariablen (20-23)",{"type":283,"tag":461,"props":2992,"children":2993},{},[2994],{"type":293,"value":2995},"Erstellen ein leeres Shopware-Projekt mit PHPUnit und Xdebug (27-36)",{"type":283,"tag":461,"props":2997,"children":2998},{},[2999],{"type":293,"value":3000},"Führen PHPUnit mit Code-Coverage-Generierung als Text und im Cobertura-Format aus (38)",{"type":283,"tag":284,"props":3002,"children":3003},{},[3004],{"type":293,"value":3005},"Wie die Code-Quality-Pipeline nutzt auch diese die Vorteile des GitLab-Coverage-Reportings voll aus.",{"type":283,"tag":532,"props":3007,"children":3009},{"id":3008},"alles-zusammenfügen",[3010],{"type":293,"value":3011},"Alles zusammenfügen",{"type":283,"tag":284,"props":3013,"children":3014},{},[3015],{"type":293,"value":3016},"Für diesen Teil lassen wir den Build- und Release-Teil weg.",{"type":283,"tag":303,"props":3018,"children":3020},{"code":3019,"filename":1796,"language":313,"meta":8,"className":314,"style":8},"stages:\n   - test\n\nphpunit:\n  stage: test\n  image:\n    name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n    entrypoint: [\"\"]\n  services:\n    - name: mysql:8.3.0\n      alias: test_database\n      variables:\n        MYSQL_SKIP_TEST_DB: 'yes'\n        MYSQL_ALLOW_EMPTY_PASSWORD: yes\n  variables:\n    GIT_STRATEGY: none\n    SHOPWARE_ROOT: ${CI_PROJECT_DIR}/shopware\n    SHOPWARE_VERSION: 6.6.10.13\n    \n    APP_SECRET: def00000bb5acb32b54ff8ee130270586eec0e878f7337dc7a837acc31d3ff00f93a56b595448b4b29664847dd51991b3314ff65aeeeb761a133b0ec0e070433bff08e48\n    MESSENGER_TRANSPORT_DSN: sync://\n    DATABASE_URL: mysql://root@test_database/shopware\n    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer\n\n    XDEBUG_MODE: coverage\n  before_script:\n    - apk add --no-cache php-8.2-xdebug\n    - shopware-cli project create shopware ${SHOPWARE_VERSION}\n    - cd $SHOPWARE_ROOT\n    - composer req --dev shopware/dev-tools phpunit/phpunit\n    - git clone \"https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git\" \"custom/plugins/${CI_PROJECT_NAME}\"\n    - cd custom/plugins/${CI_PROJECT_NAME}\n    - git checkout ${CI_COMMIT_SHA}\n    - cd ${SHOPWARE_ROOT}\n    - composer require $(composer -d custom/plugins/${CI_PROJECT_NAME} config name)\n    - cd custom/plugins/${CI_PROJECT_NAME}\n  script:\n    - ${SHOPWARE_ROOT}/vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml\n\n  cache:\n    - key: $CI_JOB_NAME\n      paths:\n        - $COMPOSER_CACHE_DIR\n  coverage: /^\\s*Lines:\\s*\\d+.\\d+\\%/\n  artifacts:\n    reports:\n      coverage_report:\n        coverage_format: cobertura\n        path: coverage.cobertura.xml\n  rules:\n    - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n\ncode-quality:\n   image:\n      name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n      entrypoint: [\"\"]\n   stage: test\n   script:\n      - shopware-cli extension validate --full . | tee report.json\n   artifacts:\n      reports:\n         codequality: report.json\n   rules:\n      - if: $CI_PIPELINE_SOURCE == \"merge_request_event\"\n      - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n        when: never\n      - if: $CI_COMMIT_BRANCH\n",[3021],{"type":283,"tag":317,"props":3022,"children":3023},{"__ignoreMap":8},[3024,3035,3046,3053,3064,3079,3090,3105,3124,3135,3154,3169,3180,3195,3210,3221,3236,3251,3266,3273,3288,3303,3318,3333,3340,3355,3366,3377,3388,3399,3410,3421,3432,3443,3454,3465,3476,3487,3498,3505,3516,3535,3546,3557,3572,3583,3594,3605,3620,3635,3646,3665,3684,3699,3718,3726,3738,3750,3766,3786,3802,3814,3826,3838,3850,3866,3878,3898,3918,3934],{"type":283,"tag":321,"props":3025,"children":3026},{"class":323,"line":324},[3027,3031],{"type":283,"tag":321,"props":3028,"children":3029},{"style":328},[3030],{"type":293,"value":1809},{"type":283,"tag":321,"props":3032,"children":3033},{"style":334},[3034],{"type":293,"value":337},{"type":283,"tag":321,"props":3036,"children":3037},{"class":323,"line":340},[3038,3042],{"type":283,"tag":321,"props":3039,"children":3040},{"style":334},[3041],{"type":293,"value":2191},{"type":283,"tag":321,"props":3043,"children":3044},{"style":367},[3045],{"type":293,"value":1826},{"type":283,"tag":321,"props":3047,"children":3048},{"class":323,"line":353},[3049],{"type":283,"tag":321,"props":3050,"children":3051},{"emptyLinePlaceholder":1046},[3052],{"type":293,"value":1049},{"type":283,"tag":321,"props":3054,"children":3055},{"class":323,"line":373},[3056,3060],{"type":283,"tag":321,"props":3057,"children":3058},{"style":328},[3059],{"type":293,"value":2210},{"type":283,"tag":321,"props":3061,"children":3062},{"style":334},[3063],{"type":293,"value":337},{"type":283,"tag":321,"props":3065,"children":3066},{"class":323,"line":308},[3067,3071,3075],{"type":283,"tag":321,"props":3068,"children":3069},{"style":328},[3070],{"type":293,"value":2222},{"type":283,"tag":321,"props":3072,"children":3073},{"style":334},[3074],{"type":293,"value":364},{"type":283,"tag":321,"props":3076,"children":3077},{"style":367},[3078],{"type":293,"value":1826},{"type":283,"tag":321,"props":3080,"children":3081},{"class":323,"line":309},[3082,3086],{"type":283,"tag":321,"props":3083,"children":3084},{"style":328},[3085],{"type":293,"value":2238},{"type":283,"tag":321,"props":3087,"children":3088},{"style":334},[3089],{"type":293,"value":337},{"type":283,"tag":321,"props":3091,"children":3092},{"class":323,"line":310},[3093,3097,3101],{"type":283,"tag":321,"props":3094,"children":3095},{"style":328},[3096],{"type":293,"value":2250},{"type":283,"tag":321,"props":3098,"children":3099},{"style":334},[3100],{"type":293,"value":364},{"type":283,"tag":321,"props":3102,"children":3103},{"style":367},[3104],{"type":293,"value":1875},{"type":283,"tag":321,"props":3106,"children":3107},{"class":323,"line":311},[3108,3112,3116,3120],{"type":283,"tag":321,"props":3109,"children":3110},{"style":328},[3111],{"type":293,"value":2266},{"type":283,"tag":321,"props":3113,"children":3114},{"style":334},[3115],{"type":293,"value":1888},{"type":283,"tag":321,"props":3117,"children":3118},{"style":367},[3119],{"type":293,"value":1893},{"type":283,"tag":321,"props":3121,"children":3122},{"style":334},[3123],{"type":293,"value":1898},{"type":283,"tag":321,"props":3125,"children":3126},{"class":323,"line":312},[3127,3131],{"type":283,"tag":321,"props":3128,"children":3129},{"style":328},[3130],{"type":293,"value":2287},{"type":283,"tag":321,"props":3132,"children":3133},{"style":334},[3134],{"type":293,"value":337},{"type":283,"tag":321,"props":3136,"children":3137},{"class":323,"line":977},[3138,3142,3146,3150],{"type":283,"tag":321,"props":3139,"children":3140},{"style":334},[3141],{"type":293,"value":2300},{"type":283,"tag":321,"props":3143,"children":3144},{"style":328},[3145],{"type":293,"value":1436},{"type":283,"tag":321,"props":3147,"children":3148},{"style":334},[3149],{"type":293,"value":364},{"type":283,"tag":321,"props":3151,"children":3152},{"style":367},[3153],{"type":293,"value":2313},{"type":283,"tag":321,"props":3155,"children":3156},{"class":323,"line":990},[3157,3161,3165],{"type":283,"tag":321,"props":3158,"children":3159},{"style":328},[3160],{"type":293,"value":2322},{"type":283,"tag":321,"props":3162,"children":3163},{"style":334},[3164],{"type":293,"value":364},{"type":283,"tag":321,"props":3166,"children":3167},{"style":367},[3168],{"type":293,"value":2331},{"type":283,"tag":321,"props":3170,"children":3171},{"class":323,"line":1003},[3172,3176],{"type":283,"tag":321,"props":3173,"children":3174},{"style":328},[3175],{"type":293,"value":2340},{"type":283,"tag":321,"props":3177,"children":3178},{"style":334},[3179],{"type":293,"value":337},{"type":283,"tag":321,"props":3181,"children":3182},{"class":323,"line":1016},[3183,3187,3191],{"type":283,"tag":321,"props":3184,"children":3185},{"style":328},[3186],{"type":293,"value":2353},{"type":283,"tag":321,"props":3188,"children":3189},{"style":334},[3190],{"type":293,"value":364},{"type":283,"tag":321,"props":3192,"children":3193},{"style":367},[3194],{"type":293,"value":2362},{"type":283,"tag":321,"props":3196,"children":3197},{"class":323,"line":1029},[3198,3202,3206],{"type":283,"tag":321,"props":3199,"children":3200},{"style":328},[3201],{"type":293,"value":2371},{"type":283,"tag":321,"props":3203,"children":3204},{"style":334},[3205],{"type":293,"value":364},{"type":283,"tag":321,"props":3207,"children":3208},{"style":1730},[3209],{"type":293,"value":2380},{"type":283,"tag":321,"props":3211,"children":3212},{"class":323,"line":1042},[3213,3217],{"type":283,"tag":321,"props":3214,"children":3215},{"style":328},[3216],{"type":293,"value":2388},{"type":283,"tag":321,"props":3218,"children":3219},{"style":334},[3220],{"type":293,"value":337},{"type":283,"tag":321,"props":3222,"children":3223},{"class":323,"line":1052},[3224,3228,3232],{"type":283,"tag":321,"props":3225,"children":3226},{"style":328},[3227],{"type":293,"value":2401},{"type":283,"tag":321,"props":3229,"children":3230},{"style":334},[3231],{"type":293,"value":364},{"type":283,"tag":321,"props":3233,"children":3234},{"style":367},[3235],{"type":293,"value":2410},{"type":283,"tag":321,"props":3237,"children":3238},{"class":323,"line":1065},[3239,3243,3247],{"type":283,"tag":321,"props":3240,"children":3241},{"style":328},[3242],{"type":293,"value":2418},{"type":283,"tag":321,"props":3244,"children":3245},{"style":334},[3246],{"type":293,"value":364},{"type":283,"tag":321,"props":3248,"children":3249},{"style":367},[3250],{"type":293,"value":2427},{"type":283,"tag":321,"props":3252,"children":3253},{"class":323,"line":1078},[3254,3258,3262],{"type":283,"tag":321,"props":3255,"children":3256},{"style":328},[3257],{"type":293,"value":2435},{"type":283,"tag":321,"props":3259,"children":3260},{"style":334},[3261],{"type":293,"value":364},{"type":283,"tag":321,"props":3263,"children":3264},{"style":1730},[3265],{"type":293,"value":2444},{"type":283,"tag":321,"props":3267,"children":3268},{"class":323,"line":1087},[3269],{"type":283,"tag":321,"props":3270,"children":3271},{"style":334},[3272],{"type":293,"value":884},{"type":283,"tag":321,"props":3274,"children":3275},{"class":323,"line":1100},[3276,3280,3284],{"type":283,"tag":321,"props":3277,"children":3278},{"style":328},[3279],{"type":293,"value":2460},{"type":283,"tag":321,"props":3281,"children":3282},{"style":334},[3283],{"type":293,"value":364},{"type":283,"tag":321,"props":3285,"children":3286},{"style":367},[3287],{"type":293,"value":2469},{"type":283,"tag":321,"props":3289,"children":3290},{"class":323,"line":1113},[3291,3295,3299],{"type":283,"tag":321,"props":3292,"children":3293},{"style":328},[3294],{"type":293,"value":2478},{"type":283,"tag":321,"props":3296,"children":3297},{"style":334},[3298],{"type":293,"value":364},{"type":283,"tag":321,"props":3300,"children":3301},{"style":367},[3302],{"type":293,"value":2487},{"type":283,"tag":321,"props":3304,"children":3305},{"class":323,"line":1126},[3306,3310,3314],{"type":283,"tag":321,"props":3307,"children":3308},{"style":328},[3309],{"type":293,"value":2496},{"type":283,"tag":321,"props":3311,"children":3312},{"style":334},[3313],{"type":293,"value":364},{"type":283,"tag":321,"props":3315,"children":3316},{"style":367},[3317],{"type":293,"value":2505},{"type":283,"tag":321,"props":3319,"children":3320},{"class":323,"line":1134},[3321,3325,3329],{"type":283,"tag":321,"props":3322,"children":3323},{"style":328},[3324],{"type":293,"value":2514},{"type":283,"tag":321,"props":3326,"children":3327},{"style":334},[3328],{"type":293,"value":364},{"type":283,"tag":321,"props":3330,"children":3331},{"style":367},[3332],{"type":293,"value":2523},{"type":283,"tag":321,"props":3334,"children":3335},{"class":323,"line":1147},[3336],{"type":283,"tag":321,"props":3337,"children":3338},{"emptyLinePlaceholder":1046},[3339],{"type":293,"value":1049},{"type":283,"tag":321,"props":3341,"children":3342},{"class":323,"line":1160},[3343,3347,3351],{"type":283,"tag":321,"props":3344,"children":3345},{"style":328},[3346],{"type":293,"value":2538},{"type":283,"tag":321,"props":3348,"children":3349},{"style":334},[3350],{"type":293,"value":364},{"type":283,"tag":321,"props":3352,"children":3353},{"style":367},[3354],{"type":293,"value":2547},{"type":283,"tag":321,"props":3356,"children":3357},{"class":323,"line":1173},[3358,3362],{"type":283,"tag":321,"props":3359,"children":3360},{"style":328},[3361],{"type":293,"value":2555},{"type":283,"tag":321,"props":3363,"children":3364},{"style":334},[3365],{"type":293,"value":337},{"type":283,"tag":321,"props":3367,"children":3368},{"class":323,"line":1186},[3369,3373],{"type":283,"tag":321,"props":3370,"children":3371},{"style":334},[3372],{"type":293,"value":2300},{"type":283,"tag":321,"props":3374,"children":3375},{"style":367},[3376],{"type":293,"value":2572},{"type":283,"tag":321,"props":3378,"children":3379},{"class":323,"line":1199},[3380,3384],{"type":283,"tag":321,"props":3381,"children":3382},{"style":334},[3383],{"type":293,"value":2300},{"type":283,"tag":321,"props":3385,"children":3386},{"style":367},[3387],{"type":293,"value":2585},{"type":283,"tag":321,"props":3389,"children":3390},{"class":323,"line":2160},[3391,3395],{"type":283,"tag":321,"props":3392,"children":3393},{"style":334},[3394],{"type":293,"value":2300},{"type":283,"tag":321,"props":3396,"children":3397},{"style":367},[3398],{"type":293,"value":2598},{"type":283,"tag":321,"props":3400,"children":3401},{"class":323,"line":2161},[3402,3406],{"type":283,"tag":321,"props":3403,"children":3404},{"style":334},[3405],{"type":293,"value":2300},{"type":283,"tag":321,"props":3407,"children":3408},{"style":367},[3409],{"type":293,"value":2611},{"type":283,"tag":321,"props":3411,"children":3412},{"class":323,"line":2162},[3413,3417],{"type":283,"tag":321,"props":3414,"children":3415},{"style":334},[3416],{"type":293,"value":2300},{"type":283,"tag":321,"props":3418,"children":3419},{"style":367},[3420],{"type":293,"value":2624},{"type":283,"tag":321,"props":3422,"children":3423},{"class":323,"line":2163},[3424,3428],{"type":283,"tag":321,"props":3425,"children":3426},{"style":334},[3427],{"type":293,"value":2300},{"type":283,"tag":321,"props":3429,"children":3430},{"style":367},[3431],{"type":293,"value":2637},{"type":283,"tag":321,"props":3433,"children":3434},{"class":323,"line":2164},[3435,3439],{"type":283,"tag":321,"props":3436,"children":3437},{"style":334},[3438],{"type":293,"value":2300},{"type":283,"tag":321,"props":3440,"children":3441},{"style":367},[3442],{"type":293,"value":2650},{"type":283,"tag":321,"props":3444,"children":3445},{"class":323,"line":2165},[3446,3450],{"type":283,"tag":321,"props":3447,"children":3448},{"style":334},[3449],{"type":293,"value":2300},{"type":283,"tag":321,"props":3451,"children":3452},{"style":367},[3453],{"type":293,"value":2663},{"type":283,"tag":321,"props":3455,"children":3456},{"class":323,"line":2166},[3457,3461],{"type":283,"tag":321,"props":3458,"children":3459},{"style":334},[3460],{"type":293,"value":2300},{"type":283,"tag":321,"props":3462,"children":3463},{"style":367},[3464],{"type":293,"value":2676},{"type":283,"tag":321,"props":3466,"children":3467},{"class":323,"line":2167},[3468,3472],{"type":283,"tag":321,"props":3469,"children":3470},{"style":334},[3471],{"type":293,"value":2300},{"type":283,"tag":321,"props":3473,"children":3474},{"style":367},[3475],{"type":293,"value":2637},{"type":283,"tag":321,"props":3477,"children":3478},{"class":323,"line":2691},[3479,3483],{"type":283,"tag":321,"props":3480,"children":3481},{"style":328},[3482],{"type":293,"value":2697},{"type":283,"tag":321,"props":3484,"children":3485},{"style":334},[3486],{"type":293,"value":337},{"type":283,"tag":321,"props":3488,"children":3489},{"class":323,"line":2168},[3490,3494],{"type":283,"tag":321,"props":3491,"children":3492},{"style":334},[3493],{"type":293,"value":2300},{"type":283,"tag":321,"props":3495,"children":3496},{"style":367},[3497],{"type":293,"value":2714},{"type":283,"tag":321,"props":3499,"children":3500},{"class":323,"line":2717},[3501],{"type":283,"tag":321,"props":3502,"children":3503},{"emptyLinePlaceholder":1046},[3504],{"type":293,"value":1049},{"type":283,"tag":321,"props":3506,"children":3507},{"class":323,"line":2725},[3508,3512],{"type":283,"tag":321,"props":3509,"children":3510},{"style":328},[3511],{"type":293,"value":2731},{"type":283,"tag":321,"props":3513,"children":3514},{"style":334},[3515],{"type":293,"value":337},{"type":283,"tag":321,"props":3517,"children":3518},{"class":323,"line":2738},[3519,3523,3527,3531],{"type":283,"tag":321,"props":3520,"children":3521},{"style":334},[3522],{"type":293,"value":2300},{"type":283,"tag":321,"props":3524,"children":3525},{"style":328},[3526],{"type":293,"value":2748},{"type":283,"tag":321,"props":3528,"children":3529},{"style":334},[3530],{"type":293,"value":364},{"type":283,"tag":321,"props":3532,"children":3533},{"style":367},[3534],{"type":293,"value":2757},{"type":283,"tag":321,"props":3536,"children":3537},{"class":323,"line":2760},[3538,3542],{"type":283,"tag":321,"props":3539,"children":3540},{"style":328},[3541],{"type":293,"value":2766},{"type":283,"tag":321,"props":3543,"children":3544},{"style":334},[3545],{"type":293,"value":337},{"type":283,"tag":321,"props":3547,"children":3548},{"class":323,"line":2773},[3549,3553],{"type":283,"tag":321,"props":3550,"children":3551},{"style":334},[3552],{"type":293,"value":2779},{"type":283,"tag":321,"props":3554,"children":3555},{"style":367},[3556],{"type":293,"value":2784},{"type":283,"tag":321,"props":3558,"children":3559},{"class":323,"line":2787},[3560,3564,3568],{"type":283,"tag":321,"props":3561,"children":3562},{"style":328},[3563],{"type":293,"value":2793},{"type":283,"tag":321,"props":3565,"children":3566},{"style":334},[3567],{"type":293,"value":364},{"type":283,"tag":321,"props":3569,"children":3570},{"style":367},[3571],{"type":293,"value":2802},{"type":283,"tag":321,"props":3573,"children":3574},{"class":323,"line":2805},[3575,3579],{"type":283,"tag":321,"props":3576,"children":3577},{"style":328},[3578],{"type":293,"value":2811},{"type":283,"tag":321,"props":3580,"children":3581},{"style":334},[3582],{"type":293,"value":337},{"type":283,"tag":321,"props":3584,"children":3585},{"class":323,"line":2818},[3586,3590],{"type":283,"tag":321,"props":3587,"children":3588},{"style":328},[3589],{"type":293,"value":2824},{"type":283,"tag":321,"props":3591,"children":3592},{"style":334},[3593],{"type":293,"value":337},{"type":283,"tag":321,"props":3595,"children":3596},{"class":323,"line":2831},[3597,3601],{"type":283,"tag":321,"props":3598,"children":3599},{"style":328},[3600],{"type":293,"value":2837},{"type":283,"tag":321,"props":3602,"children":3603},{"style":334},[3604],{"type":293,"value":337},{"type":283,"tag":321,"props":3606,"children":3607},{"class":323,"line":2844},[3608,3612,3616],{"type":283,"tag":321,"props":3609,"children":3610},{"style":328},[3611],{"type":293,"value":2850},{"type":283,"tag":321,"props":3613,"children":3614},{"style":334},[3615],{"type":293,"value":364},{"type":283,"tag":321,"props":3617,"children":3618},{"style":367},[3619],{"type":293,"value":2859},{"type":283,"tag":321,"props":3621,"children":3622},{"class":323,"line":2862},[3623,3627,3631],{"type":283,"tag":321,"props":3624,"children":3625},{"style":328},[3626],{"type":293,"value":2868},{"type":283,"tag":321,"props":3628,"children":3629},{"style":334},[3630],{"type":293,"value":364},{"type":283,"tag":321,"props":3632,"children":3633},{"style":367},[3634],{"type":293,"value":2877},{"type":283,"tag":321,"props":3636,"children":3637},{"class":323,"line":2880},[3638,3642],{"type":283,"tag":321,"props":3639,"children":3640},{"style":328},[3641],{"type":293,"value":2886},{"type":283,"tag":321,"props":3643,"children":3644},{"style":334},[3645],{"type":293,"value":337},{"type":283,"tag":321,"props":3647,"children":3648},{"class":323,"line":2893},[3649,3653,3657,3661],{"type":283,"tag":321,"props":3650,"children":3651},{"style":334},[3652],{"type":293,"value":2300},{"type":283,"tag":321,"props":3654,"children":3655},{"style":328},[3656],{"type":293,"value":2005},{"type":283,"tag":321,"props":3658,"children":3659},{"style":334},[3660],{"type":293,"value":364},{"type":283,"tag":321,"props":3662,"children":3663},{"style":367},[3664],{"type":293,"value":2014},{"type":283,"tag":321,"props":3666,"children":3667},{"class":323,"line":2913},[3668,3672,3676,3680],{"type":283,"tag":321,"props":3669,"children":3670},{"style":334},[3671],{"type":293,"value":2300},{"type":283,"tag":321,"props":3673,"children":3674},{"style":328},[3675],{"type":293,"value":2005},{"type":283,"tag":321,"props":3677,"children":3678},{"style":334},[3679],{"type":293,"value":364},{"type":283,"tag":321,"props":3681,"children":3682},{"style":367},[3683],{"type":293,"value":2035},{"type":283,"tag":321,"props":3685,"children":3686},{"class":323,"line":2933},[3687,3691,3695],{"type":283,"tag":321,"props":3688,"children":3689},{"style":328},[3690],{"type":293,"value":2939},{"type":283,"tag":321,"props":3692,"children":3693},{"style":334},[3694],{"type":293,"value":364},{"type":283,"tag":321,"props":3696,"children":3697},{"style":367},[3698],{"type":293,"value":2053},{"type":283,"tag":321,"props":3700,"children":3701},{"class":323,"line":2950},[3702,3706,3710,3714],{"type":283,"tag":321,"props":3703,"children":3704},{"style":334},[3705],{"type":293,"value":2300},{"type":283,"tag":321,"props":3707,"children":3708},{"style":328},[3709],{"type":293,"value":2005},{"type":283,"tag":321,"props":3711,"children":3712},{"style":334},[3713],{"type":293,"value":364},{"type":283,"tag":321,"props":3715,"children":3716},{"style":367},[3717],{"type":293,"value":2074},{"type":283,"tag":321,"props":3719,"children":3721},{"class":323,"line":3720},55,[3722],{"type":283,"tag":321,"props":3723,"children":3724},{"emptyLinePlaceholder":1046},[3725],{"type":293,"value":1049},{"type":283,"tag":321,"props":3727,"children":3729},{"class":323,"line":3728},56,[3730,3734],{"type":283,"tag":321,"props":3731,"children":3732},{"style":328},[3733],{"type":293,"value":1841},{"type":283,"tag":321,"props":3735,"children":3736},{"style":334},[3737],{"type":293,"value":337},{"type":283,"tag":321,"props":3739,"children":3741},{"class":323,"line":3740},57,[3742,3746],{"type":283,"tag":321,"props":3743,"children":3744},{"style":328},[3745],{"type":293,"value":1853},{"type":283,"tag":321,"props":3747,"children":3748},{"style":334},[3749],{"type":293,"value":337},{"type":283,"tag":321,"props":3751,"children":3753},{"class":323,"line":3752},58,[3754,3758,3762],{"type":283,"tag":321,"props":3755,"children":3756},{"style":328},[3757],{"type":293,"value":1866},{"type":283,"tag":321,"props":3759,"children":3760},{"style":334},[3761],{"type":293,"value":364},{"type":283,"tag":321,"props":3763,"children":3764},{"style":367},[3765],{"type":293,"value":1875},{"type":283,"tag":321,"props":3767,"children":3769},{"class":323,"line":3768},59,[3770,3774,3778,3782],{"type":283,"tag":321,"props":3771,"children":3772},{"style":328},[3773],{"type":293,"value":1883},{"type":283,"tag":321,"props":3775,"children":3776},{"style":334},[3777],{"type":293,"value":1888},{"type":283,"tag":321,"props":3779,"children":3780},{"style":367},[3781],{"type":293,"value":1893},{"type":283,"tag":321,"props":3783,"children":3784},{"style":334},[3785],{"type":293,"value":1898},{"type":283,"tag":321,"props":3787,"children":3789},{"class":323,"line":3788},60,[3790,3794,3798],{"type":283,"tag":321,"props":3791,"children":3792},{"style":328},[3793],{"type":293,"value":1906},{"type":283,"tag":321,"props":3795,"children":3796},{"style":334},[3797],{"type":293,"value":364},{"type":283,"tag":321,"props":3799,"children":3800},{"style":367},[3801],{"type":293,"value":1826},{"type":283,"tag":321,"props":3803,"children":3805},{"class":323,"line":3804},61,[3806,3810],{"type":283,"tag":321,"props":3807,"children":3808},{"style":328},[3809],{"type":293,"value":1922},{"type":283,"tag":321,"props":3811,"children":3812},{"style":334},[3813],{"type":293,"value":337},{"type":283,"tag":321,"props":3815,"children":3817},{"class":323,"line":3816},62,[3818,3822],{"type":283,"tag":321,"props":3819,"children":3820},{"style":334},[3821],{"type":293,"value":393},{"type":283,"tag":321,"props":3823,"children":3824},{"style":367},[3825],{"type":293,"value":1938},{"type":283,"tag":321,"props":3827,"children":3829},{"class":323,"line":3828},63,[3830,3834],{"type":283,"tag":321,"props":3831,"children":3832},{"style":328},[3833],{"type":293,"value":1946},{"type":283,"tag":321,"props":3835,"children":3836},{"style":334},[3837],{"type":293,"value":337},{"type":283,"tag":321,"props":3839,"children":3841},{"class":323,"line":3840},64,[3842,3846],{"type":283,"tag":321,"props":3843,"children":3844},{"style":328},[3845],{"type":293,"value":1958},{"type":283,"tag":321,"props":3847,"children":3848},{"style":334},[3849],{"type":293,"value":337},{"type":283,"tag":321,"props":3851,"children":3853},{"class":323,"line":3852},65,[3854,3858,3862],{"type":283,"tag":321,"props":3855,"children":3856},{"style":328},[3857],{"type":293,"value":1970},{"type":283,"tag":321,"props":3859,"children":3860},{"style":334},[3861],{"type":293,"value":364},{"type":283,"tag":321,"props":3863,"children":3864},{"style":367},[3865],{"type":293,"value":1979},{"type":283,"tag":321,"props":3867,"children":3869},{"class":323,"line":3868},66,[3870,3874],{"type":283,"tag":321,"props":3871,"children":3872},{"style":328},[3873],{"type":293,"value":1988},{"type":283,"tag":321,"props":3875,"children":3876},{"style":334},[3877],{"type":293,"value":337},{"type":283,"tag":321,"props":3879,"children":3881},{"class":323,"line":3880},67,[3882,3886,3890,3894],{"type":283,"tag":321,"props":3883,"children":3884},{"style":334},[3885],{"type":293,"value":393},{"type":283,"tag":321,"props":3887,"children":3888},{"style":328},[3889],{"type":293,"value":2005},{"type":283,"tag":321,"props":3891,"children":3892},{"style":334},[3893],{"type":293,"value":364},{"type":283,"tag":321,"props":3895,"children":3896},{"style":367},[3897],{"type":293,"value":2014},{"type":283,"tag":321,"props":3899,"children":3901},{"class":323,"line":3900},68,[3902,3906,3910,3914],{"type":283,"tag":321,"props":3903,"children":3904},{"style":334},[3905],{"type":293,"value":393},{"type":283,"tag":321,"props":3907,"children":3908},{"style":328},[3909],{"type":293,"value":2005},{"type":283,"tag":321,"props":3911,"children":3912},{"style":334},[3913],{"type":293,"value":364},{"type":283,"tag":321,"props":3915,"children":3916},{"style":367},[3917],{"type":293,"value":2035},{"type":283,"tag":321,"props":3919,"children":3921},{"class":323,"line":3920},69,[3922,3926,3930],{"type":283,"tag":321,"props":3923,"children":3924},{"style":328},[3925],{"type":293,"value":2044},{"type":283,"tag":321,"props":3927,"children":3928},{"style":334},[3929],{"type":293,"value":364},{"type":283,"tag":321,"props":3931,"children":3932},{"style":367},[3933],{"type":293,"value":2053},{"type":283,"tag":321,"props":3935,"children":3937},{"class":323,"line":3936},70,[3938,3942,3946,3950],{"type":283,"tag":321,"props":3939,"children":3940},{"style":334},[3941],{"type":293,"value":393},{"type":283,"tag":321,"props":3943,"children":3944},{"style":328},[3945],{"type":293,"value":2005},{"type":283,"tag":321,"props":3947,"children":3948},{"style":334},[3949],{"type":293,"value":364},{"type":283,"tag":321,"props":3951,"children":3952},{"style":367},[3953],{"type":293,"value":2074},{"type":283,"tag":1489,"props":3955,"children":3956},{},[3957],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":3959},[3960,3963,3966],{"id":1672,"depth":340,"text":1675,"children":3961},[3962],{"id":1784,"depth":353,"text":1787},{"id":2092,"depth":340,"text":1642,"children":3964},[3965],{"id":2140,"depth":353,"text":2143},{"id":3008,"depth":340,"text":3011},{"_path":41,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":42,"description":43,"author":11,"image":12,"releaseDate":30,"blogCategories":3968,"articleTags":3969,"tags":3970,"body":3971,"_type":20,"_id":47,"_source":22,"_file":48,"_stem":49,"_extension":25},[15,16],[16,33,34],[36,19],{"type":280,"children":3972,"toc":5037},[3973,3977,3988,4000,4006,4011,4038,4043,4048,4066,4078,4083,4104,4110,4130,4439,4450,4455,5000,5010,5015,5033],{"type":283,"tag":1607,"props":3974,"children":3976},{"alt":8,"aspect-ratio":1609,"height":1610,"object-fit":1611,"src":3975},"/blog/shopware-plugin-build+release.png",[],{"type":283,"tag":284,"props":3978,"children":3979},{},[3980,3981,3986],{"type":293,"value":542},{"type":283,"tag":288,"props":3982,"children":3983},{"href":51},[3984],{"type":293,"value":3985},"vorherigen Post",{"type":293,"value":3987}," habe ich beschrieben, wie man ein Shopware 6 Plugin über die GitLab Package Registry ausliefert.",{"type":283,"tag":284,"props":3989,"children":3990},{},[3991,3993,3998],{"type":293,"value":3992},"Wenn wir unser Projekt mit dem ",{"type":283,"tag":288,"props":3994,"children":3996},{"href":3995},"https://developer.shopware.com/docs/products/cli/extension-commands/build.html#building-an-extension",[3997],{"type":293,"value":1698},{"type":293,"value":3999}," bauen,\nsucht das Tool in allen Plugins und prüft, ob sie gebaut werden müssen, und tut dies gegebenenfalls. Dies ist ein unnötiger Schritt.",{"type":283,"tag":532,"props":4001,"children":4003},{"id":4002},"manuelles-bauen",[4004],{"type":293,"value":4005},"Manuelles Bauen",{"type":283,"tag":284,"props":4007,"children":4008},{},[4009],{"type":293,"value":4010},"Das Bauen eines Plugins ist so einfach wie das Ausführen von:",{"type":283,"tag":303,"props":4012,"children":4014},{"className":1705,"code":4013,"language":1704,"meta":8,"style":8},"shopware-cli extension build .\n",[4015],{"type":283,"tag":317,"props":4016,"children":4017},{"__ignoreMap":8},[4018],{"type":283,"tag":321,"props":4019,"children":4020},{"class":323,"line":324},[4021,4025,4029,4034],{"type":283,"tag":321,"props":4022,"children":4023},{"style":1715},[4024],{"type":293,"value":1698},{"type":283,"tag":321,"props":4026,"children":4027},{"style":367},[4028],{"type":293,"value":1722},{"type":283,"tag":321,"props":4030,"children":4031},{"style":367},[4032],{"type":293,"value":4033}," build",{"type":283,"tag":321,"props":4035,"children":4036},{"style":367},[4037],{"type":293,"value":1748},{"type":283,"tag":284,"props":4039,"children":4040},{},[4041],{"type":293,"value":4042},"Im Plugin-Root-Verzeichnis.",{"type":283,"tag":284,"props":4044,"children":4045},{},[4046],{"type":293,"value":4047},"Es gibt einige Anpassungen, die Sie vornehmen können, wie zum Beispiel:",{"type":283,"tag":457,"props":4049,"children":4050},{},[4051,4056,4061],{"type":283,"tag":461,"props":4052,"children":4053},{},[4054],{"type":293,"value":4055},"Einschränkung einer Shopware-Version",{"type":283,"tag":461,"props":4057,"children":4058},{},[4059],{"type":293,"value":4060},"Angabe zusätzlicher Bundles",{"type":283,"tag":461,"props":4062,"children":4063},{},[4064],{"type":293,"value":4065},"Verwendung von esbuild",{"type":283,"tag":284,"props":4067,"children":4068},{},[4069,4071,4077],{"type":293,"value":4070},"Detaillierte Konfigurationen finden Sie in der ",{"type":283,"tag":288,"props":4072,"children":4074},{"href":4073},"https://developer.shopware.com/docs/products/cli/extension-commands/build.html",[4075],{"type":293,"value":4076},"offiziellen Dokumentation",{"type":293,"value":1302},{"type":283,"tag":284,"props":4079,"children":4080},{},[4081],{"type":293,"value":4082},"Der Build-Prozess erstellt die folgenden Verzeichnisse, die die kompilierten Dateien enthalten:",{"type":283,"tag":457,"props":4084,"children":4085},{},[4086,4095],{"type":283,"tag":461,"props":4087,"children":4088},{},[4089],{"type":283,"tag":317,"props":4090,"children":4092},{"className":4091},[],[4093],{"type":293,"value":4094},"src/Resources/app/storefront/dist/",{"type":283,"tag":461,"props":4096,"children":4097},{},[4098],{"type":283,"tag":317,"props":4099,"children":4101},{"className":4100},[],[4102],{"type":293,"value":4103},"src/Resources/public/static/",{"type":283,"tag":532,"props":4105,"children":4107},{"id":4106},"build-pipeline",[4108],{"type":293,"value":4109},"Build-Pipeline",{"type":283,"tag":284,"props":4111,"children":4112},{},[4113,4115,4120,4122,4128],{"type":293,"value":4114},"Wir verwenden das offizielle ",{"type":283,"tag":317,"props":4116,"children":4118},{"className":4117},[],[4119],{"type":293,"value":1698},{"type":293,"value":4121}," Docker-Image. Um den Prozess zu beschleunigen, nutzen wir das ",{"type":283,"tag":317,"props":4123,"children":4125},{"className":4124},[],[4126],{"type":293,"value":4127},"CI",{"type":293,"value":4129},"-Caching-System.",{"type":283,"tag":303,"props":4131,"children":4134},{"className":314,"code":4132,"filename":1796,"highlights":4133,"language":313,"meta":8,"style":8},"stages:\n  - build\n\nbuild:\n  image:\n    name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n    entrypoint: [\"\"]\n  stage: build\n  variables:\n    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer\n    npm_config_cache: ${CI_PROJECT_DIR}/.npm\n  script:\n    - shopware-cli extension build .\n  cache:\n    - key: $CI_JOB_NAME\n      paths:\n        - $COMPOSER_CACHE_DIR\n        - $npm_config_cache\n  rules:\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n",[309,1029,1042,1052,1065,1078],[4135],{"type":283,"tag":317,"props":4136,"children":4137},{"__ignoreMap":8},[4138,4149,4161,4168,4180,4191,4207,4226,4241,4252,4267,4284,4295,4306,4318,4338,4350,4362,4375,4386,4405,4420],{"type":283,"tag":321,"props":4139,"children":4140},{"class":323,"line":324},[4141,4145],{"type":283,"tag":321,"props":4142,"children":4143},{"style":328},[4144],{"type":293,"value":1809},{"type":283,"tag":321,"props":4146,"children":4147},{"style":334},[4148],{"type":293,"value":337},{"type":283,"tag":321,"props":4150,"children":4151},{"class":323,"line":340},[4152,4156],{"type":283,"tag":321,"props":4153,"children":4154},{"style":334},[4155],{"type":293,"value":1821},{"type":283,"tag":321,"props":4157,"children":4158},{"style":367},[4159],{"type":293,"value":4160},"build\n",{"type":283,"tag":321,"props":4162,"children":4163},{"class":323,"line":353},[4164],{"type":283,"tag":321,"props":4165,"children":4166},{"emptyLinePlaceholder":1046},[4167],{"type":293,"value":1049},{"type":283,"tag":321,"props":4169,"children":4170},{"class":323,"line":373},[4171,4176],{"type":283,"tag":321,"props":4172,"children":4173},{"style":328},[4174],{"type":293,"value":4175},"build",{"type":283,"tag":321,"props":4177,"children":4178},{"style":334},[4179],{"type":293,"value":337},{"type":283,"tag":321,"props":4181,"children":4182},{"class":323,"line":308},[4183,4187],{"type":283,"tag":321,"props":4184,"children":4185},{"style":328},[4186],{"type":293,"value":2238},{"type":283,"tag":321,"props":4188,"children":4189},{"style":334},[4190],{"type":293,"value":337},{"type":283,"tag":321,"props":4192,"children":4194},{"class":4193,"line":309},[323,387],[4195,4199,4203],{"type":283,"tag":321,"props":4196,"children":4197},{"style":328},[4198],{"type":293,"value":2250},{"type":283,"tag":321,"props":4200,"children":4201},{"style":334},[4202],{"type":293,"value":364},{"type":283,"tag":321,"props":4204,"children":4205},{"style":367},[4206],{"type":293,"value":1875},{"type":283,"tag":321,"props":4208,"children":4209},{"class":323,"line":310},[4210,4214,4218,4222],{"type":283,"tag":321,"props":4211,"children":4212},{"style":328},[4213],{"type":293,"value":2266},{"type":283,"tag":321,"props":4215,"children":4216},{"style":334},[4217],{"type":293,"value":1888},{"type":283,"tag":321,"props":4219,"children":4220},{"style":367},[4221],{"type":293,"value":1893},{"type":283,"tag":321,"props":4223,"children":4224},{"style":334},[4225],{"type":293,"value":1898},{"type":283,"tag":321,"props":4227,"children":4228},{"class":323,"line":311},[4229,4233,4237],{"type":283,"tag":321,"props":4230,"children":4231},{"style":328},[4232],{"type":293,"value":2222},{"type":283,"tag":321,"props":4234,"children":4235},{"style":334},[4236],{"type":293,"value":364},{"type":283,"tag":321,"props":4238,"children":4239},{"style":367},[4240],{"type":293,"value":4160},{"type":283,"tag":321,"props":4242,"children":4243},{"class":323,"line":312},[4244,4248],{"type":283,"tag":321,"props":4245,"children":4246},{"style":328},[4247],{"type":293,"value":2388},{"type":283,"tag":321,"props":4249,"children":4250},{"style":334},[4251],{"type":293,"value":337},{"type":283,"tag":321,"props":4253,"children":4254},{"class":323,"line":977},[4255,4259,4263],{"type":283,"tag":321,"props":4256,"children":4257},{"style":328},[4258],{"type":293,"value":2514},{"type":283,"tag":321,"props":4260,"children":4261},{"style":334},[4262],{"type":293,"value":364},{"type":283,"tag":321,"props":4264,"children":4265},{"style":367},[4266],{"type":293,"value":2523},{"type":283,"tag":321,"props":4268,"children":4269},{"class":323,"line":990},[4270,4275,4279],{"type":283,"tag":321,"props":4271,"children":4272},{"style":328},[4273],{"type":293,"value":4274},"    npm_config_cache",{"type":283,"tag":321,"props":4276,"children":4277},{"style":334},[4278],{"type":293,"value":364},{"type":283,"tag":321,"props":4280,"children":4281},{"style":367},[4282],{"type":293,"value":4283},"${CI_PROJECT_DIR}/.npm\n",{"type":283,"tag":321,"props":4285,"children":4286},{"class":323,"line":1003},[4287,4291],{"type":283,"tag":321,"props":4288,"children":4289},{"style":328},[4290],{"type":293,"value":2697},{"type":283,"tag":321,"props":4292,"children":4293},{"style":334},[4294],{"type":293,"value":337},{"type":283,"tag":321,"props":4296,"children":4297},{"class":323,"line":1016},[4298,4302],{"type":283,"tag":321,"props":4299,"children":4300},{"style":334},[4301],{"type":293,"value":2300},{"type":283,"tag":321,"props":4303,"children":4304},{"style":367},[4305],{"type":293,"value":4013},{"type":283,"tag":321,"props":4307,"children":4309},{"class":4308,"line":1029},[323,387],[4310,4314],{"type":283,"tag":321,"props":4311,"children":4312},{"style":328},[4313],{"type":293,"value":2731},{"type":283,"tag":321,"props":4315,"children":4316},{"style":334},[4317],{"type":293,"value":337},{"type":283,"tag":321,"props":4319,"children":4321},{"class":4320,"line":1042},[323,387],[4322,4326,4330,4334],{"type":283,"tag":321,"props":4323,"children":4324},{"style":334},[4325],{"type":293,"value":2300},{"type":283,"tag":321,"props":4327,"children":4328},{"style":328},[4329],{"type":293,"value":2748},{"type":283,"tag":321,"props":4331,"children":4332},{"style":334},[4333],{"type":293,"value":364},{"type":283,"tag":321,"props":4335,"children":4336},{"style":367},[4337],{"type":293,"value":2757},{"type":283,"tag":321,"props":4339,"children":4341},{"class":4340,"line":1052},[323,387],[4342,4346],{"type":283,"tag":321,"props":4343,"children":4344},{"style":328},[4345],{"type":293,"value":2766},{"type":283,"tag":321,"props":4347,"children":4348},{"style":334},[4349],{"type":293,"value":337},{"type":283,"tag":321,"props":4351,"children":4353},{"class":4352,"line":1065},[323,387],[4354,4358],{"type":283,"tag":321,"props":4355,"children":4356},{"style":334},[4357],{"type":293,"value":2779},{"type":283,"tag":321,"props":4359,"children":4360},{"style":367},[4361],{"type":293,"value":2784},{"type":283,"tag":321,"props":4363,"children":4365},{"class":4364,"line":1078},[323,387],[4366,4370],{"type":283,"tag":321,"props":4367,"children":4368},{"style":334},[4369],{"type":293,"value":2779},{"type":283,"tag":321,"props":4371,"children":4372},{"style":367},[4373],{"type":293,"value":4374},"$npm_config_cache\n",{"type":283,"tag":321,"props":4376,"children":4377},{"class":323,"line":1087},[4378,4382],{"type":283,"tag":321,"props":4379,"children":4380},{"style":328},[4381],{"type":293,"value":2886},{"type":283,"tag":321,"props":4383,"children":4384},{"style":334},[4385],{"type":293,"value":337},{"type":283,"tag":321,"props":4387,"children":4388},{"class":323,"line":1100},[4389,4393,4397,4401],{"type":283,"tag":321,"props":4390,"children":4391},{"style":334},[4392],{"type":293,"value":2300},{"type":283,"tag":321,"props":4394,"children":4395},{"style":328},[4396],{"type":293,"value":2005},{"type":283,"tag":321,"props":4398,"children":4399},{"style":334},[4400],{"type":293,"value":364},{"type":283,"tag":321,"props":4402,"children":4403},{"style":367},[4404],{"type":293,"value":2035},{"type":283,"tag":321,"props":4406,"children":4407},{"class":323,"line":1113},[4408,4412,4416],{"type":283,"tag":321,"props":4409,"children":4410},{"style":328},[4411],{"type":293,"value":2939},{"type":283,"tag":321,"props":4413,"children":4414},{"style":334},[4415],{"type":293,"value":364},{"type":283,"tag":321,"props":4417,"children":4418},{"style":367},[4419],{"type":293,"value":2053},{"type":283,"tag":321,"props":4421,"children":4422},{"class":323,"line":1126},[4423,4427,4431,4435],{"type":283,"tag":321,"props":4424,"children":4425},{"style":334},[4426],{"type":293,"value":2300},{"type":283,"tag":321,"props":4428,"children":4429},{"style":328},[4430],{"type":293,"value":2005},{"type":283,"tag":321,"props":4432,"children":4433},{"style":334},[4434],{"type":293,"value":364},{"type":283,"tag":321,"props":4436,"children":4437},{"style":367},[4438],{"type":293,"value":2074},{"type":283,"tag":284,"props":4440,"children":4441},{},[4442,4444,4449],{"type":293,"value":4443},"Kombinieren wir dies mit unserer Release-Pipeline aus dem ",{"type":283,"tag":288,"props":4445,"children":4447},{"href":4446},"/blog/shopware-plugin-gitlab-pipeline-release#mit-semantic-release",[4448],{"type":293,"value":3985},{"type":293,"value":1302},{"type":283,"tag":284,"props":4451,"children":4452},{},[4453],{"type":293,"value":4454},"Es ist wichtig, die gebauten Artefakte an den nächsten Job zu übergeben.",{"type":283,"tag":303,"props":4456,"children":4459},{"className":314,"code":4457,"filename":1796,"highlights":4458,"language":313,"meta":8,"style":8},"stages:\n  - release\n  - build\n\nbuild:\n  image:\n    name: ghcr.io/shopware/shopware-cli:latest-php-8.2\n    entrypoint: [\"\"]\n  stage: build\n  variables:\n    COMPOSER_CACHE_DIR: ${CI_PROJECT_DIR}/.composer\n    npm_config_cache: ${CI_PROJECT_DIR}/.npm\n  script:\n    - shopware-cli extension build .\n  cache:\n    - key: $CI_JOB_NAME\n      paths:\n        - $COMPOSER_CACHE_DIR\n        - $npm_config_cache\n  artifacts:\n    paths:\n      - src/Resources/public\n      - src/Storefront/Resources/public\n  rules:\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n\nrelease:\n  stage: release\n  image:\n    name: ghcr.io/voxpupuli/semantic-release:latest\n    entrypoint: [\"\"]\n  interruptible: true\n  script:\n    - /docker-entrypoint.sh\n  rules:\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n",[1100,1113,1126,1134],[4460],{"type":283,"tag":317,"props":4461,"children":4462},{"__ignoreMap":8},[4463,4474,4486,4497,4504,4515,4526,4541,4560,4575,4586,4601,4616,4627,4638,4649,4668,4679,4690,4701,4713,4726,4739,4752,4763,4782,4797,4816,4823,4835,4850,4861,4877,4896,4913,4924,4936,4947,4966,4981],{"type":283,"tag":321,"props":4464,"children":4465},{"class":323,"line":324},[4466,4470],{"type":283,"tag":321,"props":4467,"children":4468},{"style":328},[4469],{"type":293,"value":1809},{"type":283,"tag":321,"props":4471,"children":4472},{"style":334},[4473],{"type":293,"value":337},{"type":283,"tag":321,"props":4475,"children":4476},{"class":323,"line":340},[4477,4481],{"type":283,"tag":321,"props":4478,"children":4479},{"style":334},[4480],{"type":293,"value":1821},{"type":283,"tag":321,"props":4482,"children":4483},{"style":367},[4484],{"type":293,"value":4485},"release\n",{"type":283,"tag":321,"props":4487,"children":4488},{"class":323,"line":353},[4489,4493],{"type":283,"tag":321,"props":4490,"children":4491},{"style":334},[4492],{"type":293,"value":1821},{"type":283,"tag":321,"props":4494,"children":4495},{"style":367},[4496],{"type":293,"value":4160},{"type":283,"tag":321,"props":4498,"children":4499},{"class":323,"line":373},[4500],{"type":283,"tag":321,"props":4501,"children":4502},{"emptyLinePlaceholder":1046},[4503],{"type":293,"value":1049},{"type":283,"tag":321,"props":4505,"children":4506},{"class":323,"line":308},[4507,4511],{"type":283,"tag":321,"props":4508,"children":4509},{"style":328},[4510],{"type":293,"value":4175},{"type":283,"tag":321,"props":4512,"children":4513},{"style":334},[4514],{"type":293,"value":337},{"type":283,"tag":321,"props":4516,"children":4517},{"class":323,"line":309},[4518,4522],{"type":283,"tag":321,"props":4519,"children":4520},{"style":328},[4521],{"type":293,"value":2238},{"type":283,"tag":321,"props":4523,"children":4524},{"style":334},[4525],{"type":293,"value":337},{"type":283,"tag":321,"props":4527,"children":4528},{"class":323,"line":310},[4529,4533,4537],{"type":283,"tag":321,"props":4530,"children":4531},{"style":328},[4532],{"type":293,"value":2250},{"type":283,"tag":321,"props":4534,"children":4535},{"style":334},[4536],{"type":293,"value":364},{"type":283,"tag":321,"props":4538,"children":4539},{"style":367},[4540],{"type":293,"value":1875},{"type":283,"tag":321,"props":4542,"children":4543},{"class":323,"line":311},[4544,4548,4552,4556],{"type":283,"tag":321,"props":4545,"children":4546},{"style":328},[4547],{"type":293,"value":2266},{"type":283,"tag":321,"props":4549,"children":4550},{"style":334},[4551],{"type":293,"value":1888},{"type":283,"tag":321,"props":4553,"children":4554},{"style":367},[4555],{"type":293,"value":1893},{"type":283,"tag":321,"props":4557,"children":4558},{"style":334},[4559],{"type":293,"value":1898},{"type":283,"tag":321,"props":4561,"children":4562},{"class":323,"line":312},[4563,4567,4571],{"type":283,"tag":321,"props":4564,"children":4565},{"style":328},[4566],{"type":293,"value":2222},{"type":283,"tag":321,"props":4568,"children":4569},{"style":334},[4570],{"type":293,"value":364},{"type":283,"tag":321,"props":4572,"children":4573},{"style":367},[4574],{"type":293,"value":4160},{"type":283,"tag":321,"props":4576,"children":4577},{"class":323,"line":977},[4578,4582],{"type":283,"tag":321,"props":4579,"children":4580},{"style":328},[4581],{"type":293,"value":2388},{"type":283,"tag":321,"props":4583,"children":4584},{"style":334},[4585],{"type":293,"value":337},{"type":283,"tag":321,"props":4587,"children":4588},{"class":323,"line":990},[4589,4593,4597],{"type":283,"tag":321,"props":4590,"children":4591},{"style":328},[4592],{"type":293,"value":2514},{"type":283,"tag":321,"props":4594,"children":4595},{"style":334},[4596],{"type":293,"value":364},{"type":283,"tag":321,"props":4598,"children":4599},{"style":367},[4600],{"type":293,"value":2523},{"type":283,"tag":321,"props":4602,"children":4603},{"class":323,"line":1003},[4604,4608,4612],{"type":283,"tag":321,"props":4605,"children":4606},{"style":328},[4607],{"type":293,"value":4274},{"type":283,"tag":321,"props":4609,"children":4610},{"style":334},[4611],{"type":293,"value":364},{"type":283,"tag":321,"props":4613,"children":4614},{"style":367},[4615],{"type":293,"value":4283},{"type":283,"tag":321,"props":4617,"children":4618},{"class":323,"line":1016},[4619,4623],{"type":283,"tag":321,"props":4620,"children":4621},{"style":328},[4622],{"type":293,"value":2697},{"type":283,"tag":321,"props":4624,"children":4625},{"style":334},[4626],{"type":293,"value":337},{"type":283,"tag":321,"props":4628,"children":4629},{"class":323,"line":1029},[4630,4634],{"type":283,"tag":321,"props":4631,"children":4632},{"style":334},[4633],{"type":293,"value":2300},{"type":283,"tag":321,"props":4635,"children":4636},{"style":367},[4637],{"type":293,"value":4013},{"type":283,"tag":321,"props":4639,"children":4640},{"class":323,"line":1042},[4641,4645],{"type":283,"tag":321,"props":4642,"children":4643},{"style":328},[4644],{"type":293,"value":2731},{"type":283,"tag":321,"props":4646,"children":4647},{"style":334},[4648],{"type":293,"value":337},{"type":283,"tag":321,"props":4650,"children":4651},{"class":323,"line":1052},[4652,4656,4660,4664],{"type":283,"tag":321,"props":4653,"children":4654},{"style":334},[4655],{"type":293,"value":2300},{"type":283,"tag":321,"props":4657,"children":4658},{"style":328},[4659],{"type":293,"value":2748},{"type":283,"tag":321,"props":4661,"children":4662},{"style":334},[4663],{"type":293,"value":364},{"type":283,"tag":321,"props":4665,"children":4666},{"style":367},[4667],{"type":293,"value":2757},{"type":283,"tag":321,"props":4669,"children":4670},{"class":323,"line":1065},[4671,4675],{"type":283,"tag":321,"props":4672,"children":4673},{"style":328},[4674],{"type":293,"value":2766},{"type":283,"tag":321,"props":4676,"children":4677},{"style":334},[4678],{"type":293,"value":337},{"type":283,"tag":321,"props":4680,"children":4681},{"class":323,"line":1078},[4682,4686],{"type":283,"tag":321,"props":4683,"children":4684},{"style":334},[4685],{"type":293,"value":2779},{"type":283,"tag":321,"props":4687,"children":4688},{"style":367},[4689],{"type":293,"value":2784},{"type":283,"tag":321,"props":4691,"children":4692},{"class":323,"line":1087},[4693,4697],{"type":283,"tag":321,"props":4694,"children":4695},{"style":334},[4696],{"type":293,"value":2779},{"type":283,"tag":321,"props":4698,"children":4699},{"style":367},[4700],{"type":293,"value":4374},{"type":283,"tag":321,"props":4702,"children":4704},{"class":4703,"line":1100},[323,387],[4705,4709],{"type":283,"tag":321,"props":4706,"children":4707},{"style":328},[4708],{"type":293,"value":2811},{"type":283,"tag":321,"props":4710,"children":4711},{"style":334},[4712],{"type":293,"value":337},{"type":283,"tag":321,"props":4714,"children":4716},{"class":4715,"line":1113},[323,387],[4717,4722],{"type":283,"tag":321,"props":4718,"children":4719},{"style":328},[4720],{"type":293,"value":4721},"    paths",{"type":283,"tag":321,"props":4723,"children":4724},{"style":334},[4725],{"type":293,"value":337},{"type":283,"tag":321,"props":4727,"children":4729},{"class":4728,"line":1126},[323,387],[4730,4734],{"type":283,"tag":321,"props":4731,"children":4732},{"style":334},[4733],{"type":293,"value":393},{"type":283,"tag":321,"props":4735,"children":4736},{"style":367},[4737],{"type":293,"value":4738},"src/Resources/public\n",{"type":283,"tag":321,"props":4740,"children":4742},{"class":4741,"line":1134},[323,387],[4743,4747],{"type":283,"tag":321,"props":4744,"children":4745},{"style":334},[4746],{"type":293,"value":393},{"type":283,"tag":321,"props":4748,"children":4749},{"style":367},[4750],{"type":293,"value":4751},"src/Storefront/Resources/public\n",{"type":283,"tag":321,"props":4753,"children":4754},{"class":323,"line":1147},[4755,4759],{"type":283,"tag":321,"props":4756,"children":4757},{"style":328},[4758],{"type":293,"value":2886},{"type":283,"tag":321,"props":4760,"children":4761},{"style":334},[4762],{"type":293,"value":337},{"type":283,"tag":321,"props":4764,"children":4765},{"class":323,"line":1160},[4766,4770,4774,4778],{"type":283,"tag":321,"props":4767,"children":4768},{"style":334},[4769],{"type":293,"value":2300},{"type":283,"tag":321,"props":4771,"children":4772},{"style":328},[4773],{"type":293,"value":2005},{"type":283,"tag":321,"props":4775,"children":4776},{"style":334},[4777],{"type":293,"value":364},{"type":283,"tag":321,"props":4779,"children":4780},{"style":367},[4781],{"type":293,"value":2035},{"type":283,"tag":321,"props":4783,"children":4784},{"class":323,"line":1173},[4785,4789,4793],{"type":283,"tag":321,"props":4786,"children":4787},{"style":328},[4788],{"type":293,"value":2939},{"type":283,"tag":321,"props":4790,"children":4791},{"style":334},[4792],{"type":293,"value":364},{"type":283,"tag":321,"props":4794,"children":4795},{"style":367},[4796],{"type":293,"value":2053},{"type":283,"tag":321,"props":4798,"children":4799},{"class":323,"line":1186},[4800,4804,4808,4812],{"type":283,"tag":321,"props":4801,"children":4802},{"style":334},[4803],{"type":293,"value":2300},{"type":283,"tag":321,"props":4805,"children":4806},{"style":328},[4807],{"type":293,"value":2005},{"type":283,"tag":321,"props":4809,"children":4810},{"style":334},[4811],{"type":293,"value":364},{"type":283,"tag":321,"props":4813,"children":4814},{"style":367},[4815],{"type":293,"value":2074},{"type":283,"tag":321,"props":4817,"children":4818},{"class":323,"line":1199},[4819],{"type":283,"tag":321,"props":4820,"children":4821},{"emptyLinePlaceholder":1046},[4822],{"type":293,"value":1049},{"type":283,"tag":321,"props":4824,"children":4825},{"class":323,"line":2160},[4826,4831],{"type":283,"tag":321,"props":4827,"children":4828},{"style":328},[4829],{"type":293,"value":4830},"release",{"type":283,"tag":321,"props":4832,"children":4833},{"style":334},[4834],{"type":293,"value":337},{"type":283,"tag":321,"props":4836,"children":4837},{"class":323,"line":2161},[4838,4842,4846],{"type":283,"tag":321,"props":4839,"children":4840},{"style":328},[4841],{"type":293,"value":2222},{"type":283,"tag":321,"props":4843,"children":4844},{"style":334},[4845],{"type":293,"value":364},{"type":283,"tag":321,"props":4847,"children":4848},{"style":367},[4849],{"type":293,"value":4485},{"type":283,"tag":321,"props":4851,"children":4852},{"class":323,"line":2162},[4853,4857],{"type":283,"tag":321,"props":4854,"children":4855},{"style":328},[4856],{"type":293,"value":2238},{"type":283,"tag":321,"props":4858,"children":4859},{"style":334},[4860],{"type":293,"value":337},{"type":283,"tag":321,"props":4862,"children":4863},{"class":323,"line":2163},[4864,4868,4872],{"type":283,"tag":321,"props":4865,"children":4866},{"style":328},[4867],{"type":293,"value":2250},{"type":283,"tag":321,"props":4869,"children":4870},{"style":334},[4871],{"type":293,"value":364},{"type":283,"tag":321,"props":4873,"children":4874},{"style":367},[4875],{"type":293,"value":4876},"ghcr.io/voxpupuli/semantic-release:latest\n",{"type":283,"tag":321,"props":4878,"children":4879},{"class":323,"line":2164},[4880,4884,4888,4892],{"type":283,"tag":321,"props":4881,"children":4882},{"style":328},[4883],{"type":293,"value":2266},{"type":283,"tag":321,"props":4885,"children":4886},{"style":334},[4887],{"type":293,"value":1888},{"type":283,"tag":321,"props":4889,"children":4890},{"style":367},[4891],{"type":293,"value":1893},{"type":283,"tag":321,"props":4893,"children":4894},{"style":334},[4895],{"type":293,"value":1898},{"type":283,"tag":321,"props":4897,"children":4898},{"class":323,"line":2165},[4899,4904,4908],{"type":283,"tag":321,"props":4900,"children":4901},{"style":328},[4902],{"type":293,"value":4903},"  interruptible",{"type":283,"tag":321,"props":4905,"children":4906},{"style":334},[4907],{"type":293,"value":364},{"type":283,"tag":321,"props":4909,"children":4910},{"style":1730},[4911],{"type":293,"value":4912},"true\n",{"type":283,"tag":321,"props":4914,"children":4915},{"class":323,"line":2166},[4916,4920],{"type":283,"tag":321,"props":4917,"children":4918},{"style":328},[4919],{"type":293,"value":2697},{"type":283,"tag":321,"props":4921,"children":4922},{"style":334},[4923],{"type":293,"value":337},{"type":283,"tag":321,"props":4925,"children":4926},{"class":323,"line":2167},[4927,4931],{"type":283,"tag":321,"props":4928,"children":4929},{"style":334},[4930],{"type":293,"value":2300},{"type":283,"tag":321,"props":4932,"children":4933},{"style":367},[4934],{"type":293,"value":4935},"/docker-entrypoint.sh\n",{"type":283,"tag":321,"props":4937,"children":4938},{"class":323,"line":2691},[4939,4943],{"type":283,"tag":321,"props":4940,"children":4941},{"style":328},[4942],{"type":293,"value":2886},{"type":283,"tag":321,"props":4944,"children":4945},{"style":334},[4946],{"type":293,"value":337},{"type":283,"tag":321,"props":4948,"children":4949},{"class":323,"line":2168},[4950,4954,4958,4962],{"type":283,"tag":321,"props":4951,"children":4952},{"style":334},[4953],{"type":293,"value":2300},{"type":283,"tag":321,"props":4955,"children":4956},{"style":328},[4957],{"type":293,"value":2005},{"type":283,"tag":321,"props":4959,"children":4960},{"style":334},[4961],{"type":293,"value":364},{"type":283,"tag":321,"props":4963,"children":4964},{"style":367},[4965],{"type":293,"value":2035},{"type":283,"tag":321,"props":4967,"children":4968},{"class":323,"line":2717},[4969,4973,4977],{"type":283,"tag":321,"props":4970,"children":4971},{"style":328},[4972],{"type":293,"value":2939},{"type":283,"tag":321,"props":4974,"children":4975},{"style":334},[4976],{"type":293,"value":364},{"type":283,"tag":321,"props":4978,"children":4979},{"style":367},[4980],{"type":293,"value":2053},{"type":283,"tag":321,"props":4982,"children":4983},{"class":323,"line":2725},[4984,4988,4992,4996],{"type":283,"tag":321,"props":4985,"children":4986},{"style":334},[4987],{"type":293,"value":2300},{"type":283,"tag":321,"props":4989,"children":4990},{"style":328},[4991],{"type":293,"value":2005},{"type":283,"tag":321,"props":4993,"children":4994},{"style":334},[4995],{"type":293,"value":364},{"type":283,"tag":321,"props":4997,"children":4998},{"style":367},[4999],{"type":293,"value":2074},{"type":283,"tag":284,"props":5001,"children":5002},{},[5003],{"type":283,"tag":321,"props":5004,"children":5007},{"className":5005},[5006],"text-h2",[5008],{"type":293,"value":5009},"Das war's!",{"type":283,"tag":284,"props":5011,"children":5012},{},[5013],{"type":293,"value":5014},"Dies wird:",{"type":283,"tag":613,"props":5016,"children":5017},{},[5018,5023,5028],{"type":283,"tag":461,"props":5019,"children":5020},{},[5021],{"type":293,"value":5022},"Alle Assets bauen",{"type":283,"tag":461,"props":5024,"children":5025},{},[5026],{"type":293,"value":5027},"Sie an den zweiten Job übergeben",{"type":283,"tag":461,"props":5029,"children":5030},{},[5031],{"type":293,"value":5032},"Den Release-Prozess wie zuvor beschrieben ausführen",{"type":283,"tag":1489,"props":5034,"children":5035},{},[5036],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":5038},[5039,5040],{"id":4002,"depth":340,"text":4005},{"id":4106,"depth":340,"text":4109},{"_path":51,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":52,"description":53,"author":11,"image":12,"releaseDate":30,"blogCategories":5042,"articleTags":5043,"tags":5044,"body":5045,"_type":20,"_id":57,"_source":22,"_file":58,"_stem":59,"_extension":25},[15,16],[16,33,34],[36,19],{"type":280,"children":5046,"toc":9362},[5047,5051,5056,5067,5072,5077,5112,5117,5123,5128,5134,5147,6154,6159,6183,6193,6196,6209,6232,6367,6379,6384,6390,6402,6423,6825,6866,6871,6892,7034,7046,7052,7064,7069,7081,7116,7121,8048,8053,8152,8157,8216,8227,8232,8253,8388,8397,8403,8423,8426,8429,8435,8441,8446,8464,8514,8662,8668,8673,8684,8697,8907,9312,9316,9358],{"type":283,"tag":1607,"props":5048,"children":5050},{"alt":8,"aspect-ratio":1609,"height":1610,"object-fit":1611,"src":5049},"/blog/shopware-plugin-release.png",[],{"type":283,"tag":284,"props":5052,"children":5053},{},[5054],{"type":293,"value":5055},"Es gibt viele Möglichkeiten, Shopware 6 Plugins zu installieren. Sie können sie direkt im Admin-Panel herunterladen oder mit Composer installieren.",{"type":283,"tag":284,"props":5057,"children":5058},{},[5059,5061,5066],{"type":293,"value":5060},"Einen detaillierten Vergleich finden Sie in der ",{"type":283,"tag":288,"props":5062,"children":5064},{"href":5063},"https://developer.shopware.com/docs/guides/plugins/plugins/",[5065],{"type":293,"value":4076},{"type":293,"value":1302},{"type":283,"tag":284,"props":5068,"children":5069},{},[5070],{"type":293,"value":5071},"Als Entwickler und Betreuer von Themes, Anpassungen, Drittanbieter-APIs usw. konzentriere ich mich auf statische Plugins.",{"type":283,"tag":284,"props":5073,"children":5074},{},[5075],{"type":293,"value":5076},"Der Workflow ist einfach:",{"type":283,"tag":613,"props":5078,"children":5079},{},[5080,5091,5102],{"type":283,"tag":461,"props":5081,"children":5082},{},[5083,5085],{"type":293,"value":5084},"Erstelle ein Plugin mit ",{"type":283,"tag":317,"props":5086,"children":5088},{"className":5087},[],[5089],{"type":293,"value":5090},"bin/console plugin:create --static",{"type":283,"tag":461,"props":5092,"children":5093},{},[5094,5096],{"type":293,"value":5095},"Installiere es mit ",{"type":283,"tag":288,"props":5097,"children":5099},{"href":5098},"https://developer.shopware.com/docs/guides/plugins/plugins/#static-plugins",[5100],{"type":293,"value":5101},"Composer",{"type":283,"tag":461,"props":5103,"children":5104},{},[5105,5107],{"type":293,"value":5106},"Baue das Projekt mit ",{"type":283,"tag":288,"props":5108,"children":5110},{"href":5109},"https://developer.shopware.com/docs/products/cli/project-commands/build.html#example-docker-image",[5111],{"type":293,"value":1698},{"type":283,"tag":284,"props":5113,"children":5114},{},[5115],{"type":293,"value":5116},"Wenn wir dasselbe Plugin in mehr als einem Shop benötigen, könnten wir dasselbe Plugin mehrfach erstellen, das wäre aber für die Wartung nicht optimal.",{"type":283,"tag":532,"props":5118,"children":5120},{"id":5119},"das-plugin-extrahieren",[5121],{"type":293,"value":5122},"Das Plugin extrahieren",{"type":283,"tag":284,"props":5124,"children":5125},{},[5126],{"type":293,"value":5127},"Wir fangen damit an, dass wir den Quellcode unseres Plugins in ein separates Repository verschieben. Um die Sache vorerst einfach zu machen, machen wir das Repository öffentlich.",{"type":283,"tag":1252,"props":5129,"children":5131},{"id":5130},"download-mit-git",[5132],{"type":293,"value":5133},"Download mit Git",{"type":283,"tag":284,"props":5135,"children":5136},{},[5137,5139,5145],{"type":293,"value":5138},"Wir müssen ",{"type":283,"tag":317,"props":5140,"children":5142},{"className":5141},[],[5143],{"type":293,"value":5144},"composer",{"type":293,"value":5146}," nur mitteilen, wo unser Plugin zu finden ist.",{"type":283,"tag":303,"props":5148,"children":5153},{"className":5149,"code":5150,"filename":5151,"highlights":5152,"language":1596,"meta":8,"style":8},"language-json shiki shiki-themes github-dark github-dark monokai","{\n  \"name\": \"shopware/production\",\n  \"license\": \"MIT\",\n  \"type\": \"project\",\n  \"require\": {\n    \"composer-runtime-api\": \"^2.0\",\n    \"acme/sample-plugin\": \"^1.0\",\n    \"shopware/administration\": \"*\",\n    \"shopware/core\": \"6.6.10.2\",\n    \"shopware/elasticsearch\": \"*\",\n    \"shopware/storefront\": \"*\",\n    \"symfony/flex\": \"~2\"\n  },\n  \"repositories\": [\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/plugins/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/plugins/*/packages/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/static-plugins/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"git\",\n      \"url\": \"https://\u003CDOMAIN-NAME>/\u003Cgroup>/\u003Crepo>.git\"\n    }\n  ],\n  \"autoload\": {\n    \"psr-4\": {\n      \"App\\\\\": \"src/\"\n    }\n  },\n  \"prefer-stable\": true,\n  \"config\": {\n    \"allow-plugins\": {\n      \"symfony/flex\": true,\n      \"symfony/runtime\": true\n    },\n    \"optimize-autoloader\": true,\n    \"sort-packages\": true\n  },\n  \"scripts\": {\n    \"auto-scripts\": {\n      \"assets:install\": \"symfony-cmd\"\n    },\n    \"post-install-cmd\": [\n      \"@auto-scripts\"\n    ],\n    \"post-update-cmd\": [\n      \"@auto-scripts\"\n    ]\n  },\n  \"extra\": {\n    \"symfony\": {\n      \"allow-contrib\": true,\n      \"endpoint\": [\n        \"https://raw.githubusercontent.com/shopware/recipes/flex/main/index.json\",\n        \"flex://defaults\"\n      ]\n    }\n  }\n}\n","\u003Cproject-root>/composer.json",[2167,2691,2168,2717],[5154],{"type":283,"tag":317,"props":5155,"children":5156},{"__ignoreMap":8},[5157,5165,5189,5210,5231,5244,5265,5286,5307,5328,5348,5368,5385,5393,5406,5414,5435,5456,5468,5484,5492,5500,5507,5526,5546,5557,5572,5579,5586,5593,5612,5632,5643,5658,5665,5672,5680,5701,5718,5727,5735,5747,5759,5787,5794,5801,5822,5834,5846,5866,5882,5889,5909,5925,5932,5944,5956,5973,5980,5992,6000,6008,6020,6027,6035,6042,6054,6066,6086,6098,6110,6119,6128,6136,6145],{"type":283,"tag":321,"props":5158,"children":5159},{"class":323,"line":324},[5160],{"type":283,"tag":321,"props":5161,"children":5162},{"style":334},[5163],{"type":293,"value":5164},"{\n",{"type":283,"tag":321,"props":5166,"children":5167},{"class":323,"line":340},[5168,5174,5178,5184],{"type":283,"tag":321,"props":5169,"children":5171},{"style":5170},"--shiki-default:#79B8FF;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic",[5172],{"type":293,"value":5173},"  \"name\"",{"type":283,"tag":321,"props":5175,"children":5176},{"style":334},[5177],{"type":293,"value":364},{"type":283,"tag":321,"props":5179,"children":5181},{"style":5180},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2",[5182],{"type":293,"value":5183},"\"shopware/production\"",{"type":283,"tag":321,"props":5185,"children":5186},{"style":334},[5187],{"type":293,"value":5188},",\n",{"type":283,"tag":321,"props":5190,"children":5191},{"class":323,"line":353},[5192,5197,5201,5206],{"type":283,"tag":321,"props":5193,"children":5194},{"style":5170},[5195],{"type":293,"value":5196},"  \"license\"",{"type":283,"tag":321,"props":5198,"children":5199},{"style":334},[5200],{"type":293,"value":364},{"type":283,"tag":321,"props":5202,"children":5203},{"style":5180},[5204],{"type":293,"value":5205},"\"MIT\"",{"type":283,"tag":321,"props":5207,"children":5208},{"style":334},[5209],{"type":293,"value":5188},{"type":283,"tag":321,"props":5211,"children":5212},{"class":323,"line":373},[5213,5218,5222,5227],{"type":283,"tag":321,"props":5214,"children":5215},{"style":5170},[5216],{"type":293,"value":5217},"  \"type\"",{"type":283,"tag":321,"props":5219,"children":5220},{"style":334},[5221],{"type":293,"value":364},{"type":283,"tag":321,"props":5223,"children":5224},{"style":5180},[5225],{"type":293,"value":5226},"\"project\"",{"type":283,"tag":321,"props":5228,"children":5229},{"style":334},[5230],{"type":293,"value":5188},{"type":283,"tag":321,"props":5232,"children":5233},{"class":323,"line":308},[5234,5239],{"type":283,"tag":321,"props":5235,"children":5236},{"style":5170},[5237],{"type":293,"value":5238},"  \"require\"",{"type":283,"tag":321,"props":5240,"children":5241},{"style":334},[5242],{"type":293,"value":5243},": {\n",{"type":283,"tag":321,"props":5245,"children":5246},{"class":323,"line":309},[5247,5252,5256,5261],{"type":283,"tag":321,"props":5248,"children":5249},{"style":5170},[5250],{"type":293,"value":5251},"    \"composer-runtime-api\"",{"type":283,"tag":321,"props":5253,"children":5254},{"style":334},[5255],{"type":293,"value":364},{"type":283,"tag":321,"props":5257,"children":5258},{"style":5180},[5259],{"type":293,"value":5260},"\"^2.0\"",{"type":283,"tag":321,"props":5262,"children":5263},{"style":334},[5264],{"type":293,"value":5188},{"type":283,"tag":321,"props":5266,"children":5267},{"class":323,"line":310},[5268,5273,5277,5282],{"type":283,"tag":321,"props":5269,"children":5270},{"style":5170},[5271],{"type":293,"value":5272},"    \"acme/sample-plugin\"",{"type":283,"tag":321,"props":5274,"children":5275},{"style":334},[5276],{"type":293,"value":364},{"type":283,"tag":321,"props":5278,"children":5279},{"style":5180},[5280],{"type":293,"value":5281},"\"^1.0\"",{"type":283,"tag":321,"props":5283,"children":5284},{"style":334},[5285],{"type":293,"value":5188},{"type":283,"tag":321,"props":5287,"children":5288},{"class":323,"line":311},[5289,5294,5298,5303],{"type":283,"tag":321,"props":5290,"children":5291},{"style":5170},[5292],{"type":293,"value":5293},"    \"shopware/administration\"",{"type":283,"tag":321,"props":5295,"children":5296},{"style":334},[5297],{"type":293,"value":364},{"type":283,"tag":321,"props":5299,"children":5300},{"style":5180},[5301],{"type":293,"value":5302},"\"*\"",{"type":283,"tag":321,"props":5304,"children":5305},{"style":334},[5306],{"type":293,"value":5188},{"type":283,"tag":321,"props":5308,"children":5309},{"class":323,"line":312},[5310,5315,5319,5324],{"type":283,"tag":321,"props":5311,"children":5312},{"style":5170},[5313],{"type":293,"value":5314},"    \"shopware/core\"",{"type":283,"tag":321,"props":5316,"children":5317},{"style":334},[5318],{"type":293,"value":364},{"type":283,"tag":321,"props":5320,"children":5321},{"style":5180},[5322],{"type":293,"value":5323},"\"6.6.10.2\"",{"type":283,"tag":321,"props":5325,"children":5326},{"style":334},[5327],{"type":293,"value":5188},{"type":283,"tag":321,"props":5329,"children":5330},{"class":323,"line":977},[5331,5336,5340,5344],{"type":283,"tag":321,"props":5332,"children":5333},{"style":5170},[5334],{"type":293,"value":5335},"    \"shopware/elasticsearch\"",{"type":283,"tag":321,"props":5337,"children":5338},{"style":334},[5339],{"type":293,"value":364},{"type":283,"tag":321,"props":5341,"children":5342},{"style":5180},[5343],{"type":293,"value":5302},{"type":283,"tag":321,"props":5345,"children":5346},{"style":334},[5347],{"type":293,"value":5188},{"type":283,"tag":321,"props":5349,"children":5350},{"class":323,"line":990},[5351,5356,5360,5364],{"type":283,"tag":321,"props":5352,"children":5353},{"style":5170},[5354],{"type":293,"value":5355},"    \"shopware/storefront\"",{"type":283,"tag":321,"props":5357,"children":5358},{"style":334},[5359],{"type":293,"value":364},{"type":283,"tag":321,"props":5361,"children":5362},{"style":5180},[5363],{"type":293,"value":5302},{"type":283,"tag":321,"props":5365,"children":5366},{"style":334},[5367],{"type":293,"value":5188},{"type":283,"tag":321,"props":5369,"children":5370},{"class":323,"line":1003},[5371,5376,5380],{"type":283,"tag":321,"props":5372,"children":5373},{"style":5170},[5374],{"type":293,"value":5375},"    \"symfony/flex\"",{"type":283,"tag":321,"props":5377,"children":5378},{"style":334},[5379],{"type":293,"value":364},{"type":283,"tag":321,"props":5381,"children":5382},{"style":5180},[5383],{"type":293,"value":5384},"\"~2\"\n",{"type":283,"tag":321,"props":5386,"children":5387},{"class":323,"line":1016},[5388],{"type":283,"tag":321,"props":5389,"children":5390},{"style":334},[5391],{"type":293,"value":5392},"  },\n",{"type":283,"tag":321,"props":5394,"children":5395},{"class":323,"line":1029},[5396,5401],{"type":283,"tag":321,"props":5397,"children":5398},{"style":5170},[5399],{"type":293,"value":5400},"  \"repositories\"",{"type":283,"tag":321,"props":5402,"children":5403},{"style":334},[5404],{"type":293,"value":5405},": [\n",{"type":283,"tag":321,"props":5407,"children":5408},{"class":323,"line":1042},[5409],{"type":283,"tag":321,"props":5410,"children":5411},{"style":334},[5412],{"type":293,"value":5413},"    {\n",{"type":283,"tag":321,"props":5415,"children":5416},{"class":323,"line":1052},[5417,5422,5426,5431],{"type":283,"tag":321,"props":5418,"children":5419},{"style":5170},[5420],{"type":293,"value":5421},"      \"type\"",{"type":283,"tag":321,"props":5423,"children":5424},{"style":334},[5425],{"type":293,"value":364},{"type":283,"tag":321,"props":5427,"children":5428},{"style":5180},[5429],{"type":293,"value":5430},"\"path\"",{"type":283,"tag":321,"props":5432,"children":5433},{"style":334},[5434],{"type":293,"value":5188},{"type":283,"tag":321,"props":5436,"children":5437},{"class":323,"line":1065},[5438,5443,5447,5452],{"type":283,"tag":321,"props":5439,"children":5440},{"style":5170},[5441],{"type":293,"value":5442},"      \"url\"",{"type":283,"tag":321,"props":5444,"children":5445},{"style":334},[5446],{"type":293,"value":364},{"type":283,"tag":321,"props":5448,"children":5449},{"style":5180},[5450],{"type":293,"value":5451},"\"custom/plugins/*\"",{"type":283,"tag":321,"props":5453,"children":5454},{"style":334},[5455],{"type":293,"value":5188},{"type":283,"tag":321,"props":5457,"children":5458},{"class":323,"line":1078},[5459,5464],{"type":283,"tag":321,"props":5460,"children":5461},{"style":5170},[5462],{"type":293,"value":5463},"      \"options\"",{"type":283,"tag":321,"props":5465,"children":5466},{"style":334},[5467],{"type":293,"value":5243},{"type":283,"tag":321,"props":5469,"children":5470},{"class":323,"line":1087},[5471,5476,5480],{"type":283,"tag":321,"props":5472,"children":5473},{"style":5170},[5474],{"type":293,"value":5475},"        \"symlink\"",{"type":283,"tag":321,"props":5477,"children":5478},{"style":334},[5479],{"type":293,"value":364},{"type":283,"tag":321,"props":5481,"children":5482},{"style":1730},[5483],{"type":293,"value":4912},{"type":283,"tag":321,"props":5485,"children":5486},{"class":323,"line":1100},[5487],{"type":283,"tag":321,"props":5488,"children":5489},{"style":334},[5490],{"type":293,"value":5491},"      }\n",{"type":283,"tag":321,"props":5493,"children":5494},{"class":323,"line":1113},[5495],{"type":283,"tag":321,"props":5496,"children":5497},{"style":334},[5498],{"type":293,"value":5499},"    },\n",{"type":283,"tag":321,"props":5501,"children":5502},{"class":323,"line":1126},[5503],{"type":283,"tag":321,"props":5504,"children":5505},{"style":334},[5506],{"type":293,"value":5413},{"type":283,"tag":321,"props":5508,"children":5509},{"class":323,"line":1134},[5510,5514,5518,5522],{"type":283,"tag":321,"props":5511,"children":5512},{"style":5170},[5513],{"type":293,"value":5421},{"type":283,"tag":321,"props":5515,"children":5516},{"style":334},[5517],{"type":293,"value":364},{"type":283,"tag":321,"props":5519,"children":5520},{"style":5180},[5521],{"type":293,"value":5430},{"type":283,"tag":321,"props":5523,"children":5524},{"style":334},[5525],{"type":293,"value":5188},{"type":283,"tag":321,"props":5527,"children":5528},{"class":323,"line":1147},[5529,5533,5537,5542],{"type":283,"tag":321,"props":5530,"children":5531},{"style":5170},[5532],{"type":293,"value":5442},{"type":283,"tag":321,"props":5534,"children":5535},{"style":334},[5536],{"type":293,"value":364},{"type":283,"tag":321,"props":5538,"children":5539},{"style":5180},[5540],{"type":293,"value":5541},"\"custom/plugins/*/packages/*\"",{"type":283,"tag":321,"props":5543,"children":5544},{"style":334},[5545],{"type":293,"value":5188},{"type":283,"tag":321,"props":5547,"children":5548},{"class":323,"line":1160},[5549,5553],{"type":283,"tag":321,"props":5550,"children":5551},{"style":5170},[5552],{"type":293,"value":5463},{"type":283,"tag":321,"props":5554,"children":5555},{"style":334},[5556],{"type":293,"value":5243},{"type":283,"tag":321,"props":5558,"children":5559},{"class":323,"line":1173},[5560,5564,5568],{"type":283,"tag":321,"props":5561,"children":5562},{"style":5170},[5563],{"type":293,"value":5475},{"type":283,"tag":321,"props":5565,"children":5566},{"style":334},[5567],{"type":293,"value":364},{"type":283,"tag":321,"props":5569,"children":5570},{"style":1730},[5571],{"type":293,"value":4912},{"type":283,"tag":321,"props":5573,"children":5574},{"class":323,"line":1186},[5575],{"type":283,"tag":321,"props":5576,"children":5577},{"style":334},[5578],{"type":293,"value":5491},{"type":283,"tag":321,"props":5580,"children":5581},{"class":323,"line":1199},[5582],{"type":283,"tag":321,"props":5583,"children":5584},{"style":334},[5585],{"type":293,"value":5499},{"type":283,"tag":321,"props":5587,"children":5588},{"class":323,"line":2160},[5589],{"type":283,"tag":321,"props":5590,"children":5591},{"style":334},[5592],{"type":293,"value":5413},{"type":283,"tag":321,"props":5594,"children":5595},{"class":323,"line":2161},[5596,5600,5604,5608],{"type":283,"tag":321,"props":5597,"children":5598},{"style":5170},[5599],{"type":293,"value":5421},{"type":283,"tag":321,"props":5601,"children":5602},{"style":334},[5603],{"type":293,"value":364},{"type":283,"tag":321,"props":5605,"children":5606},{"style":5180},[5607],{"type":293,"value":5430},{"type":283,"tag":321,"props":5609,"children":5610},{"style":334},[5611],{"type":293,"value":5188},{"type":283,"tag":321,"props":5613,"children":5614},{"class":323,"line":2162},[5615,5619,5623,5628],{"type":283,"tag":321,"props":5616,"children":5617},{"style":5170},[5618],{"type":293,"value":5442},{"type":283,"tag":321,"props":5620,"children":5621},{"style":334},[5622],{"type":293,"value":364},{"type":283,"tag":321,"props":5624,"children":5625},{"style":5180},[5626],{"type":293,"value":5627},"\"custom/static-plugins/*\"",{"type":283,"tag":321,"props":5629,"children":5630},{"style":334},[5631],{"type":293,"value":5188},{"type":283,"tag":321,"props":5633,"children":5634},{"class":323,"line":2163},[5635,5639],{"type":283,"tag":321,"props":5636,"children":5637},{"style":5170},[5638],{"type":293,"value":5463},{"type":283,"tag":321,"props":5640,"children":5641},{"style":334},[5642],{"type":293,"value":5243},{"type":283,"tag":321,"props":5644,"children":5645},{"class":323,"line":2164},[5646,5650,5654],{"type":283,"tag":321,"props":5647,"children":5648},{"style":5170},[5649],{"type":293,"value":5475},{"type":283,"tag":321,"props":5651,"children":5652},{"style":334},[5653],{"type":293,"value":364},{"type":283,"tag":321,"props":5655,"children":5656},{"style":1730},[5657],{"type":293,"value":4912},{"type":283,"tag":321,"props":5659,"children":5660},{"class":323,"line":2165},[5661],{"type":283,"tag":321,"props":5662,"children":5663},{"style":334},[5664],{"type":293,"value":5491},{"type":283,"tag":321,"props":5666,"children":5667},{"class":323,"line":2166},[5668],{"type":283,"tag":321,"props":5669,"children":5670},{"style":334},[5671],{"type":293,"value":5499},{"type":283,"tag":321,"props":5673,"children":5675},{"class":5674,"line":2167},[323,387],[5676],{"type":283,"tag":321,"props":5677,"children":5678},{"style":334},[5679],{"type":293,"value":5413},{"type":283,"tag":321,"props":5681,"children":5683},{"class":5682,"line":2691},[323,387],[5684,5688,5692,5697],{"type":283,"tag":321,"props":5685,"children":5686},{"style":5170},[5687],{"type":293,"value":5421},{"type":283,"tag":321,"props":5689,"children":5690},{"style":334},[5691],{"type":293,"value":364},{"type":283,"tag":321,"props":5693,"children":5694},{"style":5180},[5695],{"type":293,"value":5696},"\"git\"",{"type":283,"tag":321,"props":5698,"children":5699},{"style":334},[5700],{"type":293,"value":5188},{"type":283,"tag":321,"props":5702,"children":5704},{"class":5703,"line":2168},[323,387],[5705,5709,5713],{"type":283,"tag":321,"props":5706,"children":5707},{"style":5170},[5708],{"type":293,"value":5442},{"type":283,"tag":321,"props":5710,"children":5711},{"style":334},[5712],{"type":293,"value":364},{"type":283,"tag":321,"props":5714,"children":5715},{"style":5180},[5716],{"type":293,"value":5717},"\"https://\u003CDOMAIN-NAME>/\u003Cgroup>/\u003Crepo>.git\"\n",{"type":283,"tag":321,"props":5719,"children":5721},{"class":5720,"line":2717},[323,387],[5722],{"type":283,"tag":321,"props":5723,"children":5724},{"style":334},[5725],{"type":293,"value":5726},"    }\n",{"type":283,"tag":321,"props":5728,"children":5729},{"class":323,"line":2725},[5730],{"type":283,"tag":321,"props":5731,"children":5732},{"style":334},[5733],{"type":293,"value":5734},"  ],\n",{"type":283,"tag":321,"props":5736,"children":5737},{"class":323,"line":2738},[5738,5743],{"type":283,"tag":321,"props":5739,"children":5740},{"style":5170},[5741],{"type":293,"value":5742},"  \"autoload\"",{"type":283,"tag":321,"props":5744,"children":5745},{"style":334},[5746],{"type":293,"value":5243},{"type":283,"tag":321,"props":5748,"children":5749},{"class":323,"line":2760},[5750,5755],{"type":283,"tag":321,"props":5751,"children":5752},{"style":5170},[5753],{"type":293,"value":5754},"    \"psr-4\"",{"type":283,"tag":321,"props":5756,"children":5757},{"style":334},[5758],{"type":293,"value":5243},{"type":283,"tag":321,"props":5760,"children":5761},{"class":323,"line":2773},[5762,5767,5773,5778,5782],{"type":283,"tag":321,"props":5763,"children":5764},{"style":5170},[5765],{"type":293,"value":5766},"      \"App",{"type":283,"tag":321,"props":5768,"children":5770},{"style":5769},"--shiki-default:#79B8FF;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#AE81FF;--shiki-sepia-font-style:italic",[5771],{"type":293,"value":5772},"\\\\",{"type":283,"tag":321,"props":5774,"children":5775},{"style":5170},[5776],{"type":293,"value":5777},"\"",{"type":283,"tag":321,"props":5779,"children":5780},{"style":334},[5781],{"type":293,"value":364},{"type":283,"tag":321,"props":5783,"children":5784},{"style":5180},[5785],{"type":293,"value":5786},"\"src/\"\n",{"type":283,"tag":321,"props":5788,"children":5789},{"class":323,"line":2787},[5790],{"type":283,"tag":321,"props":5791,"children":5792},{"style":334},[5793],{"type":293,"value":5726},{"type":283,"tag":321,"props":5795,"children":5796},{"class":323,"line":2805},[5797],{"type":283,"tag":321,"props":5798,"children":5799},{"style":334},[5800],{"type":293,"value":5392},{"type":283,"tag":321,"props":5802,"children":5803},{"class":323,"line":2818},[5804,5809,5813,5818],{"type":283,"tag":321,"props":5805,"children":5806},{"style":5170},[5807],{"type":293,"value":5808},"  \"prefer-stable\"",{"type":283,"tag":321,"props":5810,"children":5811},{"style":334},[5812],{"type":293,"value":364},{"type":283,"tag":321,"props":5814,"children":5815},{"style":1730},[5816],{"type":293,"value":5817},"true",{"type":283,"tag":321,"props":5819,"children":5820},{"style":334},[5821],{"type":293,"value":5188},{"type":283,"tag":321,"props":5823,"children":5824},{"class":323,"line":2831},[5825,5830],{"type":283,"tag":321,"props":5826,"children":5827},{"style":5170},[5828],{"type":293,"value":5829},"  \"config\"",{"type":283,"tag":321,"props":5831,"children":5832},{"style":334},[5833],{"type":293,"value":5243},{"type":283,"tag":321,"props":5835,"children":5836},{"class":323,"line":2844},[5837,5842],{"type":283,"tag":321,"props":5838,"children":5839},{"style":5170},[5840],{"type":293,"value":5841},"    \"allow-plugins\"",{"type":283,"tag":321,"props":5843,"children":5844},{"style":334},[5845],{"type":293,"value":5243},{"type":283,"tag":321,"props":5847,"children":5848},{"class":323,"line":2862},[5849,5854,5858,5862],{"type":283,"tag":321,"props":5850,"children":5851},{"style":5170},[5852],{"type":293,"value":5853},"      \"symfony/flex\"",{"type":283,"tag":321,"props":5855,"children":5856},{"style":334},[5857],{"type":293,"value":364},{"type":283,"tag":321,"props":5859,"children":5860},{"style":1730},[5861],{"type":293,"value":5817},{"type":283,"tag":321,"props":5863,"children":5864},{"style":334},[5865],{"type":293,"value":5188},{"type":283,"tag":321,"props":5867,"children":5868},{"class":323,"line":2880},[5869,5874,5878],{"type":283,"tag":321,"props":5870,"children":5871},{"style":5170},[5872],{"type":293,"value":5873},"      \"symfony/runtime\"",{"type":283,"tag":321,"props":5875,"children":5876},{"style":334},[5877],{"type":293,"value":364},{"type":283,"tag":321,"props":5879,"children":5880},{"style":1730},[5881],{"type":293,"value":4912},{"type":283,"tag":321,"props":5883,"children":5884},{"class":323,"line":2893},[5885],{"type":283,"tag":321,"props":5886,"children":5887},{"style":334},[5888],{"type":293,"value":5499},{"type":283,"tag":321,"props":5890,"children":5891},{"class":323,"line":2913},[5892,5897,5901,5905],{"type":283,"tag":321,"props":5893,"children":5894},{"style":5170},[5895],{"type":293,"value":5896},"    \"optimize-autoloader\"",{"type":283,"tag":321,"props":5898,"children":5899},{"style":334},[5900],{"type":293,"value":364},{"type":283,"tag":321,"props":5902,"children":5903},{"style":1730},[5904],{"type":293,"value":5817},{"type":283,"tag":321,"props":5906,"children":5907},{"style":334},[5908],{"type":293,"value":5188},{"type":283,"tag":321,"props":5910,"children":5911},{"class":323,"line":2933},[5912,5917,5921],{"type":283,"tag":321,"props":5913,"children":5914},{"style":5170},[5915],{"type":293,"value":5916},"    \"sort-packages\"",{"type":283,"tag":321,"props":5918,"children":5919},{"style":334},[5920],{"type":293,"value":364},{"type":283,"tag":321,"props":5922,"children":5923},{"style":1730},[5924],{"type":293,"value":4912},{"type":283,"tag":321,"props":5926,"children":5927},{"class":323,"line":2950},[5928],{"type":283,"tag":321,"props":5929,"children":5930},{"style":334},[5931],{"type":293,"value":5392},{"type":283,"tag":321,"props":5933,"children":5934},{"class":323,"line":3720},[5935,5940],{"type":283,"tag":321,"props":5936,"children":5937},{"style":5170},[5938],{"type":293,"value":5939},"  \"scripts\"",{"type":283,"tag":321,"props":5941,"children":5942},{"style":334},[5943],{"type":293,"value":5243},{"type":283,"tag":321,"props":5945,"children":5946},{"class":323,"line":3728},[5947,5952],{"type":283,"tag":321,"props":5948,"children":5949},{"style":5170},[5950],{"type":293,"value":5951},"    \"auto-scripts\"",{"type":283,"tag":321,"props":5953,"children":5954},{"style":334},[5955],{"type":293,"value":5243},{"type":283,"tag":321,"props":5957,"children":5958},{"class":323,"line":3740},[5959,5964,5968],{"type":283,"tag":321,"props":5960,"children":5961},{"style":5170},[5962],{"type":293,"value":5963},"      \"assets:install\"",{"type":283,"tag":321,"props":5965,"children":5966},{"style":334},[5967],{"type":293,"value":364},{"type":283,"tag":321,"props":5969,"children":5970},{"style":5180},[5971],{"type":293,"value":5972},"\"symfony-cmd\"\n",{"type":283,"tag":321,"props":5974,"children":5975},{"class":323,"line":3752},[5976],{"type":283,"tag":321,"props":5977,"children":5978},{"style":334},[5979],{"type":293,"value":5499},{"type":283,"tag":321,"props":5981,"children":5982},{"class":323,"line":3768},[5983,5988],{"type":283,"tag":321,"props":5984,"children":5985},{"style":5170},[5986],{"type":293,"value":5987},"    \"post-install-cmd\"",{"type":283,"tag":321,"props":5989,"children":5990},{"style":334},[5991],{"type":293,"value":5405},{"type":283,"tag":321,"props":5993,"children":5994},{"class":323,"line":3788},[5995],{"type":283,"tag":321,"props":5996,"children":5997},{"style":5180},[5998],{"type":293,"value":5999},"      \"@auto-scripts\"\n",{"type":283,"tag":321,"props":6001,"children":6002},{"class":323,"line":3804},[6003],{"type":283,"tag":321,"props":6004,"children":6005},{"style":334},[6006],{"type":293,"value":6007},"    ],\n",{"type":283,"tag":321,"props":6009,"children":6010},{"class":323,"line":3816},[6011,6016],{"type":283,"tag":321,"props":6012,"children":6013},{"style":5170},[6014],{"type":293,"value":6015},"    \"post-update-cmd\"",{"type":283,"tag":321,"props":6017,"children":6018},{"style":334},[6019],{"type":293,"value":5405},{"type":283,"tag":321,"props":6021,"children":6022},{"class":323,"line":3828},[6023],{"type":283,"tag":321,"props":6024,"children":6025},{"style":5180},[6026],{"type":293,"value":5999},{"type":283,"tag":321,"props":6028,"children":6029},{"class":323,"line":3840},[6030],{"type":283,"tag":321,"props":6031,"children":6032},{"style":334},[6033],{"type":293,"value":6034},"    ]\n",{"type":283,"tag":321,"props":6036,"children":6037},{"class":323,"line":3852},[6038],{"type":283,"tag":321,"props":6039,"children":6040},{"style":334},[6041],{"type":293,"value":5392},{"type":283,"tag":321,"props":6043,"children":6044},{"class":323,"line":3868},[6045,6050],{"type":283,"tag":321,"props":6046,"children":6047},{"style":5170},[6048],{"type":293,"value":6049},"  \"extra\"",{"type":283,"tag":321,"props":6051,"children":6052},{"style":334},[6053],{"type":293,"value":5243},{"type":283,"tag":321,"props":6055,"children":6056},{"class":323,"line":3880},[6057,6062],{"type":283,"tag":321,"props":6058,"children":6059},{"style":5170},[6060],{"type":293,"value":6061},"    \"symfony\"",{"type":283,"tag":321,"props":6063,"children":6064},{"style":334},[6065],{"type":293,"value":5243},{"type":283,"tag":321,"props":6067,"children":6068},{"class":323,"line":3900},[6069,6074,6078,6082],{"type":283,"tag":321,"props":6070,"children":6071},{"style":5170},[6072],{"type":293,"value":6073},"      \"allow-contrib\"",{"type":283,"tag":321,"props":6075,"children":6076},{"style":334},[6077],{"type":293,"value":364},{"type":283,"tag":321,"props":6079,"children":6080},{"style":1730},[6081],{"type":293,"value":5817},{"type":283,"tag":321,"props":6083,"children":6084},{"style":334},[6085],{"type":293,"value":5188},{"type":283,"tag":321,"props":6087,"children":6088},{"class":323,"line":3920},[6089,6094],{"type":283,"tag":321,"props":6090,"children":6091},{"style":5170},[6092],{"type":293,"value":6093},"      \"endpoint\"",{"type":283,"tag":321,"props":6095,"children":6096},{"style":334},[6097],{"type":293,"value":5405},{"type":283,"tag":321,"props":6099,"children":6100},{"class":323,"line":3936},[6101,6106],{"type":283,"tag":321,"props":6102,"children":6103},{"style":5180},[6104],{"type":293,"value":6105},"        \"https://raw.githubusercontent.com/shopware/recipes/flex/main/index.json\"",{"type":283,"tag":321,"props":6107,"children":6108},{"style":334},[6109],{"type":293,"value":5188},{"type":283,"tag":321,"props":6111,"children":6113},{"class":323,"line":6112},71,[6114],{"type":283,"tag":321,"props":6115,"children":6116},{"style":5180},[6117],{"type":293,"value":6118},"        \"flex://defaults\"\n",{"type":283,"tag":321,"props":6120,"children":6122},{"class":323,"line":6121},72,[6123],{"type":283,"tag":321,"props":6124,"children":6125},{"style":334},[6126],{"type":293,"value":6127},"      ]\n",{"type":283,"tag":321,"props":6129,"children":6131},{"class":323,"line":6130},73,[6132],{"type":283,"tag":321,"props":6133,"children":6134},{"style":334},[6135],{"type":293,"value":5726},{"type":283,"tag":321,"props":6137,"children":6139},{"class":323,"line":6138},74,[6140],{"type":283,"tag":321,"props":6141,"children":6142},{"style":334},[6143],{"type":293,"value":6144},"  }\n",{"type":283,"tag":321,"props":6146,"children":6148},{"class":323,"line":6147},75,[6149],{"type":283,"tag":321,"props":6150,"children":6151},{"style":334},[6152],{"type":293,"value":6153},"}\n",{"type":283,"tag":284,"props":6155,"children":6156},{},[6157],{"type":293,"value":6158},"und installieren es mit",{"type":283,"tag":303,"props":6160,"children":6162},{"className":1705,"code":6161,"language":1704,"meta":8,"style":8},"composer req acme/sample-plugin\n",[6163],{"type":283,"tag":317,"props":6164,"children":6165},{"__ignoreMap":8},[6166],{"type":283,"tag":321,"props":6167,"children":6168},{"class":323,"line":324},[6169,6173,6178],{"type":283,"tag":321,"props":6170,"children":6171},{"style":1715},[6172],{"type":293,"value":5144},{"type":283,"tag":321,"props":6174,"children":6175},{"style":367},[6176],{"type":293,"value":6177}," req",{"type":283,"tag":321,"props":6179,"children":6180},{"style":367},[6181],{"type":293,"value":6182}," acme/sample-plugin\n",{"type":283,"tag":6184,"props":6185,"children":6187},"v-alert",{"type":6186},"error",[6188],{"type":283,"tag":284,"props":6189,"children":6190},{},[6191],{"type":293,"value":6192},"Could not find a version of package acme/sample-plugin matching your minimum-stability (stable).\nRequire it with an explicit version constraint allowing its desired stability.",{"type":283,"tag":1321,"props":6194,"children":6195},{},[],{"type":283,"tag":284,"props":6197,"children":6198},{},[6199,6201,6207],{"type":293,"value":6200},"Ja... das ist der Nachteil. Wir müssen ",{"type":283,"tag":317,"props":6202,"children":6204},{"className":6203},[],[6205],{"type":293,"value":6206},"dev-master",{"type":293,"value":6208}," als Version verwenden",{"type":283,"tag":303,"props":6210,"children":6212},{"className":1705,"code":6211,"language":1704,"meta":8,"style":8},"composer req acme/sample-plugin:dev-master\n",[6213],{"type":283,"tag":317,"props":6214,"children":6215},{"__ignoreMap":8},[6216],{"type":283,"tag":321,"props":6217,"children":6218},{"class":323,"line":324},[6219,6223,6227],{"type":283,"tag":321,"props":6220,"children":6221},{"style":1715},[6222],{"type":293,"value":5144},{"type":283,"tag":321,"props":6224,"children":6225},{"style":367},[6226],{"type":293,"value":6177},{"type":283,"tag":321,"props":6228,"children":6229},{"style":367},[6230],{"type":293,"value":6231}," acme/sample-plugin:dev-master\n",{"type":283,"tag":303,"props":6233,"children":6237},{"className":6234,"code":6235,"language":6236,"meta":8,"style":8},"language-output shiki shiki-themes github-dark github-dark monokai","./composer.json has been updated\nRunning composer update acme/sample-plugin\nLoading composer repositories with package information                                                                \nUpdating dependencies                                 \nLock file operations: 1 install, 0 updates, 0 removals\n  - Locking acme/sample-plugin (dev-master 294414d)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 1 install, 0 updates, 0 removals\n  - Syncing acme/sample-plugin (dev-master 294414d) into cache\n  - Installing acme/sample-plugin (dev-master 294414d): Cloning 294414deb2 from cache\nGenerating optimized autoload files\n\nRun composer recipes at any time to see the status of your Symfony recipes.\n\nExecuting script assets:install [OK]\n","output",[6238],{"type":283,"tag":317,"props":6239,"children":6240},{"__ignoreMap":8},[6241,6249,6257,6265,6273,6281,6289,6297,6305,6313,6321,6329,6337,6344,6352,6359],{"type":283,"tag":321,"props":6242,"children":6243},{"class":323,"line":324},[6244],{"type":283,"tag":321,"props":6245,"children":6246},{},[6247],{"type":293,"value":6248},"./composer.json has been updated\n",{"type":283,"tag":321,"props":6250,"children":6251},{"class":323,"line":340},[6252],{"type":283,"tag":321,"props":6253,"children":6254},{},[6255],{"type":293,"value":6256},"Running composer update acme/sample-plugin\n",{"type":283,"tag":321,"props":6258,"children":6259},{"class":323,"line":353},[6260],{"type":283,"tag":321,"props":6261,"children":6262},{},[6263],{"type":293,"value":6264},"Loading composer repositories with package information                                                                \n",{"type":283,"tag":321,"props":6266,"children":6267},{"class":323,"line":373},[6268],{"type":283,"tag":321,"props":6269,"children":6270},{},[6271],{"type":293,"value":6272},"Updating dependencies                                 \n",{"type":283,"tag":321,"props":6274,"children":6275},{"class":323,"line":308},[6276],{"type":283,"tag":321,"props":6277,"children":6278},{},[6279],{"type":293,"value":6280},"Lock file operations: 1 install, 0 updates, 0 removals\n",{"type":283,"tag":321,"props":6282,"children":6283},{"class":323,"line":309},[6284],{"type":283,"tag":321,"props":6285,"children":6286},{},[6287],{"type":293,"value":6288},"  - Locking acme/sample-plugin (dev-master 294414d)\n",{"type":283,"tag":321,"props":6290,"children":6291},{"class":323,"line":310},[6292],{"type":283,"tag":321,"props":6293,"children":6294},{},[6295],{"type":293,"value":6296},"Writing lock file\n",{"type":283,"tag":321,"props":6298,"children":6299},{"class":323,"line":311},[6300],{"type":283,"tag":321,"props":6301,"children":6302},{},[6303],{"type":293,"value":6304},"Installing dependencies from lock file (including require-dev)\n",{"type":283,"tag":321,"props":6306,"children":6307},{"class":323,"line":312},[6308],{"type":283,"tag":321,"props":6309,"children":6310},{},[6311],{"type":293,"value":6312},"Package operations: 1 install, 0 updates, 0 removals\n",{"type":283,"tag":321,"props":6314,"children":6315},{"class":323,"line":977},[6316],{"type":283,"tag":321,"props":6317,"children":6318},{},[6319],{"type":293,"value":6320},"  - Syncing acme/sample-plugin (dev-master 294414d) into cache\n",{"type":283,"tag":321,"props":6322,"children":6323},{"class":323,"line":990},[6324],{"type":283,"tag":321,"props":6325,"children":6326},{},[6327],{"type":293,"value":6328},"  - Installing acme/sample-plugin (dev-master 294414d): Cloning 294414deb2 from cache\n",{"type":283,"tag":321,"props":6330,"children":6331},{"class":323,"line":1003},[6332],{"type":283,"tag":321,"props":6333,"children":6334},{},[6335],{"type":293,"value":6336},"Generating optimized autoload files\n",{"type":283,"tag":321,"props":6338,"children":6339},{"class":323,"line":1016},[6340],{"type":283,"tag":321,"props":6341,"children":6342},{"emptyLinePlaceholder":1046},[6343],{"type":293,"value":1049},{"type":283,"tag":321,"props":6345,"children":6346},{"class":323,"line":1029},[6347],{"type":283,"tag":321,"props":6348,"children":6349},{},[6350],{"type":293,"value":6351},"Run composer recipes at any time to see the status of your Symfony recipes.\n",{"type":283,"tag":321,"props":6353,"children":6354},{"class":323,"line":1042},[6355],{"type":283,"tag":321,"props":6356,"children":6357},{"emptyLinePlaceholder":1046},[6358],{"type":293,"value":1049},{"type":283,"tag":321,"props":6360,"children":6361},{"class":323,"line":1052},[6362],{"type":283,"tag":321,"props":6363,"children":6364},{},[6365],{"type":293,"value":6366},"Executing script assets:install [OK]\n",{"type":283,"tag":284,"props":6368,"children":6369},{},[6370,6372,6377],{"type":293,"value":6371},"Composer wird ",{"type":283,"tag":317,"props":6373,"children":6375},{"className":6374},[],[6376],{"type":293,"value":555},{"type":293,"value":6378}," verwenden, um unser Repository zu klonen, und den Standard-Branch sowie den Commit-Hash verwenden, um den Release zu verfolgen.",{"type":283,"tag":284,"props":6380,"children":6381},{},[6382],{"type":293,"value":6383},"Das funktioniert, aber wir können es besser machen.",{"type":283,"tag":1252,"props":6385,"children":6387},{"id":6386},"git-tags",[6388],{"type":293,"value":6389},"Git Tags",{"type":283,"tag":284,"props":6391,"children":6392},{},[6393,6395,6401],{"type":293,"value":6394},"Wir taggen nun unser Plugin als ",{"type":283,"tag":317,"props":6396,"children":6398},{"className":6397},[],[6399],{"type":293,"value":6400},"v1.0.0",{"type":293,"value":1302},{"type":283,"tag":284,"props":6403,"children":6404},{},[6405,6407,6413,6415,6421],{"type":293,"value":6406},"Bitte beachten, dass Sie die ",{"type":283,"tag":317,"props":6408,"children":6410},{"className":6409},[],[6411],{"type":293,"value":6412},"version",{"type":293,"value":6414}," in der ",{"type":283,"tag":317,"props":6416,"children":6418},{"className":6417},[],[6419],{"type":293,"value":6420},"composer.json",{"type":293,"value":6422}," gesetzt ist.",{"type":283,"tag":303,"props":6424,"children":6428},{"className":5149,"code":6425,"filename":6426,"highlights":6427,"language":1596,"meta":8,"style":8},"{\n    \"name\": \"acme/sample-plugin\",\n    \"description\": \"acme/sample-plugin\",\n    \"type\": \"shopware-platform-plugin\",\n    \"version\": \"1.0.0\",\n    \"license\": \"MIT\",\n    \"require\": {\n        \"shopware/core\": \"~6.6.0\"\n    },\n    \"extra\": {\n        \"shopware-plugin-class\": \"Acme\\\\SamplePlugin\",\n        \"label\": {\n            \"de-DE\": \"Skeleton plugin\",\n            \"en-GB\": \"Skeleton plugin\"\n        }\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Acme\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Acme\\\\Tests\\\\\": \"tests/\"\n        }\n    }\n}\n\n","\u003Cplugin-root>/composer.json",[308],[6429],{"type":283,"tag":317,"props":6430,"children":6431},{"__ignoreMap":8},[6432,6439,6460,6480,6501,6523,6543,6555,6572,6579,6591,6621,6633,6654,6671,6679,6686,6698,6710,6734,6741,6748,6760,6771,6804,6811,6818],{"type":283,"tag":321,"props":6433,"children":6434},{"class":323,"line":324},[6435],{"type":283,"tag":321,"props":6436,"children":6437},{"style":334},[6438],{"type":293,"value":5164},{"type":283,"tag":321,"props":6440,"children":6441},{"class":323,"line":340},[6442,6447,6451,6456],{"type":283,"tag":321,"props":6443,"children":6444},{"style":5170},[6445],{"type":293,"value":6446},"    \"name\"",{"type":283,"tag":321,"props":6448,"children":6449},{"style":334},[6450],{"type":293,"value":364},{"type":283,"tag":321,"props":6452,"children":6453},{"style":5180},[6454],{"type":293,"value":6455},"\"acme/sample-plugin\"",{"type":283,"tag":321,"props":6457,"children":6458},{"style":334},[6459],{"type":293,"value":5188},{"type":283,"tag":321,"props":6461,"children":6462},{"class":323,"line":353},[6463,6468,6472,6476],{"type":283,"tag":321,"props":6464,"children":6465},{"style":5170},[6466],{"type":293,"value":6467},"    \"description\"",{"type":283,"tag":321,"props":6469,"children":6470},{"style":334},[6471],{"type":293,"value":364},{"type":283,"tag":321,"props":6473,"children":6474},{"style":5180},[6475],{"type":293,"value":6455},{"type":283,"tag":321,"props":6477,"children":6478},{"style":334},[6479],{"type":293,"value":5188},{"type":283,"tag":321,"props":6481,"children":6482},{"class":323,"line":373},[6483,6488,6492,6497],{"type":283,"tag":321,"props":6484,"children":6485},{"style":5170},[6486],{"type":293,"value":6487},"    \"type\"",{"type":283,"tag":321,"props":6489,"children":6490},{"style":334},[6491],{"type":293,"value":364},{"type":283,"tag":321,"props":6493,"children":6494},{"style":5180},[6495],{"type":293,"value":6496},"\"shopware-platform-plugin\"",{"type":283,"tag":321,"props":6498,"children":6499},{"style":334},[6500],{"type":293,"value":5188},{"type":283,"tag":321,"props":6502,"children":6504},{"class":6503,"line":308},[323,387],[6505,6510,6514,6519],{"type":283,"tag":321,"props":6506,"children":6507},{"style":5170},[6508],{"type":293,"value":6509},"    \"version\"",{"type":283,"tag":321,"props":6511,"children":6512},{"style":334},[6513],{"type":293,"value":364},{"type":283,"tag":321,"props":6515,"children":6516},{"style":5180},[6517],{"type":293,"value":6518},"\"1.0.0\"",{"type":283,"tag":321,"props":6520,"children":6521},{"style":334},[6522],{"type":293,"value":5188},{"type":283,"tag":321,"props":6524,"children":6525},{"class":323,"line":309},[6526,6531,6535,6539],{"type":283,"tag":321,"props":6527,"children":6528},{"style":5170},[6529],{"type":293,"value":6530},"    \"license\"",{"type":283,"tag":321,"props":6532,"children":6533},{"style":334},[6534],{"type":293,"value":364},{"type":283,"tag":321,"props":6536,"children":6537},{"style":5180},[6538],{"type":293,"value":5205},{"type":283,"tag":321,"props":6540,"children":6541},{"style":334},[6542],{"type":293,"value":5188},{"type":283,"tag":321,"props":6544,"children":6545},{"class":323,"line":310},[6546,6551],{"type":283,"tag":321,"props":6547,"children":6548},{"style":5170},[6549],{"type":293,"value":6550},"    \"require\"",{"type":283,"tag":321,"props":6552,"children":6553},{"style":334},[6554],{"type":293,"value":5243},{"type":283,"tag":321,"props":6556,"children":6557},{"class":323,"line":311},[6558,6563,6567],{"type":283,"tag":321,"props":6559,"children":6560},{"style":5170},[6561],{"type":293,"value":6562},"        \"shopware/core\"",{"type":283,"tag":321,"props":6564,"children":6565},{"style":334},[6566],{"type":293,"value":364},{"type":283,"tag":321,"props":6568,"children":6569},{"style":5180},[6570],{"type":293,"value":6571},"\"~6.6.0\"\n",{"type":283,"tag":321,"props":6573,"children":6574},{"class":323,"line":312},[6575],{"type":283,"tag":321,"props":6576,"children":6577},{"style":334},[6578],{"type":293,"value":5499},{"type":283,"tag":321,"props":6580,"children":6581},{"class":323,"line":977},[6582,6587],{"type":283,"tag":321,"props":6583,"children":6584},{"style":5170},[6585],{"type":293,"value":6586},"    \"extra\"",{"type":283,"tag":321,"props":6588,"children":6589},{"style":334},[6590],{"type":293,"value":5243},{"type":283,"tag":321,"props":6592,"children":6593},{"class":323,"line":990},[6594,6599,6603,6608,6612,6617],{"type":283,"tag":321,"props":6595,"children":6596},{"style":5170},[6597],{"type":293,"value":6598},"        \"shopware-plugin-class\"",{"type":283,"tag":321,"props":6600,"children":6601},{"style":334},[6602],{"type":293,"value":364},{"type":283,"tag":321,"props":6604,"children":6605},{"style":5180},[6606],{"type":293,"value":6607},"\"Acme",{"type":283,"tag":321,"props":6609,"children":6610},{"style":1730},[6611],{"type":293,"value":5772},{"type":283,"tag":321,"props":6613,"children":6614},{"style":5180},[6615],{"type":293,"value":6616},"SamplePlugin\"",{"type":283,"tag":321,"props":6618,"children":6619},{"style":334},[6620],{"type":293,"value":5188},{"type":283,"tag":321,"props":6622,"children":6623},{"class":323,"line":1003},[6624,6629],{"type":283,"tag":321,"props":6625,"children":6626},{"style":5170},[6627],{"type":293,"value":6628},"        \"label\"",{"type":283,"tag":321,"props":6630,"children":6631},{"style":334},[6632],{"type":293,"value":5243},{"type":283,"tag":321,"props":6634,"children":6635},{"class":323,"line":1016},[6636,6641,6645,6650],{"type":283,"tag":321,"props":6637,"children":6638},{"style":5170},[6639],{"type":293,"value":6640},"            \"de-DE\"",{"type":283,"tag":321,"props":6642,"children":6643},{"style":334},[6644],{"type":293,"value":364},{"type":283,"tag":321,"props":6646,"children":6647},{"style":5180},[6648],{"type":293,"value":6649},"\"Skeleton plugin\"",{"type":283,"tag":321,"props":6651,"children":6652},{"style":334},[6653],{"type":293,"value":5188},{"type":283,"tag":321,"props":6655,"children":6656},{"class":323,"line":1029},[6657,6662,6666],{"type":283,"tag":321,"props":6658,"children":6659},{"style":5170},[6660],{"type":293,"value":6661},"            \"en-GB\"",{"type":283,"tag":321,"props":6663,"children":6664},{"style":334},[6665],{"type":293,"value":364},{"type":283,"tag":321,"props":6667,"children":6668},{"style":5180},[6669],{"type":293,"value":6670},"\"Skeleton plugin\"\n",{"type":283,"tag":321,"props":6672,"children":6673},{"class":323,"line":1042},[6674],{"type":283,"tag":321,"props":6675,"children":6676},{"style":334},[6677],{"type":293,"value":6678},"        }\n",{"type":283,"tag":321,"props":6680,"children":6681},{"class":323,"line":1052},[6682],{"type":283,"tag":321,"props":6683,"children":6684},{"style":334},[6685],{"type":293,"value":5499},{"type":283,"tag":321,"props":6687,"children":6688},{"class":323,"line":1065},[6689,6694],{"type":283,"tag":321,"props":6690,"children":6691},{"style":5170},[6692],{"type":293,"value":6693},"    \"autoload\"",{"type":283,"tag":321,"props":6695,"children":6696},{"style":334},[6697],{"type":293,"value":5243},{"type":283,"tag":321,"props":6699,"children":6700},{"class":323,"line":1078},[6701,6706],{"type":283,"tag":321,"props":6702,"children":6703},{"style":5170},[6704],{"type":293,"value":6705},"        \"psr-4\"",{"type":283,"tag":321,"props":6707,"children":6708},{"style":334},[6709],{"type":293,"value":5243},{"type":283,"tag":321,"props":6711,"children":6712},{"class":323,"line":1087},[6713,6718,6722,6726,6730],{"type":283,"tag":321,"props":6714,"children":6715},{"style":5170},[6716],{"type":293,"value":6717},"            \"Acme",{"type":283,"tag":321,"props":6719,"children":6720},{"style":5769},[6721],{"type":293,"value":5772},{"type":283,"tag":321,"props":6723,"children":6724},{"style":5170},[6725],{"type":293,"value":5777},{"type":283,"tag":321,"props":6727,"children":6728},{"style":334},[6729],{"type":293,"value":364},{"type":283,"tag":321,"props":6731,"children":6732},{"style":5180},[6733],{"type":293,"value":5786},{"type":283,"tag":321,"props":6735,"children":6736},{"class":323,"line":1100},[6737],{"type":283,"tag":321,"props":6738,"children":6739},{"style":334},[6740],{"type":293,"value":6678},{"type":283,"tag":321,"props":6742,"children":6743},{"class":323,"line":1113},[6744],{"type":283,"tag":321,"props":6745,"children":6746},{"style":334},[6747],{"type":293,"value":5499},{"type":283,"tag":321,"props":6749,"children":6750},{"class":323,"line":1126},[6751,6756],{"type":283,"tag":321,"props":6752,"children":6753},{"style":5170},[6754],{"type":293,"value":6755},"    \"autoload-dev\"",{"type":283,"tag":321,"props":6757,"children":6758},{"style":334},[6759],{"type":293,"value":5243},{"type":283,"tag":321,"props":6761,"children":6762},{"class":323,"line":1134},[6763,6767],{"type":283,"tag":321,"props":6764,"children":6765},{"style":5170},[6766],{"type":293,"value":6705},{"type":283,"tag":321,"props":6768,"children":6769},{"style":334},[6770],{"type":293,"value":5243},{"type":283,"tag":321,"props":6772,"children":6773},{"class":323,"line":1147},[6774,6778,6782,6787,6791,6795,6799],{"type":283,"tag":321,"props":6775,"children":6776},{"style":5170},[6777],{"type":293,"value":6717},{"type":283,"tag":321,"props":6779,"children":6780},{"style":5769},[6781],{"type":293,"value":5772},{"type":283,"tag":321,"props":6783,"children":6784},{"style":5170},[6785],{"type":293,"value":6786},"Tests",{"type":283,"tag":321,"props":6788,"children":6789},{"style":5769},[6790],{"type":293,"value":5772},{"type":283,"tag":321,"props":6792,"children":6793},{"style":5170},[6794],{"type":293,"value":5777},{"type":283,"tag":321,"props":6796,"children":6797},{"style":334},[6798],{"type":293,"value":364},{"type":283,"tag":321,"props":6800,"children":6801},{"style":5180},[6802],{"type":293,"value":6803},"\"tests/\"\n",{"type":283,"tag":321,"props":6805,"children":6806},{"class":323,"line":1160},[6807],{"type":283,"tag":321,"props":6808,"children":6809},{"style":334},[6810],{"type":293,"value":6678},{"type":283,"tag":321,"props":6812,"children":6813},{"class":323,"line":1173},[6814],{"type":283,"tag":321,"props":6815,"children":6816},{"style":334},[6817],{"type":293,"value":5726},{"type":283,"tag":321,"props":6819,"children":6820},{"class":323,"line":1186},[6821],{"type":283,"tag":321,"props":6822,"children":6823},{"style":334},[6824],{"type":293,"value":6153},{"type":283,"tag":303,"props":6826,"children":6828},{"className":1705,"code":6827,"language":1704,"meta":8,"style":8},"git tag v1.0.0\ngit push --tags\n",[6829],{"type":283,"tag":317,"props":6830,"children":6831},{"__ignoreMap":8},[6832,6849],{"type":283,"tag":321,"props":6833,"children":6834},{"class":323,"line":324},[6835,6839,6844],{"type":283,"tag":321,"props":6836,"children":6837},{"style":1715},[6838],{"type":293,"value":555},{"type":283,"tag":321,"props":6840,"children":6841},{"style":367},[6842],{"type":293,"value":6843}," tag",{"type":283,"tag":321,"props":6845,"children":6846},{"style":367},[6847],{"type":293,"value":6848}," v1.0.0\n",{"type":283,"tag":321,"props":6850,"children":6851},{"class":323,"line":340},[6852,6856,6861],{"type":283,"tag":321,"props":6853,"children":6854},{"style":1715},[6855],{"type":293,"value":555},{"type":283,"tag":321,"props":6857,"children":6858},{"style":367},[6859],{"type":293,"value":6860}," push",{"type":283,"tag":321,"props":6862,"children":6863},{"style":1730},[6864],{"type":293,"value":6865}," --tags\n",{"type":283,"tag":284,"props":6867,"children":6868},{},[6869],{"type":293,"value":6870},"Nun wird dies funktionieren:",{"type":283,"tag":303,"props":6872,"children":6873},{"className":1705,"code":6161,"language":1704,"meta":8,"style":8},[6874],{"type":283,"tag":317,"props":6875,"children":6876},{"__ignoreMap":8},[6877],{"type":283,"tag":321,"props":6878,"children":6879},{"class":323,"line":324},[6880,6884,6888],{"type":283,"tag":321,"props":6881,"children":6882},{"style":1715},[6883],{"type":293,"value":5144},{"type":283,"tag":321,"props":6885,"children":6886},{"style":367},[6887],{"type":293,"value":6177},{"type":283,"tag":321,"props":6889,"children":6890},{"style":367},[6891],{"type":293,"value":6182},{"type":283,"tag":303,"props":6893,"children":6897},{"className":6894,"code":6895,"language":6896,"meta":8,"style":8},"language-terminaloutput shiki shiki-themes github-dark github-dark monokai","./composer.json has been updated                                                                                                            \nRunning composer update acme/sample-plugin\nLoading composer repositories with package information\nUpdating dependencies\nLock file operations: 1 install, 0 updates, 0 removals\n  - Locking acme/sample-plugin (1.0.0)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 1 install, 0 updates, 0 removals\n  - Syncing acme/sample-plugin (1.0.0) into cache\n  - Installing acme/sample-plugin (1.0.0): Cloning 294414deb2 from cache\nGenerating optimized autoload files\n\nRun composer recipes at any time to see the status of your Symfony recipes.\n\nExecuting script assets:install [OK]\n\nUsing version ^1.0 for acme/sample-plugin\n","terminaloutput",[6898],{"type":283,"tag":317,"props":6899,"children":6900},{"__ignoreMap":8},[6901,6909,6916,6924,6932,6939,6947,6954,6961,6968,6976,6984,6991,6998,7005,7012,7019,7026],{"type":283,"tag":321,"props":6902,"children":6903},{"class":323,"line":324},[6904],{"type":283,"tag":321,"props":6905,"children":6906},{},[6907],{"type":293,"value":6908},"./composer.json has been updated                                                                                                            \n",{"type":283,"tag":321,"props":6910,"children":6911},{"class":323,"line":340},[6912],{"type":283,"tag":321,"props":6913,"children":6914},{},[6915],{"type":293,"value":6256},{"type":283,"tag":321,"props":6917,"children":6918},{"class":323,"line":353},[6919],{"type":283,"tag":321,"props":6920,"children":6921},{},[6922],{"type":293,"value":6923},"Loading composer repositories with package information\n",{"type":283,"tag":321,"props":6925,"children":6926},{"class":323,"line":373},[6927],{"type":283,"tag":321,"props":6928,"children":6929},{},[6930],{"type":293,"value":6931},"Updating dependencies\n",{"type":283,"tag":321,"props":6933,"children":6934},{"class":323,"line":308},[6935],{"type":283,"tag":321,"props":6936,"children":6937},{},[6938],{"type":293,"value":6280},{"type":283,"tag":321,"props":6940,"children":6941},{"class":323,"line":309},[6942],{"type":283,"tag":321,"props":6943,"children":6944},{},[6945],{"type":293,"value":6946},"  - Locking acme/sample-plugin (1.0.0)\n",{"type":283,"tag":321,"props":6948,"children":6949},{"class":323,"line":310},[6950],{"type":283,"tag":321,"props":6951,"children":6952},{},[6953],{"type":293,"value":6296},{"type":283,"tag":321,"props":6955,"children":6956},{"class":323,"line":311},[6957],{"type":283,"tag":321,"props":6958,"children":6959},{},[6960],{"type":293,"value":6304},{"type":283,"tag":321,"props":6962,"children":6963},{"class":323,"line":312},[6964],{"type":283,"tag":321,"props":6965,"children":6966},{},[6967],{"type":293,"value":6312},{"type":283,"tag":321,"props":6969,"children":6970},{"class":323,"line":977},[6971],{"type":283,"tag":321,"props":6972,"children":6973},{},[6974],{"type":293,"value":6975},"  - Syncing acme/sample-plugin (1.0.0) into cache\n",{"type":283,"tag":321,"props":6977,"children":6978},{"class":323,"line":990},[6979],{"type":283,"tag":321,"props":6980,"children":6981},{},[6982],{"type":293,"value":6983},"  - Installing acme/sample-plugin (1.0.0): Cloning 294414deb2 from cache\n",{"type":283,"tag":321,"props":6985,"children":6986},{"class":323,"line":1003},[6987],{"type":283,"tag":321,"props":6988,"children":6989},{},[6990],{"type":293,"value":6336},{"type":283,"tag":321,"props":6992,"children":6993},{"class":323,"line":1016},[6994],{"type":283,"tag":321,"props":6995,"children":6996},{"emptyLinePlaceholder":1046},[6997],{"type":293,"value":1049},{"type":283,"tag":321,"props":6999,"children":7000},{"class":323,"line":1029},[7001],{"type":283,"tag":321,"props":7002,"children":7003},{},[7004],{"type":293,"value":6351},{"type":283,"tag":321,"props":7006,"children":7007},{"class":323,"line":1042},[7008],{"type":283,"tag":321,"props":7009,"children":7010},{"emptyLinePlaceholder":1046},[7011],{"type":293,"value":1049},{"type":283,"tag":321,"props":7013,"children":7014},{"class":323,"line":1052},[7015],{"type":283,"tag":321,"props":7016,"children":7017},{},[7018],{"type":293,"value":6366},{"type":283,"tag":321,"props":7020,"children":7021},{"class":323,"line":1065},[7022],{"type":283,"tag":321,"props":7023,"children":7024},{"emptyLinePlaceholder":1046},[7025],{"type":293,"value":1049},{"type":283,"tag":321,"props":7027,"children":7028},{"class":323,"line":1078},[7029],{"type":283,"tag":321,"props":7030,"children":7031},{},[7032],{"type":293,"value":7033},"Using version ^1.0 for acme/sample-plugin\n",{"type":283,"tag":284,"props":7035,"children":7036},{},[7037,7039,7044],{"type":293,"value":7038},"Das ist besser, aber wir verwenden immer noch ",{"type":283,"tag":317,"props":7040,"children":7042},{"className":7041},[],[7043],{"type":293,"value":555},{"type":293,"value":7045},", um das Plugin abzurufen. Wir können es noch besser machen.",{"type":283,"tag":1252,"props":7047,"children":7049},{"id":7048},"gitlab-package-registry",[7050],{"type":293,"value":7051},"GitLab Package Registry",{"type":283,"tag":284,"props":7053,"children":7054},{},[7055,7057,7062],{"type":293,"value":7056},"Hier beginnt der GitLab-Teil. Weitere Details sind in der ",{"type":283,"tag":288,"props":7058,"children":7060},{"href":7059},"https://docs.gitlab.com/18.3/user/packages/composer_repository/",[7061],{"type":293,"value":4076},{"type":293,"value":7063}," zu finden.",{"type":283,"tag":284,"props":7065,"children":7066},{},[7067],{"type":293,"value":7068},"An dieser Stelle spielt es keine Rolle, ob unser Projekt öffentlich ist oder nicht, da wir uns ohnehin gegenüber der Package Registry authentifizieren müssen.",{"type":283,"tag":284,"props":7070,"children":7071},{},[7072,7074,7079],{"type":293,"value":7073},"Wir veröffentlichen unseren ",{"type":283,"tag":317,"props":7075,"children":7077},{"className":7076},[],[7078],{"type":293,"value":6400},{"type":293,"value":7080},"-Tag als Composer-Paket.",{"type":283,"tag":303,"props":7082,"children":7084},{"className":1705,"code":7083,"language":1704,"meta":8,"style":8},"curl --fail-with-body --data tag=v1.0.0 \"https://__token__:\u003Cpersonal-access-token>@\u003CDOMAIN-NAME>/api/v4/projects/\u003Cproject_id>/packages/composer\"\n",[7085],{"type":283,"tag":317,"props":7086,"children":7087},{"__ignoreMap":8},[7088],{"type":283,"tag":321,"props":7089,"children":7090},{"class":323,"line":324},[7091,7096,7101,7106,7111],{"type":283,"tag":321,"props":7092,"children":7093},{"style":1715},[7094],{"type":293,"value":7095},"curl",{"type":283,"tag":321,"props":7097,"children":7098},{"style":1730},[7099],{"type":293,"value":7100}," --fail-with-body",{"type":283,"tag":321,"props":7102,"children":7103},{"style":1730},[7104],{"type":293,"value":7105}," --data",{"type":283,"tag":321,"props":7107,"children":7108},{"style":367},[7109],{"type":293,"value":7110}," tag=v1.0.0",{"type":283,"tag":321,"props":7112,"children":7113},{"style":367},[7114],{"type":293,"value":7115}," \"https://__token__:\u003Cpersonal-access-token>@\u003CDOMAIN-NAME>/api/v4/projects/\u003Cproject_id>/packages/composer\"\n",{"type":283,"tag":284,"props":7117,"children":7118},{},[7119],{"type":293,"value":7120},"Nun müssen wir die Repository-Informationen aktualisieren:",{"type":283,"tag":303,"props":7122,"children":7125},{"className":5149,"code":7123,"filename":5151,"highlights":7124,"language":1596,"meta":8,"style":8},"{\n  \"name\": \"shopware/production\",\n  \"license\": \"MIT\",\n  \"type\": \"project\",\n  \"require\": {\n    \"composer-runtime-api\": \"^2.0\",\n    \"acme/sample-plugin\": \"^1.0\",\n    \"shopware/administration\": \"*\",\n    \"shopware/core\": \"6.6.10.2\",\n    \"shopware/elasticsearch\": \"*\",\n    \"shopware/storefront\": \"*\",\n    \"symfony/flex\": \"~2\"\n  },\n  \"repositories\": [\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/plugins/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/plugins/*/packages/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"path\",\n      \"url\": \"custom/static-plugins/*\",\n      \"options\": {\n        \"symlink\": true\n      }\n    },\n    {\n      \"type\": \"composer\",\n      \"url\": \"https://\u003CDOMAIN-NAME>/api/v4/api/v4/group/\u003Cgroup_id>/-/packages/composer/packages.json\"\n    }\n  ],\n  \"autoload\": {\n    \"psr-4\": {\n      \"App\\\\\": \"src/\"\n    }\n  },\n  \"prefer-stable\": true,\n  \"config\": {\n    \"allow-plugins\": {\n      \"symfony/flex\": true,\n      \"symfony/runtime\": true\n    },\n    \"optimize-autoloader\": true,\n    \"sort-packages\": true\n  },\n  \"scripts\": {\n    \"auto-scripts\": {\n      \"assets:install\": \"symfony-cmd\"\n    },\n    \"post-install-cmd\": [\n      \"@auto-scripts\"\n    ],\n    \"post-update-cmd\": [\n      \"@auto-scripts\"\n    ]\n  },\n  \"extra\": {\n    \"symfony\": {\n      \"allow-contrib\": true,\n      \"endpoint\": [\n        \"https://raw.githubusercontent.com/shopware/recipes/flex/main/index.json\",\n        \"flex://defaults\"\n      ]\n    }\n  }\n}\n",[2167,2691,2168,2717],[7126],{"type":283,"tag":317,"props":7127,"children":7128},{"__ignoreMap":8},[7129,7136,7155,7174,7193,7204,7223,7242,7261,7280,7299,7318,7333,7340,7351,7358,7377,7396,7407,7422,7429,7436,7443,7462,7481,7492,7507,7514,7521,7528,7547,7566,7577,7592,7599,7606,7614,7635,7652,7660,7667,7678,7689,7712,7719,7726,7745,7756,7767,7786,7801,7808,7827,7842,7849,7860,7871,7886,7893,7904,7911,7918,7929,7936,7943,7950,7961,7972,7991,8002,8013,8020,8027,8034,8041],{"type":283,"tag":321,"props":7130,"children":7131},{"class":323,"line":324},[7132],{"type":283,"tag":321,"props":7133,"children":7134},{"style":334},[7135],{"type":293,"value":5164},{"type":283,"tag":321,"props":7137,"children":7138},{"class":323,"line":340},[7139,7143,7147,7151],{"type":283,"tag":321,"props":7140,"children":7141},{"style":5170},[7142],{"type":293,"value":5173},{"type":283,"tag":321,"props":7144,"children":7145},{"style":334},[7146],{"type":293,"value":364},{"type":283,"tag":321,"props":7148,"children":7149},{"style":5180},[7150],{"type":293,"value":5183},{"type":283,"tag":321,"props":7152,"children":7153},{"style":334},[7154],{"type":293,"value":5188},{"type":283,"tag":321,"props":7156,"children":7157},{"class":323,"line":353},[7158,7162,7166,7170],{"type":283,"tag":321,"props":7159,"children":7160},{"style":5170},[7161],{"type":293,"value":5196},{"type":283,"tag":321,"props":7163,"children":7164},{"style":334},[7165],{"type":293,"value":364},{"type":283,"tag":321,"props":7167,"children":7168},{"style":5180},[7169],{"type":293,"value":5205},{"type":283,"tag":321,"props":7171,"children":7172},{"style":334},[7173],{"type":293,"value":5188},{"type":283,"tag":321,"props":7175,"children":7176},{"class":323,"line":373},[7177,7181,7185,7189],{"type":283,"tag":321,"props":7178,"children":7179},{"style":5170},[7180],{"type":293,"value":5217},{"type":283,"tag":321,"props":7182,"children":7183},{"style":334},[7184],{"type":293,"value":364},{"type":283,"tag":321,"props":7186,"children":7187},{"style":5180},[7188],{"type":293,"value":5226},{"type":283,"tag":321,"props":7190,"children":7191},{"style":334},[7192],{"type":293,"value":5188},{"type":283,"tag":321,"props":7194,"children":7195},{"class":323,"line":308},[7196,7200],{"type":283,"tag":321,"props":7197,"children":7198},{"style":5170},[7199],{"type":293,"value":5238},{"type":283,"tag":321,"props":7201,"children":7202},{"style":334},[7203],{"type":293,"value":5243},{"type":283,"tag":321,"props":7205,"children":7206},{"class":323,"line":309},[7207,7211,7215,7219],{"type":283,"tag":321,"props":7208,"children":7209},{"style":5170},[7210],{"type":293,"value":5251},{"type":283,"tag":321,"props":7212,"children":7213},{"style":334},[7214],{"type":293,"value":364},{"type":283,"tag":321,"props":7216,"children":7217},{"style":5180},[7218],{"type":293,"value":5260},{"type":283,"tag":321,"props":7220,"children":7221},{"style":334},[7222],{"type":293,"value":5188},{"type":283,"tag":321,"props":7224,"children":7225},{"class":323,"line":310},[7226,7230,7234,7238],{"type":283,"tag":321,"props":7227,"children":7228},{"style":5170},[7229],{"type":293,"value":5272},{"type":283,"tag":321,"props":7231,"children":7232},{"style":334},[7233],{"type":293,"value":364},{"type":283,"tag":321,"props":7235,"children":7236},{"style":5180},[7237],{"type":293,"value":5281},{"type":283,"tag":321,"props":7239,"children":7240},{"style":334},[7241],{"type":293,"value":5188},{"type":283,"tag":321,"props":7243,"children":7244},{"class":323,"line":311},[7245,7249,7253,7257],{"type":283,"tag":321,"props":7246,"children":7247},{"style":5170},[7248],{"type":293,"value":5293},{"type":283,"tag":321,"props":7250,"children":7251},{"style":334},[7252],{"type":293,"value":364},{"type":283,"tag":321,"props":7254,"children":7255},{"style":5180},[7256],{"type":293,"value":5302},{"type":283,"tag":321,"props":7258,"children":7259},{"style":334},[7260],{"type":293,"value":5188},{"type":283,"tag":321,"props":7262,"children":7263},{"class":323,"line":312},[7264,7268,7272,7276],{"type":283,"tag":321,"props":7265,"children":7266},{"style":5170},[7267],{"type":293,"value":5314},{"type":283,"tag":321,"props":7269,"children":7270},{"style":334},[7271],{"type":293,"value":364},{"type":283,"tag":321,"props":7273,"children":7274},{"style":5180},[7275],{"type":293,"value":5323},{"type":283,"tag":321,"props":7277,"children":7278},{"style":334},[7279],{"type":293,"value":5188},{"type":283,"tag":321,"props":7281,"children":7282},{"class":323,"line":977},[7283,7287,7291,7295],{"type":283,"tag":321,"props":7284,"children":7285},{"style":5170},[7286],{"type":293,"value":5335},{"type":283,"tag":321,"props":7288,"children":7289},{"style":334},[7290],{"type":293,"value":364},{"type":283,"tag":321,"props":7292,"children":7293},{"style":5180},[7294],{"type":293,"value":5302},{"type":283,"tag":321,"props":7296,"children":7297},{"style":334},[7298],{"type":293,"value":5188},{"type":283,"tag":321,"props":7300,"children":7301},{"class":323,"line":990},[7302,7306,7310,7314],{"type":283,"tag":321,"props":7303,"children":7304},{"style":5170},[7305],{"type":293,"value":5355},{"type":283,"tag":321,"props":7307,"children":7308},{"style":334},[7309],{"type":293,"value":364},{"type":283,"tag":321,"props":7311,"children":7312},{"style":5180},[7313],{"type":293,"value":5302},{"type":283,"tag":321,"props":7315,"children":7316},{"style":334},[7317],{"type":293,"value":5188},{"type":283,"tag":321,"props":7319,"children":7320},{"class":323,"line":1003},[7321,7325,7329],{"type":283,"tag":321,"props":7322,"children":7323},{"style":5170},[7324],{"type":293,"value":5375},{"type":283,"tag":321,"props":7326,"children":7327},{"style":334},[7328],{"type":293,"value":364},{"type":283,"tag":321,"props":7330,"children":7331},{"style":5180},[7332],{"type":293,"value":5384},{"type":283,"tag":321,"props":7334,"children":7335},{"class":323,"line":1016},[7336],{"type":283,"tag":321,"props":7337,"children":7338},{"style":334},[7339],{"type":293,"value":5392},{"type":283,"tag":321,"props":7341,"children":7342},{"class":323,"line":1029},[7343,7347],{"type":283,"tag":321,"props":7344,"children":7345},{"style":5170},[7346],{"type":293,"value":5400},{"type":283,"tag":321,"props":7348,"children":7349},{"style":334},[7350],{"type":293,"value":5405},{"type":283,"tag":321,"props":7352,"children":7353},{"class":323,"line":1042},[7354],{"type":283,"tag":321,"props":7355,"children":7356},{"style":334},[7357],{"type":293,"value":5413},{"type":283,"tag":321,"props":7359,"children":7360},{"class":323,"line":1052},[7361,7365,7369,7373],{"type":283,"tag":321,"props":7362,"children":7363},{"style":5170},[7364],{"type":293,"value":5421},{"type":283,"tag":321,"props":7366,"children":7367},{"style":334},[7368],{"type":293,"value":364},{"type":283,"tag":321,"props":7370,"children":7371},{"style":5180},[7372],{"type":293,"value":5430},{"type":283,"tag":321,"props":7374,"children":7375},{"style":334},[7376],{"type":293,"value":5188},{"type":283,"tag":321,"props":7378,"children":7379},{"class":323,"line":1065},[7380,7384,7388,7392],{"type":283,"tag":321,"props":7381,"children":7382},{"style":5170},[7383],{"type":293,"value":5442},{"type":283,"tag":321,"props":7385,"children":7386},{"style":334},[7387],{"type":293,"value":364},{"type":283,"tag":321,"props":7389,"children":7390},{"style":5180},[7391],{"type":293,"value":5451},{"type":283,"tag":321,"props":7393,"children":7394},{"style":334},[7395],{"type":293,"value":5188},{"type":283,"tag":321,"props":7397,"children":7398},{"class":323,"line":1078},[7399,7403],{"type":283,"tag":321,"props":7400,"children":7401},{"style":5170},[7402],{"type":293,"value":5463},{"type":283,"tag":321,"props":7404,"children":7405},{"style":334},[7406],{"type":293,"value":5243},{"type":283,"tag":321,"props":7408,"children":7409},{"class":323,"line":1087},[7410,7414,7418],{"type":283,"tag":321,"props":7411,"children":7412},{"style":5170},[7413],{"type":293,"value":5475},{"type":283,"tag":321,"props":7415,"children":7416},{"style":334},[7417],{"type":293,"value":364},{"type":283,"tag":321,"props":7419,"children":7420},{"style":1730},[7421],{"type":293,"value":4912},{"type":283,"tag":321,"props":7423,"children":7424},{"class":323,"line":1100},[7425],{"type":283,"tag":321,"props":7426,"children":7427},{"style":334},[7428],{"type":293,"value":5491},{"type":283,"tag":321,"props":7430,"children":7431},{"class":323,"line":1113},[7432],{"type":283,"tag":321,"props":7433,"children":7434},{"style":334},[7435],{"type":293,"value":5499},{"type":283,"tag":321,"props":7437,"children":7438},{"class":323,"line":1126},[7439],{"type":283,"tag":321,"props":7440,"children":7441},{"style":334},[7442],{"type":293,"value":5413},{"type":283,"tag":321,"props":7444,"children":7445},{"class":323,"line":1134},[7446,7450,7454,7458],{"type":283,"tag":321,"props":7447,"children":7448},{"style":5170},[7449],{"type":293,"value":5421},{"type":283,"tag":321,"props":7451,"children":7452},{"style":334},[7453],{"type":293,"value":364},{"type":283,"tag":321,"props":7455,"children":7456},{"style":5180},[7457],{"type":293,"value":5430},{"type":283,"tag":321,"props":7459,"children":7460},{"style":334},[7461],{"type":293,"value":5188},{"type":283,"tag":321,"props":7463,"children":7464},{"class":323,"line":1147},[7465,7469,7473,7477],{"type":283,"tag":321,"props":7466,"children":7467},{"style":5170},[7468],{"type":293,"value":5442},{"type":283,"tag":321,"props":7470,"children":7471},{"style":334},[7472],{"type":293,"value":364},{"type":283,"tag":321,"props":7474,"children":7475},{"style":5180},[7476],{"type":293,"value":5541},{"type":283,"tag":321,"props":7478,"children":7479},{"style":334},[7480],{"type":293,"value":5188},{"type":283,"tag":321,"props":7482,"children":7483},{"class":323,"line":1160},[7484,7488],{"type":283,"tag":321,"props":7485,"children":7486},{"style":5170},[7487],{"type":293,"value":5463},{"type":283,"tag":321,"props":7489,"children":7490},{"style":334},[7491],{"type":293,"value":5243},{"type":283,"tag":321,"props":7493,"children":7494},{"class":323,"line":1173},[7495,7499,7503],{"type":283,"tag":321,"props":7496,"children":7497},{"style":5170},[7498],{"type":293,"value":5475},{"type":283,"tag":321,"props":7500,"children":7501},{"style":334},[7502],{"type":293,"value":364},{"type":283,"tag":321,"props":7504,"children":7505},{"style":1730},[7506],{"type":293,"value":4912},{"type":283,"tag":321,"props":7508,"children":7509},{"class":323,"line":1186},[7510],{"type":283,"tag":321,"props":7511,"children":7512},{"style":334},[7513],{"type":293,"value":5491},{"type":283,"tag":321,"props":7515,"children":7516},{"class":323,"line":1199},[7517],{"type":283,"tag":321,"props":7518,"children":7519},{"style":334},[7520],{"type":293,"value":5499},{"type":283,"tag":321,"props":7522,"children":7523},{"class":323,"line":2160},[7524],{"type":283,"tag":321,"props":7525,"children":7526},{"style":334},[7527],{"type":293,"value":5413},{"type":283,"tag":321,"props":7529,"children":7530},{"class":323,"line":2161},[7531,7535,7539,7543],{"type":283,"tag":321,"props":7532,"children":7533},{"style":5170},[7534],{"type":293,"value":5421},{"type":283,"tag":321,"props":7536,"children":7537},{"style":334},[7538],{"type":293,"value":364},{"type":283,"tag":321,"props":7540,"children":7541},{"style":5180},[7542],{"type":293,"value":5430},{"type":283,"tag":321,"props":7544,"children":7545},{"style":334},[7546],{"type":293,"value":5188},{"type":283,"tag":321,"props":7548,"children":7549},{"class":323,"line":2162},[7550,7554,7558,7562],{"type":283,"tag":321,"props":7551,"children":7552},{"style":5170},[7553],{"type":293,"value":5442},{"type":283,"tag":321,"props":7555,"children":7556},{"style":334},[7557],{"type":293,"value":364},{"type":283,"tag":321,"props":7559,"children":7560},{"style":5180},[7561],{"type":293,"value":5627},{"type":283,"tag":321,"props":7563,"children":7564},{"style":334},[7565],{"type":293,"value":5188},{"type":283,"tag":321,"props":7567,"children":7568},{"class":323,"line":2163},[7569,7573],{"type":283,"tag":321,"props":7570,"children":7571},{"style":5170},[7572],{"type":293,"value":5463},{"type":283,"tag":321,"props":7574,"children":7575},{"style":334},[7576],{"type":293,"value":5243},{"type":283,"tag":321,"props":7578,"children":7579},{"class":323,"line":2164},[7580,7584,7588],{"type":283,"tag":321,"props":7581,"children":7582},{"style":5170},[7583],{"type":293,"value":5475},{"type":283,"tag":321,"props":7585,"children":7586},{"style":334},[7587],{"type":293,"value":364},{"type":283,"tag":321,"props":7589,"children":7590},{"style":1730},[7591],{"type":293,"value":4912},{"type":283,"tag":321,"props":7593,"children":7594},{"class":323,"line":2165},[7595],{"type":283,"tag":321,"props":7596,"children":7597},{"style":334},[7598],{"type":293,"value":5491},{"type":283,"tag":321,"props":7600,"children":7601},{"class":323,"line":2166},[7602],{"type":283,"tag":321,"props":7603,"children":7604},{"style":334},[7605],{"type":293,"value":5499},{"type":283,"tag":321,"props":7607,"children":7609},{"class":7608,"line":2167},[323,387],[7610],{"type":283,"tag":321,"props":7611,"children":7612},{"style":334},[7613],{"type":293,"value":5413},{"type":283,"tag":321,"props":7615,"children":7617},{"class":7616,"line":2691},[323,387],[7618,7622,7626,7631],{"type":283,"tag":321,"props":7619,"children":7620},{"style":5170},[7621],{"type":293,"value":5421},{"type":283,"tag":321,"props":7623,"children":7624},{"style":334},[7625],{"type":293,"value":364},{"type":283,"tag":321,"props":7627,"children":7628},{"style":5180},[7629],{"type":293,"value":7630},"\"composer\"",{"type":283,"tag":321,"props":7632,"children":7633},{"style":334},[7634],{"type":293,"value":5188},{"type":283,"tag":321,"props":7636,"children":7638},{"class":7637,"line":2168},[323,387],[7639,7643,7647],{"type":283,"tag":321,"props":7640,"children":7641},{"style":5170},[7642],{"type":293,"value":5442},{"type":283,"tag":321,"props":7644,"children":7645},{"style":334},[7646],{"type":293,"value":364},{"type":283,"tag":321,"props":7648,"children":7649},{"style":5180},[7650],{"type":293,"value":7651},"\"https://\u003CDOMAIN-NAME>/api/v4/api/v4/group/\u003Cgroup_id>/-/packages/composer/packages.json\"\n",{"type":283,"tag":321,"props":7653,"children":7655},{"class":7654,"line":2717},[323,387],[7656],{"type":283,"tag":321,"props":7657,"children":7658},{"style":334},[7659],{"type":293,"value":5726},{"type":283,"tag":321,"props":7661,"children":7662},{"class":323,"line":2725},[7663],{"type":283,"tag":321,"props":7664,"children":7665},{"style":334},[7666],{"type":293,"value":5734},{"type":283,"tag":321,"props":7668,"children":7669},{"class":323,"line":2738},[7670,7674],{"type":283,"tag":321,"props":7671,"children":7672},{"style":5170},[7673],{"type":293,"value":5742},{"type":283,"tag":321,"props":7675,"children":7676},{"style":334},[7677],{"type":293,"value":5243},{"type":283,"tag":321,"props":7679,"children":7680},{"class":323,"line":2760},[7681,7685],{"type":283,"tag":321,"props":7682,"children":7683},{"style":5170},[7684],{"type":293,"value":5754},{"type":283,"tag":321,"props":7686,"children":7687},{"style":334},[7688],{"type":293,"value":5243},{"type":283,"tag":321,"props":7690,"children":7691},{"class":323,"line":2773},[7692,7696,7700,7704,7708],{"type":283,"tag":321,"props":7693,"children":7694},{"style":5170},[7695],{"type":293,"value":5766},{"type":283,"tag":321,"props":7697,"children":7698},{"style":5769},[7699],{"type":293,"value":5772},{"type":283,"tag":321,"props":7701,"children":7702},{"style":5170},[7703],{"type":293,"value":5777},{"type":283,"tag":321,"props":7705,"children":7706},{"style":334},[7707],{"type":293,"value":364},{"type":283,"tag":321,"props":7709,"children":7710},{"style":5180},[7711],{"type":293,"value":5786},{"type":283,"tag":321,"props":7713,"children":7714},{"class":323,"line":2787},[7715],{"type":283,"tag":321,"props":7716,"children":7717},{"style":334},[7718],{"type":293,"value":5726},{"type":283,"tag":321,"props":7720,"children":7721},{"class":323,"line":2805},[7722],{"type":283,"tag":321,"props":7723,"children":7724},{"style":334},[7725],{"type":293,"value":5392},{"type":283,"tag":321,"props":7727,"children":7728},{"class":323,"line":2818},[7729,7733,7737,7741],{"type":283,"tag":321,"props":7730,"children":7731},{"style":5170},[7732],{"type":293,"value":5808},{"type":283,"tag":321,"props":7734,"children":7735},{"style":334},[7736],{"type":293,"value":364},{"type":283,"tag":321,"props":7738,"children":7739},{"style":1730},[7740],{"type":293,"value":5817},{"type":283,"tag":321,"props":7742,"children":7743},{"style":334},[7744],{"type":293,"value":5188},{"type":283,"tag":321,"props":7746,"children":7747},{"class":323,"line":2831},[7748,7752],{"type":283,"tag":321,"props":7749,"children":7750},{"style":5170},[7751],{"type":293,"value":5829},{"type":283,"tag":321,"props":7753,"children":7754},{"style":334},[7755],{"type":293,"value":5243},{"type":283,"tag":321,"props":7757,"children":7758},{"class":323,"line":2844},[7759,7763],{"type":283,"tag":321,"props":7760,"children":7761},{"style":5170},[7762],{"type":293,"value":5841},{"type":283,"tag":321,"props":7764,"children":7765},{"style":334},[7766],{"type":293,"value":5243},{"type":283,"tag":321,"props":7768,"children":7769},{"class":323,"line":2862},[7770,7774,7778,7782],{"type":283,"tag":321,"props":7771,"children":7772},{"style":5170},[7773],{"type":293,"value":5853},{"type":283,"tag":321,"props":7775,"children":7776},{"style":334},[7777],{"type":293,"value":364},{"type":283,"tag":321,"props":7779,"children":7780},{"style":1730},[7781],{"type":293,"value":5817},{"type":283,"tag":321,"props":7783,"children":7784},{"style":334},[7785],{"type":293,"value":5188},{"type":283,"tag":321,"props":7787,"children":7788},{"class":323,"line":2880},[7789,7793,7797],{"type":283,"tag":321,"props":7790,"children":7791},{"style":5170},[7792],{"type":293,"value":5873},{"type":283,"tag":321,"props":7794,"children":7795},{"style":334},[7796],{"type":293,"value":364},{"type":283,"tag":321,"props":7798,"children":7799},{"style":1730},[7800],{"type":293,"value":4912},{"type":283,"tag":321,"props":7802,"children":7803},{"class":323,"line":2893},[7804],{"type":283,"tag":321,"props":7805,"children":7806},{"style":334},[7807],{"type":293,"value":5499},{"type":283,"tag":321,"props":7809,"children":7810},{"class":323,"line":2913},[7811,7815,7819,7823],{"type":283,"tag":321,"props":7812,"children":7813},{"style":5170},[7814],{"type":293,"value":5896},{"type":283,"tag":321,"props":7816,"children":7817},{"style":334},[7818],{"type":293,"value":364},{"type":283,"tag":321,"props":7820,"children":7821},{"style":1730},[7822],{"type":293,"value":5817},{"type":283,"tag":321,"props":7824,"children":7825},{"style":334},[7826],{"type":293,"value":5188},{"type":283,"tag":321,"props":7828,"children":7829},{"class":323,"line":2933},[7830,7834,7838],{"type":283,"tag":321,"props":7831,"children":7832},{"style":5170},[7833],{"type":293,"value":5916},{"type":283,"tag":321,"props":7835,"children":7836},{"style":334},[7837],{"type":293,"value":364},{"type":283,"tag":321,"props":7839,"children":7840},{"style":1730},[7841],{"type":293,"value":4912},{"type":283,"tag":321,"props":7843,"children":7844},{"class":323,"line":2950},[7845],{"type":283,"tag":321,"props":7846,"children":7847},{"style":334},[7848],{"type":293,"value":5392},{"type":283,"tag":321,"props":7850,"children":7851},{"class":323,"line":3720},[7852,7856],{"type":283,"tag":321,"props":7853,"children":7854},{"style":5170},[7855],{"type":293,"value":5939},{"type":283,"tag":321,"props":7857,"children":7858},{"style":334},[7859],{"type":293,"value":5243},{"type":283,"tag":321,"props":7861,"children":7862},{"class":323,"line":3728},[7863,7867],{"type":283,"tag":321,"props":7864,"children":7865},{"style":5170},[7866],{"type":293,"value":5951},{"type":283,"tag":321,"props":7868,"children":7869},{"style":334},[7870],{"type":293,"value":5243},{"type":283,"tag":321,"props":7872,"children":7873},{"class":323,"line":3740},[7874,7878,7882],{"type":283,"tag":321,"props":7875,"children":7876},{"style":5170},[7877],{"type":293,"value":5963},{"type":283,"tag":321,"props":7879,"children":7880},{"style":334},[7881],{"type":293,"value":364},{"type":283,"tag":321,"props":7883,"children":7884},{"style":5180},[7885],{"type":293,"value":5972},{"type":283,"tag":321,"props":7887,"children":7888},{"class":323,"line":3752},[7889],{"type":283,"tag":321,"props":7890,"children":7891},{"style":334},[7892],{"type":293,"value":5499},{"type":283,"tag":321,"props":7894,"children":7895},{"class":323,"line":3768},[7896,7900],{"type":283,"tag":321,"props":7897,"children":7898},{"style":5170},[7899],{"type":293,"value":5987},{"type":283,"tag":321,"props":7901,"children":7902},{"style":334},[7903],{"type":293,"value":5405},{"type":283,"tag":321,"props":7905,"children":7906},{"class":323,"line":3788},[7907],{"type":283,"tag":321,"props":7908,"children":7909},{"style":5180},[7910],{"type":293,"value":5999},{"type":283,"tag":321,"props":7912,"children":7913},{"class":323,"line":3804},[7914],{"type":283,"tag":321,"props":7915,"children":7916},{"style":334},[7917],{"type":293,"value":6007},{"type":283,"tag":321,"props":7919,"children":7920},{"class":323,"line":3816},[7921,7925],{"type":283,"tag":321,"props":7922,"children":7923},{"style":5170},[7924],{"type":293,"value":6015},{"type":283,"tag":321,"props":7926,"children":7927},{"style":334},[7928],{"type":293,"value":5405},{"type":283,"tag":321,"props":7930,"children":7931},{"class":323,"line":3828},[7932],{"type":283,"tag":321,"props":7933,"children":7934},{"style":5180},[7935],{"type":293,"value":5999},{"type":283,"tag":321,"props":7937,"children":7938},{"class":323,"line":3840},[7939],{"type":283,"tag":321,"props":7940,"children":7941},{"style":334},[7942],{"type":293,"value":6034},{"type":283,"tag":321,"props":7944,"children":7945},{"class":323,"line":3852},[7946],{"type":283,"tag":321,"props":7947,"children":7948},{"style":334},[7949],{"type":293,"value":5392},{"type":283,"tag":321,"props":7951,"children":7952},{"class":323,"line":3868},[7953,7957],{"type":283,"tag":321,"props":7954,"children":7955},{"style":5170},[7956],{"type":293,"value":6049},{"type":283,"tag":321,"props":7958,"children":7959},{"style":334},[7960],{"type":293,"value":5243},{"type":283,"tag":321,"props":7962,"children":7963},{"class":323,"line":3880},[7964,7968],{"type":283,"tag":321,"props":7965,"children":7966},{"style":5170},[7967],{"type":293,"value":6061},{"type":283,"tag":321,"props":7969,"children":7970},{"style":334},[7971],{"type":293,"value":5243},{"type":283,"tag":321,"props":7973,"children":7974},{"class":323,"line":3900},[7975,7979,7983,7987],{"type":283,"tag":321,"props":7976,"children":7977},{"style":5170},[7978],{"type":293,"value":6073},{"type":283,"tag":321,"props":7980,"children":7981},{"style":334},[7982],{"type":293,"value":364},{"type":283,"tag":321,"props":7984,"children":7985},{"style":1730},[7986],{"type":293,"value":5817},{"type":283,"tag":321,"props":7988,"children":7989},{"style":334},[7990],{"type":293,"value":5188},{"type":283,"tag":321,"props":7992,"children":7993},{"class":323,"line":3920},[7994,7998],{"type":283,"tag":321,"props":7995,"children":7996},{"style":5170},[7997],{"type":293,"value":6093},{"type":283,"tag":321,"props":7999,"children":8000},{"style":334},[8001],{"type":293,"value":5405},{"type":283,"tag":321,"props":8003,"children":8004},{"class":323,"line":3936},[8005,8009],{"type":283,"tag":321,"props":8006,"children":8007},{"style":5180},[8008],{"type":293,"value":6105},{"type":283,"tag":321,"props":8010,"children":8011},{"style":334},[8012],{"type":293,"value":5188},{"type":283,"tag":321,"props":8014,"children":8015},{"class":323,"line":6112},[8016],{"type":283,"tag":321,"props":8017,"children":8018},{"style":5180},[8019],{"type":293,"value":6118},{"type":283,"tag":321,"props":8021,"children":8022},{"class":323,"line":6121},[8023],{"type":283,"tag":321,"props":8024,"children":8025},{"style":334},[8026],{"type":293,"value":6127},{"type":283,"tag":321,"props":8028,"children":8029},{"class":323,"line":6130},[8030],{"type":283,"tag":321,"props":8031,"children":8032},{"style":334},[8033],{"type":293,"value":5726},{"type":283,"tag":321,"props":8035,"children":8036},{"class":323,"line":6138},[8037],{"type":283,"tag":321,"props":8038,"children":8039},{"style":334},[8040],{"type":293,"value":6144},{"type":283,"tag":321,"props":8042,"children":8043},{"class":323,"line":6147},[8044],{"type":283,"tag":321,"props":8045,"children":8046},{"style":334},[8047],{"type":293,"value":6153},{"type":283,"tag":284,"props":8049,"children":8050},{},[8051],{"type":293,"value":8052},"oder über das CLI:",{"type":283,"tag":303,"props":8054,"children":8056},{"className":1705,"code":8055,"language":1704,"meta":8,"style":8},"composer config repositories.\u003Cgroup_id> composer https://\u003CDOMAIN-NAME>/api/v4/group/\u003Cgroup_id>/-/packages/composer/packages.json\n",[8057],{"type":283,"tag":317,"props":8058,"children":8059},{"__ignoreMap":8},[8060],{"type":283,"tag":321,"props":8061,"children":8062},{"class":323,"line":324},[8063,8067,8072,8077,8083,8088,8093,8098,8103,8108,8112,8117,8122,8126,8131,8135,8139,8143,8147],{"type":283,"tag":321,"props":8064,"children":8065},{"style":1715},[8066],{"type":293,"value":5144},{"type":283,"tag":321,"props":8068,"children":8069},{"style":367},[8070],{"type":293,"value":8071}," config",{"type":283,"tag":321,"props":8073,"children":8074},{"style":367},[8075],{"type":293,"value":8076}," repositories.",{"type":283,"tag":321,"props":8078,"children":8080},{"style":8079},"--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672",[8081],{"type":293,"value":8082},"\u003C",{"type":283,"tag":321,"props":8084,"children":8085},{"style":367},[8086],{"type":293,"value":8087},"group_i",{"type":283,"tag":321,"props":8089,"children":8090},{"style":334},[8091],{"type":293,"value":8092},"d",{"type":283,"tag":321,"props":8094,"children":8095},{"style":8079},[8096],{"type":293,"value":8097},">",{"type":283,"tag":321,"props":8099,"children":8100},{"style":367},[8101],{"type":293,"value":8102}," composer",{"type":283,"tag":321,"props":8104,"children":8105},{"style":367},[8106],{"type":293,"value":8107}," https://",{"type":283,"tag":321,"props":8109,"children":8110},{"style":8079},[8111],{"type":293,"value":8082},{"type":283,"tag":321,"props":8113,"children":8114},{"style":367},[8115],{"type":293,"value":8116},"DOMAIN-NAM",{"type":283,"tag":321,"props":8118,"children":8119},{"style":334},[8120],{"type":293,"value":8121},"E",{"type":283,"tag":321,"props":8123,"children":8124},{"style":8079},[8125],{"type":293,"value":8097},{"type":283,"tag":321,"props":8127,"children":8128},{"style":367},[8129],{"type":293,"value":8130},"/api/v4/group/",{"type":283,"tag":321,"props":8132,"children":8133},{"style":8079},[8134],{"type":293,"value":8082},{"type":283,"tag":321,"props":8136,"children":8137},{"style":367},[8138],{"type":293,"value":8087},{"type":283,"tag":321,"props":8140,"children":8141},{"style":334},[8142],{"type":293,"value":8092},{"type":283,"tag":321,"props":8144,"children":8145},{"style":8079},[8146],{"type":293,"value":8097},{"type":283,"tag":321,"props":8148,"children":8149},{"style":367},[8150],{"type":293,"value":8151},"/-/packages/composer/packages.json\n",{"type":283,"tag":284,"props":8153,"children":8154},{},[8155],{"type":293,"value":8156},"Und die GitLab-Anmeldeinformationen einrichten:",{"type":283,"tag":303,"props":8158,"children":8160},{"className":1705,"code":8159,"language":1704,"meta":8,"style":8},"composer config gitlab-token.\u003CDOMAIN-NAME> \u003Cpersonal_access_token>\n",[8161],{"type":283,"tag":317,"props":8162,"children":8163},{"__ignoreMap":8},[8164],{"type":283,"tag":321,"props":8165,"children":8166},{"class":323,"line":324},[8167,8171,8175,8180,8184,8188,8192,8196,8201,8206,8211],{"type":283,"tag":321,"props":8168,"children":8169},{"style":1715},[8170],{"type":293,"value":5144},{"type":283,"tag":321,"props":8172,"children":8173},{"style":367},[8174],{"type":293,"value":8071},{"type":283,"tag":321,"props":8176,"children":8177},{"style":367},[8178],{"type":293,"value":8179}," gitlab-token.",{"type":283,"tag":321,"props":8181,"children":8182},{"style":8079},[8183],{"type":293,"value":8082},{"type":283,"tag":321,"props":8185,"children":8186},{"style":367},[8187],{"type":293,"value":8116},{"type":283,"tag":321,"props":8189,"children":8190},{"style":334},[8191],{"type":293,"value":8121},{"type":283,"tag":321,"props":8193,"children":8194},{"style":8079},[8195],{"type":293,"value":8097},{"type":283,"tag":321,"props":8197,"children":8198},{"style":8079},[8199],{"type":293,"value":8200}," \u003C",{"type":283,"tag":321,"props":8202,"children":8203},{"style":367},[8204],{"type":293,"value":8205},"personal_access_toke",{"type":283,"tag":321,"props":8207,"children":8208},{"style":334},[8209],{"type":293,"value":8210},"n",{"type":283,"tag":321,"props":8212,"children":8213},{"style":8079},[8214],{"type":293,"value":8215},">\n",{"type":283,"tag":284,"props":8217,"children":8218},{},[8219,8221,8226],{"type":293,"value":8220},"Mehr über diesen Prozess in der ",{"type":283,"tag":288,"props":8222,"children":8224},{"href":8223},"https://docs.gitlab.com/user/packages/composer_repository/#install-a-composer-package",[8225],{"type":293,"value":4076},{"type":293,"value":7063},{"type":283,"tag":284,"props":8228,"children":8229},{},[8230],{"type":293,"value":8231},"Jetzt installieren wir unser Paket wie gewohnt:",{"type":283,"tag":303,"props":8233,"children":8234},{"className":1705,"code":6161,"language":1704,"meta":8,"style":8},[8235],{"type":283,"tag":317,"props":8236,"children":8237},{"__ignoreMap":8},[8238],{"type":283,"tag":321,"props":8239,"children":8240},{"class":323,"line":324},[8241,8245,8249],{"type":283,"tag":321,"props":8242,"children":8243},{"style":1715},[8244],{"type":293,"value":5144},{"type":283,"tag":321,"props":8246,"children":8247},{"style":367},[8248],{"type":293,"value":6177},{"type":283,"tag":321,"props":8250,"children":8251},{"style":367},[8252],{"type":293,"value":6182},{"type":283,"tag":303,"props":8254,"children":8256},{"className":6894,"code":8255,"language":6896,"meta":8,"style":8},"./composer.json has been updated\nRunning composer update acme/sample-plugin\nLoading composer repositories with package information\nUpdating dependencies\nLock file operations: 1 install, 0 updates, 0 removals\n  - Locking acme/sample-plugin (1.0.0)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 1 install, 0 updates, 0 removals\n  - Downloading acme/sample-plugin (1.0.0)\n  - Installing acme/sample-plugin (1.0.0): Extracting archive\nGenerating optimized autoload files\n\nRun composer recipes at any time to see the status of your Symfony recipes.\n\nExecuting script assets:install [OK]\n\nUsing version ^1.0 for acme/sample-plugin\n",[8257],{"type":283,"tag":317,"props":8258,"children":8259},{"__ignoreMap":8},[8260,8267,8274,8281,8288,8295,8302,8309,8316,8323,8331,8339,8346,8353,8360,8367,8374,8381],{"type":283,"tag":321,"props":8261,"children":8262},{"class":323,"line":324},[8263],{"type":283,"tag":321,"props":8264,"children":8265},{},[8266],{"type":293,"value":6248},{"type":283,"tag":321,"props":8268,"children":8269},{"class":323,"line":340},[8270],{"type":283,"tag":321,"props":8271,"children":8272},{},[8273],{"type":293,"value":6256},{"type":283,"tag":321,"props":8275,"children":8276},{"class":323,"line":353},[8277],{"type":283,"tag":321,"props":8278,"children":8279},{},[8280],{"type":293,"value":6923},{"type":283,"tag":321,"props":8282,"children":8283},{"class":323,"line":373},[8284],{"type":283,"tag":321,"props":8285,"children":8286},{},[8287],{"type":293,"value":6931},{"type":283,"tag":321,"props":8289,"children":8290},{"class":323,"line":308},[8291],{"type":283,"tag":321,"props":8292,"children":8293},{},[8294],{"type":293,"value":6280},{"type":283,"tag":321,"props":8296,"children":8297},{"class":323,"line":309},[8298],{"type":283,"tag":321,"props":8299,"children":8300},{},[8301],{"type":293,"value":6946},{"type":283,"tag":321,"props":8303,"children":8304},{"class":323,"line":310},[8305],{"type":283,"tag":321,"props":8306,"children":8307},{},[8308],{"type":293,"value":6296},{"type":283,"tag":321,"props":8310,"children":8311},{"class":323,"line":311},[8312],{"type":283,"tag":321,"props":8313,"children":8314},{},[8315],{"type":293,"value":6304},{"type":283,"tag":321,"props":8317,"children":8318},{"class":323,"line":312},[8319],{"type":283,"tag":321,"props":8320,"children":8321},{},[8322],{"type":293,"value":6312},{"type":283,"tag":321,"props":8324,"children":8325},{"class":323,"line":977},[8326],{"type":283,"tag":321,"props":8327,"children":8328},{},[8329],{"type":293,"value":8330},"  - Downloading acme/sample-plugin (1.0.0)\n",{"type":283,"tag":321,"props":8332,"children":8333},{"class":323,"line":990},[8334],{"type":283,"tag":321,"props":8335,"children":8336},{},[8337],{"type":293,"value":8338},"  - Installing acme/sample-plugin (1.0.0): Extracting archive\n",{"type":283,"tag":321,"props":8340,"children":8341},{"class":323,"line":1003},[8342],{"type":283,"tag":321,"props":8343,"children":8344},{},[8345],{"type":293,"value":6336},{"type":283,"tag":321,"props":8347,"children":8348},{"class":323,"line":1016},[8349],{"type":283,"tag":321,"props":8350,"children":8351},{"emptyLinePlaceholder":1046},[8352],{"type":293,"value":1049},{"type":283,"tag":321,"props":8354,"children":8355},{"class":323,"line":1029},[8356],{"type":283,"tag":321,"props":8357,"children":8358},{},[8359],{"type":293,"value":6351},{"type":283,"tag":321,"props":8361,"children":8362},{"class":323,"line":1042},[8363],{"type":283,"tag":321,"props":8364,"children":8365},{"emptyLinePlaceholder":1046},[8366],{"type":293,"value":1049},{"type":283,"tag":321,"props":8368,"children":8369},{"class":323,"line":1052},[8370],{"type":283,"tag":321,"props":8371,"children":8372},{},[8373],{"type":293,"value":6366},{"type":283,"tag":321,"props":8375,"children":8376},{"class":323,"line":1065},[8377],{"type":283,"tag":321,"props":8378,"children":8379},{"emptyLinePlaceholder":1046},[8380],{"type":293,"value":1049},{"type":283,"tag":321,"props":8382,"children":8383},{"class":323,"line":1078},[8384],{"type":283,"tag":321,"props":8385,"children":8386},{},[8387],{"type":293,"value":7033},{"type":283,"tag":284,"props":8389,"children":8390},{},[8391],{"type":283,"tag":321,"props":8392,"children":8394},{"className":8393},[5006],[8395],{"type":293,"value":8396},"Großartig. Direkter Paket-Download!",{"type":283,"tag":1252,"props":8398,"children":8400},{"id":8399},"warum-die-mühe",[8401],{"type":293,"value":8402},"Warum die Mühe?",{"type":283,"tag":284,"props":8404,"children":8405},{},[8406,8408,8413,8415,8421],{"type":293,"value":8407},"Das ist eine sehr gute Frage. Der Hauptgrund ist das Paket-Caching. Bei der Ausführung in einer ",{"type":283,"tag":317,"props":8409,"children":8411},{"className":8410},[],[8412],{"type":293,"value":1564},{"type":293,"value":8414},"-Umgebung oder einem ",{"type":283,"tag":317,"props":8416,"children":8418},{"className":8417},[],[8419],{"type":293,"value":8420},"docker build",{"type":293,"value":8422}," kann das Caching von Paketen einen massiven Leistungsschub bewirken.",{"type":283,"tag":1321,"props":8424,"children":8425},{},[],{"type":283,"tag":837,"props":8427,"children":8428},{},[],{"type":283,"tag":532,"props":8430,"children":8432},{"id":8431},"release-pipeline",[8433],{"type":293,"value":8434},"Release-Pipeline",{"type":283,"tag":1252,"props":8436,"children":8438},{"id":8437},"mit-manuellem-tagging",[8439],{"type":293,"value":8440},"Mit manuellem Tagging",{"type":283,"tag":284,"props":8442,"children":8443},{},[8444],{"type":293,"value":8445},"Dies ist eine einfache Pipeline, in der ein Git-Tag manuell erstellt und pushen wird.",{"type":283,"tag":284,"props":8447,"children":8448},{},[8449,8451,8456,8457,8462],{"type":293,"value":8450},"Bitte sicherstellen, dass Sie die ",{"type":283,"tag":317,"props":8452,"children":8454},{"className":8453},[],[8455],{"type":293,"value":6412},{"type":293,"value":6414},{"type":283,"tag":317,"props":8458,"children":8460},{"className":8459},[],[8461],{"type":293,"value":6420},{"type":293,"value":8463}," immer aktualisiert wird.",{"type":283,"tag":303,"props":8465,"children":8467},{"className":1705,"code":8466,"language":1704,"meta":8,"style":8},"git tag \u003Cversion>\ngit push --tags\n",[8468],{"type":283,"tag":317,"props":8469,"children":8470},{"__ignoreMap":8},[8471,8499],{"type":283,"tag":321,"props":8472,"children":8473},{"class":323,"line":324},[8474,8478,8482,8486,8491,8495],{"type":283,"tag":321,"props":8475,"children":8476},{"style":1715},[8477],{"type":293,"value":555},{"type":283,"tag":321,"props":8479,"children":8480},{"style":367},[8481],{"type":293,"value":6843},{"type":283,"tag":321,"props":8483,"children":8484},{"style":8079},[8485],{"type":293,"value":8200},{"type":283,"tag":321,"props":8487,"children":8488},{"style":367},[8489],{"type":293,"value":8490},"versio",{"type":283,"tag":321,"props":8492,"children":8493},{"style":334},[8494],{"type":293,"value":8210},{"type":283,"tag":321,"props":8496,"children":8497},{"style":8079},[8498],{"type":293,"value":8215},{"type":283,"tag":321,"props":8500,"children":8501},{"class":323,"line":340},[8502,8506,8510],{"type":283,"tag":321,"props":8503,"children":8504},{"style":1715},[8505],{"type":293,"value":555},{"type":283,"tag":321,"props":8507,"children":8508},{"style":367},[8509],{"type":293,"value":6860},{"type":283,"tag":321,"props":8511,"children":8512},{"style":1730},[8513],{"type":293,"value":6865},{"type":283,"tag":303,"props":8515,"children":8518},{"className":314,"code":8516,"filename":8517,"language":313,"meta":8,"style":8},"stages:\n  - release\n\ndeploy:\n  image: alpine/curl\n  stage: release\n  script:\n    - 'curl --fail-with-body --header \"Job-Token: $CI_JOB_TOKEN\" --data tag=$CI_COMMIT_TAG \"${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/composer\"'\n  environment: production\n  rules:\n    if: $CI_COMMIT_TAG\n",".gitlab-ci.yml",[8519],{"type":283,"tag":317,"props":8520,"children":8521},{"__ignoreMap":8},[8522,8533,8544,8551,8563,8579,8594,8605,8617,8634,8645],{"type":283,"tag":321,"props":8523,"children":8524},{"class":323,"line":324},[8525,8529],{"type":283,"tag":321,"props":8526,"children":8527},{"style":328},[8528],{"type":293,"value":1809},{"type":283,"tag":321,"props":8530,"children":8531},{"style":334},[8532],{"type":293,"value":337},{"type":283,"tag":321,"props":8534,"children":8535},{"class":323,"line":340},[8536,8540],{"type":283,"tag":321,"props":8537,"children":8538},{"style":334},[8539],{"type":293,"value":1821},{"type":283,"tag":321,"props":8541,"children":8542},{"style":367},[8543],{"type":293,"value":4485},{"type":283,"tag":321,"props":8545,"children":8546},{"class":323,"line":353},[8547],{"type":283,"tag":321,"props":8548,"children":8549},{"emptyLinePlaceholder":1046},[8550],{"type":293,"value":1049},{"type":283,"tag":321,"props":8552,"children":8553},{"class":323,"line":373},[8554,8559],{"type":283,"tag":321,"props":8555,"children":8556},{"style":328},[8557],{"type":293,"value":8558},"deploy",{"type":283,"tag":321,"props":8560,"children":8561},{"style":334},[8562],{"type":293,"value":337},{"type":283,"tag":321,"props":8564,"children":8565},{"class":323,"line":308},[8566,8570,8574],{"type":283,"tag":321,"props":8567,"children":8568},{"style":328},[8569],{"type":293,"value":2238},{"type":283,"tag":321,"props":8571,"children":8572},{"style":334},[8573],{"type":293,"value":364},{"type":283,"tag":321,"props":8575,"children":8576},{"style":367},[8577],{"type":293,"value":8578},"alpine/curl\n",{"type":283,"tag":321,"props":8580,"children":8581},{"class":323,"line":309},[8582,8586,8590],{"type":283,"tag":321,"props":8583,"children":8584},{"style":328},[8585],{"type":293,"value":2222},{"type":283,"tag":321,"props":8587,"children":8588},{"style":334},[8589],{"type":293,"value":364},{"type":283,"tag":321,"props":8591,"children":8592},{"style":367},[8593],{"type":293,"value":4485},{"type":283,"tag":321,"props":8595,"children":8596},{"class":323,"line":310},[8597,8601],{"type":283,"tag":321,"props":8598,"children":8599},{"style":328},[8600],{"type":293,"value":2697},{"type":283,"tag":321,"props":8602,"children":8603},{"style":334},[8604],{"type":293,"value":337},{"type":283,"tag":321,"props":8606,"children":8607},{"class":323,"line":311},[8608,8612],{"type":283,"tag":321,"props":8609,"children":8610},{"style":334},[8611],{"type":293,"value":2300},{"type":283,"tag":321,"props":8613,"children":8614},{"style":367},[8615],{"type":293,"value":8616},"'curl --fail-with-body --header \"Job-Token: $CI_JOB_TOKEN\" --data tag=$CI_COMMIT_TAG \"${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/composer\"'\n",{"type":283,"tag":321,"props":8618,"children":8619},{"class":323,"line":312},[8620,8625,8629],{"type":283,"tag":321,"props":8621,"children":8622},{"style":328},[8623],{"type":293,"value":8624},"  environment",{"type":283,"tag":321,"props":8626,"children":8627},{"style":334},[8628],{"type":293,"value":364},{"type":283,"tag":321,"props":8630,"children":8631},{"style":367},[8632],{"type":293,"value":8633},"production\n",{"type":283,"tag":321,"props":8635,"children":8636},{"class":323,"line":977},[8637,8641],{"type":283,"tag":321,"props":8638,"children":8639},{"style":328},[8640],{"type":293,"value":2886},{"type":283,"tag":321,"props":8642,"children":8643},{"style":334},[8644],{"type":293,"value":337},{"type":283,"tag":321,"props":8646,"children":8647},{"class":323,"line":990},[8648,8653,8657],{"type":283,"tag":321,"props":8649,"children":8650},{"style":328},[8651],{"type":293,"value":8652},"    if",{"type":283,"tag":321,"props":8654,"children":8655},{"style":334},[8656],{"type":293,"value":364},{"type":283,"tag":321,"props":8658,"children":8659},{"style":367},[8660],{"type":293,"value":8661},"$CI_COMMIT_TAG\n",{"type":283,"tag":1252,"props":8663,"children":8665},{"id":8664},"mit-semantic-release",[8666],{"type":293,"value":8667},"Mit semantic-release",{"type":283,"tag":284,"props":8669,"children":8670},{},[8671],{"type":293,"value":8672},"Es wäre viel einfacher, wenn wir unsere Änderungen einfach pushen könnten und uns nicht um Versionierung und Tagging kümmern müssten.",{"type":283,"tag":284,"props":8674,"children":8675},{},[8676,8682],{"type":283,"tag":288,"props":8677,"children":8679},{"href":8678},"https://github.com/semantic-release/semantic-release",[8680],{"type":293,"value":8681},"semantic-release",{"type":293,"value":8683}," automatisiert den gesamten Workflow für Paket-Releases.",{"type":283,"tag":284,"props":8685,"children":8686},{},[8687,8689,8695],{"type":293,"value":8688},"Bitte befolgen Sie der ",{"type":283,"tag":288,"props":8690,"children":8692},{"href":8691},"https://github.com/semantic-release/gitlab?tab=readme-ov-file#gitlab-authentication",[8693],{"type":293,"value":8694},"Anleitung zur GitLab-Authentifizierung",{"type":293,"value":8696},", bevor Sie weiterlesen.",{"type":283,"tag":303,"props":8698,"children":8700},{"className":314,"code":8699,"filename":1796,"language":313,"meta":8,"style":8},"stages:\n  - release\n\nrelease:\n  stage: release\n  image:\n    name: ghcr.io/voxpupuli/semantic-release:25.0.0-latest\n    entrypoint: [\"\"]\n  interruptible: true\n  script:\n    - /container-entrypoint.sh\n  rules:\n    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n      when: never\n    - if: $CI_COMMIT_BRANCH\n\n",[8701],{"type":283,"tag":317,"props":8702,"children":8703},{"__ignoreMap":8},[8704,8715,8726,8733,8744,8759,8770,8786,8805,8820,8831,8843,8854,8873,8888],{"type":283,"tag":321,"props":8705,"children":8706},{"class":323,"line":324},[8707,8711],{"type":283,"tag":321,"props":8708,"children":8709},{"style":328},[8710],{"type":293,"value":1809},{"type":283,"tag":321,"props":8712,"children":8713},{"style":334},[8714],{"type":293,"value":337},{"type":283,"tag":321,"props":8716,"children":8717},{"class":323,"line":340},[8718,8722],{"type":283,"tag":321,"props":8719,"children":8720},{"style":334},[8721],{"type":293,"value":1821},{"type":283,"tag":321,"props":8723,"children":8724},{"style":367},[8725],{"type":293,"value":4485},{"type":283,"tag":321,"props":8727,"children":8728},{"class":323,"line":353},[8729],{"type":283,"tag":321,"props":8730,"children":8731},{"emptyLinePlaceholder":1046},[8732],{"type":293,"value":1049},{"type":283,"tag":321,"props":8734,"children":8735},{"class":323,"line":373},[8736,8740],{"type":283,"tag":321,"props":8737,"children":8738},{"style":328},[8739],{"type":293,"value":4830},{"type":283,"tag":321,"props":8741,"children":8742},{"style":334},[8743],{"type":293,"value":337},{"type":283,"tag":321,"props":8745,"children":8746},{"class":323,"line":308},[8747,8751,8755],{"type":283,"tag":321,"props":8748,"children":8749},{"style":328},[8750],{"type":293,"value":2222},{"type":283,"tag":321,"props":8752,"children":8753},{"style":334},[8754],{"type":293,"value":364},{"type":283,"tag":321,"props":8756,"children":8757},{"style":367},[8758],{"type":293,"value":4485},{"type":283,"tag":321,"props":8760,"children":8761},{"class":323,"line":309},[8762,8766],{"type":283,"tag":321,"props":8763,"children":8764},{"style":328},[8765],{"type":293,"value":2238},{"type":283,"tag":321,"props":8767,"children":8768},{"style":334},[8769],{"type":293,"value":337},{"type":283,"tag":321,"props":8771,"children":8772},{"class":323,"line":310},[8773,8777,8781],{"type":283,"tag":321,"props":8774,"children":8775},{"style":328},[8776],{"type":293,"value":2250},{"type":283,"tag":321,"props":8778,"children":8779},{"style":334},[8780],{"type":293,"value":364},{"type":283,"tag":321,"props":8782,"children":8783},{"style":367},[8784],{"type":293,"value":8785},"ghcr.io/voxpupuli/semantic-release:25.0.0-latest\n",{"type":283,"tag":321,"props":8787,"children":8788},{"class":323,"line":311},[8789,8793,8797,8801],{"type":283,"tag":321,"props":8790,"children":8791},{"style":328},[8792],{"type":293,"value":2266},{"type":283,"tag":321,"props":8794,"children":8795},{"style":334},[8796],{"type":293,"value":1888},{"type":283,"tag":321,"props":8798,"children":8799},{"style":367},[8800],{"type":293,"value":1893},{"type":283,"tag":321,"props":8802,"children":8803},{"style":334},[8804],{"type":293,"value":1898},{"type":283,"tag":321,"props":8806,"children":8807},{"class":323,"line":312},[8808,8812,8816],{"type":283,"tag":321,"props":8809,"children":8810},{"style":328},[8811],{"type":293,"value":4903},{"type":283,"tag":321,"props":8813,"children":8814},{"style":334},[8815],{"type":293,"value":364},{"type":283,"tag":321,"props":8817,"children":8818},{"style":1730},[8819],{"type":293,"value":4912},{"type":283,"tag":321,"props":8821,"children":8822},{"class":323,"line":977},[8823,8827],{"type":283,"tag":321,"props":8824,"children":8825},{"style":328},[8826],{"type":293,"value":2697},{"type":283,"tag":321,"props":8828,"children":8829},{"style":334},[8830],{"type":293,"value":337},{"type":283,"tag":321,"props":8832,"children":8833},{"class":323,"line":990},[8834,8838],{"type":283,"tag":321,"props":8835,"children":8836},{"style":334},[8837],{"type":293,"value":2300},{"type":283,"tag":321,"props":8839,"children":8840},{"style":367},[8841],{"type":293,"value":8842},"/container-entrypoint.sh\n",{"type":283,"tag":321,"props":8844,"children":8845},{"class":323,"line":1003},[8846,8850],{"type":283,"tag":321,"props":8847,"children":8848},{"style":328},[8849],{"type":293,"value":2886},{"type":283,"tag":321,"props":8851,"children":8852},{"style":334},[8853],{"type":293,"value":337},{"type":283,"tag":321,"props":8855,"children":8856},{"class":323,"line":1016},[8857,8861,8865,8869],{"type":283,"tag":321,"props":8858,"children":8859},{"style":334},[8860],{"type":293,"value":2300},{"type":283,"tag":321,"props":8862,"children":8863},{"style":328},[8864],{"type":293,"value":2005},{"type":283,"tag":321,"props":8866,"children":8867},{"style":334},[8868],{"type":293,"value":364},{"type":283,"tag":321,"props":8870,"children":8871},{"style":367},[8872],{"type":293,"value":2035},{"type":283,"tag":321,"props":8874,"children":8875},{"class":323,"line":1029},[8876,8880,8884],{"type":283,"tag":321,"props":8877,"children":8878},{"style":328},[8879],{"type":293,"value":2939},{"type":283,"tag":321,"props":8881,"children":8882},{"style":334},[8883],{"type":293,"value":364},{"type":283,"tag":321,"props":8885,"children":8886},{"style":367},[8887],{"type":293,"value":2053},{"type":283,"tag":321,"props":8889,"children":8890},{"class":323,"line":1042},[8891,8895,8899,8903],{"type":283,"tag":321,"props":8892,"children":8893},{"style":334},[8894],{"type":293,"value":2300},{"type":283,"tag":321,"props":8896,"children":8897},{"style":328},[8898],{"type":293,"value":2005},{"type":283,"tag":321,"props":8900,"children":8901},{"style":334},[8902],{"type":293,"value":364},{"type":283,"tag":321,"props":8904,"children":8905},{"style":367},[8906],{"type":293,"value":2074},{"type":283,"tag":303,"props":8908,"children":8911},{"className":5149,"code":8909,"filename":8910,"language":1596,"meta":8,"style":8},"{\n  \"plugins\": [\n    \"@semantic-release/commit-analyzer\",\n    [\n      \"semantic-release-replace-plugin\",\n      {\n        \"replacements\": [\n          {\n            \"files\": [\"composer.json\"],\n            \"from\": \"version\\\": \\\".*\\\"\",\n            \"to\": \"version\\\": \\\"${nextRelease.version}\\\"\"\n          }\n        ]\n      }\n    ],\n    [\n      \"@semantic-release/git\",\n      {\n        \"assets\": [\"composer.json\"],\n        \"message\": \"chore(release): ${nextRelease.version} [skip ci]\\n\\n${nextRelease.notes}\"\n      }\n    ],\n    [\n      \"@semantic-release/exec\",\n      {\n        \"publishCmd\": \"curl --fail-with-body --header \\\"Job-Token: ${process.env.CI_JOB_TOKEN}\\\" --data tag=${nextRelease.gitTag} ${process.env.CI_API_V4_URL}/projects/${process.env.CI_PROJECT_ID}/packages/composer\"\n      }\n    ]\n  ]\n}\n","\u003Cplugin-root>/.releaserc.json",[8912],{"type":283,"tag":317,"props":8913,"children":8914},{"__ignoreMap":8},[8915,8922,8934,8946,8954,8966,8974,8986,8994,9016,9063,9105,9113,9121,9128,9135,9142,9154,9161,9181,9208,9215,9222,9229,9241,9248,9283,9290,9297,9305],{"type":283,"tag":321,"props":8916,"children":8917},{"class":323,"line":324},[8918],{"type":283,"tag":321,"props":8919,"children":8920},{"style":334},[8921],{"type":293,"value":5164},{"type":283,"tag":321,"props":8923,"children":8924},{"class":323,"line":340},[8925,8930],{"type":283,"tag":321,"props":8926,"children":8927},{"style":5170},[8928],{"type":293,"value":8929},"  \"plugins\"",{"type":283,"tag":321,"props":8931,"children":8932},{"style":334},[8933],{"type":293,"value":5405},{"type":283,"tag":321,"props":8935,"children":8936},{"class":323,"line":353},[8937,8942],{"type":283,"tag":321,"props":8938,"children":8939},{"style":5180},[8940],{"type":293,"value":8941},"    \"@semantic-release/commit-analyzer\"",{"type":283,"tag":321,"props":8943,"children":8944},{"style":334},[8945],{"type":293,"value":5188},{"type":283,"tag":321,"props":8947,"children":8948},{"class":323,"line":373},[8949],{"type":283,"tag":321,"props":8950,"children":8951},{"style":334},[8952],{"type":293,"value":8953},"    [\n",{"type":283,"tag":321,"props":8955,"children":8956},{"class":323,"line":308},[8957,8962],{"type":283,"tag":321,"props":8958,"children":8959},{"style":5180},[8960],{"type":293,"value":8961},"      \"semantic-release-replace-plugin\"",{"type":283,"tag":321,"props":8963,"children":8964},{"style":334},[8965],{"type":293,"value":5188},{"type":283,"tag":321,"props":8967,"children":8968},{"class":323,"line":309},[8969],{"type":283,"tag":321,"props":8970,"children":8971},{"style":334},[8972],{"type":293,"value":8973},"      {\n",{"type":283,"tag":321,"props":8975,"children":8976},{"class":323,"line":310},[8977,8982],{"type":283,"tag":321,"props":8978,"children":8979},{"style":5170},[8980],{"type":293,"value":8981},"        \"replacements\"",{"type":283,"tag":321,"props":8983,"children":8984},{"style":334},[8985],{"type":293,"value":5405},{"type":283,"tag":321,"props":8987,"children":8988},{"class":323,"line":311},[8989],{"type":283,"tag":321,"props":8990,"children":8991},{"style":334},[8992],{"type":293,"value":8993},"          {\n",{"type":283,"tag":321,"props":8995,"children":8996},{"class":323,"line":312},[8997,9002,9006,9011],{"type":283,"tag":321,"props":8998,"children":8999},{"style":5170},[9000],{"type":293,"value":9001},"            \"files\"",{"type":283,"tag":321,"props":9003,"children":9004},{"style":334},[9005],{"type":293,"value":1888},{"type":283,"tag":321,"props":9007,"children":9008},{"style":5180},[9009],{"type":293,"value":9010},"\"composer.json\"",{"type":283,"tag":321,"props":9012,"children":9013},{"style":334},[9014],{"type":293,"value":9015},"],\n",{"type":283,"tag":321,"props":9017,"children":9018},{"class":323,"line":977},[9019,9024,9028,9033,9038,9042,9046,9051,9055,9059],{"type":283,"tag":321,"props":9020,"children":9021},{"style":5170},[9022],{"type":293,"value":9023},"            \"from\"",{"type":283,"tag":321,"props":9025,"children":9026},{"style":334},[9027],{"type":293,"value":364},{"type":283,"tag":321,"props":9029,"children":9030},{"style":5180},[9031],{"type":293,"value":9032},"\"version",{"type":283,"tag":321,"props":9034,"children":9035},{"style":1730},[9036],{"type":293,"value":9037},"\\\"",{"type":283,"tag":321,"props":9039,"children":9040},{"style":5180},[9041],{"type":293,"value":364},{"type":283,"tag":321,"props":9043,"children":9044},{"style":1730},[9045],{"type":293,"value":9037},{"type":283,"tag":321,"props":9047,"children":9048},{"style":5180},[9049],{"type":293,"value":9050},".*",{"type":283,"tag":321,"props":9052,"children":9053},{"style":1730},[9054],{"type":293,"value":9037},{"type":283,"tag":321,"props":9056,"children":9057},{"style":5180},[9058],{"type":293,"value":5777},{"type":283,"tag":321,"props":9060,"children":9061},{"style":334},[9062],{"type":293,"value":5188},{"type":283,"tag":321,"props":9064,"children":9065},{"class":323,"line":990},[9066,9071,9075,9079,9083,9087,9091,9096,9100],{"type":283,"tag":321,"props":9067,"children":9068},{"style":5170},[9069],{"type":293,"value":9070},"            \"to\"",{"type":283,"tag":321,"props":9072,"children":9073},{"style":334},[9074],{"type":293,"value":364},{"type":283,"tag":321,"props":9076,"children":9077},{"style":5180},[9078],{"type":293,"value":9032},{"type":283,"tag":321,"props":9080,"children":9081},{"style":1730},[9082],{"type":293,"value":9037},{"type":283,"tag":321,"props":9084,"children":9085},{"style":5180},[9086],{"type":293,"value":364},{"type":283,"tag":321,"props":9088,"children":9089},{"style":1730},[9090],{"type":293,"value":9037},{"type":283,"tag":321,"props":9092,"children":9093},{"style":5180},[9094],{"type":293,"value":9095},"${nextRelease.version}",{"type":283,"tag":321,"props":9097,"children":9098},{"style":1730},[9099],{"type":293,"value":9037},{"type":283,"tag":321,"props":9101,"children":9102},{"style":5180},[9103],{"type":293,"value":9104},"\"\n",{"type":283,"tag":321,"props":9106,"children":9107},{"class":323,"line":1003},[9108],{"type":283,"tag":321,"props":9109,"children":9110},{"style":334},[9111],{"type":293,"value":9112},"          }\n",{"type":283,"tag":321,"props":9114,"children":9115},{"class":323,"line":1016},[9116],{"type":283,"tag":321,"props":9117,"children":9118},{"style":334},[9119],{"type":293,"value":9120},"        ]\n",{"type":283,"tag":321,"props":9122,"children":9123},{"class":323,"line":1029},[9124],{"type":283,"tag":321,"props":9125,"children":9126},{"style":334},[9127],{"type":293,"value":5491},{"type":283,"tag":321,"props":9129,"children":9130},{"class":323,"line":1042},[9131],{"type":283,"tag":321,"props":9132,"children":9133},{"style":334},[9134],{"type":293,"value":6007},{"type":283,"tag":321,"props":9136,"children":9137},{"class":323,"line":1052},[9138],{"type":283,"tag":321,"props":9139,"children":9140},{"style":334},[9141],{"type":293,"value":8953},{"type":283,"tag":321,"props":9143,"children":9144},{"class":323,"line":1065},[9145,9150],{"type":283,"tag":321,"props":9146,"children":9147},{"style":5180},[9148],{"type":293,"value":9149},"      \"@semantic-release/git\"",{"type":283,"tag":321,"props":9151,"children":9152},{"style":334},[9153],{"type":293,"value":5188},{"type":283,"tag":321,"props":9155,"children":9156},{"class":323,"line":1078},[9157],{"type":283,"tag":321,"props":9158,"children":9159},{"style":334},[9160],{"type":293,"value":8973},{"type":283,"tag":321,"props":9162,"children":9163},{"class":323,"line":1087},[9164,9169,9173,9177],{"type":283,"tag":321,"props":9165,"children":9166},{"style":5170},[9167],{"type":293,"value":9168},"        \"assets\"",{"type":283,"tag":321,"props":9170,"children":9171},{"style":334},[9172],{"type":293,"value":1888},{"type":283,"tag":321,"props":9174,"children":9175},{"style":5180},[9176],{"type":293,"value":9010},{"type":283,"tag":321,"props":9178,"children":9179},{"style":334},[9180],{"type":293,"value":9015},{"type":283,"tag":321,"props":9182,"children":9183},{"class":323,"line":1100},[9184,9189,9193,9198,9203],{"type":283,"tag":321,"props":9185,"children":9186},{"style":5170},[9187],{"type":293,"value":9188},"        \"message\"",{"type":283,"tag":321,"props":9190,"children":9191},{"style":334},[9192],{"type":293,"value":364},{"type":283,"tag":321,"props":9194,"children":9195},{"style":5180},[9196],{"type":293,"value":9197},"\"chore(release): ${nextRelease.version} [skip ci]",{"type":283,"tag":321,"props":9199,"children":9200},{"style":1730},[9201],{"type":293,"value":9202},"\\n\\n",{"type":283,"tag":321,"props":9204,"children":9205},{"style":5180},[9206],{"type":293,"value":9207},"${nextRelease.notes}\"\n",{"type":283,"tag":321,"props":9209,"children":9210},{"class":323,"line":1113},[9211],{"type":283,"tag":321,"props":9212,"children":9213},{"style":334},[9214],{"type":293,"value":5491},{"type":283,"tag":321,"props":9216,"children":9217},{"class":323,"line":1126},[9218],{"type":283,"tag":321,"props":9219,"children":9220},{"style":334},[9221],{"type":293,"value":6007},{"type":283,"tag":321,"props":9223,"children":9224},{"class":323,"line":1134},[9225],{"type":283,"tag":321,"props":9226,"children":9227},{"style":334},[9228],{"type":293,"value":8953},{"type":283,"tag":321,"props":9230,"children":9231},{"class":323,"line":1147},[9232,9237],{"type":283,"tag":321,"props":9233,"children":9234},{"style":5180},[9235],{"type":293,"value":9236},"      \"@semantic-release/exec\"",{"type":283,"tag":321,"props":9238,"children":9239},{"style":334},[9240],{"type":293,"value":5188},{"type":283,"tag":321,"props":9242,"children":9243},{"class":323,"line":1160},[9244],{"type":283,"tag":321,"props":9245,"children":9246},{"style":334},[9247],{"type":293,"value":8973},{"type":283,"tag":321,"props":9249,"children":9250},{"class":323,"line":1173},[9251,9256,9260,9265,9269,9274,9278],{"type":283,"tag":321,"props":9252,"children":9253},{"style":5170},[9254],{"type":293,"value":9255},"        \"publishCmd\"",{"type":283,"tag":321,"props":9257,"children":9258},{"style":334},[9259],{"type":293,"value":364},{"type":283,"tag":321,"props":9261,"children":9262},{"style":5180},[9263],{"type":293,"value":9264},"\"curl --fail-with-body --header ",{"type":283,"tag":321,"props":9266,"children":9267},{"style":1730},[9268],{"type":293,"value":9037},{"type":283,"tag":321,"props":9270,"children":9271},{"style":5180},[9272],{"type":293,"value":9273},"Job-Token: ${process.env.CI_JOB_TOKEN}",{"type":283,"tag":321,"props":9275,"children":9276},{"style":1730},[9277],{"type":293,"value":9037},{"type":283,"tag":321,"props":9279,"children":9280},{"style":5180},[9281],{"type":293,"value":9282}," --data tag=${nextRelease.gitTag} ${process.env.CI_API_V4_URL}/projects/${process.env.CI_PROJECT_ID}/packages/composer\"\n",{"type":283,"tag":321,"props":9284,"children":9285},{"class":323,"line":1186},[9286],{"type":283,"tag":321,"props":9287,"children":9288},{"style":334},[9289],{"type":293,"value":5491},{"type":283,"tag":321,"props":9291,"children":9292},{"class":323,"line":1199},[9293],{"type":283,"tag":321,"props":9294,"children":9295},{"style":334},[9296],{"type":293,"value":6034},{"type":283,"tag":321,"props":9298,"children":9299},{"class":323,"line":2160},[9300],{"type":283,"tag":321,"props":9301,"children":9302},{"style":334},[9303],{"type":293,"value":9304},"  ]\n",{"type":283,"tag":321,"props":9306,"children":9307},{"class":323,"line":2161},[9308],{"type":283,"tag":321,"props":9309,"children":9310},{"style":334},[9311],{"type":293,"value":6153},{"type":283,"tag":284,"props":9313,"children":9314},{},[9315],{"type":293,"value":5014},{"type":283,"tag":613,"props":9317,"children":9318},{},[9319,9324,9336,9348,9353],{"type":283,"tag":461,"props":9320,"children":9321},{},[9322],{"type":293,"value":9323},"Die Commits seit dem letzten Release analysieren, um zu entscheiden, ob eine neue Version veröffentlicht werden soll",{"type":283,"tag":461,"props":9325,"children":9326},{},[9327,9329,9334],{"type":293,"value":9328},"Die Version in der ",{"type":283,"tag":317,"props":9330,"children":9332},{"className":9331},[],[9333],{"type":293,"value":6420},{"type":293,"value":9335}," aktualisieren",{"type":283,"tag":461,"props":9337,"children":9338},{},[9339,9341,9346],{"type":293,"value":9340},"Die ",{"type":283,"tag":317,"props":9342,"children":9344},{"className":9343},[],[9345],{"type":293,"value":6420},{"type":293,"value":9347}," zurück in das Repository committen",{"type":283,"tag":461,"props":9349,"children":9350},{},[9351],{"type":293,"value":9352},"Einen Tag erstellen",{"type":283,"tag":461,"props":9354,"children":9355},{},[9356],{"type":293,"value":9357},"Ein Composer-Paket von diesem Tag releasen",{"type":283,"tag":1489,"props":9359,"children":9360},{},[9361],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":9363},[9364,9370],{"id":5119,"depth":340,"text":5122,"children":9365},[9366,9367,9368,9369],{"id":5130,"depth":353,"text":5133},{"id":6386,"depth":353,"text":6389},{"id":7048,"depth":353,"text":7051},{"id":8399,"depth":353,"text":8402},{"id":8431,"depth":340,"text":8434,"children":9371},[9372,9373],{"id":8437,"depth":353,"text":8440},{"id":8664,"depth":353,"text":8667},{"_path":61,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":62,"description":63,"author":11,"image":12,"releaseDate":64,"blogCategories":9375,"articleTags":9376,"tags":9377,"body":9378,"_type":20,"_id":68,"_source":22,"_file":69,"_stem":70,"_extension":25},[15,16],[16,33],[19],{"type":280,"children":9379,"toc":10837},[9380,9385,9390,9395,9400,9405,9423,9428,9468,9474,9487,9500,9505,9511,9522,9535,9544,9550,9555,9667,10185,10220,10233,10236,10241,10402,10415,10421,10426,10496,10501,10507,10512,10525,10538,10572,10599,10611,10630,10643,10646,10651,10664,10684,10689,10694,10814,10833],{"type":283,"tag":284,"props":9381,"children":9382},{},[9383],{"type":293,"value":9384},"Die Verwaltung eines Servers mit mehreren Diensten kann knifflig sein. Nicht jede Software ist miteinander kompatibel. Beispielsweise gibt es Anforderungen an Datenbank- oder PHP-Versionen.",{"type":283,"tag":284,"props":9386,"children":9387},{},[9388],{"type":293,"value":9389},"Außerdem sollte die Software auf dem neuesten Stand sein, um mögliche Sicherheitsrisiken zu minimieren.",{"type":283,"tag":284,"props":9391,"children":9392},{},[9393],{"type":293,"value":9394},"Es gibt viele Möglichkeiten, damit umzugehen, wie etwa Ansible, Chef usw.",{"type":283,"tag":284,"props":9396,"children":9397},{},[9398],{"type":293,"value":9399},"Unser Ziel war eine einfach zu bedienende, automatisierte und kostenlose Lösung.",{"type":283,"tag":284,"props":9401,"children":9402},{},[9403],{"type":293,"value":9404},"Hier sind die Ziele:",{"type":283,"tag":457,"props":9406,"children":9407},{},[9408,9413,9418],{"type":283,"tag":461,"props":9409,"children":9410},{},[9411],{"type":293,"value":9412},"den GitOps-Ansatz nutzen, um die Konfiguration zu speichern und per Versionskontrolle nachvollziehbar zu machen",{"type":283,"tag":461,"props":9414,"children":9415},{},[9416],{"type":293,"value":9417},"Container verwenden, um die Software auszuführen",{"type":283,"tag":461,"props":9419,"children":9420},{},[9421],{"type":293,"value":9422},"Sicherheitsupdates automatisch ausspielen und Minor-/Major-Updates per Opt-in steuern",{"type":283,"tag":284,"props":9424,"children":9425},{},[9426],{"type":293,"value":9427},"Wir haben uns am Ende für den folgenden Stack entschieden:",{"type":283,"tag":457,"props":9429,"children":9430},{},[9431,9447,9457],{"type":283,"tag":461,"props":9432,"children":9433},{},[9434,9439,9441,9445],{"type":283,"tag":288,"props":9435,"children":9437},{"href":9436},"https://www.docker.com/",[9438],{"type":293,"value":1527},{"type":293,"value":9440}," und ",{"type":283,"tag":288,"props":9442,"children":9443},{"href":560},[9444],{"type":293,"value":563},{"type":293,"value":9446}," zum Verwalten der Software",{"type":283,"tag":461,"props":9448,"children":9449},{},[9450,9455],{"type":283,"tag":288,"props":9451,"children":9453},{"href":9452},"https://about.gitlab.com/",[9454],{"type":293,"value":1531},{"type":293,"value":9456}," zum Speichern aller Compose-Dateien",{"type":283,"tag":461,"props":9458,"children":9459},{},[9460,9466],{"type":283,"tag":288,"props":9461,"children":9463},{"href":9462},"https://docs.renovatebot.com",[9464],{"type":293,"value":9465},"Renovate Bot",{"type":293,"value":9467},", um die Software aktuell zu halten",{"type":283,"tag":532,"props":9469,"children":9471},{"id":9470},"über-den-stack",[9472],{"type":293,"value":9473},"Über den Stack",{"type":283,"tag":284,"props":9475,"children":9476},{},[9477,9479,9485],{"type":293,"value":9478},"Wir verwenden Docker bereits seit einiger Zeit in der Produktion. Je nach Situation erstellen wir die Compose-Datei direkt auf dem Server, verwalten sie über Portainer oder übertragen sie per ",{"type":283,"tag":317,"props":9480,"children":9482},{"className":9481},[],[9483],{"type":293,"value":9484},"scp",{"type":293,"value":9486}," in eine Pipeline.",{"type":283,"tag":284,"props":9488,"children":9489},{},[9490,9492,9498],{"type":293,"value":9491},"GitLab ist unser primäres Tool für die Versionskontrolle. Zusätzlich kümmert sich ein ",{"type":283,"tag":288,"props":9493,"children":9495},{"href":9494},"https://docs.gitlab.com/runner/",[9496],{"type":293,"value":9497},"GitLab Runner",{"type":293,"value":9499}," um das Ausführen der Pipelines.",{"type":283,"tag":284,"props":9501,"children":9502},{},[9503],{"type":293,"value":9504},"Renovate automatisiert Abhängigkeitsupdates. PHP, Go, Python, Docker – um nur ein paar zu nennen. Wir nutzen es bereits in verschiedenen Projekten.",{"type":283,"tag":532,"props":9506,"children":9508},{"id":9507},"container-mit-docker-und-docker-compose",[9509],{"type":293,"value":9510},"Container mit Docker und Docker Compose",{"type":283,"tag":284,"props":9512,"children":9513},{},[9514,9516,9521],{"type":293,"value":9515},"Der Hauptgrund, warum wir Docker gewählt haben, ist die Möglichkeit, auf einen remoten Docker-Host zuzugreifen und Docker-Befehle ausführen zu können.\nWeitere Informationen findest du in der ",{"type":283,"tag":288,"props":9517,"children":9519},{"href":9518},"https://docs.docker.com/reference/cli/docker/#host",[9520],{"type":293,"value":4076},{"type":293,"value":1302},{"type":283,"tag":284,"props":9523,"children":9524},{},[9525,9527,9533],{"type":293,"value":9526},"Wir verwenden ",{"type":283,"tag":317,"props":9528,"children":9530},{"className":9529},[],[9531],{"type":293,"value":9532},"ssh",{"type":293,"value":9534},", um auf unseren Zielserver zuzugreifen.",{"type":283,"tag":284,"props":9536,"children":9537},{},[9538],{"type":283,"tag":317,"props":9539,"children":9541},{"className":9540},[],[9542],{"type":293,"value":9543},"DOCKER_HOST=ssh://[username@]\u003CIP or host>[:port] docker compose up --wait",{"type":283,"tag":532,"props":9545,"children":9547},{"id":9546},"gitops-mit-gitlab",[9548],{"type":293,"value":9549},"GitOps mit GitLab",{"type":283,"tag":284,"props":9551,"children":9552},{},[9553],{"type":293,"value":9554},"Die Idee hinter GitOps ist, ein Git-Repository zur Ablage der Konfiguration zu verwenden. Hier ein Beispiel:",{"type":283,"tag":303,"props":9556,"children":9558},{"className":1705,"code":9557,"language":1704,"meta":8,"style":8},".\n├──.gitlab-ci.yml             # Pipeline-Definition\n├── renovate.json             # Renovate-Konfiguration\n├── nextcloud\n│   ├── docker-compose.yml   # Nextcloud Datei-Hosting und Zusammenarbeit\n└── traefik\n    └── docker-compose.yml   # Traefik Reverse-Proxy-Konfiguration\n\n",[9559],{"type":283,"tag":317,"props":9560,"children":9561},{"__ignoreMap":8},[9562,9571,9584,9602,9614,9637,9650],{"type":283,"tag":321,"props":9563,"children":9564},{"class":323,"line":324},[9565],{"type":283,"tag":321,"props":9566,"children":9568},{"style":9567},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF",[9569],{"type":293,"value":9570},".\n",{"type":283,"tag":321,"props":9572,"children":9573},{"class":323,"line":340},[9574,9579],{"type":283,"tag":321,"props":9575,"children":9576},{"style":1715},[9577],{"type":293,"value":9578},"├──.gitlab-ci.yml",{"type":283,"tag":321,"props":9580,"children":9581},{"style":1447},[9582],{"type":293,"value":9583},"             # Pipeline-Definition\n",{"type":283,"tag":321,"props":9585,"children":9586},{"class":323,"line":353},[9587,9592,9597],{"type":283,"tag":321,"props":9588,"children":9589},{"style":1715},[9590],{"type":293,"value":9591},"├──",{"type":283,"tag":321,"props":9593,"children":9594},{"style":367},[9595],{"type":293,"value":9596}," renovate.json",{"type":283,"tag":321,"props":9598,"children":9599},{"style":1447},[9600],{"type":293,"value":9601},"             # Renovate-Konfiguration\n",{"type":283,"tag":321,"props":9603,"children":9604},{"class":323,"line":373},[9605,9609],{"type":283,"tag":321,"props":9606,"children":9607},{"style":1715},[9608],{"type":293,"value":9591},{"type":283,"tag":321,"props":9610,"children":9611},{"style":367},[9612],{"type":293,"value":9613}," nextcloud\n",{"type":283,"tag":321,"props":9615,"children":9616},{"class":323,"line":308},[9617,9622,9627,9632],{"type":283,"tag":321,"props":9618,"children":9619},{"style":1715},[9620],{"type":293,"value":9621},"│",{"type":283,"tag":321,"props":9623,"children":9624},{"style":367},[9625],{"type":293,"value":9626},"   ├──",{"type":283,"tag":321,"props":9628,"children":9629},{"style":367},[9630],{"type":293,"value":9631}," docker-compose.yml",{"type":283,"tag":321,"props":9633,"children":9634},{"style":1447},[9635],{"type":293,"value":9636},"   # Nextcloud Datei-Hosting und Zusammenarbeit\n",{"type":283,"tag":321,"props":9638,"children":9639},{"class":323,"line":309},[9640,9645],{"type":283,"tag":321,"props":9641,"children":9642},{"style":1715},[9643],{"type":293,"value":9644},"└──",{"type":283,"tag":321,"props":9646,"children":9647},{"style":367},[9648],{"type":293,"value":9649}," traefik\n",{"type":283,"tag":321,"props":9651,"children":9652},{"class":323,"line":310},[9653,9658,9662],{"type":283,"tag":321,"props":9654,"children":9655},{"style":1715},[9656],{"type":293,"value":9657},"    └──",{"type":283,"tag":321,"props":9659,"children":9660},{"style":367},[9661],{"type":293,"value":9631},{"type":283,"tag":321,"props":9663,"children":9664},{"style":1447},[9665],{"type":293,"value":9666},"   # Traefik Reverse-Proxy-Konfiguration\n",{"type":283,"tag":303,"props":9668,"children":9671},{"className":314,"code":9669,"filename":9670,"language":313,"meta":8,"style":8},"volumes:\n  nextcloud:\n  db:\n\nservices:\n  db:\n    image: mariadb:11.8\n    restart: unless-stopped\n    volumes:\n      - db:/var/lib/mysql\n    environment:\n      - MARIADB_ROOT_PASSWORD=${NEXTCLOUD_MARIADB_ROOT_PASSWORD:?error}\n      - MARIADB_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n      - MARIADB_DATABASE=nextcloud\n      - MARIADB_USER=nextcloud\n    command:\n      - --transaction-isolation=READ-COMMITTED\n      - --log-bin=binlog\n      - --binlog-format=ROW\n    healthcheck:\n      test: [\"CMD\", \"healthcheck.sh\", \"--connect\", \"--innodb_initialized\"]\n      interval: 15s\n      timeout: 5s\n      retries: 6\n\n  nextcloud:\n    image: nextcloud:32.0.0\n    restart: unless-stopped\n    depends_on:\n      db:\n        condition: service_healthy\n    volumes:\n      - nextcloud:/var/www/html\n    environment:\n      - MYSQL_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n      - MYSQL_DATABASE=nextcloud\n      - MYSQL_USER=nextcloud\n      - MYSQL_HOST=db\n","nextcloud/docker-compose.yaml",[9672],{"type":283,"tag":317,"props":9673,"children":9674},{"__ignoreMap":8},[9675,9686,9698,9710,9717,9728,9739,9755,9771,9782,9794,9806,9818,9830,9842,9854,9865,9877,9889,9901,9913,9962,9979,9996,10013,10020,10031,10047,10062,10074,10086,10103,10114,10126,10137,10149,10161,10173],{"type":283,"tag":321,"props":9676,"children":9677},{"class":323,"line":324},[9678,9682],{"type":283,"tag":321,"props":9679,"children":9680},{"style":328},[9681],{"type":293,"value":860},{"type":283,"tag":321,"props":9683,"children":9684},{"style":334},[9685],{"type":293,"value":337},{"type":283,"tag":321,"props":9687,"children":9688},{"class":323,"line":340},[9689,9694],{"type":283,"tag":321,"props":9690,"children":9691},{"style":328},[9692],{"type":293,"value":9693},"  nextcloud",{"type":283,"tag":321,"props":9695,"children":9696},{"style":334},[9697],{"type":293,"value":337},{"type":283,"tag":321,"props":9699,"children":9700},{"class":323,"line":353},[9701,9706],{"type":283,"tag":321,"props":9702,"children":9703},{"style":328},[9704],{"type":293,"value":9705},"  db",{"type":283,"tag":321,"props":9707,"children":9708},{"style":334},[9709],{"type":293,"value":337},{"type":283,"tag":321,"props":9711,"children":9712},{"class":323,"line":373},[9713],{"type":283,"tag":321,"props":9714,"children":9715},{"emptyLinePlaceholder":1046},[9716],{"type":293,"value":1049},{"type":283,"tag":321,"props":9718,"children":9719},{"class":323,"line":308},[9720,9724],{"type":283,"tag":321,"props":9721,"children":9722},{"style":328},[9723],{"type":293,"value":331},{"type":283,"tag":321,"props":9725,"children":9726},{"style":334},[9727],{"type":293,"value":337},{"type":283,"tag":321,"props":9729,"children":9730},{"class":323,"line":309},[9731,9735],{"type":283,"tag":321,"props":9732,"children":9733},{"style":328},[9734],{"type":293,"value":9705},{"type":283,"tag":321,"props":9736,"children":9737},{"style":334},[9738],{"type":293,"value":337},{"type":283,"tag":321,"props":9740,"children":9741},{"class":323,"line":310},[9742,9746,9750],{"type":283,"tag":321,"props":9743,"children":9744},{"style":328},[9745],{"type":293,"value":359},{"type":283,"tag":321,"props":9747,"children":9748},{"style":334},[9749],{"type":293,"value":364},{"type":283,"tag":321,"props":9751,"children":9752},{"style":367},[9753],{"type":293,"value":9754},"mariadb:11.8\n",{"type":283,"tag":321,"props":9756,"children":9757},{"class":323,"line":311},[9758,9762,9766],{"type":283,"tag":321,"props":9759,"children":9760},{"style":328},[9761],{"type":293,"value":932},{"type":283,"tag":321,"props":9763,"children":9764},{"style":334},[9765],{"type":293,"value":364},{"type":283,"tag":321,"props":9767,"children":9768},{"style":367},[9769],{"type":293,"value":9770},"unless-stopped\n",{"type":283,"tag":321,"props":9772,"children":9773},{"class":323,"line":312},[9774,9778],{"type":283,"tag":321,"props":9775,"children":9776},{"style":328},[9777],{"type":293,"value":1179},{"type":283,"tag":321,"props":9779,"children":9780},{"style":334},[9781],{"type":293,"value":337},{"type":283,"tag":321,"props":9783,"children":9784},{"class":323,"line":977},[9785,9789],{"type":283,"tag":321,"props":9786,"children":9787},{"style":334},[9788],{"type":293,"value":393},{"type":283,"tag":321,"props":9790,"children":9791},{"style":367},[9792],{"type":293,"value":9793},"db:/var/lib/mysql\n",{"type":283,"tag":321,"props":9795,"children":9796},{"class":323,"line":990},[9797,9802],{"type":283,"tag":321,"props":9798,"children":9799},{"style":328},[9800],{"type":293,"value":9801},"    environment",{"type":283,"tag":321,"props":9803,"children":9804},{"style":334},[9805],{"type":293,"value":337},{"type":283,"tag":321,"props":9807,"children":9808},{"class":323,"line":1003},[9809,9813],{"type":283,"tag":321,"props":9810,"children":9811},{"style":334},[9812],{"type":293,"value":393},{"type":283,"tag":321,"props":9814,"children":9815},{"style":367},[9816],{"type":293,"value":9817},"MARIADB_ROOT_PASSWORD=${NEXTCLOUD_MARIADB_ROOT_PASSWORD:?error}\n",{"type":283,"tag":321,"props":9819,"children":9820},{"class":323,"line":1016},[9821,9825],{"type":283,"tag":321,"props":9822,"children":9823},{"style":334},[9824],{"type":293,"value":393},{"type":283,"tag":321,"props":9826,"children":9827},{"style":367},[9828],{"type":293,"value":9829},"MARIADB_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":283,"tag":321,"props":9831,"children":9832},{"class":323,"line":1029},[9833,9837],{"type":283,"tag":321,"props":9834,"children":9835},{"style":334},[9836],{"type":293,"value":393},{"type":283,"tag":321,"props":9838,"children":9839},{"style":367},[9840],{"type":293,"value":9841},"MARIADB_DATABASE=nextcloud\n",{"type":283,"tag":321,"props":9843,"children":9844},{"class":323,"line":1042},[9845,9849],{"type":283,"tag":321,"props":9846,"children":9847},{"style":334},[9848],{"type":293,"value":393},{"type":283,"tag":321,"props":9850,"children":9851},{"style":367},[9852],{"type":293,"value":9853},"MARIADB_USER=nextcloud\n",{"type":283,"tag":321,"props":9855,"children":9856},{"class":323,"line":1052},[9857,9861],{"type":283,"tag":321,"props":9858,"children":9859},{"style":328},[9860],{"type":293,"value":983},{"type":283,"tag":321,"props":9862,"children":9863},{"style":334},[9864],{"type":293,"value":337},{"type":283,"tag":321,"props":9866,"children":9867},{"class":323,"line":1065},[9868,9872],{"type":283,"tag":321,"props":9869,"children":9870},{"style":334},[9871],{"type":293,"value":393},{"type":283,"tag":321,"props":9873,"children":9874},{"style":367},[9875],{"type":293,"value":9876},"--transaction-isolation=READ-COMMITTED\n",{"type":283,"tag":321,"props":9878,"children":9879},{"class":323,"line":1078},[9880,9884],{"type":283,"tag":321,"props":9881,"children":9882},{"style":334},[9883],{"type":293,"value":393},{"type":283,"tag":321,"props":9885,"children":9886},{"style":367},[9887],{"type":293,"value":9888},"--log-bin=binlog\n",{"type":283,"tag":321,"props":9890,"children":9891},{"class":323,"line":1087},[9892,9896],{"type":283,"tag":321,"props":9893,"children":9894},{"style":334},[9895],{"type":293,"value":393},{"type":283,"tag":321,"props":9897,"children":9898},{"style":367},[9899],{"type":293,"value":9900},"--binlog-format=ROW\n",{"type":283,"tag":321,"props":9902,"children":9903},{"class":323,"line":1100},[9904,9909],{"type":283,"tag":321,"props":9905,"children":9906},{"style":328},[9907],{"type":293,"value":9908},"    healthcheck",{"type":283,"tag":321,"props":9910,"children":9911},{"style":334},[9912],{"type":293,"value":337},{"type":283,"tag":321,"props":9914,"children":9915},{"class":323,"line":1113},[9916,9921,9925,9930,9935,9940,9944,9949,9953,9958],{"type":283,"tag":321,"props":9917,"children":9918},{"style":328},[9919],{"type":293,"value":9920},"      test",{"type":283,"tag":321,"props":9922,"children":9923},{"style":334},[9924],{"type":293,"value":1888},{"type":283,"tag":321,"props":9926,"children":9927},{"style":367},[9928],{"type":293,"value":9929},"\"CMD\"",{"type":283,"tag":321,"props":9931,"children":9932},{"style":334},[9933],{"type":293,"value":9934},", ",{"type":283,"tag":321,"props":9936,"children":9937},{"style":367},[9938],{"type":293,"value":9939},"\"healthcheck.sh\"",{"type":283,"tag":321,"props":9941,"children":9942},{"style":334},[9943],{"type":293,"value":9934},{"type":283,"tag":321,"props":9945,"children":9946},{"style":367},[9947],{"type":293,"value":9948},"\"--connect\"",{"type":283,"tag":321,"props":9950,"children":9951},{"style":334},[9952],{"type":293,"value":9934},{"type":283,"tag":321,"props":9954,"children":9955},{"style":367},[9956],{"type":293,"value":9957},"\"--innodb_initialized\"",{"type":283,"tag":321,"props":9959,"children":9960},{"style":334},[9961],{"type":293,"value":1898},{"type":283,"tag":321,"props":9963,"children":9964},{"class":323,"line":1126},[9965,9970,9974],{"type":283,"tag":321,"props":9966,"children":9967},{"style":328},[9968],{"type":293,"value":9969},"      interval",{"type":283,"tag":321,"props":9971,"children":9972},{"style":334},[9973],{"type":293,"value":364},{"type":283,"tag":321,"props":9975,"children":9976},{"style":367},[9977],{"type":293,"value":9978},"15s\n",{"type":283,"tag":321,"props":9980,"children":9981},{"class":323,"line":1134},[9982,9987,9991],{"type":283,"tag":321,"props":9983,"children":9984},{"style":328},[9985],{"type":293,"value":9986},"      timeout",{"type":283,"tag":321,"props":9988,"children":9989},{"style":334},[9990],{"type":293,"value":364},{"type":283,"tag":321,"props":9992,"children":9993},{"style":367},[9994],{"type":293,"value":9995},"5s\n",{"type":283,"tag":321,"props":9997,"children":9998},{"class":323,"line":1147},[9999,10004,10008],{"type":283,"tag":321,"props":10000,"children":10001},{"style":328},[10002],{"type":293,"value":10003},"      retries",{"type":283,"tag":321,"props":10005,"children":10006},{"style":334},[10007],{"type":293,"value":364},{"type":283,"tag":321,"props":10009,"children":10010},{"style":1730},[10011],{"type":293,"value":10012},"6\n",{"type":283,"tag":321,"props":10014,"children":10015},{"class":323,"line":1160},[10016],{"type":283,"tag":321,"props":10017,"children":10018},{"emptyLinePlaceholder":1046},[10019],{"type":293,"value":1049},{"type":283,"tag":321,"props":10021,"children":10022},{"class":323,"line":1173},[10023,10027],{"type":283,"tag":321,"props":10024,"children":10025},{"style":328},[10026],{"type":293,"value":9693},{"type":283,"tag":321,"props":10028,"children":10029},{"style":334},[10030],{"type":293,"value":337},{"type":283,"tag":321,"props":10032,"children":10033},{"class":323,"line":1186},[10034,10038,10042],{"type":283,"tag":321,"props":10035,"children":10036},{"style":328},[10037],{"type":293,"value":359},{"type":283,"tag":321,"props":10039,"children":10040},{"style":334},[10041],{"type":293,"value":364},{"type":283,"tag":321,"props":10043,"children":10044},{"style":367},[10045],{"type":293,"value":10046},"nextcloud:32.0.0\n",{"type":283,"tag":321,"props":10048,"children":10049},{"class":323,"line":1199},[10050,10054,10058],{"type":283,"tag":321,"props":10051,"children":10052},{"style":328},[10053],{"type":293,"value":932},{"type":283,"tag":321,"props":10055,"children":10056},{"style":334},[10057],{"type":293,"value":364},{"type":283,"tag":321,"props":10059,"children":10060},{"style":367},[10061],{"type":293,"value":9770},{"type":283,"tag":321,"props":10063,"children":10064},{"class":323,"line":2160},[10065,10070],{"type":283,"tag":321,"props":10066,"children":10067},{"style":328},[10068],{"type":293,"value":10069},"    depends_on",{"type":283,"tag":321,"props":10071,"children":10072},{"style":334},[10073],{"type":293,"value":337},{"type":283,"tag":321,"props":10075,"children":10076},{"class":323,"line":2161},[10077,10082],{"type":283,"tag":321,"props":10078,"children":10079},{"style":328},[10080],{"type":293,"value":10081},"      db",{"type":283,"tag":321,"props":10083,"children":10084},{"style":334},[10085],{"type":293,"value":337},{"type":283,"tag":321,"props":10087,"children":10088},{"class":323,"line":2162},[10089,10094,10098],{"type":283,"tag":321,"props":10090,"children":10091},{"style":328},[10092],{"type":293,"value":10093},"        condition",{"type":283,"tag":321,"props":10095,"children":10096},{"style":334},[10097],{"type":293,"value":364},{"type":283,"tag":321,"props":10099,"children":10100},{"style":367},[10101],{"type":293,"value":10102},"service_healthy\n",{"type":283,"tag":321,"props":10104,"children":10105},{"class":323,"line":2163},[10106,10110],{"type":283,"tag":321,"props":10107,"children":10108},{"style":328},[10109],{"type":293,"value":1179},{"type":283,"tag":321,"props":10111,"children":10112},{"style":334},[10113],{"type":293,"value":337},{"type":283,"tag":321,"props":10115,"children":10116},{"class":323,"line":2164},[10117,10121],{"type":283,"tag":321,"props":10118,"children":10119},{"style":334},[10120],{"type":293,"value":393},{"type":283,"tag":321,"props":10122,"children":10123},{"style":367},[10124],{"type":293,"value":10125},"nextcloud:/var/www/html\n",{"type":283,"tag":321,"props":10127,"children":10128},{"class":323,"line":2165},[10129,10133],{"type":283,"tag":321,"props":10130,"children":10131},{"style":328},[10132],{"type":293,"value":9801},{"type":283,"tag":321,"props":10134,"children":10135},{"style":334},[10136],{"type":293,"value":337},{"type":283,"tag":321,"props":10138,"children":10139},{"class":323,"line":2166},[10140,10144],{"type":283,"tag":321,"props":10141,"children":10142},{"style":334},[10143],{"type":293,"value":393},{"type":283,"tag":321,"props":10145,"children":10146},{"style":367},[10147],{"type":293,"value":10148},"MYSQL_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":283,"tag":321,"props":10150,"children":10151},{"class":323,"line":2167},[10152,10156],{"type":283,"tag":321,"props":10153,"children":10154},{"style":334},[10155],{"type":293,"value":393},{"type":283,"tag":321,"props":10157,"children":10158},{"style":367},[10159],{"type":293,"value":10160},"MYSQL_DATABASE=nextcloud\n",{"type":283,"tag":321,"props":10162,"children":10163},{"class":323,"line":2691},[10164,10168],{"type":283,"tag":321,"props":10165,"children":10166},{"style":334},[10167],{"type":293,"value":393},{"type":283,"tag":321,"props":10169,"children":10170},{"style":367},[10171],{"type":293,"value":10172},"MYSQL_USER=nextcloud\n",{"type":283,"tag":321,"props":10174,"children":10175},{"class":323,"line":2168},[10176,10180],{"type":283,"tag":321,"props":10177,"children":10178},{"style":334},[10179],{"type":293,"value":393},{"type":283,"tag":321,"props":10181,"children":10182},{"style":367},[10183],{"type":293,"value":10184},"MYSQL_HOST=db\n",{"type":283,"tag":303,"props":10186,"children":10190},{"className":10187,"code":10188,"language":10189,"meta":8,"style":8},"language-dotenv shiki shiki-themes github-dark github-dark monokai","NEXTCLOUD_MARIADB_ROOT_PASSWORD=\nNEXTCLOUD_MARIADB_PASSWORD=\n","dotenv",[10191],{"type":283,"tag":317,"props":10192,"children":10193},{"__ignoreMap":8},[10194,10208],{"type":283,"tag":321,"props":10195,"children":10196},{"class":323,"line":324},[10197,10203],{"type":283,"tag":321,"props":10198,"children":10200},{"style":10199},"--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2",[10201],{"type":293,"value":10202},"NEXTCLOUD_MARIADB_ROOT_PASSWORD",{"type":283,"tag":321,"props":10204,"children":10205},{"style":8079},[10206],{"type":293,"value":10207},"=\n",{"type":283,"tag":321,"props":10209,"children":10210},{"class":323,"line":340},[10211,10216],{"type":283,"tag":321,"props":10212,"children":10213},{"style":10199},[10214],{"type":293,"value":10215},"NEXTCLOUD_MARIADB_PASSWORD",{"type":283,"tag":321,"props":10217,"children":10218},{"style":8079},[10219],{"type":293,"value":10207},{"type":283,"tag":284,"props":10221,"children":10222},{},[10223,10225,10231],{"type":293,"value":10224},"Werden als ",{"type":283,"tag":288,"props":10226,"children":10228},{"href":10227},"https://docs.gitlab.com/ci/variables/",[10229],{"type":293,"value":10230},"CI/CD-Variablen",{"type":293,"value":10232}," gespeichert.",{"type":283,"tag":837,"props":10234,"children":10235},{},[],{"type":283,"tag":284,"props":10237,"children":10238},{},[10239],{"type":293,"value":10240},"Um den Stack zu deployen, haben wir folgende Pipeline:",{"type":283,"tag":303,"props":10242,"children":10244},{"className":314,"code":10243,"filename":8517,"language":313,"meta":8,"style":8},"stages:\n  - deploy\n\ndeploy:\n  stage: deploy\n  image: docker:28\n  variables:\n    DOCKER_HOST: ssh://[username@]\u003CIP or host>[:port]\n  script:\n    - for file in $(find . -type f -name docker-compose.yml); do docker compose -f $file up --remove-orphans --wait; done\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n\n",[10245],{"type":283,"tag":317,"props":10246,"children":10247},{"__ignoreMap":8},[10248,10259,10271,10278,10289,10304,10320,10331,10348,10359,10371,10382],{"type":283,"tag":321,"props":10249,"children":10250},{"class":323,"line":324},[10251,10255],{"type":283,"tag":321,"props":10252,"children":10253},{"style":328},[10254],{"type":293,"value":1809},{"type":283,"tag":321,"props":10256,"children":10257},{"style":334},[10258],{"type":293,"value":337},{"type":283,"tag":321,"props":10260,"children":10261},{"class":323,"line":340},[10262,10266],{"type":283,"tag":321,"props":10263,"children":10264},{"style":334},[10265],{"type":293,"value":1821},{"type":283,"tag":321,"props":10267,"children":10268},{"style":367},[10269],{"type":293,"value":10270},"deploy\n",{"type":283,"tag":321,"props":10272,"children":10273},{"class":323,"line":353},[10274],{"type":283,"tag":321,"props":10275,"children":10276},{"emptyLinePlaceholder":1046},[10277],{"type":293,"value":1049},{"type":283,"tag":321,"props":10279,"children":10280},{"class":323,"line":373},[10281,10285],{"type":283,"tag":321,"props":10282,"children":10283},{"style":328},[10284],{"type":293,"value":8558},{"type":283,"tag":321,"props":10286,"children":10287},{"style":334},[10288],{"type":293,"value":337},{"type":283,"tag":321,"props":10290,"children":10291},{"class":323,"line":308},[10292,10296,10300],{"type":283,"tag":321,"props":10293,"children":10294},{"style":328},[10295],{"type":293,"value":2222},{"type":283,"tag":321,"props":10297,"children":10298},{"style":334},[10299],{"type":293,"value":364},{"type":283,"tag":321,"props":10301,"children":10302},{"style":367},[10303],{"type":293,"value":10270},{"type":283,"tag":321,"props":10305,"children":10306},{"class":323,"line":309},[10307,10311,10315],{"type":283,"tag":321,"props":10308,"children":10309},{"style":328},[10310],{"type":293,"value":2238},{"type":283,"tag":321,"props":10312,"children":10313},{"style":334},[10314],{"type":293,"value":364},{"type":283,"tag":321,"props":10316,"children":10317},{"style":367},[10318],{"type":293,"value":10319},"docker:28\n",{"type":283,"tag":321,"props":10321,"children":10322},{"class":323,"line":310},[10323,10327],{"type":283,"tag":321,"props":10324,"children":10325},{"style":328},[10326],{"type":293,"value":2388},{"type":283,"tag":321,"props":10328,"children":10329},{"style":334},[10330],{"type":293,"value":337},{"type":283,"tag":321,"props":10332,"children":10333},{"class":323,"line":311},[10334,10339,10343],{"type":283,"tag":321,"props":10335,"children":10336},{"style":328},[10337],{"type":293,"value":10338},"    DOCKER_HOST",{"type":283,"tag":321,"props":10340,"children":10341},{"style":334},[10342],{"type":293,"value":364},{"type":283,"tag":321,"props":10344,"children":10345},{"style":367},[10346],{"type":293,"value":10347},"ssh://[username@]\u003CIP or host>[:port]\n",{"type":283,"tag":321,"props":10349,"children":10350},{"class":323,"line":312},[10351,10355],{"type":283,"tag":321,"props":10352,"children":10353},{"style":328},[10354],{"type":293,"value":2697},{"type":283,"tag":321,"props":10356,"children":10357},{"style":334},[10358],{"type":293,"value":337},{"type":283,"tag":321,"props":10360,"children":10361},{"class":323,"line":977},[10362,10366],{"type":283,"tag":321,"props":10363,"children":10364},{"style":334},[10365],{"type":293,"value":2300},{"type":283,"tag":321,"props":10367,"children":10368},{"style":367},[10369],{"type":293,"value":10370},"for file in $(find . -type f -name docker-compose.yml); do docker compose -f $file up --remove-orphans --wait; done\n",{"type":283,"tag":321,"props":10372,"children":10373},{"class":323,"line":990},[10374,10378],{"type":283,"tag":321,"props":10375,"children":10376},{"style":328},[10377],{"type":293,"value":2886},{"type":283,"tag":321,"props":10379,"children":10380},{"style":334},[10381],{"type":293,"value":337},{"type":283,"tag":321,"props":10383,"children":10384},{"class":323,"line":1003},[10385,10389,10393,10397],{"type":283,"tag":321,"props":10386,"children":10387},{"style":334},[10388],{"type":293,"value":2300},{"type":283,"tag":321,"props":10390,"children":10391},{"style":328},[10392],{"type":293,"value":2005},{"type":283,"tag":321,"props":10394,"children":10395},{"style":334},[10396],{"type":293,"value":364},{"type":283,"tag":321,"props":10398,"children":10399},{"style":367},[10400],{"type":293,"value":10401},"$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n",{"type":283,"tag":284,"props":10403,"children":10404},{},[10405,10407,10413],{"type":293,"value":10406},"Die Pipeline läuft bei jedem Commit auf dem Standard-Branch, iteriert über alle ",{"type":283,"tag":317,"props":10408,"children":10410},{"className":10409},[],[10411],{"type":293,"value":10412},"docker-compose.yml",{"type":293,"value":10414},"-Dateien und deployt sie.",{"type":283,"tag":532,"props":10416,"children":10418},{"id":10417},"halte-deine-software-aktuell-mit-renovate-bot",[10419],{"type":293,"value":10420},"Halte deine Software aktuell mit Renovate-Bot",{"type":283,"tag":284,"props":10422,"children":10423},{},[10424],{"type":293,"value":10425},"Hier kommt Renovate ins Spiel.",{"type":283,"tag":303,"props":10427,"children":10430},{"className":5149,"code":10428,"filename":10429,"language":1596,"meta":8,"style":8},"{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:best-practices\"\n  ]\n}\n","renovate.json",[10431],{"type":283,"tag":317,"props":10432,"children":10433},{"__ignoreMap":8},[10434,10441,10462,10474,10482,10489],{"type":283,"tag":321,"props":10435,"children":10436},{"class":323,"line":324},[10437],{"type":283,"tag":321,"props":10438,"children":10439},{"style":334},[10440],{"type":293,"value":5164},{"type":283,"tag":321,"props":10442,"children":10443},{"class":323,"line":340},[10444,10449,10453,10458],{"type":283,"tag":321,"props":10445,"children":10446},{"style":5170},[10447],{"type":293,"value":10448},"  \"$schema\"",{"type":283,"tag":321,"props":10450,"children":10451},{"style":334},[10452],{"type":293,"value":364},{"type":283,"tag":321,"props":10454,"children":10455},{"style":5180},[10456],{"type":293,"value":10457},"\"https://docs.renovatebot.com/renovate-schema.json\"",{"type":283,"tag":321,"props":10459,"children":10460},{"style":334},[10461],{"type":293,"value":5188},{"type":283,"tag":321,"props":10463,"children":10464},{"class":323,"line":353},[10465,10470],{"type":283,"tag":321,"props":10466,"children":10467},{"style":5170},[10468],{"type":293,"value":10469},"  \"extends\"",{"type":283,"tag":321,"props":10471,"children":10472},{"style":334},[10473],{"type":293,"value":5405},{"type":283,"tag":321,"props":10475,"children":10476},{"class":323,"line":373},[10477],{"type":283,"tag":321,"props":10478,"children":10479},{"style":5180},[10480],{"type":293,"value":10481},"    \"config:best-practices\"\n",{"type":283,"tag":321,"props":10483,"children":10484},{"class":323,"line":308},[10485],{"type":283,"tag":321,"props":10486,"children":10487},{"style":334},[10488],{"type":293,"value":9304},{"type":283,"tag":321,"props":10490,"children":10491},{"class":323,"line":309},[10492],{"type":283,"tag":321,"props":10493,"children":10494},{"style":334},[10495],{"type":293,"value":6153},{"type":283,"tag":284,"props":10497,"children":10498},{},[10499],{"type":293,"value":10500},"Renovate erstellt für jedes Update einen Merge-Request. Super!",{"type":283,"tag":532,"props":10502,"children":10504},{"id":10503},"automatisierte-sicherheitsupdates-und-opt-in-für-minor-major-versionen",[10505],{"type":293,"value":10506},"Automatisierte Sicherheitsupdates und Opt-in für Minor-/Major-Versionen",{"type":283,"tag":284,"props":10508,"children":10509},{},[10510],{"type":293,"value":10511},"Die aktuelle Konfiguration erstellt für jedes Update einen Merge-Request, aber wir möchten, dass Sicherheitsupdates ohne Benutzerinteraktion erfolgen.",{"type":283,"tag":284,"props":10513,"children":10514},{},[10515,10517,10523],{"type":293,"value":10516},"Es ist wichtig zu verstehen, wie Docker-Images versioniert bzw. getaggt werden. Es hängt vom jeweiligen Image ab, aber nehmen wir die offizielle ",{"type":283,"tag":288,"props":10518,"children":10520},{"href":10519},"https://hub.docker.com/_/mariadb",[10521],{"type":293,"value":10522},"MariaDB",{"type":293,"value":10524}," als Beispiel.",{"type":283,"tag":284,"props":10526,"children":10527},{},[10528,10530,10536],{"type":293,"value":10529},"Es gibt ",{"type":283,"tag":317,"props":10531,"children":10533},{"className":10532},[],[10534],{"type":293,"value":10535},"11.8.3-noble, 11.8-noble, 11-noble, lts-noble, 11.8.3, 11.8, 11, lts",{"type":293,"value":10537},", die alle auf dasselbe Image verweisen.",{"type":283,"tag":284,"props":10539,"children":10540},{},[10541,10547,10549,10555,10557,10563,10564,10570],{"type":283,"tag":317,"props":10542,"children":10544},{"className":10543},[],[10545],{"type":293,"value":10546},"11.8.3-noble",{"type":293,"value":10548}," bedeutet, dass wir MariaDB in Version ",{"type":283,"tag":317,"props":10550,"children":10552},{"className":10551},[],[10553],{"type":293,"value":10554},"11.8.3",{"type":293,"value":10556}," auf Basis von Ubuntu Noble erhalten.\n",{"type":283,"tag":317,"props":10558,"children":10560},{"className":10559},[],[10561],{"type":293,"value":10562},"11.8-noble",{"type":293,"value":10548},{"type":283,"tag":317,"props":10565,"children":10567},{"className":10566},[],[10568],{"type":293,"value":10569},"11.8.\u003Clatest_patch>",{"type":293,"value":10571}," auf Basis von Ubuntu Noble erhalten.",{"type":283,"tag":284,"props":10573,"children":10574},{},[10575,10577,10583,10585,10590,10592,10597],{"type":293,"value":10576},"Wenn eine neue Version von MariaDB veröffentlicht wird, z. B. ",{"type":283,"tag":317,"props":10578,"children":10580},{"className":10579},[],[10581],{"type":293,"value":10582},"11.8.4-noble",{"type":293,"value":10584},", wird ein neuer Tag ",{"type":283,"tag":317,"props":10586,"children":10588},{"className":10587},[],[10589],{"type":293,"value":10582},{"type":293,"value":10591}," veröffentlicht, aber der Tag ",{"type":283,"tag":317,"props":10593,"children":10595},{"className":10594},[],[10596],{"type":293,"value":10562},{"type":293,"value":10598}," wird aktualisiert.",{"type":283,"tag":284,"props":10600,"children":10601},{},[10602,10604,10609],{"type":293,"value":10603},"Gleiches gilt für das Ubuntu-Update. Der Tag ",{"type":283,"tag":317,"props":10605,"children":10607},{"className":10606},[],[10608],{"type":293,"value":10546},{"type":293,"value":10610}," kann aktualisiert werden, wenn das Image mit dem neuesten Ubuntu-Image erneut gebaut wird.",{"type":283,"tag":284,"props":10612,"children":10613},{},[10614,10620,10622,10628],{"type":283,"tag":317,"props":10615,"children":10617},{"className":10616},[],[10618],{"type":293,"value":10619},"docker compose up",{"type":293,"value":10621}," mit ",{"type":283,"tag":317,"props":10623,"children":10625},{"className":10624},[],[10626],{"type":293,"value":10627},"mariadb:11.8-noble",{"type":293,"value":10629}," wird nichts bewirken, weil Docker sich dieser Änderung nicht bewusst ist.",{"type":283,"tag":284,"props":10631,"children":10632},{},[10633,10635,10641],{"type":293,"value":10634},"Im Beispiel oben verweisen wir auf ",{"type":283,"tag":317,"props":10636,"children":10638},{"className":10637},[],[10639],{"type":293,"value":10640},"mariadb:11.8",{"type":293,"value":10642},", weil wir die neueste Patch-Version auf Basis des neuesten Betriebssystems verwenden möchten.",{"type":283,"tag":837,"props":10644,"children":10645},{},[],{"type":283,"tag":284,"props":10647,"children":10648},{},[10649],{"type":293,"value":10650},"Wie soll Docker mitgeteilt werden, dass es eine neue Version gibt?",{"type":283,"tag":284,"props":10652,"children":10653},{},[10654,10656,10662],{"type":293,"value":10655},"Die Hauptidee ist, das Docker-Image zusätzlich mit einem ",{"type":283,"tag":288,"props":10657,"children":10659},{"href":10658},"https://docs.docker.com/dhi/core-concepts/digests/",[10660],{"type":293,"value":10661},"Digest",{"type":293,"value":10663}," anzugeben.",{"type":283,"tag":284,"props":10665,"children":10666},{},[10667,10669,10674,10676,10682],{"type":293,"value":10668},"Wenn Renovate das erste Mal läuft, findet es den Verweis auf ",{"type":283,"tag":317,"props":10670,"children":10672},{"className":10671},[],[10673],{"type":293,"value":10640},{"type":293,"value":10675}," und erstellt einen Merge-Request, um den Digest auf so etwas wie ",{"type":283,"tag":317,"props":10677,"children":10679},{"className":10678},[],[10680],{"type":293,"value":10681},"mariadb:11.8@sha256:ae6119716edac6998ae85508431b3d2e666530ddf4e94c61a10710caec9b0f71",{"type":293,"value":10683}," festzulegen.",{"type":283,"tag":284,"props":10685,"children":10686},{},[10687],{"type":293,"value":10688},"Es überwacht das auch, sodass bei jedem Update des Images der Digest wechselt und Renovate einen Merge-Request erstellt.",{"type":283,"tag":284,"props":10690,"children":10691},{},[10692],{"type":293,"value":10693},"Damit diese Updates automatisch gemergt werden, müssen wir ein paar Anpassungen vornehmen.",{"type":283,"tag":303,"props":10695,"children":10698},{"className":5149,"code":10696,"filename":10429,"highlights":10697,"language":1596,"meta":8,"style":8},"{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:best-practices\",\n    \"default:automergeDigest\"\n  ],\n  \"automergeType\": \"branch\",\n  \"ignoreTests\": true\n}\n",[308,309,310,311],[10699],{"type":283,"tag":317,"props":10700,"children":10701},{"__ignoreMap":8},[10702,10709,10728,10739,10751,10760,10768,10790,10807],{"type":283,"tag":321,"props":10703,"children":10704},{"class":323,"line":324},[10705],{"type":283,"tag":321,"props":10706,"children":10707},{"style":334},[10708],{"type":293,"value":5164},{"type":283,"tag":321,"props":10710,"children":10711},{"class":323,"line":340},[10712,10716,10720,10724],{"type":283,"tag":321,"props":10713,"children":10714},{"style":5170},[10715],{"type":293,"value":10448},{"type":283,"tag":321,"props":10717,"children":10718},{"style":334},[10719],{"type":293,"value":364},{"type":283,"tag":321,"props":10721,"children":10722},{"style":5180},[10723],{"type":293,"value":10457},{"type":283,"tag":321,"props":10725,"children":10726},{"style":334},[10727],{"type":293,"value":5188},{"type":283,"tag":321,"props":10729,"children":10730},{"class":323,"line":353},[10731,10735],{"type":283,"tag":321,"props":10732,"children":10733},{"style":5170},[10734],{"type":293,"value":10469},{"type":283,"tag":321,"props":10736,"children":10737},{"style":334},[10738],{"type":293,"value":5405},{"type":283,"tag":321,"props":10740,"children":10741},{"class":323,"line":373},[10742,10747],{"type":283,"tag":321,"props":10743,"children":10744},{"style":5180},[10745],{"type":293,"value":10746},"    \"config:best-practices\"",{"type":283,"tag":321,"props":10748,"children":10749},{"style":334},[10750],{"type":293,"value":5188},{"type":283,"tag":321,"props":10752,"children":10754},{"class":10753,"line":308},[323,387],[10755],{"type":283,"tag":321,"props":10756,"children":10757},{"style":5180},[10758],{"type":293,"value":10759},"    \"default:automergeDigest\"\n",{"type":283,"tag":321,"props":10761,"children":10763},{"class":10762,"line":309},[323,387],[10764],{"type":283,"tag":321,"props":10765,"children":10766},{"style":334},[10767],{"type":293,"value":5734},{"type":283,"tag":321,"props":10769,"children":10771},{"class":10770,"line":310},[323,387],[10772,10777,10781,10786],{"type":283,"tag":321,"props":10773,"children":10774},{"style":5170},[10775],{"type":293,"value":10776},"  \"automergeType\"",{"type":283,"tag":321,"props":10778,"children":10779},{"style":334},[10780],{"type":293,"value":364},{"type":283,"tag":321,"props":10782,"children":10783},{"style":5180},[10784],{"type":293,"value":10785},"\"branch\"",{"type":283,"tag":321,"props":10787,"children":10788},{"style":334},[10789],{"type":293,"value":5188},{"type":283,"tag":321,"props":10791,"children":10793},{"class":10792,"line":311},[323,387],[10794,10799,10803],{"type":283,"tag":321,"props":10795,"children":10796},{"style":5170},[10797],{"type":293,"value":10798},"  \"ignoreTests\"",{"type":283,"tag":321,"props":10800,"children":10801},{"style":334},[10802],{"type":293,"value":364},{"type":283,"tag":321,"props":10804,"children":10805},{"style":1730},[10806],{"type":293,"value":4912},{"type":283,"tag":321,"props":10808,"children":10809},{"class":323,"line":312},[10810],{"type":283,"tag":321,"props":10811,"children":10812},{"style":334},[10813],{"type":293,"value":6153},{"type":283,"tag":284,"props":10815,"children":10816},{},[10817,10819,10825,10826,10832],{"type":293,"value":10818},"Das weist Renovate an, die Digest-Updates automatisch zu mergen, ohne einen Merge-Request zu erstellen. Das reduziert das \"Rauschen\", weil es keine Merge-Request-Benachrichtigung gibt.\nMehr dazu findest du unter ",{"type":283,"tag":288,"props":10820,"children":10822},{"href":10821},"https://docs.renovatebot.com/key-concepts/automerge/#branch-vs-pr-automerging",[10823],{"type":293,"value":10824},"automergeType",{"type":293,"value":9440},{"type":283,"tag":288,"props":10827,"children":10829},{"href":10828},"https://docs.renovatebot.com/key-concepts/automerge/#absence-of-tests",[10830],{"type":293,"value":10831},"ignoreTests",{"type":293,"value":1302},{"type":283,"tag":1489,"props":10834,"children":10835},{},[10836],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":10838},[10839,10840,10841,10842,10843],{"id":9470,"depth":340,"text":9473},{"id":9507,"depth":340,"text":9510},{"id":9546,"depth":340,"text":9549},{"id":10417,"depth":340,"text":10420},{"id":10503,"depth":340,"text":10506},{"_path":72,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":73,"description":74,"author":11,"image":12,"releaseDate":75,"blogCategories":10845,"articleTags":10846,"tags":10847,"body":10848,"_type":20,"_id":80,"_source":22,"_file":81,"_stem":82,"_extension":25},[77,16],[16,33],[36,19],{"type":280,"children":10849,"toc":11373},[10850,10854,10865,10871,10884,10893,10924,10930,10958,10963,10993,11299,11304,11369],{"type":283,"tag":1607,"props":10851,"children":10853},{"alt":8,"aspect-ratio":1609,"height":1610,"object-fit":1611,"src":10852},"/blog/shopware-renovate.png",[],{"type":283,"tag":284,"props":10855,"children":10856},{},[10857,10863],{"type":283,"tag":288,"props":10858,"children":10860},{"href":10859},"https://docs.renovatebot.com/",[10861],{"type":293,"value":10862},"Renovate",{"type":293,"value":10864}," ist ein Tool zur Verfolgung von Projektabhängigkeiten und zur Erstellung von Merge-/Pull-Requests für diese. Es funktioniert perfekt für die meisten gängigen Paketmanager, aber...",{"type":283,"tag":532,"props":10866,"children":10868},{"id":10867},"shopware-versionierungsschema",[10869],{"type":293,"value":10870},"Shopware Versionierungsschema",{"type":283,"tag":284,"props":10872,"children":10873},{},[10874,10876,10882],{"type":293,"value":10875},"Shopware verwendet ein benutzerdefiniertes Versionierungsschema. Sie können den ",{"type":283,"tag":288,"props":10877,"children":10879},{"href":10878},"https://www.shopware.com/de/news/shopware-6-versionierungs-strategie/",[10880],{"type":293,"value":10881},"offiziellen Artikel",{"type":293,"value":10883}," lesen, aber kurz gesagt:",{"type":283,"tag":10885,"props":10886,"children":10887},"blockquote",{},[10888],{"type":283,"tag":284,"props":10889,"children":10890},{},[10891],{"type":293,"value":10892},"Shopware implementierte SemVer als \"SemVer with benefits\".",{"type":283,"tag":10885,"props":10894,"children":10895},{},[10896,10901,10919],{"type":283,"tag":284,"props":10897,"children":10898},{},[10899],{"type":293,"value":10900},"Eine SemVer-konforme Version hat drei Zahlen: Major, Minor und Patch. Diese werden nach folgendem Regelsatz erhöht:",{"type":283,"tag":457,"props":10902,"children":10903},{},[10904,10909,10914],{"type":283,"tag":461,"props":10905,"children":10906},{},[10907],{"type":293,"value":10908},"MAJOR: Inkompatible API-Änderungen werden vorgenommen",{"type":283,"tag":461,"props":10910,"children":10911},{},[10912],{"type":293,"value":10913},"MINOR: Funktionalität wird auf rückwärtskompatible Weise hinzugefügt",{"type":283,"tag":461,"props":10915,"children":10916},{},[10917],{"type":293,"value":10918},"PATCH: Rückwärtskompatible Fehlerbehebungen werden vorgenommen",{"type":283,"tag":284,"props":10920,"children":10921},{},[10922],{"type":293,"value":10923},"Der \"with benefits\"-Teil ist: Wir behalten die große Marketing-Nummer. Also ist Shopware 6 immer noch das Produkt, aber es gibt eine Shopware 6.3.0.0. Wobei 3.0.0 der SemVer-Teil ist.",{"type":283,"tag":532,"props":10925,"children":10927},{"id":10926},"renovate-konfiguration",[10928],{"type":293,"value":10929},"Renovate-Konfiguration",{"type":283,"tag":284,"props":10931,"children":10932},{},[10933,10934,10940,10942,10948,10950,10956],{"type":293,"value":9340},{"type":283,"tag":317,"props":10935,"children":10937},{"className":10936},[],[10938],{"type":293,"value":10939},"\"große Marketing-Nummer\"",{"type":293,"value":10941}," oder ",{"type":283,"tag":317,"props":10943,"children":10945},{"className":10944},[],[10946],{"type":293,"value":10947},"\"Generation\"",{"type":293,"value":10949}," wird in Renovate als ",{"type":283,"tag":317,"props":10951,"children":10953},{"className":10952},[],[10954],{"type":293,"value":10955},"compatibility",{"type":293,"value":10957}," dargestellt.",{"type":283,"tag":284,"props":10959,"children":10960},{},[10961],{"type":293,"value":10962},"Die folgende Konfiguration wird:",{"type":283,"tag":613,"props":10964,"children":10965},{},[10966,10971,10983,10988],{"type":283,"tag":461,"props":10967,"children":10968},{},[10969],{"type":293,"value":10970},"Alle shopware-spezifischen Updates gruppieren",{"type":283,"tag":461,"props":10972,"children":10973},{},[10974,10976,10981],{"type":293,"value":10975},"Die Updates als ",{"type":283,"tag":317,"props":10977,"children":10979},{"className":10978},[],[10980],{"type":293,"value":36},{"type":293,"value":10982}," gruppieren",{"type":283,"tag":461,"props":10984,"children":10985},{},[10986],{"type":293,"value":10987},"Renovate mitteilen, wie die Version extrahiert werden soll",{"type":283,"tag":461,"props":10989,"children":10990},{},[10991],{"type":293,"value":10992},"Renovate mitteilen, wo Changelog-Informationen zu finden sind",{"type":283,"tag":303,"props":10994,"children":10996},{"className":5149,"code":10995,"filename":10429,"language":1596,"meta":8,"style":8},"{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"packageRules\": [\n    {\n      \"description\": \"Follow Shopware version schema\",\n      \"matchDatasources\": [\n        \"packagist\"\n      ],\n      \"matchPackageNames\": [\n        \"shopware/core\",\n        \"shopware/administration\",\n        \"shopware/elasticsearch\",\n        \"shopware/storefront\"\n      ],\n      \"groupName\": \"shopware\",\n      \"versioning\": \"regex:(?\u003Ccompatibility>\\\\d+)\\\\.(?\u003Cmajor>\\\\d+)(\\\\.(?\u003Cminor>\\\\d+))?(\\\\.(?\u003Cpatch>\\\\d+))?$\",\n      \"sourceUrl\": \"https://github.com/shopware/shopware\"\n    }\n  ]\n}\n",[10997],{"type":283,"tag":317,"props":10998,"children":10999},{"__ignoreMap":8},[11000,11007,11026,11038,11045,11066,11078,11086,11094,11106,11117,11129,11141,11149,11156,11177,11261,11278,11285,11292],{"type":283,"tag":321,"props":11001,"children":11002},{"class":323,"line":324},[11003],{"type":283,"tag":321,"props":11004,"children":11005},{"style":334},[11006],{"type":293,"value":5164},{"type":283,"tag":321,"props":11008,"children":11009},{"class":323,"line":340},[11010,11014,11018,11022],{"type":283,"tag":321,"props":11011,"children":11012},{"style":5170},[11013],{"type":293,"value":10448},{"type":283,"tag":321,"props":11015,"children":11016},{"style":334},[11017],{"type":293,"value":364},{"type":283,"tag":321,"props":11019,"children":11020},{"style":5180},[11021],{"type":293,"value":10457},{"type":283,"tag":321,"props":11023,"children":11024},{"style":334},[11025],{"type":293,"value":5188},{"type":283,"tag":321,"props":11027,"children":11028},{"class":323,"line":353},[11029,11034],{"type":283,"tag":321,"props":11030,"children":11031},{"style":5170},[11032],{"type":293,"value":11033},"  \"packageRules\"",{"type":283,"tag":321,"props":11035,"children":11036},{"style":334},[11037],{"type":293,"value":5405},{"type":283,"tag":321,"props":11039,"children":11040},{"class":323,"line":373},[11041],{"type":283,"tag":321,"props":11042,"children":11043},{"style":334},[11044],{"type":293,"value":5413},{"type":283,"tag":321,"props":11046,"children":11047},{"class":323,"line":308},[11048,11053,11057,11062],{"type":283,"tag":321,"props":11049,"children":11050},{"style":5170},[11051],{"type":293,"value":11052},"      \"description\"",{"type":283,"tag":321,"props":11054,"children":11055},{"style":334},[11056],{"type":293,"value":364},{"type":283,"tag":321,"props":11058,"children":11059},{"style":5180},[11060],{"type":293,"value":11061},"\"Follow Shopware version schema\"",{"type":283,"tag":321,"props":11063,"children":11064},{"style":334},[11065],{"type":293,"value":5188},{"type":283,"tag":321,"props":11067,"children":11068},{"class":323,"line":309},[11069,11074],{"type":283,"tag":321,"props":11070,"children":11071},{"style":5170},[11072],{"type":293,"value":11073},"      \"matchDatasources\"",{"type":283,"tag":321,"props":11075,"children":11076},{"style":334},[11077],{"type":293,"value":5405},{"type":283,"tag":321,"props":11079,"children":11080},{"class":323,"line":310},[11081],{"type":283,"tag":321,"props":11082,"children":11083},{"style":5180},[11084],{"type":293,"value":11085},"        \"packagist\"\n",{"type":283,"tag":321,"props":11087,"children":11088},{"class":323,"line":311},[11089],{"type":283,"tag":321,"props":11090,"children":11091},{"style":334},[11092],{"type":293,"value":11093},"      ],\n",{"type":283,"tag":321,"props":11095,"children":11096},{"class":323,"line":312},[11097,11102],{"type":283,"tag":321,"props":11098,"children":11099},{"style":5170},[11100],{"type":293,"value":11101},"      \"matchPackageNames\"",{"type":283,"tag":321,"props":11103,"children":11104},{"style":334},[11105],{"type":293,"value":5405},{"type":283,"tag":321,"props":11107,"children":11108},{"class":323,"line":977},[11109,11113],{"type":283,"tag":321,"props":11110,"children":11111},{"style":5180},[11112],{"type":293,"value":6562},{"type":283,"tag":321,"props":11114,"children":11115},{"style":334},[11116],{"type":293,"value":5188},{"type":283,"tag":321,"props":11118,"children":11119},{"class":323,"line":990},[11120,11125],{"type":283,"tag":321,"props":11121,"children":11122},{"style":5180},[11123],{"type":293,"value":11124},"        \"shopware/administration\"",{"type":283,"tag":321,"props":11126,"children":11127},{"style":334},[11128],{"type":293,"value":5188},{"type":283,"tag":321,"props":11130,"children":11131},{"class":323,"line":1003},[11132,11137],{"type":283,"tag":321,"props":11133,"children":11134},{"style":5180},[11135],{"type":293,"value":11136},"        \"shopware/elasticsearch\"",{"type":283,"tag":321,"props":11138,"children":11139},{"style":334},[11140],{"type":293,"value":5188},{"type":283,"tag":321,"props":11142,"children":11143},{"class":323,"line":1016},[11144],{"type":283,"tag":321,"props":11145,"children":11146},{"style":5180},[11147],{"type":293,"value":11148},"        \"shopware/storefront\"\n",{"type":283,"tag":321,"props":11150,"children":11151},{"class":323,"line":1029},[11152],{"type":283,"tag":321,"props":11153,"children":11154},{"style":334},[11155],{"type":293,"value":11093},{"type":283,"tag":321,"props":11157,"children":11158},{"class":323,"line":1042},[11159,11164,11168,11173],{"type":283,"tag":321,"props":11160,"children":11161},{"style":5170},[11162],{"type":293,"value":11163},"      \"groupName\"",{"type":283,"tag":321,"props":11165,"children":11166},{"style":334},[11167],{"type":293,"value":364},{"type":283,"tag":321,"props":11169,"children":11170},{"style":5180},[11171],{"type":293,"value":11172},"\"shopware\"",{"type":283,"tag":321,"props":11174,"children":11175},{"style":334},[11176],{"type":293,"value":5188},{"type":283,"tag":321,"props":11178,"children":11179},{"class":323,"line":1052},[11180,11185,11189,11194,11198,11203,11207,11212,11216,11221,11225,11230,11234,11239,11243,11248,11252,11257],{"type":283,"tag":321,"props":11181,"children":11182},{"style":5170},[11183],{"type":293,"value":11184},"      \"versioning\"",{"type":283,"tag":321,"props":11186,"children":11187},{"style":334},[11188],{"type":293,"value":364},{"type":283,"tag":321,"props":11190,"children":11191},{"style":5180},[11192],{"type":293,"value":11193},"\"regex:(?\u003Ccompatibility>",{"type":283,"tag":321,"props":11195,"children":11196},{"style":1730},[11197],{"type":293,"value":5772},{"type":283,"tag":321,"props":11199,"children":11200},{"style":5180},[11201],{"type":293,"value":11202},"d+)",{"type":283,"tag":321,"props":11204,"children":11205},{"style":1730},[11206],{"type":293,"value":5772},{"type":283,"tag":321,"props":11208,"children":11209},{"style":5180},[11210],{"type":293,"value":11211},".(?\u003Cmajor>",{"type":283,"tag":321,"props":11213,"children":11214},{"style":1730},[11215],{"type":293,"value":5772},{"type":283,"tag":321,"props":11217,"children":11218},{"style":5180},[11219],{"type":293,"value":11220},"d+)(",{"type":283,"tag":321,"props":11222,"children":11223},{"style":1730},[11224],{"type":293,"value":5772},{"type":283,"tag":321,"props":11226,"children":11227},{"style":5180},[11228],{"type":293,"value":11229},".(?\u003Cminor>",{"type":283,"tag":321,"props":11231,"children":11232},{"style":1730},[11233],{"type":293,"value":5772},{"type":283,"tag":321,"props":11235,"children":11236},{"style":5180},[11237],{"type":293,"value":11238},"d+))?(",{"type":283,"tag":321,"props":11240,"children":11241},{"style":1730},[11242],{"type":293,"value":5772},{"type":283,"tag":321,"props":11244,"children":11245},{"style":5180},[11246],{"type":293,"value":11247},".(?\u003Cpatch>",{"type":283,"tag":321,"props":11249,"children":11250},{"style":1730},[11251],{"type":293,"value":5772},{"type":283,"tag":321,"props":11253,"children":11254},{"style":5180},[11255],{"type":293,"value":11256},"d+))?$\"",{"type":283,"tag":321,"props":11258,"children":11259},{"style":334},[11260],{"type":293,"value":5188},{"type":283,"tag":321,"props":11262,"children":11263},{"class":323,"line":1065},[11264,11269,11273],{"type":283,"tag":321,"props":11265,"children":11266},{"style":5170},[11267],{"type":293,"value":11268},"      \"sourceUrl\"",{"type":283,"tag":321,"props":11270,"children":11271},{"style":334},[11272],{"type":293,"value":364},{"type":283,"tag":321,"props":11274,"children":11275},{"style":5180},[11276],{"type":293,"value":11277},"\"https://github.com/shopware/shopware\"\n",{"type":283,"tag":321,"props":11279,"children":11280},{"class":323,"line":1078},[11281],{"type":283,"tag":321,"props":11282,"children":11283},{"style":334},[11284],{"type":293,"value":5726},{"type":283,"tag":321,"props":11286,"children":11287},{"class":323,"line":1087},[11288],{"type":283,"tag":321,"props":11289,"children":11290},{"style":334},[11291],{"type":293,"value":9304},{"type":283,"tag":321,"props":11293,"children":11294},{"class":323,"line":1100},[11295],{"type":283,"tag":321,"props":11296,"children":11297},{"style":334},[11298],{"type":293,"value":6153},{"type":283,"tag":284,"props":11300,"children":11301},{},[11302],{"type":293,"value":11303},"Dies sollte zur Erstellung folgender Merge-/Pull-Requests führen:",{"type":283,"tag":457,"props":11305,"children":11306},{},[11307,11340],{"type":283,"tag":461,"props":11308,"children":11309},{},[11310,11312,11318,11319,11325,11326,11332,11333,11339],{"type":293,"value":11311},"fix(deps): update shopware (",{"type":283,"tag":317,"props":11313,"children":11315},{"className":11314},[],[11316],{"type":293,"value":11317},"shopware/administration",{"type":293,"value":9934},{"type":283,"tag":317,"props":11320,"children":11322},{"className":11321},[],[11323],{"type":293,"value":11324},"shopware/core",{"type":293,"value":9934},{"type":283,"tag":317,"props":11327,"children":11329},{"className":11328},[],[11330],{"type":293,"value":11331},"shopware/elasticsearch",{"type":293,"value":9934},{"type":283,"tag":317,"props":11334,"children":11336},{"className":11335},[],[11337],{"type":293,"value":11338},"shopware/storefront",{"type":293,"value":1669},{"type":283,"tag":461,"props":11341,"children":11342},{},[11343,11345,11350,11351,11356,11357,11362,11363,11368],{"type":293,"value":11344},"fix(deps): update shopware to v7 (major) (",{"type":283,"tag":317,"props":11346,"children":11348},{"className":11347},[],[11349],{"type":293,"value":11317},{"type":293,"value":9934},{"type":283,"tag":317,"props":11352,"children":11354},{"className":11353},[],[11355],{"type":293,"value":11324},{"type":293,"value":9934},{"type":283,"tag":317,"props":11358,"children":11360},{"className":11359},[],[11361],{"type":293,"value":11331},{"type":293,"value":9934},{"type":283,"tag":317,"props":11364,"children":11366},{"className":11365},[],[11367],{"type":293,"value":11338},{"type":293,"value":1669},{"type":283,"tag":1489,"props":11370,"children":11371},{},[11372],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":11374},[11375,11376],{"id":10867,"depth":340,"text":10870},{"id":10926,"depth":340,"text":10929},{"_path":84,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":85,"description":86,"author":87,"image":88,"releaseDate":89,"blogCategories":11378,"articleTags":11379,"tags":11380,"body":11381,"_type":20,"_id":95,"_source":22,"_file":96,"_stem":97,"_extension":25},[77],[92],[94],{"type":280,"children":11382,"toc":12872},[11383,11389,11395,11417,11425,11482,11496,11499,11502,11508,11546,11562,11590,11600,11615,11621,11672,11688,11768,11780,11789,12014,12026,12035,12148,12184,12206,12321,12332,12371,12402,12408,12426,12431,12510,12516,12732,12738,12754,12777,12792,12798,12808,12813,12820,12861,12867],{"type":283,"tag":1607,"props":11384,"children":11388},{"alt":11385,"aspect-ratio":11386,"height":1610,"object-fit":1611,"src":11387},"Fiktiver Entwurf eines Abmahnungsschreibens der Marktüberwachungsstelle mit der Beschreibung \"Nichteinhaltung von Vorgaben zur Barrierefreiheit.\"","1.7","/blog/Abmahnung-Barrierefreiheitsstaerkungsgesetz.png",[],{"type":283,"tag":532,"props":11390,"children":11392},{"id":11391},"barrierefreiheit-wird-pflicht-was-das-barrierefreiheitsstärkungsgesetz-ab-2025-für-digitale-services-bedeutet",[11393],{"type":293,"value":11394},"Barrierefreiheit wird Pflicht: Was das Barrierefreiheitsstärkungsgesetz ab 2025 für digitale Services bedeutet",{"type":283,"tag":284,"props":11396,"children":11397},{},[11398,11404,11406,11415],{"type":283,"tag":11399,"props":11400,"children":11401},"strong",{},[11402],{"type":293,"value":11403},"Barrierefreiheit ist seit Mitte 2025 für viele digitale Produkte und Dienstleistungen Pflicht.",{"type":293,"value":11405},"\nDas haben wir bereits in unserem Artikel „Accessibility wird zur Empfehlung – und zur Pflicht“ erklärt.\nWichtig neben der technischen Umsetzung ist, dass eine\n",{"type":283,"tag":288,"props":11407,"children":11409},{"href":11408},"https://helmundwalter.de/blog/accessibility-will-be-recommended?utm_source=chatgpt.com",[11410],{"type":283,"tag":11399,"props":11411,"children":11412},{},[11413],{"type":293,"value":11414},"Erklärung zur Barrierefreiheit (EzB)",{"type":293,"value":11416},"\ngesetzlich vorgeschrieben ist und dass bei falscher Formulierung Abmahnungen oder regulatorischer Druck drohen.",{"type":283,"tag":284,"props":11418,"children":11419},{},[11420],{"type":283,"tag":11399,"props":11421,"children":11422},{},[11423],{"type":293,"value":11424},"Inhalt dieses Blogposts:",{"type":283,"tag":457,"props":11426,"children":11427},{},[11428,11440,11445,11455,11467,11477],{"type":283,"tag":461,"props":11429,"children":11430},{},[11431,11433,11438],{"type":293,"value":11432},"Warum eine ",{"type":283,"tag":11399,"props":11434,"children":11435},{},[11436],{"type":293,"value":11437},"Erklärung zur Barrierefreiheit laut BFSG",{"type":293,"value":11439}," gesetzlich vorgeschrieben ist",{"type":283,"tag":461,"props":11441,"children":11442},{},[11443],{"type":293,"value":11444},"Was diese Erklärung beinhalten muss",{"type":283,"tag":461,"props":11446,"children":11447},{},[11448,11453],{"type":283,"tag":11399,"props":11449,"children":11450},{},[11451],{"type":293,"value":11452},"Ein Vorschlag für eine mögliche Barrierefreiheitserklärung",{"type":293,"value":11454}," / EzB",{"type":283,"tag":461,"props":11456,"children":11457},{},[11458,11460,11465],{"type":293,"value":11459},"Kurze Erklärung, an welchen Stellen Sie die Erklärung ",{"type":283,"tag":11399,"props":11461,"children":11462},{},[11463],{"type":293,"value":11464},"individuell und wahrheitsgemäß auf Ihre Dienstleistung zuschneiden",{"type":293,"value":11466}," sollten",{"type":283,"tag":461,"props":11468,"children":11469},{},[11470,11475],{"type":283,"tag":11399,"props":11471,"children":11472},{},[11473],{"type":293,"value":11474},"Unsere Erfahrung mit juristischer Beratung",{"type":293,"value":11476}," zur Formulierung",{"type":283,"tag":461,"props":11478,"children":11479},{},[11480],{"type":293,"value":11481},"Was bei Nichteinhaltung drohen kann",{"type":283,"tag":321,"props":11483,"children":11486},{"className":11484},[11485],"text-right",[11487],{"type":283,"tag":284,"props":11488,"children":11489},{},[11490],{"type":283,"tag":11491,"props":11492,"children":11493},"em",{},[11494],{"type":293,"value":11495},"Lesedauer: ca. 15 Minuten",{"type":283,"tag":1321,"props":11497,"children":11498},{},[],{"type":283,"tag":837,"props":11500,"children":11501},{},[],{"type":283,"tag":532,"props":11503,"children":11505},{"id":11504},"worum-geht-es-beim-bfsg-und-der-barrierefreiheitserklärung-ezb",[11506],{"type":293,"value":11507},"Worum geht es beim BFSG und der Barrierefreiheitserklärung / EzB?",{"type":283,"tag":284,"props":11509,"children":11510},{},[11511,11513,11519,11521,11530,11532,11537,11539,11544],{"type":293,"value":11512},"Das ",{"type":283,"tag":288,"props":11514,"children":11516},{"href":11515},"https://bfsg-gesetz.de",[11517],{"type":293,"value":11518},"Barrierefreiheitsstärkungsgesetz (BFSG)",{"type":293,"value":11520}," verpflichtet digitale Angebote wie Online-Shops, Banking-Apps oder Buchungsportale, seit dem 28. Juni 2025 barrierefrei zugänglich zu sein.\nDas folgt dem EU-weiten ",{"type":283,"tag":288,"props":11522,"children":11524},{"href":11523},"https://commission.europa.eu/strategy-and-policy/policies/justice-and-fundamental-rights/disability/union-equality-strategy-rights-persons-disabilities-2021-2030/european-accessibility-act_en",[11525],{"type":283,"tag":11399,"props":11526,"children":11527},{},[11528],{"type":293,"value":11529},"European Accessibility Act (EAA)",{"type":293,"value":11531}," und der ",{"type":283,"tag":11399,"props":11533,"children":11534},{},[11535],{"type":293,"value":11536},"Norm EN 301 549",{"type":293,"value":11538},", die meist die ",{"type":283,"tag":11399,"props":11540,"children":11541},{},[11542],{"type":293,"value":11543},"WCAG 2.1 AA",{"type":293,"value":11545}," als technisches Ziel definiert. Ausgenommen sind Kleinstunternehmen mit unter 10 Mitarbeitenden und weniger als\n2 Mio. € Jahresumsatz.",{"type":283,"tag":284,"props":11547,"children":11548},{},[11549,11551,11560],{"type":293,"value":11550},"Gemäß ",{"type":283,"tag":288,"props":11552,"children":11554},{"href":11553},"https://bfsg-gesetz.de/anlage-3/",[11555],{"type":283,"tag":11399,"props":11556,"children":11557},{},[11558],{"type":293,"value":11559},"§ 14 BFSG und Anlage 3",{"type":293,"value":11561}," müssen Anbieter eine Barrierefreiheitserklärung veröffentlichen, die folgende Punkte enthält:",{"type":283,"tag":457,"props":11563,"children":11564},{},[11565,11570,11575,11580,11585],{"type":283,"tag":461,"props":11566,"children":11567},{},[11568],{"type":293,"value":11569},"Allgemeine Beschreibung der digitalen Dienstleistung",{"type":283,"tag":461,"props":11571,"children":11572},{},[11573],{"type":293,"value":11574},"Erfüllungsstatus der Barrierefreiheitsanforderungen (z.B. WCAG, EN 301 549)",{"type":283,"tag":461,"props":11576,"children":11577},{},[11578],{"type":293,"value":11579},"Kontaktmöglichkeiten des Dienstleisters für Rückmeldungen bei Barrieren",{"type":283,"tag":461,"props":11581,"children":11582},{},[11583],{"type":293,"value":11584},"Marktüberwachungsbehörde als zuständige Kontrollstelle",{"type":283,"tag":461,"props":11586,"children":11587},{},[11588],{"type":293,"value":11589},"Optionale Angaben: Datum der letzten Prüfung, Prüfmethodik, Feedbackmechanismus",{"type":283,"tag":284,"props":11591,"children":11592},{},[11593,11598],{"type":283,"tag":11399,"props":11594,"children":11595},{},[11596],{"type":293,"value":11597},"Es gibt keine offizielle Vorlage für die Barrierefreiheitserklärung.",{"type":293,"value":11599},"\nNach unserem derzeitigen Wissensstand ist diese auch nicht geplant.",{"type":283,"tag":284,"props":11601,"children":11602},{},[11603],{"type":283,"tag":11399,"props":11604,"children":11605},{},[11606,11608,11613],{"type":293,"value":11607},"Deshalb gehen wir im Folgenden darauf ein, wie eine solche\n",{"type":283,"tag":11491,"props":11609,"children":11610},{},[11611],{"type":293,"value":11612},"Erklärung zur Barrierefreiheit",{"type":293,"value":11614}," aussehen kann.",{"type":283,"tag":532,"props":11616,"children":11618},{"id":11617},"unsere-vorlage-für-ihre-ezb",[11619],{"type":293,"value":11620},"Unsere Vorlage für Ihre EzB",{"type":283,"tag":11622,"props":11623,"children":11627},"div",{"className":11624},[11625,11626],"doc-sheet","doc-sheet__border-top",[11628],{"type":283,"tag":11622,"props":11629,"children":11632},{"className":11630},[11631],"doc-sheet__section",[11633,11640,11666],{"type":283,"tag":11634,"props":11635,"children":11637},"h1",{"id":11636},"informationen-zur-barrierefreiheit",[11638],{"type":293,"value":11639},"Informationen zur Barrierefreiheit",{"type":283,"tag":284,"props":11641,"children":11642},{},[11643,11645,11650,11652,11657,11659,11664],{"type":293,"value":11644},"Wir verpflichten uns zur Umsetzung der Anforderungen des ",{"type":283,"tag":11399,"props":11646,"children":11647},{},[11648],{"type":293,"value":11649},"Barrierefreiheitsstärkungsgesetzes (BFSG)",{"type":293,"value":11651}," sowie der zugrunde liegenden ",{"type":283,"tag":11399,"props":11653,"children":11654},{},[11655],{"type":293,"value":11656},"EU-Richtlinie (EU) 2019/882 über die Barrierefreiheitsanforderungen für Produkte und Dienstleistungen",{"type":293,"value":11658},". Unser Ziel ist es, unsere digitalen Angebote – insbesondere Webanwendungen und Online-Dienste – so zu gestalten, dass sie für alle Menschen ",{"type":283,"tag":11399,"props":11660,"children":11661},{},[11662],{"type":293,"value":11663},"barrierefrei zugänglich",{"type":293,"value":11665}," sind, unabhängig von individuellen Fähigkeiten oder technischen Hilfsmitteln.",{"type":283,"tag":532,"props":11667,"children":11669},{"id":11668},"beschreibung-der-dienstleistung",[11670],{"type":293,"value":11671},"Beschreibung der Dienstleistung",{"type":283,"tag":11622,"props":11673,"children":11682},{"className":11674},[11675,11676,11677,11678,11679,11680,11681],"mt-8","mb-5","pl-0","pr-0","pt-5","pb-5","pa-sm-5",[11683],{"type":283,"tag":284,"props":11684,"children":11685},{},[11686],{"type":293,"value":11687},"Diesen Teil müssen Sie individuell an Ihre digitale Dienstleistung anpassen.\nWir haben an dieser Stelle ein Beispiel für einen klassischen Online-Shop angegeben.",{"type":283,"tag":11622,"props":11689,"children":11692},{"className":11690},[11625,11691],"doc-sheet__border-sides",[11693],{"type":283,"tag":11622,"props":11694,"children":11696},{"className":11695},[11631],[11697,11709,11749],{"type":283,"tag":284,"props":11698,"children":11699},{},[11700,11702,11707],{"type":293,"value":11701},"Unser Online-Shop ermöglicht es,\n",{"type":283,"tag":11399,"props":11703,"children":11704},{},[11705],{"type":293,"value":11706},"Informationen zu Produkten zu beziehen, Produkte digital auszuwählen und zu kaufen",{"type":293,"value":11708},".\nDie Waren werden jeweils auf einer eigenen Produktseite mit Beschreibung, Preis und\neventuell verfügbaren Varianten wie Größe oder Farbe angeboten.",{"type":283,"tag":284,"props":11710,"children":11711},{},[11712,11714,11719,11721,11726,11728,11733,11735,11740,11742,11747],{"type":293,"value":11713},"Die gewünschten Produkte können in einen ",{"type":283,"tag":11399,"props":11715,"children":11716},{},[11717],{"type":293,"value":11718},"virtuellen Warenkorb",{"type":293,"value":11720}," gelegt werden.\nNach Auswahl aller Artikel führt der Bestellprozess über den ",{"type":283,"tag":11399,"props":11722,"children":11723},{},[11724],{"type":293,"value":11725},"Checkout-Bereich",{"type":293,"value":11727},",\nin dem eine ",{"type":283,"tag":11399,"props":11729,"children":11730},{},[11731],{"type":293,"value":11732},"Lieferadresse",{"type":293,"value":11734}," und eine eventuell abweichende ",{"type":283,"tag":11399,"props":11736,"children":11737},{},[11738],{"type":293,"value":11739},"Rechnungsadresse",{"type":293,"value":11741},"\neingegeben, sowie eine ",{"type":283,"tag":11399,"props":11743,"children":11744},{},[11745],{"type":293,"value":11746},"Zahlungsart",{"type":293,"value":11748}," ausgewählt werden muss.",{"type":283,"tag":284,"props":11750,"children":11751},{},[11752,11754,11759,11761,11766],{"type":293,"value":11753},"Nach erfolgreicher Bestellung werden\n",{"type":283,"tag":11399,"props":11755,"children":11756},{},[11757],{"type":293,"value":11758},"Eingangsbestätigung und Versandbestätigungen per E-Mail",{"type":293,"value":11760}," an die bei der Bestellung\nangegebene E-Mail-Adresse versendet.\nEs ist möglich, dass eine ",{"type":283,"tag":11399,"props":11762,"children":11763},{},[11764],{"type":293,"value":11765},"Weiterleitung zu Drittdiensten",{"type":293,"value":11767}," für die Abwicklung von\nBezahlvorgängen erfolgt. Wir haben nur bedingt Einfluss auf die Gestaltung und\ntechnische Ausführung dieser Dienste.",{"type":283,"tag":321,"props":11769,"children":11771},{"className":11770},[11485],[11772],{"type":283,"tag":284,"props":11773,"children":11774},{},[11775],{"type":283,"tag":11491,"props":11776,"children":11777},{},[11778],{"type":293,"value":11779},"Anpassen an die individuelle Dienstleistung",{"type":283,"tag":11622,"props":11781,"children":11783},{"className":11782},[11675,11676,11677,11678,11679,11680,11681],[11784],{"type":283,"tag":284,"props":11785,"children":11786},{},[11787],{"type":293,"value":11788},"Den folgenden Teil müssen Sie nicht unbedingt angeben.\nEr stellt aber Ihre bisherigen Bemühungen und Maßnahmen, sowie Ihr Engagement im\nBereich Barrierefreiheit klar und bietet eine Anlaufstelle jenseits der\nMarktüberwachungsbehörde.",{"type":283,"tag":11622,"props":11790,"children":11792},{"className":11791},[11625,11691],[11793],{"type":283,"tag":11622,"props":11794,"children":11796},{"className":11795},[11631],[11797,11803,11815,11827,11866,11878,11884,11922,11928,11940,11948,11988],{"type":283,"tag":532,"props":11798,"children":11800},{"id":11799},"stand-der-barrierefreiheit",[11801],{"type":293,"value":11802},"Stand der Barrierefreiheit",{"type":283,"tag":284,"props":11804,"children":11805},{},[11806,11808,11813],{"type":293,"value":11807},"Unsere Website und digitalen Dienste werden fortlaufend an geltende\n",{"type":283,"tag":11399,"props":11809,"children":11810},{},[11811],{"type":293,"value":11812},"Barrierefreiheitsstandards (z.B. WCAG 2.1 AA und EN 301 549)",{"type":293,"value":11814}," angepasst.\nWir verfolgen aktiv das Ziel, bestehende Barrieren zu erkennen, zu reduzieren und\nlangfristig vollständig zu beseitigen.",{"type":283,"tag":284,"props":11816,"children":11817},{},[11818,11820,11825],{"type":293,"value":11819},"Trotz aller Sorgfalt kann es in Einzelfällen zu ",{"type":283,"tag":11399,"props":11821,"children":11822},{},[11823],{"type":293,"value":11824},"temporären oder partiellen Barrieren",{"type":293,"value":11826}," kommen.\nDies kann insbesondere auftreten:",{"type":283,"tag":457,"props":11828,"children":11829},{},[11830,11842,11854],{"type":283,"tag":461,"props":11831,"children":11832},{},[11833,11835,11840],{"type":293,"value":11834},"durch laufende ",{"type":283,"tag":11399,"props":11836,"children":11837},{},[11838],{"type":293,"value":11839},"redaktionelle oder technische Überarbeitungen",{"type":293,"value":11841}," einzelner Inhalte und Seiten,",{"type":283,"tag":461,"props":11843,"children":11844},{},[11845,11847,11852],{"type":293,"value":11846},"aufgrund von ",{"type":283,"tag":11399,"props":11848,"children":11849},{},[11850],{"type":293,"value":11851},"unterschiedlichen Interpretationen",{"type":293,"value":11853}," der technischen Anforderungen an Barrierefreiheit,",{"type":283,"tag":461,"props":11855,"children":11856},{},[11857,11859,11864],{"type":293,"value":11858},"oder bei ",{"type":283,"tag":11399,"props":11860,"children":11861},{},[11862],{"type":293,"value":11863},"komplexen Funktionalitäten",{"type":293,"value":11865},", für die bisher noch keine vollständig barrierefreie Lösung verfügbar ist.",{"type":283,"tag":284,"props":11867,"children":11868},{},[11869,11871,11876],{"type":293,"value":11870},"Wir arbeiten kontinuierlich daran, auch solche Abweichungen zu identifizieren und\nLösungen zu entwickeln, um allen Nutzenden einen möglichst\n",{"type":283,"tag":11399,"props":11872,"children":11873},{},[11874],{"type":293,"value":11875},"niederschwelligen und gleichwertigen Zugang",{"type":293,"value":11877}," zu ermöglichen.",{"type":283,"tag":1252,"props":11879,"children":11881},{"id":11880},"letzte-überprüfung",[11882],{"type":293,"value":11883},"Letzte Überprüfung",{"type":283,"tag":284,"props":11885,"children":11886},{},[11887,11889,11894,11896,11901,11903,11908,11910,11914,11915,11920],{"type":293,"value":11888},"Die letzte exemplarische Prüfung der Barrierefreiheit erfolgte am ",{"type":283,"tag":11491,"props":11890,"children":11891},{},[11892],{"type":293,"value":11893},"[Datum der letzten Überprüfung]",{"type":293,"value":11895},"\ndurch ",{"type":283,"tag":11491,"props":11897,"children":11898},{},[11899],{"type":293,"value":11900},"[Firma eintragen – eine ext. Firma ist hier besser]",{"type":293,"value":11902},".\nDabei wurde eine ",{"type":283,"tag":11399,"props":11904,"children":11905},{},[11906],{"type":293,"value":11907},"Auswahl repräsentativer Seiten und Funktionen",{"type":293,"value":11909}," auf Konformität\nmit den Anforderungen der ",{"type":283,"tag":11399,"props":11911,"children":11912},{},[11913],{"type":293,"value":11543},{"type":293,"value":11531},{"type":283,"tag":11399,"props":11916,"children":11917},{},[11918],{"type":293,"value":11919},"EN 301 549",{"type":293,"value":11921}," untersucht.\nNicht alle Inhalte oder Seiten wurden dabei individuell getestet.\nDie Auswahl erfolgte auf Basis der Nutzungshäufigkeit und zentralen Funktionalitäten\nunseres Online-Angebots.",{"type":283,"tag":532,"props":11923,"children":11925},{"id":11924},"rückmeldung-und-kontakt",[11926],{"type":293,"value":11927},"Rückmeldung und Kontakt",{"type":283,"tag":284,"props":11929,"children":11930},{},[11931,11933,11938],{"type":293,"value":11932},"Sollten Ihnen beim Besuch unserer digitalen Angebote ",{"type":283,"tag":11399,"props":11934,"children":11935},{},[11936],{"type":293,"value":11937},"Barrieren auffallen",{"type":293,"value":11939},",\nbitten wir Sie, uns zu informieren.\nJeder Hinweis hilft uns, bestehende Schwachstellen besser zu verstehen und gezielt\nzu verbessern.",{"type":283,"tag":284,"props":11941,"children":11942},{},[11943],{"type":283,"tag":11399,"props":11944,"children":11945},{},[11946],{"type":293,"value":11947},"Kontakt für Hinweise zur Barrierefreiheit:",{"type":283,"tag":284,"props":11949,"children":11950},{},[11951,11956,11959,11964,11967,11972,11975,11980,11983],{"type":283,"tag":11491,"props":11952,"children":11953},{},[11954],{"type":293,"value":11955},"[Name oder Abteilung]",{"type":283,"tag":1321,"props":11957,"children":11958},{},[],{"type":283,"tag":11491,"props":11960,"children":11961},{},[11962],{"type":293,"value":11963},"[Unternehmen]",{"type":283,"tag":1321,"props":11965,"children":11966},{},[],{"type":283,"tag":11491,"props":11968,"children":11969},{},[11970],{"type":293,"value":11971},"[Adresse, optional]",{"type":283,"tag":1321,"props":11973,"children":11974},{},[],{"type":283,"tag":11491,"props":11976,"children":11977},{},[11978],{"type":293,"value":11979},"[E-Mail-Adresse]",{"type":283,"tag":1321,"props":11981,"children":11982},{},[],{"type":283,"tag":11491,"props":11984,"children":11985},{},[11986],{"type":293,"value":11987},"[Telefonnummer, optional]",{"type":283,"tag":284,"props":11989,"children":11990},{},[11991,11993,11998,12000,12005,12007,12012],{"type":293,"value":11992},"Wir sichern zu, dass wir eingehende Rückmeldungen schnellstmöglich\n",{"type":283,"tag":11399,"props":11994,"children":11995},{},[11996],{"type":293,"value":11997},"redaktionell und technisch prüfen",{"type":293,"value":11999}," und, sofern möglich, in angemessener Frist ",{"type":283,"tag":11399,"props":12001,"children":12002},{},[12003],{"type":293,"value":12004},"beheben",{"type":293,"value":12006},".\nSollte eine kurzfristige technische Lösung nicht möglich sein, suchen wir gemeinsam\nmit Ihnen nach ",{"type":283,"tag":11399,"props":12008,"children":12009},{},[12010],{"type":293,"value":12011},"alternativen Zugangswegen oder unterstützenden Maßnahmen",{"type":293,"value":12013},",\num Ihnen die Nutzung dennoch zu ermöglichen.",{"type":283,"tag":321,"props":12015,"children":12017},{"className":12016},[11485],[12018],{"type":283,"tag":284,"props":12019,"children":12020},{},[12021],{"type":283,"tag":11491,"props":12022,"children":12023},{},[12024],{"type":293,"value":12025},"optional",{"type":283,"tag":11622,"props":12027,"children":12029},{"className":12028},[11675,11676,11677,11678,11679,11680,11681],[12030],{"type":283,"tag":284,"props":12031,"children":12032},{},[12033],{"type":293,"value":12034},"Der folgende Teil ist wieder wichtig, da hier die Marktüberwachungsbehörde benannt werden\nmuss und man auf die aktuell geltenden AGBs verweisen sollte, die mögliche Lücken in der\nBeschreibung der Dienstleistung oder des Produktes schließen.",{"type":283,"tag":11622,"props":12036,"children":12038},{"className":12037},[11625,11691],[12039],{"type":283,"tag":11622,"props":12040,"children":12042},{"className":12041},[11631],[12043,12049,12066,12085,12090,12101,12107,12112],{"type":283,"tag":532,"props":12044,"children":12046},{"id":12045},"weiterführende-hinweise",[12047],{"type":293,"value":12048},"Weiterführende Hinweise",{"type":283,"tag":284,"props":12050,"children":12051},{},[12052,12054,12059,12061],{"type":293,"value":12053},"Es ist zu beachten, dass die Nutzung unserer digitalen Dienste und aller dazugehörigen\nFunktionen zusätzlich unseren ",{"type":283,"tag":11399,"props":12055,"children":12056},{},[12057],{"type":293,"value":12058},"Allgemeinen Geschäftsbedingungen (AGB)",{"type":293,"value":12060}," unterliegt.\nDiese AGB regeln unter anderem den Vertragsschluss, die Zahlungsabwicklung und die\nLieferung. Im Falle von Widersprüchen oder Abweichungen gelten die AGB in ihrer\njeweils aktuellen Fassung, soweit diese nicht die Anforderungen an Barrierefreiheit\neinschränken oder aufheben.\nEine barrierefreie Version hier unserer AGBs gibt es hier: ",{"type":283,"tag":11491,"props":12062,"children":12063},{},[12064],{"type":293,"value":12065},"[Link zu den AGB]",{"type":283,"tag":284,"props":12067,"children":12068},{},[12069,12071,12076,12078,12083],{"type":293,"value":12070},"Wir verstehen Barrierefreiheit nicht als einmalige Maßnahme, sondern als\n",{"type":283,"tag":11399,"props":12072,"children":12073},{},[12074],{"type":293,"value":12075},"laufenden Prozess",{"type":293,"value":12077},". Daher werden unsere Inhalte und Systeme regelmäßig überprüft\nund überarbeitet. Dabei kann es in einzelnen Fällen vorübergehend zu\n",{"type":283,"tag":11399,"props":12079,"children":12080},{},[12081],{"type":293,"value":12082},"Einschränkungen in der Zugänglichkeit",{"type":293,"value":12084}," kommen. Wir bitten hierfür um Ihr Verständnis.",{"type":283,"tag":284,"props":12086,"children":12087},{},[12088],{"type":293,"value":12089},"Für weiterführende Informationen zum Barrierefreiheitsstärkungsgesetz verweisen wir auf\ndie zuständige nationale Durchsetzungsstelle:",{"type":283,"tag":284,"props":12091,"children":12092},{},[12093,12099],{"type":283,"tag":288,"props":12094,"children":12096},{"href":12095},"https://www.bundesfachstelle-barrierefreiheit.de",[12097],{"type":293,"value":12098},"Bundesfachstelle Barrierefreiheit",{"type":293,"value":12100}," (Träger: Knappschaft-Bahn-See)",{"type":283,"tag":1252,"props":12102,"children":12104},{"id":12103},"zuständige-marktüberwachungsbehörde",[12105],{"type":293,"value":12106},"Zuständige Marktüberwachungsbehörde",{"type":283,"tag":284,"props":12108,"children":12109},{},[12110],{"type":293,"value":12111},"Marktüberwachungsstelle der Länder für die Barrierefreiheit von Produkten und\nDienstleistungen (MLBF) in Magdeburg, Sachsen-Anhalt.",{"type":283,"tag":284,"props":12113,"children":12114},{},[12115,12120,12123,12125,12128,12130,12133,12135,12138,12141,12143,12146],{"type":283,"tag":11399,"props":12116,"children":12117},{},[12118],{"type":293,"value":12119},"MLBF (in Errichtung)",{"type":283,"tag":1321,"props":12121,"children":12122},{},[],{"type":293,"value":12124},"\nc/o Ministerium für Arbeit, Soziales, Gesundheit und Gleichstellung Sachsen-Anhalt",{"type":283,"tag":1321,"props":12126,"children":12127},{},[],{"type":293,"value":12129},"\nPostfach 39 11 55",{"type":283,"tag":1321,"props":12131,"children":12132},{},[],{"type":293,"value":12134},"\n39135 Magdeburg",{"type":283,"tag":1321,"props":12136,"children":12137},{},[],{"type":283,"tag":1321,"props":12139,"children":12140},{},[],{"type":293,"value":12142},"\nTelefon: 0391 567 6970",{"type":283,"tag":1321,"props":12144,"children":12145},{},[],{"type":293,"value":12147},"\nE-Mail: MLBF(at)ms.sachsen-anhalt.de.",{"type":283,"tag":11622,"props":12149,"children":12154},{"className":12150},[12151,12152,12153],"hint","hint--warning","mt-5",[12155],{"type":283,"tag":284,"props":12156,"children":12157},{},[12158,12163,12166,12168,12175,12177,12182],{"type":283,"tag":11399,"props":12159,"children":12160},{},[12161],{"type":293,"value":12162},"Hinweis:",{"type":283,"tag":1321,"props":12164,"children":12165},{},[],{"type":293,"value":12167},"\nNach ",{"type":283,"tag":11491,"props":12169,"children":12170},{},[12171],{"type":283,"tag":288,"props":12172,"children":12173},{"href":11553},[12174],{"type":293,"value":11553},{"type":293,"value":12176}," §1 c müsste\n“",{"type":283,"tag":11491,"props":12178,"children":12179},{},[12180],{"type":293,"value":12181},"eine Beschreibung, wie die Dienstleistung die einschlägigen in der nach §3 Absatz 2\nzu erlassenden Rechtsverordnung aufgeführten Barrierefreiheitsanforderungen erfüllt;",{"type":293,"value":12183},"”\neingebracht werden – also eine genaue Beschreibung, wie die Dienstleistung barrierefrei\ngestaltet wurde.",{"type":283,"tag":11622,"props":12185,"children":12189},{"className":12186},[12187,11676,11677,11678,11679,11680,11681,12188],"mt-0","pt-0",[12190,12196,12201],{"type":283,"tag":1252,"props":12191,"children":12193},{"id":12192},"beispiel-für-eine-beschreibung-der-konkreten-maßnahmen",[12194],{"type":293,"value":12195},"Beispiel für eine Beschreibung der konkreten Maßnahmen",{"type":283,"tag":284,"props":12197,"children":12198},{},[12199],{"type":293,"value":12200},"Im Folgenden ein Beispiel für konkrete Maßnahmen, wie wir sie als Agentur für unsere Kunden\nstandardmäßig in Projekten vorsehen und umsetzen.",{"type":283,"tag":284,"props":12202,"children":12203},{},[12204],{"type":293,"value":12205},"Diese Maßnahmen müssten wahrheitsgemäß und individuell an Ihre Maßnahmen angepasst werden.",{"type":283,"tag":11622,"props":12207,"children":12210},{"className":12208},[11625,12209],"doc-sheet__border-bottom",[12211],{"type":283,"tag":11622,"props":12212,"children":12214},{"className":12213},[11631],[12215,12221,12226,12232,12237,12243,12248,12254,12259,12265,12270,12276,12281,12287,12292,12298,12316],{"type":283,"tag":532,"props":12216,"children":12218},{"id":12217},"konkrete-umsetzung-der-barrierefreiheitsanforderungen",[12219],{"type":293,"value":12220},"Konkrete Umsetzung der Barrierefreiheitsanforderungen",{"type":283,"tag":284,"props":12222,"children":12223},{},[12224],{"type":293,"value":12225},"Zur Erfüllung der gesetzlichen Barrierefreiheitsanforderungen wurden folgende technische\nund gestalterische Maßnahmen implementiert:",{"type":283,"tag":1252,"props":12227,"children":12229},{"id":12228},"technische-strukturierung-und-semantik",[12230],{"type":293,"value":12231},"Technische Strukturierung und Semantik",{"type":283,"tag":284,"props":12233,"children":12234},{},[12235],{"type":293,"value":12236},"Die HTML-Strukturen unserer Website entsprechen dem semantischen Zweck der jeweiligen\nInhalte und Interaktionselemente. Ergänzend wurden ARIA-Markups eingesetzt, um komplexe\nFunktionalitäten und deren Status für assistive Technologien zugänglich zu machen.",{"type":283,"tag":1252,"props":12238,"children":12240},{"id":12239},"inhaltsgestaltung-und-redaktionelle-maßnahmen",[12241],{"type":293,"value":12242},"Inhaltsgestaltung und redaktionelle Maßnahmen",{"type":283,"tag":284,"props":12244,"children":12245},{},[12246],{"type":293,"value":12247},"Redaktionell verantwortliche Personen wurden zur korrekten Verwendung von Textstrukturen\nund hierarchischen Überschriftenebenen geschult. Bei der Erstellung von Inhalten wird\nauf eine klare, verständliche Sprache geachtet. Komplexe Sachverhalte werden strukturiert\ndargestellt und durch Zwischenüberschriften gegliedert. Link-Texte sind aussagekräftig\nformuliert und beschreiben das Ziel der Verlinkung eindeutig. Listen und andere\nstrukturierende HTML-Elemente werden gezielt eingesetzt, um die Inhaltsstruktur zu\nverdeutlichen. Tabellen werden mit entsprechenden Überschriften und Beschreibungen\nversehen, um deren Inhalt und Aufbau verständlich zu machen.",{"type":283,"tag":1252,"props":12249,"children":12251},{"id":12250},"visuelle-gestaltung-und-responsive-design",[12252],{"type":293,"value":12253},"Visuelle Gestaltung und Responsive Design",{"type":283,"tag":284,"props":12255,"children":12256},{},[12257],{"type":293,"value":12258},"Bei der Farbgestaltung wurde auf eine kontrastreiche Darstellung entsprechend dem\nWCAG-Level AA geachtet. Informationen werden nicht ausschließlich über visuelle\nEigenschaften wie Farbe, Form oder Position vermittelt, sondern durch zusätzliche\ntextliche oder strukturelle Hinweise ergänzt. Die Website ist responsiv gestaltet\nund auf verschiedenen Ausgabegeräten nutzbar. Die Textgröße kann mittels Browserzoom\nauf mindestens 200 % ohne Funktionsverlust angepasst werden. Navigation und\nBedienelemente sind konsistent gestaltet und an vergleichbaren Stellen positioniert.",{"type":283,"tag":1252,"props":12260,"children":12262},{"id":12261},"textalternativen-medien-und-zeitgesteuerte-inhalte",[12263],{"type":293,"value":12264},"Textalternativen, Medien und zeitgesteuerte Inhalte",{"type":283,"tag":284,"props":12266,"children":12267},{},[12268],{"type":293,"value":12269},"Für alle Bilder und Grafiken wurden Vorkehrungen getroffen, damit Nutzende beim\nErstellen von Inhalten aussagekräftige Alternativtexte hinterlegen oder reine\nSchmuckgrafiken durch leere Alternativtexte kennzeichnen können.\nVideo-Inhalte, soweit sie unserer Kontrolle unterliegen, sind mit Untertiteln versehen.\nZeitgesteuerte Anzeigen oder automatische Hinweise wurden vermieden.\nFalls solche Elemente aus funktionalen Gründen erforderlich sind, können diese von\nNutzenden pausiert und gesteuert werden.\nInhalte, die Aufmerksamkeit erfordern könnten, blinken oder flackern nicht.",{"type":283,"tag":1252,"props":12271,"children":12273},{"id":12272},"navigation-und-bedienung",[12274],{"type":293,"value":12275},"Navigation und Bedienung",{"type":283,"tag":284,"props":12277,"children":12278},{},[12279],{"type":293,"value":12280},"Die Website ist vollständig per Tastatur bedienbar. Der Tastaturfokus ist stets klar\nsichtbar und folgt einer logischen Reihenfolge entsprechend dem Seitenaufbau.\nEin unnötiges Versetzen des Fokus innerhalb einer Seite sowie ein unbeabsichtigtes\nZurücksetzen beim Neuladen von Seiten werden vermieden, um Kontext- und\nOrientierungsverluste zu verhindern.",{"type":283,"tag":1252,"props":12282,"children":12284},{"id":12283},"formulare-und-eingaben",[12285],{"type":293,"value":12286},"Formulare und Eingaben",{"type":283,"tag":284,"props":12288,"children":12289},{},[12290],{"type":293,"value":12291},"In allen Formularen sind eindeutige Label-Zuordnungen zu den entsprechenden Formular-\nund Bedienelementen hinterlegt.\nFehler- und Statusmeldungen werden klar verständlich und zugänglich dargestellt,\num die Bedienung und das Verständnis von Eingaben zu erleichtern.",{"type":283,"tag":1252,"props":12293,"children":12295},{"id":12294},"zusätzliche-maßnahmen",[12296],{"type":293,"value":12297},"Zusätzliche Maßnahmen",{"type":283,"tag":457,"props":12299,"children":12300},{},[12301,12306,12311],{"type":283,"tag":461,"props":12302,"children":12303},{},[12304],{"type":293,"value":12305},"Automatische Seitenumleitungen ohne Nutzerinteraktion wurden vermieden.",{"type":283,"tag":461,"props":12307,"children":12308},{},[12309],{"type":293,"value":12310},"Klick- und Touch-Ziele haben eine ausreichende Mindestgröße für eine einfache Bedienung.",{"type":283,"tag":461,"props":12312,"children":12313},{},[12314],{"type":293,"value":12315},"Bei linearer Navigation durch assistive Technologien folgen die Inhalte einer sinnvollen und verständlichen Reihenfolge.",{"type":283,"tag":284,"props":12317,"children":12318},{},[12319],{"type":293,"value":12320},"Diese Maßnahmen gewährleisten ein hohes Maß an Kompatibilität mit gängigen assistiven\nTechnologien und ermöglichen eine gleichwertige Nutzung unserer digitalen Dienste für\nMenschen mit unterschiedlichen Fähigkeiten.",{"type":283,"tag":321,"props":12322,"children":12324},{"className":12323},[11485],[12325],{"type":283,"tag":284,"props":12326,"children":12327},{},[12328],{"type":283,"tag":11491,"props":12329,"children":12330},{},[12331],{"type":293,"value":11779},{"type":283,"tag":11622,"props":12333,"children":12336},{"className":12334},[12151,12335],"hint--info",[12337,12343,12354],{"type":283,"tag":532,"props":12338,"children":12340},{"id":12339},"mögliche-kurzversion",[12341],{"type":293,"value":12342},"Mögliche Kurzversion:",{"type":283,"tag":284,"props":12344,"children":12345},{},[12346,12348,12352],{"type":293,"value":12347},"Wir gestalten unsere digitalen Angebote gemäß dem\n",{"type":283,"tag":11399,"props":12349,"children":12350},{},[12351],{"type":293,"value":11518},{"type":293,"value":12353}," und den geltenden Standards\n(z.B. WCAG 2.1 AA) barrierefrei und bauen diese Zugänglichkeit laufend weiter aus.",{"type":283,"tag":284,"props":12355,"children":12356},{},[12357,12359,12364,12366],{"type":293,"value":12358},"Trotz aller Sorgfalt kann es vereinzelt zu\n",{"type":283,"tag":11399,"props":12360,"children":12361},{},[12362],{"type":293,"value":12363},"temporären oder technischen Einschränkungen",{"type":293,"value":12365}," kommen.\nHinweise zu Barrieren nehmen wir gerne entgegen und bemühen uns um schnelle\nLösungen. ",{"type":283,"tag":11491,"props":12367,"children":12368},{},[12369],{"type":293,"value":12370},"[Hier geht’s zu den vollständigen Informationen zur Barrierefreiheit](LINK)",{"type":283,"tag":11622,"props":12372,"children":12374},{"className":12373},[12151,12152],[12375,12387],{"type":283,"tag":284,"props":12376,"children":12377},{},[12378,12382,12385],{"type":283,"tag":11399,"props":12379,"children":12380},{},[12381],{"type":293,"value":12162},{"type":283,"tag":1321,"props":12383,"children":12384},{},[],{"type":293,"value":12386},"\nDie EzB/IBE nicht in die AGB einbringen, da dies evtl. Einfluss auf andere\n“Rechtsgeschäfte” haben könnte.\nStattdessen einen individuellen Link „Barrierefreiheit“ im Footer platzieren,\nder auf die „Informationen zur Barrierefreiheit“ verweist als eigenständige Seite.",{"type":283,"tag":10885,"props":12388,"children":12389},{},[12390],{"type":283,"tag":284,"props":12391,"children":12392},{},[12393,12395,12400],{"type":293,"value":12394},"“",{"type":283,"tag":11491,"props":12396,"children":12397},{},[12398],{"type":293,"value":12399},"Der Dienstleistungserbringer gibt zu seiner Dienstleistung im Sinne des\n§ 1 Absatz 3 in seinen Allgemeinen Geschäftsbedingungen oder auf andere\ndeutlich wahrnehmbare Weise an, wie sie die Barrierefreiheitsanforderungen der\nnach § 3 Absatz 2 zu erlassenden Rechtsverordnung erfüllt.",{"type":293,"value":12401},"”",{"type":283,"tag":532,"props":12403,"children":12405},{"id":12404},"welche-erfahrungen-haben-wir-mit-juristischer-beratung-zu-diesem-thema-gemacht",[12406],{"type":293,"value":12407},"Welche Erfahrungen haben wir mit juristischer Beratung zu diesem Thema gemacht",{"type":283,"tag":284,"props":12409,"children":12410},{},[12411,12413,12418,12419,12424],{"type":293,"value":12412},"Es gilt zu beachten, dass es auch unter den juristischen Beratern, mit denen wir im Laufe\nder Zeit zu diesem Thema Kontakt hatten, einen gewissen Diskurs zur Umsetzung der im\nGesetz beschriebenen Maßnahmen gegeben hat. Dabei ist in erster Line die Unterscheidung\nzwischen einer ",{"type":283,"tag":11491,"props":12414,"children":12415},{},[12416],{"type":293,"value":12417},"engen",{"type":293,"value":9440},{"type":283,"tag":11491,"props":12420,"children":12421},{},[12422],{"type":293,"value":12423},"weiten",{"type":293,"value":12425}," Auslegung der Barrierefreiheitsanforderungen\nAusgangspunkt für den eingeforderten Detailgrad und Tiefe der beschriebenen Maßnahmen.",{"type":283,"tag":284,"props":12427,"children":12428},{},[12429],{"type":293,"value":12430},"Viele Kanzleien, die sich mit digitaler Barrierefreiheit befassen, empfehlen aber:",{"type":283,"tag":457,"props":12432,"children":12433},{},[12434,12453,12465,12488,12500],{"type":283,"tag":461,"props":12435,"children":12436},{},[12437,12439,12444,12446,12451],{"type":293,"value":12438},"die EzB ",{"type":283,"tag":11399,"props":12440,"children":12441},{},[12442],{"type":293,"value":12443},"nicht in die AGB zu integrieren",{"type":293,"value":12445},", sondern als ",{"type":283,"tag":11399,"props":12447,"children":12448},{},[12449],{"type":293,"value":12450},"eigenständige, gut auffindbare Seite zu führen",{"type":293,"value":12452}," – etwa unter /barrierefreiheit und diese dann im Footer der Webseite zu verlinken.",{"type":283,"tag":461,"props":12454,"children":12455},{},[12456,12458,12463],{"type":293,"value":12457},"In der ",{"type":283,"tag":11399,"props":12459,"children":12460},{},[12461],{"type":293,"value":12462},"EzB muss ausdrücklich auf die AGBs verwiesen werden",{"type":293,"value":12464}," (z.B. um Erklärungslücken in der Geschäftstätigkeit etc. zu schließen)",{"type":283,"tag":461,"props":12466,"children":12467},{},[12468,12473,12475,12480,12481,12486],{"type":283,"tag":11399,"props":12469,"children":12470},{},[12471],{"type":293,"value":12472},"Keine rechtlich verbindlichen Zusicherungen",{"type":293,"value":12474}," (",{"type":283,"tag":11491,"props":12476,"children":12477},{},[12478],{"type":293,"value":12479},"„vollständige Barrierefreiheit“",{"type":293,"value":9934},{"type":283,"tag":11491,"props":12482,"children":12483},{},[12484],{"type":293,"value":12485},"„garantierte Konformität“",{"type":293,"value":12487},") abzugeben, wenn diese nicht zu 100 % erfüllt sind",{"type":283,"tag":461,"props":12489,"children":12490},{},[12491,12493,12498],{"type":293,"value":12492},"Einen ",{"type":283,"tag":11399,"props":12494,"children":12495},{},[12496],{"type":293,"value":12497},"Ansprechperson für Rückmeldungen benennen",{"type":293,"value":12499}," – am besten mit E-Mail-Adresse und optional Telefonnummer",{"type":283,"tag":461,"props":12501,"children":12502},{},[12503,12508],{"type":283,"tag":11399,"props":12504,"children":12505},{},[12506],{"type":293,"value":12507},"Im Speziellen:",{"type":293,"value":12509}," Um nicht in das Schussfeld von Abmahnwellen zu geraten, sollte der entsprechende Gesetzestext fast 1:1 aufgegriffen werden. Das senkt das Risiko einer bei einer (Semi-)Automatischen Prüfung in den Fokus für ein Versäumnis in der Erklärung zu geraten (BFSG Anlage 3 kopieren oder zitieren)",{"type":283,"tag":1252,"props":12511,"children":12513},{"id":12512},"eine-mögliche-zusätzliche-formulierung-zur-verbesserten-abwehr-vor-abmahnungen",[12514],{"type":293,"value":12515},"Eine mögliche zusätzliche Formulierung zur verbesserten Abwehr vor Abmahnungen",{"type":283,"tag":11622,"props":12517,"children":12520},{"className":12518},[11625,12519],"doc-sheet__border-all",[12521],{"type":283,"tag":11622,"props":12522,"children":12524},{"className":12523},[11631],[12525,12531,12536,12579,12585,12590,12628,12666,12672,12677,12683,12688,12721],{"type":283,"tag":532,"props":12526,"children":12528},{"id":12527},"konzeption-der-dienstleistung-für-einen-barrierefreien-zugang",[12529],{"type":293,"value":12530},"Konzeption der Dienstleistung für einen barrierefreien Zugang",{"type":283,"tag":284,"props":12532,"children":12533},{},[12534],{"type":293,"value":12535},"Unsere digitale Dienstleistung wurde so konzipiert, dass sie Menschen mit\nverschiedenen Einschränkungen eine gleichwertige Nutzung ermöglicht.\nDabei setzen wir auf folgende Prinzipien:",{"type":283,"tag":457,"props":12537,"children":12538},{},[12539,12544,12549,12554,12559,12564,12569,12574],{"type":283,"tag":461,"props":12540,"children":12541},{},[12542],{"type":293,"value":12543},"Kontraststarke Gestaltung der Benutzeroberfläche",{"type":283,"tag":461,"props":12545,"children":12546},{},[12547],{"type":293,"value":12548},"Bereitstellung von Informationen auf mehreren Wahrnehmungsebenen (textbasiert, auditiv, visuell)",{"type":283,"tag":461,"props":12550,"children":12551},{},[12552],{"type":293,"value":12553},"Alternative Inhalte für visuelle oder auditive Medien",{"type":283,"tag":461,"props":12555,"children":12556},{},[12557],{"type":293,"value":12558},"Bedienung sämtlicher Funktionen mittels Tastatur",{"type":283,"tag":461,"props":12560,"children":12561},{},[12562],{"type":293,"value":12563},"Unterstützung für Screenreader und vergleichbare assistive Technologien",{"type":283,"tag":461,"props":12565,"children":12566},{},[12567],{"type":293,"value":12568},"Vermeidung zeitkritischer Interaktionen ohne barrierefreie Alternativen",{"type":283,"tag":461,"props":12570,"children":12571},{},[12572],{"type":293,"value":12573},"Einsatz einfacher Sprache verständlicher Inhalte",{"type":283,"tag":461,"props":12575,"children":12576},{},[12577],{"type":293,"value":12578},"intuitive Navigation und logisch gegliederte Inhalte",{"type":283,"tag":1252,"props":12580,"children":12582},{"id":12581},"allgemeine-barrierefreie-informationsbereitstellung",[12583],{"type":293,"value":12584},"Allgemeine barrierefreie Informationsbereitstellung",{"type":283,"tag":284,"props":12586,"children":12587},{},[12588],{"type":293,"value":12589},"Die Informationen über unsere Dienstleistungen werden so an Nutzende vermittelt,\ndass sie:",{"type":283,"tag":457,"props":12591,"children":12592},{},[12593,12598,12603,12608,12613,12618,12623],{"type":283,"tag":461,"props":12594,"children":12595},{},[12596],{"type":293,"value":12597},"über mehrere Sinne des Nutzers (z.B. visuell und/oder auditiv) erfassbar sind,",{"type":283,"tag":461,"props":12599,"children":12600},{},[12601],{"type":293,"value":12602},"leicht auffindbar für Nutzer bereitgestellt werden,",{"type":283,"tag":461,"props":12604,"children":12605},{},[12606],{"type":293,"value":12607},"in verständlicher Art verfasst sind,",{"type":283,"tag":461,"props":12609,"children":12610},{},[12611],{"type":293,"value":12612},"in einem universellen Textformat (Schriftart, Größe, Kontraste, Abstände) vorliegen, um Konvertierungen in assistive Ausgabeformen zu ermöglichen,",{"type":283,"tag":461,"props":12614,"children":12615},{},[12616],{"type":293,"value":12617},"in gut lesbarer Schriftgröße, angemessener Typografie und mit ausreichendem Kontrast sowie Abstand gestaltet sind,",{"type":283,"tag":461,"props":12619,"children":12620},{},[12621],{"type":293,"value":12622},"bei nicht-textbasierten Inhalten alternative textuelle Beschreibungen bereitstellen,",{"type":283,"tag":461,"props":12624,"children":12625},{},[12626],{"type":293,"value":12627},"digital so konzipiert sind, dass sie konsistent, zugänglich, intuitiv und stabil funktionieren.",{"type":283,"tag":284,"props":12629,"children":12630},{},[12631,12633,12638,12639,12644,12645,12650,12651,12656,12658,12664],{"type":293,"value":12632},"Sowohl unsere Webangebote, digitale Dienstleistungen als auch mobile Applikationen\nfolgen diesen Prinzipien.\nDie Gestaltung richtet sich dabei durchgängig an den Grundsätzen der\n",{"type":283,"tag":11399,"props":12634,"children":12635},{},[12636],{"type":293,"value":12637},"Wahrnehmbarkeit",{"type":293,"value":9934},{"type":283,"tag":11399,"props":12640,"children":12641},{},[12642],{"type":293,"value":12643},"Bedienbarkeit",{"type":293,"value":9934},{"type":283,"tag":11399,"props":12646,"children":12647},{},[12648],{"type":293,"value":12649},"Verständlichkeit",{"type":293,"value":9440},{"type":283,"tag":11399,"props":12652,"children":12653},{},[12654],{"type":293,"value":12655},"Robustheit",{"type":293,"value":12657},"\n(nach ",{"type":283,"tag":288,"props":12659,"children":12661},{"href":12660},"https://www.barrierefreiheit-dienstekonsolidierung.bund.de/Webs/PB/DE/gesetze-und-richtlinien/wcag/wcag-artikel.html",[12662],{"type":293,"value":12663},"WCAG-Kriterien",{"type":293,"value":12665},") aus.",{"type":283,"tag":1252,"props":12667,"children":12669},{"id":12668},"zugänglichkeit-unterstützender-dienste",[12670],{"type":293,"value":12671},"Zugänglichkeit unterstützender Dienste",{"type":283,"tag":284,"props":12673,"children":12674},{},[12675],{"type":293,"value":12676},"Wenn zusätzliche Hilfsangebote wie Support-Hotlines, Schulungsangebote oder\ntechnische Beratung angeboten werden, stellen wir sicher, dass auch diese Dienste\nInformationen zur Barrierefreiheit und Kompatibilität auf barrierefreiem Weg\nzugänglich machen.",{"type":283,"tag":1252,"props":12678,"children":12680},{"id":12679},"funktionale-anforderungen-für-spezielle-einschränkungen",[12681],{"type":293,"value":12682},"Funktionale Anforderungen für spezielle Einschränkungen",{"type":283,"tag":284,"props":12684,"children":12685},{},[12686],{"type":293,"value":12687},"Unsere Dienstleistungen berücksichtigen folgende barrierefreie Interaktionsformen\nfür die Nutzenden:",{"type":283,"tag":457,"props":12689,"children":12690},{},[12691,12696,12701,12706,12711,12716],{"type":283,"tag":461,"props":12692,"children":12693},{},[12694],{"type":293,"value":12695},"Für visuelle Einschränkungen: mindestens eine Option ohne visuelle Elemente und eine, die unabhängig von Farbunterscheidung funktioniert.",{"type":283,"tag":461,"props":12697,"children":12698},{},[12699],{"type":293,"value":12700},"Für Personen mit Einschränkungen des Hörens: mindestens eine Nutzungsmöglichkeit ohne Ton und eine mit anpassbaren Audiofunktionen.",{"type":283,"tag":461,"props":12702,"children":12703},{},[12704],{"type":293,"value":12705},"Für stimmlich eingeschränkte Nutzer: mindestens eine Bedienvariante ohne sprachliche Eingabe.",{"type":283,"tag":461,"props":12707,"children":12708},{},[12709],{"type":293,"value":12710},"Für motorisch eingeschränkte Nutzer: mindestens eine Bedienform ohne komplexe Bewegungsabfolgen oder Muskelkraft, sowie eine Option bei eingeschränkter Reichweite.",{"type":283,"tag":461,"props":12712,"children":12713},{},[12714],{"type":293,"value":12715},"Für Menschen mit kognitiven Einschränkungen: bedienerfreundliche Strukturen, soweit möglich reduzierte Komplexität und unterstützende Hinweise.",{"type":283,"tag":461,"props":12717,"children":12718},{},[12719],{"type":293,"value":12720},"Für alle Barrierefreiheitsfunktionen gilt: Die Privatsphäre der Nutzenden wird gewahrt.",{"type":283,"tag":284,"props":12722,"children":12723},{},[12724,12726,12730],{"type":293,"value":12725},"Diese Maßnahmen orientieren sich an den Vorgaben des\n",{"type":283,"tag":11399,"props":12727,"children":12728},{},[12729],{"type":293,"value":11649},{"type":293,"value":12731}," und wurden in unsere technischen und\ngestalterischen Prozesse integriert, um eine möglichst umfassende Zugänglichkeit\nsicherzustellen.",{"type":283,"tag":532,"props":12733,"children":12735},{"id":12734},"was-droht-ohne-ezb",[12736],{"type":293,"value":12737},"Was droht ohne EzB?",{"type":283,"tag":284,"props":12739,"children":12740},{},[12741,12743,12752],{"type":293,"value":12742},"Ohne gültige und überprüfbare Erklärung kann laut ",{"type":283,"tag":288,"props":12744,"children":12746},{"href":12745},"https://bfsg-gesetz.de/37-bfsg/",[12747],{"type":283,"tag":11399,"props":12748,"children":12749},{},[12750],{"type":293,"value":12751},"§ 37 BFSG",{"type":293,"value":12753}," Folgendes passieren:",{"type":283,"tag":457,"props":12755,"children":12756},{},[12757,12762,12767,12772],{"type":283,"tag":461,"props":12758,"children":12759},{},[12760],{"type":293,"value":12761},"Betriebs- oder Vertriebsverbot (der entsprechenden Dienstleistungen oder Produkte)",{"type":283,"tag":461,"props":12763,"children":12764},{},[12765],{"type":293,"value":12766},"Bußgelder von bis zu 100.000 Euro (je nach Verstoß)",{"type":283,"tag":461,"props":12768,"children":12769},{},[12770],{"type":293,"value":12771},"Förmliche Beanstandung durch die Marktüberwachung",{"type":283,"tag":461,"props":12773,"children":12774},{},[12775],{"type":293,"value":12776},"Abmahnungen durch Wettbewerber oder Verbraucherorganisationen",{"type":283,"tag":284,"props":12778,"children":12779},{},[12780,12782,12790],{"type":293,"value":12781},"Dies ist insbesondere deshalb relevant,\n",{"type":283,"tag":11399,"props":12783,"children":12784},{},[12785],{"type":283,"tag":11491,"props":12786,"children":12787},{},[12788],{"type":293,"value":12789},"da jede Institution, Firma oder natürliche Person die Prüfstellen auf einen Verstoß\ngegen das BFSG hinweisen kann",{"type":293,"value":12791},". So ist anzunehmen,\ndass mindestens Ihre Konkurrenz ein starkes Augenmerk darauf legen wird!",{"type":283,"tag":532,"props":12793,"children":12795},{"id":12794},"fazit-klarheit-schützt-vor-abmahnung",[12796],{"type":293,"value":12797},"Fazit - Klarheit schützt vor Abmahnung",{"type":283,"tag":284,"props":12799,"children":12800},{},[12801,12802,12806],{"type":293,"value":9340},{"type":283,"tag":11399,"props":12803,"children":12804},{},[12805],{"type":293,"value":11612},{"type":293,"value":12807}," ist nur ein kleiner Teil Ihrer digitalen Dienstleistung aber mit großer Wirkung.\nWer sie ernst nimmt und individuell auf die eigene Dienstleistung zuschneidet, zeigt nicht nur Gesetzestreue,\nsondern auch Respekt gegenüber allen Nutzenden. Zudem schützt sie vor rechtlichen Stolperfallen und wirtschaftlichen Schäden.",{"type":283,"tag":284,"props":12809,"children":12810},{},[12811],{"type":293,"value":12812},"Wenn Sie Unterstützung bei der Erstellung oder Formulierung brauchen, sprechen Sie uns gern an.\nWir helfen beim Erstellen barrierefreier Webanwendungen und zeigen, wie Sie die gesetzlichen Anforderungen sinnvoll\numsetzen können.",{"type":283,"tag":12814,"props":12815,"children":12817},"h4",{"id":12816},"rechtlicher-hinweis",[12818],{"type":293,"value":12819},"Rechtlicher Hinweis",{"type":283,"tag":284,"props":12821,"children":12822},{},[12823,12825,12833,12834,12839,12841,12846,12847,12852,12854,12859],{"type":293,"value":12824},"Dieser Blogpost ",{"type":283,"tag":11399,"props":12826,"children":12827},{},[12828],{"type":283,"tag":11491,"props":12829,"children":12830},{},[12831],{"type":293,"value":12832},"stellt keine Rechtsberatung dar",{"type":293,"value":9440},{"type":283,"tag":11399,"props":12835,"children":12836},{},[12837],{"type":293,"value":12838},"ersetzt auch keine rechtliche Prüfung Ihrer Erklärung zur Barrierefreiheit",{"type":293,"value":12840},". Die enthaltenen Formulierungen und Hinweise wurden sorgfältig recherchiert, erheben jedoch ",{"type":283,"tag":11399,"props":12842,"children":12843},{},[12844],{"type":293,"value":12845},"keinen Anspruch auf Vollständigkeit",{"type":293,"value":10941},{"type":283,"tag":11399,"props":12848,"children":12849},{},[12850],{"type":293,"value":12851},"rechtliche Verbindlichkeit",{"type":293,"value":12853},". Für die tatsächliche Umsetzung gemäß ",{"type":283,"tag":11399,"props":12855,"children":12856},{},[12857],{"type":293,"value":12858},"BFSG",{"type":293,"value":12860}," und geltender Verordnungen ist eine juristische Prüfung im Einzelfall empfohlen.",{"type":283,"tag":12814,"props":12862,"children":12864},{"id":12863},"hinweis-zur-erstellung-dieses-beitrags",[12865],{"type":293,"value":12866},"Hinweis zur Erstellung dieses Beitrags",{"type":283,"tag":284,"props":12868,"children":12869},{},[12870],{"type":293,"value":12871},"Dieser Beitrag wurde auch mit Hilfe der KI OpenAI GPT-4 (2024-06, Modell: GPT-4o) erstellt. Grundlage waren redaktionelle Recherchen, persönliche Erfahrungen, rechtliche Quellen und eine firmeneigene Mustervorlage. Das abschließende Lektorat und die fachliche Freigabe erfolgten durch den Autor des Artikels und Zuständigen für Barrierefreiheit Dr.-Ing. Jens Bornschein.",{"title":8,"searchDepth":340,"depth":340,"links":12873},[12874,12875,12876,12879,12880,12883,12884],{"id":11391,"depth":340,"text":11394},{"id":11504,"depth":340,"text":11507},{"id":11617,"depth":340,"text":11620,"children":12877},[12878],{"id":12192,"depth":353,"text":12195},{"id":12339,"depth":340,"text":12342},{"id":12404,"depth":340,"text":12407,"children":12881},[12882],{"id":12512,"depth":353,"text":12515},{"id":12734,"depth":340,"text":12737},{"id":12794,"depth":340,"text":12797},{"_path":12886,"_dir":1506,"_draft":7,"_partial":7,"_locale":8,"slug":87,"teams":12887,"primaryTeam":1508,"firstName":12888,"lastName":12889,"prefixTitle":12890,"suffixTitle":8,"executiveRole":12891,"education":12892,"role":12900,"workingSince":12899,"inTheCompanySince":12896,"techSkills":12903,"skills":12925,"projects":12937,"contactDetails":12943,"certifications":12946,"image":12952,"_id":12953,"_type":1596,"title":12954,"_source":1506,"_file":12955,"_stem":12956,"_extension":1596},"/employees/jens-bornschein",[1508],"Jens","Bornschein","Dr. Ing.","Projektmanager | Consultant",[12893,12897],[12894,12895,12896],"Doktor-Ingenieur der Informatik","TU Dresden","2020",[12898,12895,12899],"Diplom-Medieninformatiker (TU)","2010",[12901,1519,1520,12902,1573,1522],"projectManager","UI/UX",[12904,12905,12908,12909,12910,12912,12914,12917,12920,12923],{"name":1555,"level":1528},{"name":12906,"level":1528,"icon":12907},"C#","/images/csharp.svg",{"name":1548,"level":1549,"icon":1550},{"name":1552,"level":1549,"icon":1553},{"name":12911,"level":1549,"icon":1561},"Vue.js",{"name":12913,"level":1549},"Java",{"name":12915,"level":1528,"icon":12916},"Adobe Photoshop","/images/adobeps-logo.svg",{"name":12918,"level":1528,"icon":12919},"Adobe Illustrator","/images/adobeai-logo.svg",{"name":12921,"level":1549,"icon":12922},"Adobe XD","/images/adobexd-logo.svg",{"name":12924,"level":1549},"Gitlab",[12926,12928,12929,12930,12932,12934,12935],{"name":12927,"level":1528},"projectManagement",{"name":1573,"level":1528},{"name":12902,"level":1528},{"name":12931,"level":1549},"consulting",{"name":12933,"level":1549},"scrum",{"name":1578,"level":1549},{"name":12936,"level":1549},"training",[12938,12941],{"project":12939,"position":12940},"Montagespezis","project manager",{"project":12942,"position":12940},"Vipr",{"eMail":12944,"phone":12945,"visibility":1592},"jens.bornschein@helmundwalter.de","+49 351 799 035 24",[12947],{"image":12948,"link":12949,"title":12950,"pdf":12951},"/images/certifications/KHZG_Badge.svg","https://www.bundesamtsozialesicherung.de/de/themen/innovationsfonds-und-krankenhausstrukturfonds/krankenhausstrukturfonds/","Berechtigung nach § 21 Absatz 5 Satz 1 KHSFV - Management für KHZG geförderte Vorhaben","/certificates/jb_KHSFV_Zertifikat.pdf","images/employees/Portraits/JensBornschein_MS.webp","employees:employees:5.jens-bornschein.json","Jens Bornschein","employees/5.jens-bornschein.json","employees/5.jens-bornschein",{"_path":99,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":100,"description":101,"author":11,"image":12,"releaseDate":102,"blogCategories":12958,"articleTags":12959,"tags":12960,"body":12961,"_type":20,"_id":107,"_source":22,"_file":108,"_stem":109,"_extension":25},[15,104],[16],[19],{"type":280,"children":12962,"toc":15862},[12963,12967,12973,12983,13234,13239,13245,13250,13255,13260,13359,13365,13370,13609,13615,13620,13638,13644,13660,13988,13993,14056,14062,14077,14101,14473,14477,14513,14516,14524,14527,14530,14536,14549,14559,14572,14575,14582,14976,14980,15005,15008,15011,15021,15027,15383,15387,15400,15403,15408,15838,15842,15858],{"type":283,"tag":1607,"props":12964,"children":12966},{"alt":8,"aspect-ratio":1609,"height":1610,"object-fit":1611,"src":12965},"/blog/gitlab-traefik.png",[],{"type":283,"tag":532,"props":12968,"children":12970},{"id":12969},"der-einfachste-weg-gitlab-zu-installieren",[12971],{"type":293,"value":12972},"Der einfachste Weg, GitLab zu installieren",{"type":283,"tag":284,"props":12974,"children":12975},{},[12976,12978],{"type":293,"value":12977},"GitLab bietet offizielle Anweisungen zur Installation mit Docker und Docker Compose. Sie finden diese in der ",{"type":283,"tag":288,"props":12979,"children":12981},{"href":12980},"https://docs.gitlab.com/install/docker/installation/#install-gitlab-by-using-docker-compose",[12982],{"type":293,"value":4076},{"type":283,"tag":303,"props":12984,"children":12987},{"className":314,"code":12985,"filename":12986,"language":313,"meta":8,"style":8},"services:\n  gitlab:\n    image: gitlab/gitlab-ee:\u003Cversion>-ce.0\n    container_name: gitlab\n    restart: always\n    hostname: '\u003Cgitlab.example.com>'\n    environment:\n      GITLAB_OMNIBUS_CONFIG: |\n        # Add any other gitlab.rb configuration here, each on its own line\n        external_url 'https://\u003Cgitlab.example.com>'\n    ports:\n      - '80:80'\n      - '443:443'\n      - '22:22'\n    volumes:\n      - '$GITLAB_HOME/config:/etc/gitlab'\n      - '$GITLAB_HOME/logs:/var/log/gitlab'\n      - '$GITLAB_HOME/data:/var/opt/gitlab'\n    shm_size: '256m'\n","gitlab/docker-compose.yaml",[12988],{"type":283,"tag":317,"props":12989,"children":12990},{"__ignoreMap":8},[12991,13002,13014,13030,13046,13061,13078,13089,13106,13114,13122,13134,13146,13158,13170,13181,13193,13205,13217],{"type":283,"tag":321,"props":12992,"children":12993},{"class":323,"line":324},[12994,12998],{"type":283,"tag":321,"props":12995,"children":12996},{"style":328},[12997],{"type":293,"value":331},{"type":283,"tag":321,"props":12999,"children":13000},{"style":334},[13001],{"type":293,"value":337},{"type":283,"tag":321,"props":13003,"children":13004},{"class":323,"line":340},[13005,13010],{"type":283,"tag":321,"props":13006,"children":13007},{"style":328},[13008],{"type":293,"value":13009},"  gitlab",{"type":283,"tag":321,"props":13011,"children":13012},{"style":334},[13013],{"type":293,"value":337},{"type":283,"tag":321,"props":13015,"children":13016},{"class":323,"line":353},[13017,13021,13025],{"type":283,"tag":321,"props":13018,"children":13019},{"style":328},[13020],{"type":293,"value":359},{"type":283,"tag":321,"props":13022,"children":13023},{"style":334},[13024],{"type":293,"value":364},{"type":283,"tag":321,"props":13026,"children":13027},{"style":367},[13028],{"type":293,"value":13029},"gitlab/gitlab-ee:\u003Cversion>-ce.0\n",{"type":283,"tag":321,"props":13031,"children":13032},{"class":323,"line":373},[13033,13037,13041],{"type":283,"tag":321,"props":13034,"children":13035},{"style":328},[13036],{"type":293,"value":915},{"type":283,"tag":321,"props":13038,"children":13039},{"style":334},[13040],{"type":293,"value":364},{"type":283,"tag":321,"props":13042,"children":13043},{"style":367},[13044],{"type":293,"value":13045},"gitlab\n",{"type":283,"tag":321,"props":13047,"children":13048},{"class":323,"line":308},[13049,13053,13057],{"type":283,"tag":321,"props":13050,"children":13051},{"style":328},[13052],{"type":293,"value":932},{"type":283,"tag":321,"props":13054,"children":13055},{"style":334},[13056],{"type":293,"value":364},{"type":283,"tag":321,"props":13058,"children":13059},{"style":367},[13060],{"type":293,"value":941},{"type":283,"tag":321,"props":13062,"children":13063},{"class":323,"line":309},[13064,13069,13073],{"type":283,"tag":321,"props":13065,"children":13066},{"style":328},[13067],{"type":293,"value":13068},"    hostname",{"type":283,"tag":321,"props":13070,"children":13071},{"style":334},[13072],{"type":293,"value":364},{"type":283,"tag":321,"props":13074,"children":13075},{"style":367},[13076],{"type":293,"value":13077},"'\u003Cgitlab.example.com>'\n",{"type":283,"tag":321,"props":13079,"children":13080},{"class":323,"line":310},[13081,13085],{"type":283,"tag":321,"props":13082,"children":13083},{"style":328},[13084],{"type":293,"value":9801},{"type":283,"tag":321,"props":13086,"children":13087},{"style":334},[13088],{"type":293,"value":337},{"type":283,"tag":321,"props":13090,"children":13091},{"class":323,"line":311},[13092,13097,13101],{"type":283,"tag":321,"props":13093,"children":13094},{"style":328},[13095],{"type":293,"value":13096},"      GITLAB_OMNIBUS_CONFIG",{"type":283,"tag":321,"props":13098,"children":13099},{"style":334},[13100],{"type":293,"value":364},{"type":283,"tag":321,"props":13102,"children":13103},{"style":8079},[13104],{"type":293,"value":13105},"|\n",{"type":283,"tag":321,"props":13107,"children":13108},{"class":323,"line":312},[13109],{"type":283,"tag":321,"props":13110,"children":13111},{"style":367},[13112],{"type":293,"value":13113},"        # Add any other gitlab.rb configuration here, each on its own line\n",{"type":283,"tag":321,"props":13115,"children":13116},{"class":323,"line":977},[13117],{"type":283,"tag":321,"props":13118,"children":13119},{"style":367},[13120],{"type":293,"value":13121},"        external_url 'https://\u003Cgitlab.example.com>'\n",{"type":283,"tag":321,"props":13123,"children":13124},{"class":323,"line":990},[13125,13130],{"type":283,"tag":321,"props":13126,"children":13127},{"style":328},[13128],{"type":293,"value":13129},"    ports",{"type":283,"tag":321,"props":13131,"children":13132},{"style":334},[13133],{"type":293,"value":337},{"type":283,"tag":321,"props":13135,"children":13136},{"class":323,"line":1003},[13137,13141],{"type":283,"tag":321,"props":13138,"children":13139},{"style":334},[13140],{"type":293,"value":393},{"type":283,"tag":321,"props":13142,"children":13143},{"style":367},[13144],{"type":293,"value":13145},"'80:80'\n",{"type":283,"tag":321,"props":13147,"children":13148},{"class":323,"line":1016},[13149,13153],{"type":283,"tag":321,"props":13150,"children":13151},{"style":334},[13152],{"type":293,"value":393},{"type":283,"tag":321,"props":13154,"children":13155},{"style":367},[13156],{"type":293,"value":13157},"'443:443'\n",{"type":283,"tag":321,"props":13159,"children":13160},{"class":323,"line":1029},[13161,13165],{"type":283,"tag":321,"props":13162,"children":13163},{"style":334},[13164],{"type":293,"value":393},{"type":283,"tag":321,"props":13166,"children":13167},{"style":367},[13168],{"type":293,"value":13169},"'22:22'\n",{"type":283,"tag":321,"props":13171,"children":13172},{"class":323,"line":1042},[13173,13177],{"type":283,"tag":321,"props":13174,"children":13175},{"style":328},[13176],{"type":293,"value":1179},{"type":283,"tag":321,"props":13178,"children":13179},{"style":334},[13180],{"type":293,"value":337},{"type":283,"tag":321,"props":13182,"children":13183},{"class":323,"line":1052},[13184,13188],{"type":283,"tag":321,"props":13185,"children":13186},{"style":334},[13187],{"type":293,"value":393},{"type":283,"tag":321,"props":13189,"children":13190},{"style":367},[13191],{"type":293,"value":13192},"'$GITLAB_HOME/config:/etc/gitlab'\n",{"type":283,"tag":321,"props":13194,"children":13195},{"class":323,"line":1065},[13196,13200],{"type":283,"tag":321,"props":13197,"children":13198},{"style":334},[13199],{"type":293,"value":393},{"type":283,"tag":321,"props":13201,"children":13202},{"style":367},[13203],{"type":293,"value":13204},"'$GITLAB_HOME/logs:/var/log/gitlab'\n",{"type":283,"tag":321,"props":13206,"children":13207},{"class":323,"line":1078},[13208,13212],{"type":283,"tag":321,"props":13209,"children":13210},{"style":334},[13211],{"type":293,"value":393},{"type":283,"tag":321,"props":13213,"children":13214},{"style":367},[13215],{"type":293,"value":13216},"'$GITLAB_HOME/data:/var/opt/gitlab'\n",{"type":283,"tag":321,"props":13218,"children":13219},{"class":323,"line":1087},[13220,13225,13229],{"type":283,"tag":321,"props":13221,"children":13222},{"style":328},[13223],{"type":293,"value":13224},"    shm_size",{"type":283,"tag":321,"props":13226,"children":13227},{"style":334},[13228],{"type":293,"value":364},{"type":283,"tag":321,"props":13230,"children":13231},{"style":367},[13232],{"type":293,"value":13233},"'256m'\n",{"type":283,"tag":284,"props":13235,"children":13236},{},[13237],{"type":293,"value":13238},"Dies setzt voraus, dass Sie einen Server haben, der ausschließlich für GitLab bestimmt ist und alle erforderlichen Ports (http, https, ssh) frei sind.\nGitLab kümmert sich um alles, einschließlich der TLS-Konfiguration mit Lets Encrypt.",{"type":283,"tag":532,"props":13240,"children":13242},{"id":13241},"integration-von-gitlab-neben-anderen-deployments",[13243],{"type":293,"value":13244},"Integration von GitLab neben anderen Deployments",{"type":283,"tag":284,"props":13246,"children":13247},{},[13248],{"type":293,"value":13249},"Was ist, wenn Sie GitLab nicht auf einem dedizierten Server installieren können oder wollen?",{"type":283,"tag":284,"props":13251,"children":13252},{},[13253],{"type":293,"value":13254},"Vielleicht möchten Sie einfach einen einzigen Server für alle Ihre Dienste?",{"type":283,"tag":284,"props":13256,"children":13257},{},[13258],{"type":293,"value":13259},"Dies ist eine Beispielstruktur, wie Sie Ihre Deployments organisieren könnten:",{"type":283,"tag":303,"props":13261,"children":13263},{"className":1705,"code":13262,"language":1704,"meta":8,"style":8},".\n├── gitlab/                # GitLab Service-Stack\n├── gitlab-runner/         # GitLab Runner für CI/CD\n├── mattermost/            # Mattermost Team-Kollaboration\n├── nextcloud/             # Nextcloud Dateihosting und Zusammenarbeit\n└── traefik/               # Traefik Reverse-Proxy-Konfiguration\n",[13264],{"type":283,"tag":317,"props":13265,"children":13266},{"__ignoreMap":8},[13267,13274,13291,13308,13325,13342],{"type":283,"tag":321,"props":13268,"children":13269},{"class":323,"line":324},[13270],{"type":283,"tag":321,"props":13271,"children":13272},{"style":9567},[13273],{"type":293,"value":9570},{"type":283,"tag":321,"props":13275,"children":13276},{"class":323,"line":340},[13277,13281,13286],{"type":283,"tag":321,"props":13278,"children":13279},{"style":1715},[13280],{"type":293,"value":9591},{"type":283,"tag":321,"props":13282,"children":13283},{"style":367},[13284],{"type":293,"value":13285}," gitlab/",{"type":283,"tag":321,"props":13287,"children":13288},{"style":1447},[13289],{"type":293,"value":13290},"                # GitLab Service-Stack\n",{"type":283,"tag":321,"props":13292,"children":13293},{"class":323,"line":353},[13294,13298,13303],{"type":283,"tag":321,"props":13295,"children":13296},{"style":1715},[13297],{"type":293,"value":9591},{"type":283,"tag":321,"props":13299,"children":13300},{"style":367},[13301],{"type":293,"value":13302}," gitlab-runner/",{"type":283,"tag":321,"props":13304,"children":13305},{"style":1447},[13306],{"type":293,"value":13307},"         # GitLab Runner für CI/CD\n",{"type":283,"tag":321,"props":13309,"children":13310},{"class":323,"line":373},[13311,13315,13320],{"type":283,"tag":321,"props":13312,"children":13313},{"style":1715},[13314],{"type":293,"value":9591},{"type":283,"tag":321,"props":13316,"children":13317},{"style":367},[13318],{"type":293,"value":13319}," mattermost/",{"type":283,"tag":321,"props":13321,"children":13322},{"style":1447},[13323],{"type":293,"value":13324},"            # Mattermost Team-Kollaboration\n",{"type":283,"tag":321,"props":13326,"children":13327},{"class":323,"line":308},[13328,13332,13337],{"type":283,"tag":321,"props":13329,"children":13330},{"style":1715},[13331],{"type":293,"value":9591},{"type":283,"tag":321,"props":13333,"children":13334},{"style":367},[13335],{"type":293,"value":13336}," nextcloud/",{"type":283,"tag":321,"props":13338,"children":13339},{"style":1447},[13340],{"type":293,"value":13341},"             # Nextcloud Dateihosting und Zusammenarbeit\n",{"type":283,"tag":321,"props":13343,"children":13344},{"class":323,"line":309},[13345,13349,13354],{"type":283,"tag":321,"props":13346,"children":13347},{"style":1715},[13348],{"type":293,"value":9644},{"type":283,"tag":321,"props":13350,"children":13351},{"style":367},[13352],{"type":293,"value":13353}," traefik/",{"type":283,"tag":321,"props":13355,"children":13356},{"style":1447},[13357],{"type":293,"value":13358},"               # Traefik Reverse-Proxy-Konfiguration\n",{"type":283,"tag":1252,"props":13360,"children":13362},{"id":13361},"verwendung-einer-dedizierten-ip",[13363],{"type":293,"value":13364},"Verwendung einer dedizierten IP",{"type":283,"tag":284,"props":13366,"children":13367},{},[13368],{"type":293,"value":13369},"Falls Sie die Möglichkeit haben, Ihrem Server eine zusätzliche IP zuzuweisen (wie eine Floating IP bei Hetzner),\nkönnen Sie die Ports einfach an diese IP binden.",{"type":283,"tag":303,"props":13371,"children":13374},{"className":314,"code":13372,"filename":12986,"highlights":13373,"language":313,"meta":8,"style":8},"services:\n  gitlab:\n    image: gitlab/gitlab-ee:\u003Cversion>-ce.0\n    container_name: gitlab\n    restart: always\n    hostname: '\u003Cgitlab.example.com>'\n    environment:\n      GITLAB_OMNIBUS_CONFIG: |\n        # Add any other gitlab.rb configuration here, each on its own line\n        external_url 'https://\u003Cgitlab.example.com>'\n    ports:\n      - '192.168.0.1:80:80'\n      - '192.168.0.1:443:443'\n      - '192.168.0.1:22:22'\n    volumes:\n      - '$GITLAB_HOME/config:/etc/gitlab'\n      - '$GITLAB_HOME/logs:/var/log/gitlab'\n      - '$GITLAB_HOME/data:/var/opt/gitlab'\n    shm_size: '256m'\n",[1003,1016,1029],[13375],{"type":283,"tag":317,"props":13376,"children":13377},{"__ignoreMap":8},[13378,13389,13400,13415,13430,13445,13460,13471,13486,13493,13500,13511,13524,13537,13550,13561,13572,13583,13594],{"type":283,"tag":321,"props":13379,"children":13380},{"class":323,"line":324},[13381,13385],{"type":283,"tag":321,"props":13382,"children":13383},{"style":328},[13384],{"type":293,"value":331},{"type":283,"tag":321,"props":13386,"children":13387},{"style":334},[13388],{"type":293,"value":337},{"type":283,"tag":321,"props":13390,"children":13391},{"class":323,"line":340},[13392,13396],{"type":283,"tag":321,"props":13393,"children":13394},{"style":328},[13395],{"type":293,"value":13009},{"type":283,"tag":321,"props":13397,"children":13398},{"style":334},[13399],{"type":293,"value":337},{"type":283,"tag":321,"props":13401,"children":13402},{"class":323,"line":353},[13403,13407,13411],{"type":283,"tag":321,"props":13404,"children":13405},{"style":328},[13406],{"type":293,"value":359},{"type":283,"tag":321,"props":13408,"children":13409},{"style":334},[13410],{"type":293,"value":364},{"type":283,"tag":321,"props":13412,"children":13413},{"style":367},[13414],{"type":293,"value":13029},{"type":283,"tag":321,"props":13416,"children":13417},{"class":323,"line":373},[13418,13422,13426],{"type":283,"tag":321,"props":13419,"children":13420},{"style":328},[13421],{"type":293,"value":915},{"type":283,"tag":321,"props":13423,"children":13424},{"style":334},[13425],{"type":293,"value":364},{"type":283,"tag":321,"props":13427,"children":13428},{"style":367},[13429],{"type":293,"value":13045},{"type":283,"tag":321,"props":13431,"children":13432},{"class":323,"line":308},[13433,13437,13441],{"type":283,"tag":321,"props":13434,"children":13435},{"style":328},[13436],{"type":293,"value":932},{"type":283,"tag":321,"props":13438,"children":13439},{"style":334},[13440],{"type":293,"value":364},{"type":283,"tag":321,"props":13442,"children":13443},{"style":367},[13444],{"type":293,"value":941},{"type":283,"tag":321,"props":13446,"children":13447},{"class":323,"line":309},[13448,13452,13456],{"type":283,"tag":321,"props":13449,"children":13450},{"style":328},[13451],{"type":293,"value":13068},{"type":283,"tag":321,"props":13453,"children":13454},{"style":334},[13455],{"type":293,"value":364},{"type":283,"tag":321,"props":13457,"children":13458},{"style":367},[13459],{"type":293,"value":13077},{"type":283,"tag":321,"props":13461,"children":13462},{"class":323,"line":310},[13463,13467],{"type":283,"tag":321,"props":13464,"children":13465},{"style":328},[13466],{"type":293,"value":9801},{"type":283,"tag":321,"props":13468,"children":13469},{"style":334},[13470],{"type":293,"value":337},{"type":283,"tag":321,"props":13472,"children":13473},{"class":323,"line":311},[13474,13478,13482],{"type":283,"tag":321,"props":13475,"children":13476},{"style":328},[13477],{"type":293,"value":13096},{"type":283,"tag":321,"props":13479,"children":13480},{"style":334},[13481],{"type":293,"value":364},{"type":283,"tag":321,"props":13483,"children":13484},{"style":8079},[13485],{"type":293,"value":13105},{"type":283,"tag":321,"props":13487,"children":13488},{"class":323,"line":312},[13489],{"type":283,"tag":321,"props":13490,"children":13491},{"style":367},[13492],{"type":293,"value":13113},{"type":283,"tag":321,"props":13494,"children":13495},{"class":323,"line":977},[13496],{"type":283,"tag":321,"props":13497,"children":13498},{"style":367},[13499],{"type":293,"value":13121},{"type":283,"tag":321,"props":13501,"children":13502},{"class":323,"line":990},[13503,13507],{"type":283,"tag":321,"props":13504,"children":13505},{"style":328},[13506],{"type":293,"value":13129},{"type":283,"tag":321,"props":13508,"children":13509},{"style":334},[13510],{"type":293,"value":337},{"type":283,"tag":321,"props":13512,"children":13514},{"class":13513,"line":1003},[323,387],[13515,13519],{"type":283,"tag":321,"props":13516,"children":13517},{"style":334},[13518],{"type":293,"value":393},{"type":283,"tag":321,"props":13520,"children":13521},{"style":367},[13522],{"type":293,"value":13523},"'192.168.0.1:80:80'\n",{"type":283,"tag":321,"props":13525,"children":13527},{"class":13526,"line":1016},[323,387],[13528,13532],{"type":283,"tag":321,"props":13529,"children":13530},{"style":334},[13531],{"type":293,"value":393},{"type":283,"tag":321,"props":13533,"children":13534},{"style":367},[13535],{"type":293,"value":13536},"'192.168.0.1:443:443'\n",{"type":283,"tag":321,"props":13538,"children":13540},{"class":13539,"line":1029},[323,387],[13541,13545],{"type":283,"tag":321,"props":13542,"children":13543},{"style":334},[13544],{"type":293,"value":393},{"type":283,"tag":321,"props":13546,"children":13547},{"style":367},[13548],{"type":293,"value":13549},"'192.168.0.1:22:22'\n",{"type":283,"tag":321,"props":13551,"children":13552},{"class":323,"line":1042},[13553,13557],{"type":283,"tag":321,"props":13554,"children":13555},{"style":328},[13556],{"type":293,"value":1179},{"type":283,"tag":321,"props":13558,"children":13559},{"style":334},[13560],{"type":293,"value":337},{"type":283,"tag":321,"props":13562,"children":13563},{"class":323,"line":1052},[13564,13568],{"type":283,"tag":321,"props":13565,"children":13566},{"style":334},[13567],{"type":293,"value":393},{"type":283,"tag":321,"props":13569,"children":13570},{"style":367},[13571],{"type":293,"value":13192},{"type":283,"tag":321,"props":13573,"children":13574},{"class":323,"line":1065},[13575,13579],{"type":283,"tag":321,"props":13576,"children":13577},{"style":334},[13578],{"type":293,"value":393},{"type":283,"tag":321,"props":13580,"children":13581},{"style":367},[13582],{"type":293,"value":13204},{"type":283,"tag":321,"props":13584,"children":13585},{"class":323,"line":1078},[13586,13590],{"type":283,"tag":321,"props":13587,"children":13588},{"style":334},[13589],{"type":293,"value":393},{"type":283,"tag":321,"props":13591,"children":13592},{"style":367},[13593],{"type":293,"value":13216},{"type":283,"tag":321,"props":13595,"children":13596},{"class":323,"line":1087},[13597,13601,13605],{"type":283,"tag":321,"props":13598,"children":13599},{"style":328},[13600],{"type":293,"value":13224},{"type":283,"tag":321,"props":13602,"children":13603},{"style":334},[13604],{"type":293,"value":364},{"type":283,"tag":321,"props":13606,"children":13607},{"style":367},[13608],{"type":293,"value":13233},{"type":283,"tag":1252,"props":13610,"children":13612},{"id":13611},"verwendung-von-traefik-als-reverse-proxy",[13613],{"type":293,"value":13614},"Verwendung von Traefik als Reverse-Proxy",{"type":283,"tag":284,"props":13616,"children":13617},{},[13618],{"type":293,"value":13619},"In diesem Fall gehe ich davon aus, dass Sie:",{"type":283,"tag":457,"props":13621,"children":13622},{},[13623,13628,13633],{"type":283,"tag":461,"props":13624,"children":13625},{},[13626],{"type":293,"value":13627},"keine dedizierte IP für GitLab zuweisen können oder wollen",{"type":283,"tag":461,"props":13629,"children":13630},{},[13631],{"type":293,"value":13632},"Ihren Standard-SSH-Port nicht ändern können oder wollen",{"type":283,"tag":461,"props":13634,"children":13635},{},[13636],{"type":293,"value":13637},"Traefik als Reverse-Proxy verwenden möchten",{"type":283,"tag":12814,"props":13639,"children":13641},{"id":13640},"das-traefik-deployment",[13642],{"type":293,"value":13643},"Das Traefik-Deployment",{"type":283,"tag":284,"props":13645,"children":13646},{},[13647,13649,13658],{"type":293,"value":13648},"Denken Sie daran, ",{"type":283,"tag":11399,"props":13650,"children":13651},{},[13652],{"type":283,"tag":317,"props":13653,"children":13655},{"className":13654},[],[13656],{"type":293,"value":13657},"\u003Cinfo@example.com>",{"type":293,"value":13659}," durch Ihre eigene E-Mail-Adresse zu ersetzen.",{"type":283,"tag":303,"props":13661,"children":13664},{"className":314,"code":13662,"filename":13663,"language":313,"meta":8,"style":8},"volumes:\n  letsencrypt:\n\nservices:\n  traefik:\n    image: traefik:3\n    container_name: traefik\n    restart: always\n    network_mode: host\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - letsencrypt:/letsencrypt\n    command:\n      - --log.level=INFO\n\n      - --entrypoints.web.address=:80\n      - --entrypoints.web.http.redirections.entrypoint.to=websecure\n      - --entrypoints.web.http.redirections.entrypoint.scheme=https\n\n      - --entrypoints.websecure.address=:443\n      - --entrypoints.websecure.http.tls.certresolver=letsencrypt\n\n      - --providers.docker=true\n      - --providers.docker.exposedByDefault=false\n\n      - --certificatesresolvers.letsencrypt.acme.email=\u003Cinfo@example.com>\n      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n","traefik/docker-compose.yaml",[13665],{"type":283,"tag":317,"props":13666,"children":13667},{"__ignoreMap":8},[13668,13679,13690,13697,13708,13719,13734,13749,13764,13779,13790,13801,13813,13824,13836,13843,13854,13865,13876,13883,13894,13905,13912,13924,13936,13943,13955,13966,13977],{"type":283,"tag":321,"props":13669,"children":13670},{"class":323,"line":324},[13671,13675],{"type":283,"tag":321,"props":13672,"children":13673},{"style":328},[13674],{"type":293,"value":860},{"type":283,"tag":321,"props":13676,"children":13677},{"style":334},[13678],{"type":293,"value":337},{"type":283,"tag":321,"props":13680,"children":13681},{"class":323,"line":340},[13682,13686],{"type":283,"tag":321,"props":13683,"children":13684},{"style":328},[13685],{"type":293,"value":872},{"type":283,"tag":321,"props":13687,"children":13688},{"style":334},[13689],{"type":293,"value":337},{"type":283,"tag":321,"props":13691,"children":13692},{"class":323,"line":353},[13693],{"type":283,"tag":321,"props":13694,"children":13695},{"emptyLinePlaceholder":1046},[13696],{"type":293,"value":1049},{"type":283,"tag":321,"props":13698,"children":13699},{"class":323,"line":373},[13700,13704],{"type":283,"tag":321,"props":13701,"children":13702},{"style":328},[13703],{"type":293,"value":331},{"type":283,"tag":321,"props":13705,"children":13706},{"style":334},[13707],{"type":293,"value":337},{"type":283,"tag":321,"props":13709,"children":13710},{"class":323,"line":308},[13711,13715],{"type":283,"tag":321,"props":13712,"children":13713},{"style":328},[13714],{"type":293,"value":903},{"type":283,"tag":321,"props":13716,"children":13717},{"style":334},[13718],{"type":293,"value":337},{"type":283,"tag":321,"props":13720,"children":13721},{"class":323,"line":309},[13722,13726,13730],{"type":283,"tag":321,"props":13723,"children":13724},{"style":328},[13725],{"type":293,"value":359},{"type":283,"tag":321,"props":13727,"children":13728},{"style":334},[13729],{"type":293,"value":364},{"type":283,"tag":321,"props":13731,"children":13732},{"style":367},[13733],{"type":293,"value":957},{"type":283,"tag":321,"props":13735,"children":13736},{"class":323,"line":310},[13737,13741,13745],{"type":283,"tag":321,"props":13738,"children":13739},{"style":328},[13740],{"type":293,"value":915},{"type":283,"tag":321,"props":13742,"children":13743},{"style":334},[13744],{"type":293,"value":364},{"type":283,"tag":321,"props":13746,"children":13747},{"style":367},[13748],{"type":293,"value":924},{"type":283,"tag":321,"props":13750,"children":13751},{"class":323,"line":311},[13752,13756,13760],{"type":283,"tag":321,"props":13753,"children":13754},{"style":328},[13755],{"type":293,"value":932},{"type":283,"tag":321,"props":13757,"children":13758},{"style":334},[13759],{"type":293,"value":364},{"type":283,"tag":321,"props":13761,"children":13762},{"style":367},[13763],{"type":293,"value":941},{"type":283,"tag":321,"props":13765,"children":13766},{"class":323,"line":312},[13767,13771,13775],{"type":283,"tag":321,"props":13768,"children":13769},{"style":328},[13770],{"type":293,"value":965},{"type":283,"tag":321,"props":13772,"children":13773},{"style":334},[13774],{"type":293,"value":364},{"type":283,"tag":321,"props":13776,"children":13777},{"style":367},[13778],{"type":293,"value":974},{"type":283,"tag":321,"props":13780,"children":13781},{"class":323,"line":977},[13782,13786],{"type":283,"tag":321,"props":13783,"children":13784},{"style":328},[13785],{"type":293,"value":1179},{"type":283,"tag":321,"props":13787,"children":13788},{"style":334},[13789],{"type":293,"value":337},{"type":283,"tag":321,"props":13791,"children":13792},{"class":323,"line":990},[13793,13797],{"type":283,"tag":321,"props":13794,"children":13795},{"style":334},[13796],{"type":293,"value":393},{"type":283,"tag":321,"props":13798,"children":13799},{"style":367},[13800],{"type":293,"value":1196},{"type":283,"tag":321,"props":13802,"children":13803},{"class":323,"line":1003},[13804,13808],{"type":283,"tag":321,"props":13805,"children":13806},{"style":334},[13807],{"type":293,"value":393},{"type":283,"tag":321,"props":13809,"children":13810},{"style":367},[13811],{"type":293,"value":13812},"letsencrypt:/letsencrypt\n",{"type":283,"tag":321,"props":13814,"children":13815},{"class":323,"line":1016},[13816,13820],{"type":283,"tag":321,"props":13817,"children":13818},{"style":328},[13819],{"type":293,"value":983},{"type":283,"tag":321,"props":13821,"children":13822},{"style":334},[13823],{"type":293,"value":337},{"type":283,"tag":321,"props":13825,"children":13826},{"class":323,"line":1029},[13827,13831],{"type":283,"tag":321,"props":13828,"children":13829},{"style":334},[13830],{"type":293,"value":393},{"type":283,"tag":321,"props":13832,"children":13833},{"style":367},[13834],{"type":293,"value":13835},"--log.level=INFO\n",{"type":283,"tag":321,"props":13837,"children":13838},{"class":323,"line":1042},[13839],{"type":283,"tag":321,"props":13840,"children":13841},{"emptyLinePlaceholder":1046},[13842],{"type":293,"value":1049},{"type":283,"tag":321,"props":13844,"children":13845},{"class":323,"line":1052},[13846,13850],{"type":283,"tag":321,"props":13847,"children":13848},{"style":334},[13849],{"type":293,"value":393},{"type":283,"tag":321,"props":13851,"children":13852},{"style":367},[13853],{"type":293,"value":1062},{"type":283,"tag":321,"props":13855,"children":13856},{"class":323,"line":1065},[13857,13861],{"type":283,"tag":321,"props":13858,"children":13859},{"style":334},[13860],{"type":293,"value":393},{"type":283,"tag":321,"props":13862,"children":13863},{"style":367},[13864],{"type":293,"value":1097},{"type":283,"tag":321,"props":13866,"children":13867},{"class":323,"line":1078},[13868,13872],{"type":283,"tag":321,"props":13869,"children":13870},{"style":334},[13871],{"type":293,"value":393},{"type":283,"tag":321,"props":13873,"children":13874},{"style":367},[13875],{"type":293,"value":1110},{"type":283,"tag":321,"props":13877,"children":13878},{"class":323,"line":1087},[13879],{"type":283,"tag":321,"props":13880,"children":13881},{"emptyLinePlaceholder":1046},[13882],{"type":293,"value":1049},{"type":283,"tag":321,"props":13884,"children":13885},{"class":323,"line":1100},[13886,13890],{"type":283,"tag":321,"props":13887,"children":13888},{"style":334},[13889],{"type":293,"value":393},{"type":283,"tag":321,"props":13891,"children":13892},{"style":367},[13893],{"type":293,"value":1075},{"type":283,"tag":321,"props":13895,"children":13896},{"class":323,"line":1113},[13897,13901],{"type":283,"tag":321,"props":13898,"children":13899},{"style":334},[13900],{"type":293,"value":393},{"type":283,"tag":321,"props":13902,"children":13903},{"style":367},[13904],{"type":293,"value":1123},{"type":283,"tag":321,"props":13906,"children":13907},{"class":323,"line":1126},[13908],{"type":283,"tag":321,"props":13909,"children":13910},{"emptyLinePlaceholder":1046},[13911],{"type":293,"value":1049},{"type":283,"tag":321,"props":13913,"children":13914},{"class":323,"line":1134},[13915,13919],{"type":283,"tag":321,"props":13916,"children":13917},{"style":334},[13918],{"type":293,"value":393},{"type":283,"tag":321,"props":13920,"children":13921},{"style":367},[13922],{"type":293,"value":13923},"--providers.docker=true\n",{"type":283,"tag":321,"props":13925,"children":13926},{"class":323,"line":1147},[13927,13931],{"type":283,"tag":321,"props":13928,"children":13929},{"style":334},[13930],{"type":293,"value":393},{"type":283,"tag":321,"props":13932,"children":13933},{"style":367},[13934],{"type":293,"value":13935},"--providers.docker.exposedByDefault=false\n",{"type":283,"tag":321,"props":13937,"children":13938},{"class":323,"line":1160},[13939],{"type":283,"tag":321,"props":13940,"children":13941},{"emptyLinePlaceholder":1046},[13942],{"type":293,"value":1049},{"type":283,"tag":321,"props":13944,"children":13945},{"class":323,"line":1173},[13946,13950],{"type":283,"tag":321,"props":13947,"children":13948},{"style":334},[13949],{"type":293,"value":393},{"type":283,"tag":321,"props":13951,"children":13952},{"style":367},[13953],{"type":293,"value":13954},"--certificatesresolvers.letsencrypt.acme.email=\u003Cinfo@example.com>\n",{"type":283,"tag":321,"props":13956,"children":13957},{"class":323,"line":1186},[13958,13962],{"type":283,"tag":321,"props":13959,"children":13960},{"style":334},[13961],{"type":293,"value":393},{"type":283,"tag":321,"props":13963,"children":13964},{"style":367},[13965],{"type":293,"value":1026},{"type":283,"tag":321,"props":13967,"children":13968},{"class":323,"line":1199},[13969,13973],{"type":283,"tag":321,"props":13970,"children":13971},{"style":334},[13972],{"type":293,"value":393},{"type":283,"tag":321,"props":13974,"children":13975},{"style":367},[13976],{"type":293,"value":1000},{"type":283,"tag":321,"props":13978,"children":13979},{"class":323,"line":2160},[13980,13984],{"type":283,"tag":321,"props":13981,"children":13982},{"style":334},[13983],{"type":293,"value":393},{"type":283,"tag":321,"props":13985,"children":13986},{"style":367},[13987],{"type":293,"value":1039},{"type":283,"tag":284,"props":13989,"children":13990},{},[13991],{"type":293,"value":13992},"Diese Konfiguration wird:",{"type":283,"tag":457,"props":13994,"children":13995},{},[13996,14005,14014,14019,14036,14045],{"type":283,"tag":461,"props":13997,"children":13998},{},[13999],{"type":283,"tag":288,"props":14000,"children":14002},{"href":14001},"https://doc.traefik.io/traefik/reference/install-configuration/providers/docker/",[14003],{"type":293,"value":14004},"den Docker-Provider aktivieren",{"type":283,"tag":461,"props":14006,"children":14007},{},[14008],{"type":283,"tag":288,"props":14009,"children":14011},{"href":14010},"https://doc.traefik.io/traefik/providers/docker/#exposedbydefault",[14012],{"type":293,"value":14013},"die Container-Erkennung deaktivieren",{"type":283,"tag":461,"props":14015,"children":14016},{},[14017],{"type":293,"value":14018},"den gesamten HTTP-traffic auf HTTPS umleiten",{"type":283,"tag":461,"props":14020,"children":14021},{},[14022],{"type":283,"tag":288,"props":14023,"children":14025},{"href":14024},"https://doc.traefik.io/traefik/https/acme/#httpchallenge",[14026,14028,14034],{"type":293,"value":14027},"Let's Encrypt mit ",{"type":283,"tag":317,"props":14029,"children":14031},{"className":14030},[],[14032],{"type":293,"value":14033},"HTTP-01",{"type":293,"value":14035},"-Challenge konfigurieren",{"type":283,"tag":461,"props":14037,"children":14038},{},[14039],{"type":283,"tag":288,"props":14040,"children":14042},{"href":14041},"https://doc.traefik.io/traefik/routing/entrypoints/#tls",[14043],{"type":293,"value":14044},"die TLS-Konfiguration auf alle Routen anwenden",{"type":283,"tag":461,"props":14046,"children":14047},{},[14048,14054],{"type":283,"tag":288,"props":14049,"children":14051},{"href":14050},"https://docs.docker.com/engine/network/tutorials/host/",[14052],{"type":293,"value":14053},"den Traefik-Container direkt an das Netzwerk des Hosts binden",{"type":293,"value":14055},", sodass keine zusätzliche Konfiguration für Traefik erforderlich ist",{"type":283,"tag":12814,"props":14057,"children":14059},{"id":14058},"das-gitlab-deployment",[14060],{"type":293,"value":14061},"Das GitLab-Deployment",{"type":283,"tag":284,"props":14063,"children":14064},{},[14065,14066,14075],{"type":293,"value":13648},{"type":283,"tag":11399,"props":14067,"children":14068},{},[14069],{"type":283,"tag":317,"props":14070,"children":14072},{"className":14071},[],[14073],{"type":293,"value":14074},"\u003Cgitlab.example.com>",{"type":293,"value":14076}," durch Ihre eigene Domain zu ersetzen.",{"type":283,"tag":284,"props":14078,"children":14079},{},[14080,14082,14088,14090,14099],{"type":293,"value":14081},"Bitte schauen Sie in die ",{"type":283,"tag":288,"props":14083,"children":14085},{"href":14084},"https://docs.gitlab.com/install/docker/installation/#create-a-directory-for-the-volumes",[14086],{"type":293,"value":14087},"offizielle Dokumentation",{"type":293,"value":14089}," bezüglich des ",{"type":283,"tag":11399,"props":14091,"children":14092},{},[14093],{"type":283,"tag":317,"props":14094,"children":14096},{"className":14095},[],[14097],{"type":293,"value":14098},"GITLAB_HOME",{"type":293,"value":14100},"-Verzeichnisses",{"type":283,"tag":303,"props":14102,"children":14105},{"className":314,"code":14103,"filename":12986,"highlights":14104,"language":313,"meta":8,"style":8},"services:\n  gitlab:\n    image: gitlab/gitlab-ce:\u003Cversion>-ce.0\n    container_name: gitlab\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.gitlab.rule=Host(`\u003Cgitlab.example.com>`)\"\n      - \"traefik.http.routers.gitlab.service=gitlab\"\n      - \"traefik.http.services.gitlab.loadbalancer.server.port=80\"\n    restart: always\n    hostname: 'gitlab.example.com'\n    environment:\n      GITLAB_OMNIBUS_CONFIG: |\n        # Add any other gitlab.rb configuration here, each on its own line\n        external_url '\u003Chttps://gitlab.example.com>'\n        \n        letsencrypt['enable'] = false\n        \n        nginx['listen_port'] = 80\n        nginx['listen_https'] = false\n        nginx['proxy_set_headers'] = {\n          \"X-Forwarded-Proto\" => \"https\",\n          \"X-Forwarded-Ssl\" => \"on\"\n        }\n        \n        gitlab_rails['gitlab_shell_ssh_port'] = 2424\n    ports:\n      - '2424:22'\n    volumes:\n      - '$GITLAB_HOME/config:/etc/gitlab'\n      - '$GITLAB_HOME/logs:/var/log/gitlab'\n      - '$GITLAB_HOME/data:/var/opt/gitlab'\n    shm_size: '256m'\n",[308,309,310,311,312,1065,1087,1100,1113,1126,1134,1147,1173,1199],[14106],{"type":283,"tag":317,"props":14107,"children":14108},{"__ignoreMap":8},[14109,14120,14131,14147,14162,14174,14186,14199,14212,14225,14240,14256,14267,14282,14289,14297,14305,14314,14321,14330,14339,14348,14357,14366,14374,14381,14390,14401,14414,14425,14436,14447,14458],{"type":283,"tag":321,"props":14110,"children":14111},{"class":323,"line":324},[14112,14116],{"type":283,"tag":321,"props":14113,"children":14114},{"style":328},[14115],{"type":293,"value":331},{"type":283,"tag":321,"props":14117,"children":14118},{"style":334},[14119],{"type":293,"value":337},{"type":283,"tag":321,"props":14121,"children":14122},{"class":323,"line":340},[14123,14127],{"type":283,"tag":321,"props":14124,"children":14125},{"style":328},[14126],{"type":293,"value":13009},{"type":283,"tag":321,"props":14128,"children":14129},{"style":334},[14130],{"type":293,"value":337},{"type":283,"tag":321,"props":14132,"children":14133},{"class":323,"line":353},[14134,14138,14142],{"type":283,"tag":321,"props":14135,"children":14136},{"style":328},[14137],{"type":293,"value":359},{"type":283,"tag":321,"props":14139,"children":14140},{"style":334},[14141],{"type":293,"value":364},{"type":283,"tag":321,"props":14143,"children":14144},{"style":367},[14145],{"type":293,"value":14146},"gitlab/gitlab-ce:\u003Cversion>-ce.0\n",{"type":283,"tag":321,"props":14148,"children":14149},{"class":323,"line":373},[14150,14154,14158],{"type":283,"tag":321,"props":14151,"children":14152},{"style":328},[14153],{"type":293,"value":915},{"type":283,"tag":321,"props":14155,"children":14156},{"style":334},[14157],{"type":293,"value":364},{"type":283,"tag":321,"props":14159,"children":14160},{"style":367},[14161],{"type":293,"value":13045},{"type":283,"tag":321,"props":14163,"children":14165},{"class":14164,"line":308},[323,387],[14166,14170],{"type":283,"tag":321,"props":14167,"children":14168},{"style":328},[14169],{"type":293,"value":379},{"type":283,"tag":321,"props":14171,"children":14172},{"style":334},[14173],{"type":293,"value":337},{"type":283,"tag":321,"props":14175,"children":14177},{"class":14176,"line":309},[323,387],[14178,14182],{"type":283,"tag":321,"props":14179,"children":14180},{"style":334},[14181],{"type":293,"value":393},{"type":283,"tag":321,"props":14183,"children":14184},{"style":367},[14185],{"type":293,"value":398},{"type":283,"tag":321,"props":14187,"children":14189},{"class":14188,"line":310},[323,387],[14190,14194],{"type":283,"tag":321,"props":14191,"children":14192},{"style":334},[14193],{"type":293,"value":393},{"type":283,"tag":321,"props":14195,"children":14196},{"style":367},[14197],{"type":293,"value":14198},"\"traefik.http.routers.gitlab.rule=Host(`\u003Cgitlab.example.com>`)\"\n",{"type":283,"tag":321,"props":14200,"children":14202},{"class":14201,"line":311},[323,387],[14203,14207],{"type":283,"tag":321,"props":14204,"children":14205},{"style":334},[14206],{"type":293,"value":393},{"type":283,"tag":321,"props":14208,"children":14209},{"style":367},[14210],{"type":293,"value":14211},"\"traefik.http.routers.gitlab.service=gitlab\"\n",{"type":283,"tag":321,"props":14213,"children":14215},{"class":14214,"line":312},[323,387],[14216,14220],{"type":283,"tag":321,"props":14217,"children":14218},{"style":334},[14219],{"type":293,"value":393},{"type":283,"tag":321,"props":14221,"children":14222},{"style":367},[14223],{"type":293,"value":14224},"\"traefik.http.services.gitlab.loadbalancer.server.port=80\"\n",{"type":283,"tag":321,"props":14226,"children":14227},{"class":323,"line":977},[14228,14232,14236],{"type":283,"tag":321,"props":14229,"children":14230},{"style":328},[14231],{"type":293,"value":932},{"type":283,"tag":321,"props":14233,"children":14234},{"style":334},[14235],{"type":293,"value":364},{"type":283,"tag":321,"props":14237,"children":14238},{"style":367},[14239],{"type":293,"value":941},{"type":283,"tag":321,"props":14241,"children":14242},{"class":323,"line":990},[14243,14247,14251],{"type":283,"tag":321,"props":14244,"children":14245},{"style":328},[14246],{"type":293,"value":13068},{"type":283,"tag":321,"props":14248,"children":14249},{"style":334},[14250],{"type":293,"value":364},{"type":283,"tag":321,"props":14252,"children":14253},{"style":367},[14254],{"type":293,"value":14255},"'gitlab.example.com'\n",{"type":283,"tag":321,"props":14257,"children":14258},{"class":323,"line":1003},[14259,14263],{"type":283,"tag":321,"props":14260,"children":14261},{"style":328},[14262],{"type":293,"value":9801},{"type":283,"tag":321,"props":14264,"children":14265},{"style":334},[14266],{"type":293,"value":337},{"type":283,"tag":321,"props":14268,"children":14269},{"class":323,"line":1016},[14270,14274,14278],{"type":283,"tag":321,"props":14271,"children":14272},{"style":328},[14273],{"type":293,"value":13096},{"type":283,"tag":321,"props":14275,"children":14276},{"style":334},[14277],{"type":293,"value":364},{"type":283,"tag":321,"props":14279,"children":14280},{"style":8079},[14281],{"type":293,"value":13105},{"type":283,"tag":321,"props":14283,"children":14284},{"class":323,"line":1029},[14285],{"type":283,"tag":321,"props":14286,"children":14287},{"style":367},[14288],{"type":293,"value":13113},{"type":283,"tag":321,"props":14290,"children":14291},{"class":323,"line":1042},[14292],{"type":283,"tag":321,"props":14293,"children":14294},{"style":367},[14295],{"type":293,"value":14296},"        external_url '\u003Chttps://gitlab.example.com>'\n",{"type":283,"tag":321,"props":14298,"children":14299},{"class":323,"line":1052},[14300],{"type":283,"tag":321,"props":14301,"children":14302},{"style":367},[14303],{"type":293,"value":14304},"        \n",{"type":283,"tag":321,"props":14306,"children":14308},{"class":14307,"line":1065},[323,387],[14309],{"type":283,"tag":321,"props":14310,"children":14311},{"style":367},[14312],{"type":293,"value":14313},"        letsencrypt['enable'] = false\n",{"type":283,"tag":321,"props":14315,"children":14316},{"class":323,"line":1078},[14317],{"type":283,"tag":321,"props":14318,"children":14319},{"style":367},[14320],{"type":293,"value":14304},{"type":283,"tag":321,"props":14322,"children":14324},{"class":14323,"line":1087},[323,387],[14325],{"type":283,"tag":321,"props":14326,"children":14327},{"style":367},[14328],{"type":293,"value":14329},"        nginx['listen_port'] = 80\n",{"type":283,"tag":321,"props":14331,"children":14333},{"class":14332,"line":1100},[323,387],[14334],{"type":283,"tag":321,"props":14335,"children":14336},{"style":367},[14337],{"type":293,"value":14338},"        nginx['listen_https'] = false\n",{"type":283,"tag":321,"props":14340,"children":14342},{"class":14341,"line":1113},[323,387],[14343],{"type":283,"tag":321,"props":14344,"children":14345},{"style":367},[14346],{"type":293,"value":14347},"        nginx['proxy_set_headers'] = {\n",{"type":283,"tag":321,"props":14349,"children":14351},{"class":14350,"line":1126},[323,387],[14352],{"type":283,"tag":321,"props":14353,"children":14354},{"style":367},[14355],{"type":293,"value":14356},"          \"X-Forwarded-Proto\" => \"https\",\n",{"type":283,"tag":321,"props":14358,"children":14360},{"class":14359,"line":1134},[323,387],[14361],{"type":283,"tag":321,"props":14362,"children":14363},{"style":367},[14364],{"type":293,"value":14365},"          \"X-Forwarded-Ssl\" => \"on\"\n",{"type":283,"tag":321,"props":14367,"children":14369},{"class":14368,"line":1147},[323,387],[14370],{"type":283,"tag":321,"props":14371,"children":14372},{"style":367},[14373],{"type":293,"value":6678},{"type":283,"tag":321,"props":14375,"children":14376},{"class":323,"line":1160},[14377],{"type":283,"tag":321,"props":14378,"children":14379},{"style":367},[14380],{"type":293,"value":14304},{"type":283,"tag":321,"props":14382,"children":14384},{"class":14383,"line":1173},[323,387],[14385],{"type":283,"tag":321,"props":14386,"children":14387},{"style":367},[14388],{"type":293,"value":14389},"        gitlab_rails['gitlab_shell_ssh_port'] = 2424\n",{"type":283,"tag":321,"props":14391,"children":14392},{"class":323,"line":1186},[14393,14397],{"type":283,"tag":321,"props":14394,"children":14395},{"style":328},[14396],{"type":293,"value":13129},{"type":283,"tag":321,"props":14398,"children":14399},{"style":334},[14400],{"type":293,"value":337},{"type":283,"tag":321,"props":14402,"children":14404},{"class":14403,"line":1199},[323,387],[14405,14409],{"type":283,"tag":321,"props":14406,"children":14407},{"style":334},[14408],{"type":293,"value":393},{"type":283,"tag":321,"props":14410,"children":14411},{"style":367},[14412],{"type":293,"value":14413},"'2424:22'\n",{"type":283,"tag":321,"props":14415,"children":14416},{"class":323,"line":2160},[14417,14421],{"type":283,"tag":321,"props":14418,"children":14419},{"style":328},[14420],{"type":293,"value":1179},{"type":283,"tag":321,"props":14422,"children":14423},{"style":334},[14424],{"type":293,"value":337},{"type":283,"tag":321,"props":14426,"children":14427},{"class":323,"line":2161},[14428,14432],{"type":283,"tag":321,"props":14429,"children":14430},{"style":334},[14431],{"type":293,"value":393},{"type":283,"tag":321,"props":14433,"children":14434},{"style":367},[14435],{"type":293,"value":13192},{"type":283,"tag":321,"props":14437,"children":14438},{"class":323,"line":2162},[14439,14443],{"type":283,"tag":321,"props":14440,"children":14441},{"style":334},[14442],{"type":293,"value":393},{"type":283,"tag":321,"props":14444,"children":14445},{"style":367},[14446],{"type":293,"value":13204},{"type":283,"tag":321,"props":14448,"children":14449},{"class":323,"line":2163},[14450,14454],{"type":283,"tag":321,"props":14451,"children":14452},{"style":334},[14453],{"type":293,"value":393},{"type":283,"tag":321,"props":14455,"children":14456},{"style":367},[14457],{"type":293,"value":13216},{"type":283,"tag":321,"props":14459,"children":14460},{"class":323,"line":2164},[14461,14465,14469],{"type":283,"tag":321,"props":14462,"children":14463},{"style":328},[14464],{"type":293,"value":13224},{"type":283,"tag":321,"props":14466,"children":14467},{"style":334},[14468],{"type":293,"value":364},{"type":283,"tag":321,"props":14470,"children":14471},{"style":367},[14472],{"type":293,"value":13233},{"type":283,"tag":284,"props":14474,"children":14475},{},[14476],{"type":293,"value":13992},{"type":283,"tag":457,"props":14478,"children":14479},{},[14480,14485,14490,14495,14500],{"type":283,"tag":461,"props":14481,"children":14482},{},[14483],{"type":293,"value":14484},"Let's Encrypt deaktivieren",{"type":283,"tag":461,"props":14486,"children":14487},{},[14488],{"type":293,"value":14489},"das Abhören von HTTPS deaktivieren und auf Port 80 hören",{"type":283,"tag":461,"props":14491,"children":14492},{},[14493],{"type":293,"value":14494},"die erforderlichen Proxy-Header setzen",{"type":283,"tag":461,"props":14496,"children":14497},{},[14498],{"type":293,"value":14499},"den SSH-Port auf 2424 ändern",{"type":283,"tag":461,"props":14501,"children":14502},{},[14503,14505,14511],{"type":293,"value":14504},"Traefik anweisen, den gesamten Verkehr für ",{"type":283,"tag":317,"props":14506,"children":14508},{"className":14507},[],[14509],{"type":293,"value":14510},"gitlab.example.com",{"type":293,"value":14512}," an Port 80 des Containers weiterzuleiten",{"type":283,"tag":1321,"props":14514,"children":14515},{},[],{"type":283,"tag":284,"props":14517,"children":14518},{},[14519],{"type":283,"tag":321,"props":14520,"children":14522},{"className":14521},[5006],[14523],{"type":293,"value":5009},{"type":283,"tag":1321,"props":14525,"children":14526},{},[],{"type":283,"tag":837,"props":14528,"children":14529},{},[],{"type":283,"tag":1252,"props":14531,"children":14533},{"id":14532},"gitlab-container-registry",[14534],{"type":293,"value":14535},"GitLab Container-Registry",{"type":283,"tag":284,"props":14537,"children":14538},{},[14539,14541,14547],{"type":293,"value":14540},"Wenn Sie so weit gekommen sind, möchten Sie wahrscheinlich auch die ",{"type":283,"tag":288,"props":14542,"children":14544},{"href":14543},"https://docs.gitlab.com/administration/packages/container_registry/",[14545],{"type":293,"value":14546},"Container-Registry",{"type":293,"value":14548}," einrichten",{"type":283,"tag":12814,"props":14550,"children":14552},{"id":14551},"container-registry-unter-eigener-domain-konfigurieren",[14553],{"type":283,"tag":288,"props":14554,"children":14556},{"href":14555},"https://docs.gitlab.com/administration/packages/container_registry/#configure-container-registry-under-its-own-domain",[14557],{"type":293,"value":14558},"Container-Registry unter eigener Domain konfigurieren",{"type":283,"tag":284,"props":14560,"children":14561},{},[14562,14564,14570],{"type":293,"value":14563},"Diese Einrichtung ist einfach. Wir müssen nur die ",{"type":283,"tag":317,"props":14565,"children":14567},{"className":14566},[],[14568],{"type":293,"value":14569},"registry_external_url",{"type":293,"value":14571}," setzen und Traefik anweisen, wohin die Anfragen weitergeleitet werden sollen",{"type":283,"tag":1321,"props":14573,"children":14574},{},[],{"type":283,"tag":14576,"props":14577,"children":14579},"h5",{"id":14578},"aktualisierung-der-gitlab-konfiguration",[14580],{"type":293,"value":14581},"Aktualisierung der GitLab-Konfiguration",{"type":283,"tag":303,"props":14583,"children":14586},{"className":314,"code":14584,"filename":12986,"highlights":14585,"language":313,"meta":8,"style":8},"services:\n  gitlab:\n    image: gitlab/gitlab-ce:\u003Cversion>-ce.0\n    container_name: gitlab\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.gitlab.rule=Host(`\u003Cgitlab.example.com>`)\"\n      - \"traefik.http.routers.gitlab.service=gitlab\"\n      - \"traefik.http.services.gitlab.loadbalancer.server.port=80\"\n      - \"traefik.http.routers.container-registry.rule=Host(`registry.gitlab.example.com`)\"\n      - \"traefik.http.services.container-registry.loadbalancer.server.port=5000\"\n    restart: always\n    hostname: 'gitlab.example.com'\n    environment:\n      GITLAB_OMNIBUS_CONFIG: |\n        # Add any other gitlab.rb configuration here, each on its own line\n        external_url '\u003Chttps://gitlab.example.com>'\n\n        letsencrypt['enable'] = false\n\n        nginx['listen_port'] = 80\n        nginx['listen_https'] = false\n        nginx['proxy_set_headers'] = {\n          \"X-Forwarded-Proto\" => \"https\",\n          \"X-Forwarded-Ssl\" => \"on\"\n        }\n\n        gitlab_rails['gitlab_shell_ssh_port'] = 2424\n\n        registry_external_url '\u003Chttps://registry.gitlab.example.com>'\n        registry_nginx['enable'] = false\n    ports:\n      - '2424:22'\n    volumes:\n      - '$GITLAB_HOME/config:/etc/gitlab'\n      - '$GITLAB_HOME/logs:/var/log/gitlab'\n      - '$GITLAB_HOME/data:/var/opt/gitlab'\n    shm_size: '256m'\n",[977,990,2161,2162],[14587],{"type":283,"tag":317,"props":14588,"children":14589},{"__ignoreMap":8},[14590,14601,14612,14627,14642,14653,14664,14675,14686,14697,14710,14723,14738,14753,14764,14779,14786,14793,14800,14807,14814,14821,14828,14835,14842,14849,14856,14863,14870,14877,14886,14895,14906,14917,14928,14939,14950,14961],{"type":283,"tag":321,"props":14591,"children":14592},{"class":323,"line":324},[14593,14597],{"type":283,"tag":321,"props":14594,"children":14595},{"style":328},[14596],{"type":293,"value":331},{"type":283,"tag":321,"props":14598,"children":14599},{"style":334},[14600],{"type":293,"value":337},{"type":283,"tag":321,"props":14602,"children":14603},{"class":323,"line":340},[14604,14608],{"type":283,"tag":321,"props":14605,"children":14606},{"style":328},[14607],{"type":293,"value":13009},{"type":283,"tag":321,"props":14609,"children":14610},{"style":334},[14611],{"type":293,"value":337},{"type":283,"tag":321,"props":14613,"children":14614},{"class":323,"line":353},[14615,14619,14623],{"type":283,"tag":321,"props":14616,"children":14617},{"style":328},[14618],{"type":293,"value":359},{"type":283,"tag":321,"props":14620,"children":14621},{"style":334},[14622],{"type":293,"value":364},{"type":283,"tag":321,"props":14624,"children":14625},{"style":367},[14626],{"type":293,"value":14146},{"type":283,"tag":321,"props":14628,"children":14629},{"class":323,"line":373},[14630,14634,14638],{"type":283,"tag":321,"props":14631,"children":14632},{"style":328},[14633],{"type":293,"value":915},{"type":283,"tag":321,"props":14635,"children":14636},{"style":334},[14637],{"type":293,"value":364},{"type":283,"tag":321,"props":14639,"children":14640},{"style":367},[14641],{"type":293,"value":13045},{"type":283,"tag":321,"props":14643,"children":14644},{"class":323,"line":308},[14645,14649],{"type":283,"tag":321,"props":14646,"children":14647},{"style":328},[14648],{"type":293,"value":379},{"type":283,"tag":321,"props":14650,"children":14651},{"style":334},[14652],{"type":293,"value":337},{"type":283,"tag":321,"props":14654,"children":14655},{"class":323,"line":309},[14656,14660],{"type":283,"tag":321,"props":14657,"children":14658},{"style":334},[14659],{"type":293,"value":393},{"type":283,"tag":321,"props":14661,"children":14662},{"style":367},[14663],{"type":293,"value":398},{"type":283,"tag":321,"props":14665,"children":14666},{"class":323,"line":310},[14667,14671],{"type":283,"tag":321,"props":14668,"children":14669},{"style":334},[14670],{"type":293,"value":393},{"type":283,"tag":321,"props":14672,"children":14673},{"style":367},[14674],{"type":293,"value":14198},{"type":283,"tag":321,"props":14676,"children":14677},{"class":323,"line":311},[14678,14682],{"type":283,"tag":321,"props":14679,"children":14680},{"style":334},[14681],{"type":293,"value":393},{"type":283,"tag":321,"props":14683,"children":14684},{"style":367},[14685],{"type":293,"value":14211},{"type":283,"tag":321,"props":14687,"children":14688},{"class":323,"line":312},[14689,14693],{"type":283,"tag":321,"props":14690,"children":14691},{"style":334},[14692],{"type":293,"value":393},{"type":283,"tag":321,"props":14694,"children":14695},{"style":367},[14696],{"type":293,"value":14224},{"type":283,"tag":321,"props":14698,"children":14700},{"class":14699,"line":977},[323,387],[14701,14705],{"type":283,"tag":321,"props":14702,"children":14703},{"style":334},[14704],{"type":293,"value":393},{"type":283,"tag":321,"props":14706,"children":14707},{"style":367},[14708],{"type":293,"value":14709},"\"traefik.http.routers.container-registry.rule=Host(`registry.gitlab.example.com`)\"\n",{"type":283,"tag":321,"props":14711,"children":14713},{"class":14712,"line":990},[323,387],[14714,14718],{"type":283,"tag":321,"props":14715,"children":14716},{"style":334},[14717],{"type":293,"value":393},{"type":283,"tag":321,"props":14719,"children":14720},{"style":367},[14721],{"type":293,"value":14722},"\"traefik.http.services.container-registry.loadbalancer.server.port=5000\"\n",{"type":283,"tag":321,"props":14724,"children":14725},{"class":323,"line":1003},[14726,14730,14734],{"type":283,"tag":321,"props":14727,"children":14728},{"style":328},[14729],{"type":293,"value":932},{"type":283,"tag":321,"props":14731,"children":14732},{"style":334},[14733],{"type":293,"value":364},{"type":283,"tag":321,"props":14735,"children":14736},{"style":367},[14737],{"type":293,"value":941},{"type":283,"tag":321,"props":14739,"children":14740},{"class":323,"line":1016},[14741,14745,14749],{"type":283,"tag":321,"props":14742,"children":14743},{"style":328},[14744],{"type":293,"value":13068},{"type":283,"tag":321,"props":14746,"children":14747},{"style":334},[14748],{"type":293,"value":364},{"type":283,"tag":321,"props":14750,"children":14751},{"style":367},[14752],{"type":293,"value":14255},{"type":283,"tag":321,"props":14754,"children":14755},{"class":323,"line":1029},[14756,14760],{"type":283,"tag":321,"props":14757,"children":14758},{"style":328},[14759],{"type":293,"value":9801},{"type":283,"tag":321,"props":14761,"children":14762},{"style":334},[14763],{"type":293,"value":337},{"type":283,"tag":321,"props":14765,"children":14766},{"class":323,"line":1042},[14767,14771,14775],{"type":283,"tag":321,"props":14768,"children":14769},{"style":328},[14770],{"type":293,"value":13096},{"type":283,"tag":321,"props":14772,"children":14773},{"style":334},[14774],{"type":293,"value":364},{"type":283,"tag":321,"props":14776,"children":14777},{"style":8079},[14778],{"type":293,"value":13105},{"type":283,"tag":321,"props":14780,"children":14781},{"class":323,"line":1052},[14782],{"type":283,"tag":321,"props":14783,"children":14784},{"style":367},[14785],{"type":293,"value":13113},{"type":283,"tag":321,"props":14787,"children":14788},{"class":323,"line":1065},[14789],{"type":283,"tag":321,"props":14790,"children":14791},{"style":367},[14792],{"type":293,"value":14296},{"type":283,"tag":321,"props":14794,"children":14795},{"class":323,"line":1078},[14796],{"type":283,"tag":321,"props":14797,"children":14798},{"emptyLinePlaceholder":1046},[14799],{"type":293,"value":1049},{"type":283,"tag":321,"props":14801,"children":14802},{"class":323,"line":1087},[14803],{"type":283,"tag":321,"props":14804,"children":14805},{"style":367},[14806],{"type":293,"value":14313},{"type":283,"tag":321,"props":14808,"children":14809},{"class":323,"line":1100},[14810],{"type":283,"tag":321,"props":14811,"children":14812},{"emptyLinePlaceholder":1046},[14813],{"type":293,"value":1049},{"type":283,"tag":321,"props":14815,"children":14816},{"class":323,"line":1113},[14817],{"type":283,"tag":321,"props":14818,"children":14819},{"style":367},[14820],{"type":293,"value":14329},{"type":283,"tag":321,"props":14822,"children":14823},{"class":323,"line":1126},[14824],{"type":283,"tag":321,"props":14825,"children":14826},{"style":367},[14827],{"type":293,"value":14338},{"type":283,"tag":321,"props":14829,"children":14830},{"class":323,"line":1134},[14831],{"type":283,"tag":321,"props":14832,"children":14833},{"style":367},[14834],{"type":293,"value":14347},{"type":283,"tag":321,"props":14836,"children":14837},{"class":323,"line":1147},[14838],{"type":283,"tag":321,"props":14839,"children":14840},{"style":367},[14841],{"type":293,"value":14356},{"type":283,"tag":321,"props":14843,"children":14844},{"class":323,"line":1160},[14845],{"type":283,"tag":321,"props":14846,"children":14847},{"style":367},[14848],{"type":293,"value":14365},{"type":283,"tag":321,"props":14850,"children":14851},{"class":323,"line":1173},[14852],{"type":283,"tag":321,"props":14853,"children":14854},{"style":367},[14855],{"type":293,"value":6678},{"type":283,"tag":321,"props":14857,"children":14858},{"class":323,"line":1186},[14859],{"type":283,"tag":321,"props":14860,"children":14861},{"emptyLinePlaceholder":1046},[14862],{"type":293,"value":1049},{"type":283,"tag":321,"props":14864,"children":14865},{"class":323,"line":1199},[14866],{"type":283,"tag":321,"props":14867,"children":14868},{"style":367},[14869],{"type":293,"value":14389},{"type":283,"tag":321,"props":14871,"children":14872},{"class":323,"line":2160},[14873],{"type":283,"tag":321,"props":14874,"children":14875},{"emptyLinePlaceholder":1046},[14876],{"type":293,"value":1049},{"type":283,"tag":321,"props":14878,"children":14880},{"class":14879,"line":2161},[323,387],[14881],{"type":283,"tag":321,"props":14882,"children":14883},{"style":367},[14884],{"type":293,"value":14885},"        registry_external_url '\u003Chttps://registry.gitlab.example.com>'\n",{"type":283,"tag":321,"props":14887,"children":14889},{"class":14888,"line":2162},[323,387],[14890],{"type":283,"tag":321,"props":14891,"children":14892},{"style":367},[14893],{"type":293,"value":14894},"        registry_nginx['enable'] = false\n",{"type":283,"tag":321,"props":14896,"children":14897},{"class":323,"line":2163},[14898,14902],{"type":283,"tag":321,"props":14899,"children":14900},{"style":328},[14901],{"type":293,"value":13129},{"type":283,"tag":321,"props":14903,"children":14904},{"style":334},[14905],{"type":293,"value":337},{"type":283,"tag":321,"props":14907,"children":14908},{"class":323,"line":2164},[14909,14913],{"type":283,"tag":321,"props":14910,"children":14911},{"style":334},[14912],{"type":293,"value":393},{"type":283,"tag":321,"props":14914,"children":14915},{"style":367},[14916],{"type":293,"value":14413},{"type":283,"tag":321,"props":14918,"children":14919},{"class":323,"line":2165},[14920,14924],{"type":283,"tag":321,"props":14921,"children":14922},{"style":328},[14923],{"type":293,"value":1179},{"type":283,"tag":321,"props":14925,"children":14926},{"style":334},[14927],{"type":293,"value":337},{"type":283,"tag":321,"props":14929,"children":14930},{"class":323,"line":2166},[14931,14935],{"type":283,"tag":321,"props":14932,"children":14933},{"style":334},[14934],{"type":293,"value":393},{"type":283,"tag":321,"props":14936,"children":14937},{"style":367},[14938],{"type":293,"value":13192},{"type":283,"tag":321,"props":14940,"children":14941},{"class":323,"line":2167},[14942,14946],{"type":283,"tag":321,"props":14943,"children":14944},{"style":334},[14945],{"type":293,"value":393},{"type":283,"tag":321,"props":14947,"children":14948},{"style":367},[14949],{"type":293,"value":13204},{"type":283,"tag":321,"props":14951,"children":14952},{"class":323,"line":2691},[14953,14957],{"type":283,"tag":321,"props":14954,"children":14955},{"style":334},[14956],{"type":293,"value":393},{"type":283,"tag":321,"props":14958,"children":14959},{"style":367},[14960],{"type":293,"value":13216},{"type":283,"tag":321,"props":14962,"children":14963},{"class":323,"line":2168},[14964,14968,14972],{"type":283,"tag":321,"props":14965,"children":14966},{"style":328},[14967],{"type":293,"value":13224},{"type":283,"tag":321,"props":14969,"children":14970},{"style":334},[14971],{"type":293,"value":364},{"type":283,"tag":321,"props":14973,"children":14974},{"style":367},[14975],{"type":293,"value":13233},{"type":283,"tag":284,"props":14977,"children":14978},{},[14979],{"type":293,"value":13992},{"type":283,"tag":457,"props":14981,"children":14982},{},[14983,14988,14993],{"type":283,"tag":461,"props":14984,"children":14985},{},[14986],{"type":293,"value":14987},"die externe URL der Registry setzen",{"type":283,"tag":461,"props":14989,"children":14990},{},[14991],{"type":293,"value":14992},"Nginx für die Registry deaktivieren",{"type":283,"tag":461,"props":14994,"children":14995},{},[14996,14997,15003],{"type":293,"value":14504},{"type":283,"tag":317,"props":14998,"children":15000},{"className":14999},[],[15001],{"type":293,"value":15002},"registry.gitlab.example.com",{"type":293,"value":15004}," an Port 5000 des Containers weiterzuleiten",{"type":283,"tag":1321,"props":15006,"children":15007},{},[],{"type":283,"tag":837,"props":15009,"children":15010},{},[],{"type":283,"tag":12814,"props":15012,"children":15014},{"id":15013},"container-registry-unter-einer-bestehenden-gitlab-domain-konfigurieren",[15015],{"type":283,"tag":288,"props":15016,"children":15018},{"href":15017},"https://docs.gitlab.com/administration/packages/container_registry/#configure-container-registry-under-an-existing-gitlab-domain",[15019],{"type":293,"value":15020},"Container-Registry unter einer bestehenden GitLab-Domain konfigurieren",{"type":283,"tag":14576,"props":15022,"children":15024},{"id":15023},"aktualisierung-der-traefik-konfiguration",[15025],{"type":293,"value":15026},"Aktualisierung der Traefik-Konfiguration",{"type":283,"tag":303,"props":15028,"children":15031},{"className":314,"code":15029,"filename":13663,"highlights":15030,"language":313,"meta":8,"style":8},"volumes:\n  letsencrypt:\n\nservices:\n  traefik:\n    image: traefik:3\n    container_name: traefik\n    restart: always\n    network_mode: host\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - letsencrypt:/letsencrypt\n    command:\n      - --log.level=INFO\n\n      - --entrypoints.web.address=:80\n      - --entrypoints.web.http.redirections.entrypoint.to=websecure\n      - --entrypoints.web.http.redirections.entrypoint.scheme=https\n\n      - --entrypoints.websecure.address=:443\n      - --entrypoints.websecure.http.tls.certresolver=letsencrypt\n        \n      - --entrypoints.container-registry.address=:5050\n      - --entrypoints.container-registry.http.tls.certresolver=letsencrypt\n\n      - --providers.docker=true\n      - --providers.docker.exposedByDefault=false\n\n      - --certificatesresolvers.letsencrypt.acme.email=\u003Cinfo@example.com>\n      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true\n      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n",[1134,1147],[15032],{"type":283,"tag":317,"props":15033,"children":15034},{"__ignoreMap":8},[15035,15046,15057,15064,15075,15086,15101,15116,15131,15146,15157,15168,15179,15190,15201,15208,15219,15230,15241,15248,15259,15270,15277,15290,15303,15310,15321,15332,15339,15350,15361,15372],{"type":283,"tag":321,"props":15036,"children":15037},{"class":323,"line":324},[15038,15042],{"type":283,"tag":321,"props":15039,"children":15040},{"style":328},[15041],{"type":293,"value":860},{"type":283,"tag":321,"props":15043,"children":15044},{"style":334},[15045],{"type":293,"value":337},{"type":283,"tag":321,"props":15047,"children":15048},{"class":323,"line":340},[15049,15053],{"type":283,"tag":321,"props":15050,"children":15051},{"style":328},[15052],{"type":293,"value":872},{"type":283,"tag":321,"props":15054,"children":15055},{"style":334},[15056],{"type":293,"value":337},{"type":283,"tag":321,"props":15058,"children":15059},{"class":323,"line":353},[15060],{"type":283,"tag":321,"props":15061,"children":15062},{"emptyLinePlaceholder":1046},[15063],{"type":293,"value":1049},{"type":283,"tag":321,"props":15065,"children":15066},{"class":323,"line":373},[15067,15071],{"type":283,"tag":321,"props":15068,"children":15069},{"style":328},[15070],{"type":293,"value":331},{"type":283,"tag":321,"props":15072,"children":15073},{"style":334},[15074],{"type":293,"value":337},{"type":283,"tag":321,"props":15076,"children":15077},{"class":323,"line":308},[15078,15082],{"type":283,"tag":321,"props":15079,"children":15080},{"style":328},[15081],{"type":293,"value":903},{"type":283,"tag":321,"props":15083,"children":15084},{"style":334},[15085],{"type":293,"value":337},{"type":283,"tag":321,"props":15087,"children":15088},{"class":323,"line":309},[15089,15093,15097],{"type":283,"tag":321,"props":15090,"children":15091},{"style":328},[15092],{"type":293,"value":359},{"type":283,"tag":321,"props":15094,"children":15095},{"style":334},[15096],{"type":293,"value":364},{"type":283,"tag":321,"props":15098,"children":15099},{"style":367},[15100],{"type":293,"value":957},{"type":283,"tag":321,"props":15102,"children":15103},{"class":323,"line":310},[15104,15108,15112],{"type":283,"tag":321,"props":15105,"children":15106},{"style":328},[15107],{"type":293,"value":915},{"type":283,"tag":321,"props":15109,"children":15110},{"style":334},[15111],{"type":293,"value":364},{"type":283,"tag":321,"props":15113,"children":15114},{"style":367},[15115],{"type":293,"value":924},{"type":283,"tag":321,"props":15117,"children":15118},{"class":323,"line":311},[15119,15123,15127],{"type":283,"tag":321,"props":15120,"children":15121},{"style":328},[15122],{"type":293,"value":932},{"type":283,"tag":321,"props":15124,"children":15125},{"style":334},[15126],{"type":293,"value":364},{"type":283,"tag":321,"props":15128,"children":15129},{"style":367},[15130],{"type":293,"value":941},{"type":283,"tag":321,"props":15132,"children":15133},{"class":323,"line":312},[15134,15138,15142],{"type":283,"tag":321,"props":15135,"children":15136},{"style":328},[15137],{"type":293,"value":965},{"type":283,"tag":321,"props":15139,"children":15140},{"style":334},[15141],{"type":293,"value":364},{"type":283,"tag":321,"props":15143,"children":15144},{"style":367},[15145],{"type":293,"value":974},{"type":283,"tag":321,"props":15147,"children":15148},{"class":323,"line":977},[15149,15153],{"type":283,"tag":321,"props":15150,"children":15151},{"style":328},[15152],{"type":293,"value":1179},{"type":283,"tag":321,"props":15154,"children":15155},{"style":334},[15156],{"type":293,"value":337},{"type":283,"tag":321,"props":15158,"children":15159},{"class":323,"line":990},[15160,15164],{"type":283,"tag":321,"props":15161,"children":15162},{"style":334},[15163],{"type":293,"value":393},{"type":283,"tag":321,"props":15165,"children":15166},{"style":367},[15167],{"type":293,"value":1196},{"type":283,"tag":321,"props":15169,"children":15170},{"class":323,"line":1003},[15171,15175],{"type":283,"tag":321,"props":15172,"children":15173},{"style":334},[15174],{"type":293,"value":393},{"type":283,"tag":321,"props":15176,"children":15177},{"style":367},[15178],{"type":293,"value":13812},{"type":283,"tag":321,"props":15180,"children":15181},{"class":323,"line":1016},[15182,15186],{"type":283,"tag":321,"props":15183,"children":15184},{"style":328},[15185],{"type":293,"value":983},{"type":283,"tag":321,"props":15187,"children":15188},{"style":334},[15189],{"type":293,"value":337},{"type":283,"tag":321,"props":15191,"children":15192},{"class":323,"line":1029},[15193,15197],{"type":283,"tag":321,"props":15194,"children":15195},{"style":334},[15196],{"type":293,"value":393},{"type":283,"tag":321,"props":15198,"children":15199},{"style":367},[15200],{"type":293,"value":13835},{"type":283,"tag":321,"props":15202,"children":15203},{"class":323,"line":1042},[15204],{"type":283,"tag":321,"props":15205,"children":15206},{"emptyLinePlaceholder":1046},[15207],{"type":293,"value":1049},{"type":283,"tag":321,"props":15209,"children":15210},{"class":323,"line":1052},[15211,15215],{"type":283,"tag":321,"props":15212,"children":15213},{"style":334},[15214],{"type":293,"value":393},{"type":283,"tag":321,"props":15216,"children":15217},{"style":367},[15218],{"type":293,"value":1062},{"type":283,"tag":321,"props":15220,"children":15221},{"class":323,"line":1065},[15222,15226],{"type":283,"tag":321,"props":15223,"children":15224},{"style":334},[15225],{"type":293,"value":393},{"type":283,"tag":321,"props":15227,"children":15228},{"style":367},[15229],{"type":293,"value":1097},{"type":283,"tag":321,"props":15231,"children":15232},{"class":323,"line":1078},[15233,15237],{"type":283,"tag":321,"props":15234,"children":15235},{"style":334},[15236],{"type":293,"value":393},{"type":283,"tag":321,"props":15238,"children":15239},{"style":367},[15240],{"type":293,"value":1110},{"type":283,"tag":321,"props":15242,"children":15243},{"class":323,"line":1087},[15244],{"type":283,"tag":321,"props":15245,"children":15246},{"emptyLinePlaceholder":1046},[15247],{"type":293,"value":1049},{"type":283,"tag":321,"props":15249,"children":15250},{"class":323,"line":1100},[15251,15255],{"type":283,"tag":321,"props":15252,"children":15253},{"style":334},[15254],{"type":293,"value":393},{"type":283,"tag":321,"props":15256,"children":15257},{"style":367},[15258],{"type":293,"value":1075},{"type":283,"tag":321,"props":15260,"children":15261},{"class":323,"line":1113},[15262,15266],{"type":283,"tag":321,"props":15263,"children":15264},{"style":334},[15265],{"type":293,"value":393},{"type":283,"tag":321,"props":15267,"children":15268},{"style":367},[15269],{"type":293,"value":1123},{"type":283,"tag":321,"props":15271,"children":15272},{"class":323,"line":1126},[15273],{"type":283,"tag":321,"props":15274,"children":15275},{"style":334},[15276],{"type":293,"value":14304},{"type":283,"tag":321,"props":15278,"children":15280},{"class":15279,"line":1134},[323,387],[15281,15285],{"type":283,"tag":321,"props":15282,"children":15283},{"style":334},[15284],{"type":293,"value":393},{"type":283,"tag":321,"props":15286,"children":15287},{"style":367},[15288],{"type":293,"value":15289},"--entrypoints.container-registry.address=:5050\n",{"type":283,"tag":321,"props":15291,"children":15293},{"class":15292,"line":1147},[323,387],[15294,15298],{"type":283,"tag":321,"props":15295,"children":15296},{"style":334},[15297],{"type":293,"value":393},{"type":283,"tag":321,"props":15299,"children":15300},{"style":367},[15301],{"type":293,"value":15302},"--entrypoints.container-registry.http.tls.certresolver=letsencrypt\n",{"type":283,"tag":321,"props":15304,"children":15305},{"class":323,"line":1160},[15306],{"type":283,"tag":321,"props":15307,"children":15308},{"emptyLinePlaceholder":1046},[15309],{"type":293,"value":1049},{"type":283,"tag":321,"props":15311,"children":15312},{"class":323,"line":1173},[15313,15317],{"type":283,"tag":321,"props":15314,"children":15315},{"style":334},[15316],{"type":293,"value":393},{"type":283,"tag":321,"props":15318,"children":15319},{"style":367},[15320],{"type":293,"value":13923},{"type":283,"tag":321,"props":15322,"children":15323},{"class":323,"line":1186},[15324,15328],{"type":283,"tag":321,"props":15325,"children":15326},{"style":334},[15327],{"type":293,"value":393},{"type":283,"tag":321,"props":15329,"children":15330},{"style":367},[15331],{"type":293,"value":13935},{"type":283,"tag":321,"props":15333,"children":15334},{"class":323,"line":1199},[15335],{"type":283,"tag":321,"props":15336,"children":15337},{"emptyLinePlaceholder":1046},[15338],{"type":293,"value":1049},{"type":283,"tag":321,"props":15340,"children":15341},{"class":323,"line":2160},[15342,15346],{"type":283,"tag":321,"props":15343,"children":15344},{"style":334},[15345],{"type":293,"value":393},{"type":283,"tag":321,"props":15347,"children":15348},{"style":367},[15349],{"type":293,"value":13954},{"type":283,"tag":321,"props":15351,"children":15352},{"class":323,"line":2161},[15353,15357],{"type":283,"tag":321,"props":15354,"children":15355},{"style":334},[15356],{"type":293,"value":393},{"type":283,"tag":321,"props":15358,"children":15359},{"style":367},[15360],{"type":293,"value":1026},{"type":283,"tag":321,"props":15362,"children":15363},{"class":323,"line":2162},[15364,15368],{"type":283,"tag":321,"props":15365,"children":15366},{"style":334},[15367],{"type":293,"value":393},{"type":283,"tag":321,"props":15369,"children":15370},{"style":367},[15371],{"type":293,"value":1000},{"type":283,"tag":321,"props":15373,"children":15374},{"class":323,"line":2163},[15375,15379],{"type":283,"tag":321,"props":15376,"children":15377},{"style":334},[15378],{"type":293,"value":393},{"type":283,"tag":321,"props":15380,"children":15381},{"style":367},[15382],{"type":293,"value":1039},{"type":283,"tag":284,"props":15384,"children":15385},{},[15386],{"type":293,"value":13992},{"type":283,"tag":457,"props":15388,"children":15389},{},[15390,15395],{"type":283,"tag":461,"props":15391,"children":15392},{},[15393],{"type":293,"value":15394},"einen neuen Einstiegspunkt für die Container-Registry hinzufügen",{"type":283,"tag":461,"props":15396,"children":15397},{},[15398],{"type":293,"value":15399},"die TLS-Konfiguration auf alle Routen in diesem Einstiegspunkt anwenden",{"type":283,"tag":1321,"props":15401,"children":15402},{},[],{"type":283,"tag":14576,"props":15404,"children":15406},{"id":15405},"aktualisierung-der-gitlab-konfiguration-1",[15407],{"type":293,"value":14581},{"type":283,"tag":303,"props":15409,"children":15412},{"className":314,"code":15410,"filename":12986,"highlights":15411,"language":313,"meta":8,"style":8},"services:\n  gitlab:\n    image: gitlab/gitlab-ce:\u003Cversion>-ce.0\n    container_name: gitlab\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.gitlab.rule=Host(`\u003Cgitlab.example.com>`)\"\n      - \"traefik.http.routers.gitlab.entrypoints=web,websecure\"\n      - \"traefik.http.routers.gitlab.service=gitlab\"\n      - \"traefik.http.services.gitlab.loadbalancer.server.port=80\"\n      - \"traefik.http.routers.container-registry.rule=Host(`gitlab.example.com`)\"\n      - \"traefik.http.routers.container-registry.entrypoints=container-registry\"\n      - \"traefik.http.routers.container-registry.service=container-registry\"\n      - \"traefik.http.services.container-registry.loadbalancer.server.port=5000\"\n    restart: always\n    hostname: 'gitlab.example.com'\n    environment:\n      GITLAB_OMNIBUS_CONFIG: |\n        # Add any other gitlab.rb configuration here, each on its own line\n        external_url '\u003Chttps://gitlab.example.com>'\n\n        letsencrypt['enable'] = false\n\n        nginx['listen_port'] = 80\n        nginx['listen_https'] = false\n        nginx['proxy_set_headers'] = {\n          \"X-Forwarded-Proto\" => \"https\",\n          \"X-Forwarded-Ssl\" => \"on\"\n        }\n\n        gitlab_rails['gitlab_shell_ssh_port'] = 2424\n\n        registry_external_url '\u003Chttps://gitlab.example.com:5050>'\n        registry_nginx['enable'] = false\n    ports:\n      - '2424:22'\n    volumes:\n      - '$GITLAB_HOME/config:/etc/gitlab'\n      - '$GITLAB_HOME/logs:/var/log/gitlab'\n      - '$GITLAB_HOME/data:/var/opt/gitlab'\n    shm_size: '256m'\n",[311,990,1003,1016,1029,2164],[15413],{"type":283,"tag":317,"props":15414,"children":15415},{"__ignoreMap":8},[15416,15427,15438,15453,15468,15479,15490,15501,15514,15525,15536,15549,15562,15575,15587,15602,15617,15628,15643,15650,15657,15664,15671,15678,15685,15692,15699,15706,15713,15720,15727,15734,15741,15750,15757,15768,15779,15790,15801,15812,15823],{"type":283,"tag":321,"props":15417,"children":15418},{"class":323,"line":324},[15419,15423],{"type":283,"tag":321,"props":15420,"children":15421},{"style":328},[15422],{"type":293,"value":331},{"type":283,"tag":321,"props":15424,"children":15425},{"style":334},[15426],{"type":293,"value":337},{"type":283,"tag":321,"props":15428,"children":15429},{"class":323,"line":340},[15430,15434],{"type":283,"tag":321,"props":15431,"children":15432},{"style":328},[15433],{"type":293,"value":13009},{"type":283,"tag":321,"props":15435,"children":15436},{"style":334},[15437],{"type":293,"value":337},{"type":283,"tag":321,"props":15439,"children":15440},{"class":323,"line":353},[15441,15445,15449],{"type":283,"tag":321,"props":15442,"children":15443},{"style":328},[15444],{"type":293,"value":359},{"type":283,"tag":321,"props":15446,"children":15447},{"style":334},[15448],{"type":293,"value":364},{"type":283,"tag":321,"props":15450,"children":15451},{"style":367},[15452],{"type":293,"value":14146},{"type":283,"tag":321,"props":15454,"children":15455},{"class":323,"line":373},[15456,15460,15464],{"type":283,"tag":321,"props":15457,"children":15458},{"style":328},[15459],{"type":293,"value":915},{"type":283,"tag":321,"props":15461,"children":15462},{"style":334},[15463],{"type":293,"value":364},{"type":283,"tag":321,"props":15465,"children":15466},{"style":367},[15467],{"type":293,"value":13045},{"type":283,"tag":321,"props":15469,"children":15470},{"class":323,"line":308},[15471,15475],{"type":283,"tag":321,"props":15472,"children":15473},{"style":328},[15474],{"type":293,"value":379},{"type":283,"tag":321,"props":15476,"children":15477},{"style":334},[15478],{"type":293,"value":337},{"type":283,"tag":321,"props":15480,"children":15481},{"class":323,"line":309},[15482,15486],{"type":283,"tag":321,"props":15483,"children":15484},{"style":334},[15485],{"type":293,"value":393},{"type":283,"tag":321,"props":15487,"children":15488},{"style":367},[15489],{"type":293,"value":398},{"type":283,"tag":321,"props":15491,"children":15492},{"class":323,"line":310},[15493,15497],{"type":283,"tag":321,"props":15494,"children":15495},{"style":334},[15496],{"type":293,"value":393},{"type":283,"tag":321,"props":15498,"children":15499},{"style":367},[15500],{"type":293,"value":14198},{"type":283,"tag":321,"props":15502,"children":15504},{"class":15503,"line":311},[323,387],[15505,15509],{"type":283,"tag":321,"props":15506,"children":15507},{"style":334},[15508],{"type":293,"value":393},{"type":283,"tag":321,"props":15510,"children":15511},{"style":367},[15512],{"type":293,"value":15513},"\"traefik.http.routers.gitlab.entrypoints=web,websecure\"\n",{"type":283,"tag":321,"props":15515,"children":15516},{"class":323,"line":312},[15517,15521],{"type":283,"tag":321,"props":15518,"children":15519},{"style":334},[15520],{"type":293,"value":393},{"type":283,"tag":321,"props":15522,"children":15523},{"style":367},[15524],{"type":293,"value":14211},{"type":283,"tag":321,"props":15526,"children":15527},{"class":323,"line":977},[15528,15532],{"type":283,"tag":321,"props":15529,"children":15530},{"style":334},[15531],{"type":293,"value":393},{"type":283,"tag":321,"props":15533,"children":15534},{"style":367},[15535],{"type":293,"value":14224},{"type":283,"tag":321,"props":15537,"children":15539},{"class":15538,"line":990},[323,387],[15540,15544],{"type":283,"tag":321,"props":15541,"children":15542},{"style":334},[15543],{"type":293,"value":393},{"type":283,"tag":321,"props":15545,"children":15546},{"style":367},[15547],{"type":293,"value":15548},"\"traefik.http.routers.container-registry.rule=Host(`gitlab.example.com`)\"\n",{"type":283,"tag":321,"props":15550,"children":15552},{"class":15551,"line":1003},[323,387],[15553,15557],{"type":283,"tag":321,"props":15554,"children":15555},{"style":334},[15556],{"type":293,"value":393},{"type":283,"tag":321,"props":15558,"children":15559},{"style":367},[15560],{"type":293,"value":15561},"\"traefik.http.routers.container-registry.entrypoints=container-registry\"\n",{"type":283,"tag":321,"props":15563,"children":15565},{"class":15564,"line":1016},[323,387],[15566,15570],{"type":283,"tag":321,"props":15567,"children":15568},{"style":334},[15569],{"type":293,"value":393},{"type":283,"tag":321,"props":15571,"children":15572},{"style":367},[15573],{"type":293,"value":15574},"\"traefik.http.routers.container-registry.service=container-registry\"\n",{"type":283,"tag":321,"props":15576,"children":15578},{"class":15577,"line":1029},[323,387],[15579,15583],{"type":283,"tag":321,"props":15580,"children":15581},{"style":334},[15582],{"type":293,"value":393},{"type":283,"tag":321,"props":15584,"children":15585},{"style":367},[15586],{"type":293,"value":14722},{"type":283,"tag":321,"props":15588,"children":15589},{"class":323,"line":1042},[15590,15594,15598],{"type":283,"tag":321,"props":15591,"children":15592},{"style":328},[15593],{"type":293,"value":932},{"type":283,"tag":321,"props":15595,"children":15596},{"style":334},[15597],{"type":293,"value":364},{"type":283,"tag":321,"props":15599,"children":15600},{"style":367},[15601],{"type":293,"value":941},{"type":283,"tag":321,"props":15603,"children":15604},{"class":323,"line":1052},[15605,15609,15613],{"type":283,"tag":321,"props":15606,"children":15607},{"style":328},[15608],{"type":293,"value":13068},{"type":283,"tag":321,"props":15610,"children":15611},{"style":334},[15612],{"type":293,"value":364},{"type":283,"tag":321,"props":15614,"children":15615},{"style":367},[15616],{"type":293,"value":14255},{"type":283,"tag":321,"props":15618,"children":15619},{"class":323,"line":1065},[15620,15624],{"type":283,"tag":321,"props":15621,"children":15622},{"style":328},[15623],{"type":293,"value":9801},{"type":283,"tag":321,"props":15625,"children":15626},{"style":334},[15627],{"type":293,"value":337},{"type":283,"tag":321,"props":15629,"children":15630},{"class":323,"line":1078},[15631,15635,15639],{"type":283,"tag":321,"props":15632,"children":15633},{"style":328},[15634],{"type":293,"value":13096},{"type":283,"tag":321,"props":15636,"children":15637},{"style":334},[15638],{"type":293,"value":364},{"type":283,"tag":321,"props":15640,"children":15641},{"style":8079},[15642],{"type":293,"value":13105},{"type":283,"tag":321,"props":15644,"children":15645},{"class":323,"line":1087},[15646],{"type":283,"tag":321,"props":15647,"children":15648},{"style":367},[15649],{"type":293,"value":13113},{"type":283,"tag":321,"props":15651,"children":15652},{"class":323,"line":1100},[15653],{"type":283,"tag":321,"props":15654,"children":15655},{"style":367},[15656],{"type":293,"value":14296},{"type":283,"tag":321,"props":15658,"children":15659},{"class":323,"line":1113},[15660],{"type":283,"tag":321,"props":15661,"children":15662},{"emptyLinePlaceholder":1046},[15663],{"type":293,"value":1049},{"type":283,"tag":321,"props":15665,"children":15666},{"class":323,"line":1126},[15667],{"type":283,"tag":321,"props":15668,"children":15669},{"style":367},[15670],{"type":293,"value":14313},{"type":283,"tag":321,"props":15672,"children":15673},{"class":323,"line":1134},[15674],{"type":283,"tag":321,"props":15675,"children":15676},{"emptyLinePlaceholder":1046},[15677],{"type":293,"value":1049},{"type":283,"tag":321,"props":15679,"children":15680},{"class":323,"line":1147},[15681],{"type":283,"tag":321,"props":15682,"children":15683},{"style":367},[15684],{"type":293,"value":14329},{"type":283,"tag":321,"props":15686,"children":15687},{"class":323,"line":1160},[15688],{"type":283,"tag":321,"props":15689,"children":15690},{"style":367},[15691],{"type":293,"value":14338},{"type":283,"tag":321,"props":15693,"children":15694},{"class":323,"line":1173},[15695],{"type":283,"tag":321,"props":15696,"children":15697},{"style":367},[15698],{"type":293,"value":14347},{"type":283,"tag":321,"props":15700,"children":15701},{"class":323,"line":1186},[15702],{"type":283,"tag":321,"props":15703,"children":15704},{"style":367},[15705],{"type":293,"value":14356},{"type":283,"tag":321,"props":15707,"children":15708},{"class":323,"line":1199},[15709],{"type":283,"tag":321,"props":15710,"children":15711},{"style":367},[15712],{"type":293,"value":14365},{"type":283,"tag":321,"props":15714,"children":15715},{"class":323,"line":2160},[15716],{"type":283,"tag":321,"props":15717,"children":15718},{"style":367},[15719],{"type":293,"value":6678},{"type":283,"tag":321,"props":15721,"children":15722},{"class":323,"line":2161},[15723],{"type":283,"tag":321,"props":15724,"children":15725},{"emptyLinePlaceholder":1046},[15726],{"type":293,"value":1049},{"type":283,"tag":321,"props":15728,"children":15729},{"class":323,"line":2162},[15730],{"type":283,"tag":321,"props":15731,"children":15732},{"style":367},[15733],{"type":293,"value":14389},{"type":283,"tag":321,"props":15735,"children":15736},{"class":323,"line":2163},[15737],{"type":283,"tag":321,"props":15738,"children":15739},{"emptyLinePlaceholder":1046},[15740],{"type":293,"value":1049},{"type":283,"tag":321,"props":15742,"children":15744},{"class":15743,"line":2164},[323,387],[15745],{"type":283,"tag":321,"props":15746,"children":15747},{"style":367},[15748],{"type":293,"value":15749},"        registry_external_url '\u003Chttps://gitlab.example.com:5050>'\n",{"type":283,"tag":321,"props":15751,"children":15752},{"class":323,"line":2165},[15753],{"type":283,"tag":321,"props":15754,"children":15755},{"style":367},[15756],{"type":293,"value":14894},{"type":283,"tag":321,"props":15758,"children":15759},{"class":323,"line":2166},[15760,15764],{"type":283,"tag":321,"props":15761,"children":15762},{"style":328},[15763],{"type":293,"value":13129},{"type":283,"tag":321,"props":15765,"children":15766},{"style":334},[15767],{"type":293,"value":337},{"type":283,"tag":321,"props":15769,"children":15770},{"class":323,"line":2167},[15771,15775],{"type":283,"tag":321,"props":15772,"children":15773},{"style":334},[15774],{"type":293,"value":393},{"type":283,"tag":321,"props":15776,"children":15777},{"style":367},[15778],{"type":293,"value":14413},{"type":283,"tag":321,"props":15780,"children":15781},{"class":323,"line":2691},[15782,15786],{"type":283,"tag":321,"props":15783,"children":15784},{"style":328},[15785],{"type":293,"value":1179},{"type":283,"tag":321,"props":15787,"children":15788},{"style":334},[15789],{"type":293,"value":337},{"type":283,"tag":321,"props":15791,"children":15792},{"class":323,"line":2168},[15793,15797],{"type":283,"tag":321,"props":15794,"children":15795},{"style":334},[15796],{"type":293,"value":393},{"type":283,"tag":321,"props":15798,"children":15799},{"style":367},[15800],{"type":293,"value":13192},{"type":283,"tag":321,"props":15802,"children":15803},{"class":323,"line":2717},[15804,15808],{"type":283,"tag":321,"props":15805,"children":15806},{"style":334},[15807],{"type":293,"value":393},{"type":283,"tag":321,"props":15809,"children":15810},{"style":367},[15811],{"type":293,"value":13204},{"type":283,"tag":321,"props":15813,"children":15814},{"class":323,"line":2725},[15815,15819],{"type":283,"tag":321,"props":15816,"children":15817},{"style":334},[15818],{"type":293,"value":393},{"type":283,"tag":321,"props":15820,"children":15821},{"style":367},[15822],{"type":293,"value":13216},{"type":283,"tag":321,"props":15824,"children":15825},{"class":323,"line":2738},[15826,15830,15834],{"type":283,"tag":321,"props":15827,"children":15828},{"style":328},[15829],{"type":293,"value":13224},{"type":283,"tag":321,"props":15831,"children":15832},{"style":334},[15833],{"type":293,"value":364},{"type":283,"tag":321,"props":15835,"children":15836},{"style":367},[15837],{"type":293,"value":13233},{"type":283,"tag":284,"props":15839,"children":15840},{},[15841],{"type":293,"value":13992},{"type":283,"tag":457,"props":15843,"children":15844},{},[15845,15849,15853],{"type":283,"tag":461,"props":15846,"children":15847},{},[15848],{"type":293,"value":14987},{"type":283,"tag":461,"props":15850,"children":15851},{},[15852],{"type":293,"value":14992},{"type":283,"tag":461,"props":15854,"children":15855},{},[15856],{"type":293,"value":15857},"Traefik anweisen, den gesamten Verkehr von Port 5050 an Port 5000 des Containers weiterzuleiten",{"type":283,"tag":1489,"props":15859,"children":15860},{},[15861],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":15863},[15864,15865],{"id":12969,"depth":340,"text":12972},{"id":13241,"depth":340,"text":13244,"children":15866},[15867,15868,15869],{"id":13361,"depth":353,"text":13364},{"id":13611,"depth":353,"text":13614},{"id":14532,"depth":353,"text":14535},{"_path":111,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":112,"description":113,"author":87,"image":88,"releaseDate":114,"blogCategories":15871,"articleTags":15872,"tags":15873,"body":15874,"_type":20,"_id":118,"_source":22,"_file":119,"_stem":120,"_extension":25},[77],[92],[94],{"type":280,"children":15875,"toc":17151},[15876,15881,15898,15902,15923,15934,15940,15965,16049,16052,16078,16159,16171,16177,16209,16232,16238,16260,16352,16355,16393,16399,16411,16434,16460,16466,16492,16503,16534,16540,16545,16556,16566,16576,16582,16608,16674,16747,16764,16788,16831,16837,16849,17076,17082,17114,17142],{"type":283,"tag":1607,"props":15877,"children":15880},{"alt":15878,"aspect-ratio":11386,"height":1610,"object-fit":1611,"src":15879},"Eine Frau mit einer Handprotese am rechten Arm sitzt an einem Laptop","/blog/digital-accessibility-with-prosthetic-hand.jpg",[],{"type":283,"tag":321,"props":15882,"children":15885},{"className":15883},[11485,15884],"text-caption",[15886],{"type":283,"tag":284,"props":15887,"children":15888},{},[15889],{"type":283,"tag":11491,"props":15890,"children":15891},{},[15892],{"type":283,"tag":288,"props":15893,"children":15895},{"href":15894},"https://www.pexels.com/photo/a-woman-using-a-laptop-5614124/",[15896],{"type":293,"value":15897},"Photo by Anna Shvets",{"type":283,"tag":532,"props":15899,"children":15900},{"id":11391},[15901],{"type":293,"value":11394},{"type":283,"tag":284,"props":15903,"children":15904},{},[15905,15907,15913,15915,15921],{"type":293,"value":15906},"Ab dem 28. Juni 2025 gilt in Deutschland das Barrierefreiheitsstärkungsgesetz (BFSG). Dieses Gesetz verpflichtet\nerstmals private Unternehmen, bestimmte digitale Produkte und Dienstleistungen barrierefrei anzubieten\n",{"type":283,"tag":288,"props":15908,"children":15910},{"href":15909},"https://www.bildungsserver.de/onlineressource.html?onlineressourcen_id=65777#:~:text=Am%2022,Bundesfachstelle%20Barrierefreiheit%20bietet%20auf%20dieser",[15911],{"type":293,"value":15912},"bildungsserver.de",{"type":293,"value":15914},"\n. Für viele Betreiber von Websites, Online-Shops und Apps bedeutet das, dass sie ihre digitalen Angebote bis zum\nStichtag auf Zugänglichkeit trimmen müssen\n",{"type":283,"tag":288,"props":15916,"children":15918},{"href":15917},"https://www.visionbites.de/blog/barrierefreie-websites-bfsg-bitv-20-oder-wcag#:~:text=Ab%20dem%2028,W3C%C2%A0in%20den%C2%A0Konformit%C3%A4tsstufen%20A%20und%20AA",[15919],{"type":293,"value":15920},"visionbites.de",{"type":293,"value":15922},".\nDoch wen betrifft das konkret, was heißt “barrierefrei” in diesem Zusammenhang – und wie kann man die Umsetzung\nstemmen, ohne dass die Kosten explodieren? In diesem Blog-Artikel wollen wir die neuen Anforderungen einmal beleuchten.",{"type":283,"tag":321,"props":15924,"children":15926},{"className":15925},[11485],[15927],{"type":283,"tag":284,"props":15928,"children":15929},{},[15930],{"type":283,"tag":11491,"props":15931,"children":15932},{},[15933],{"type":293,"value":11495},{"type":283,"tag":1252,"props":15935,"children":15937},{"id":15936},"wen-betrifft-das-gesetz-geltungsbereich-ab-juli-2025",[15938],{"type":293,"value":15939},"Wen betrifft das Gesetz? – Geltungsbereich ab Juli 2025",{"type":283,"tag":284,"props":15941,"children":15942},{},[15943,15945,15949,15951,15957,15959,15962],{"type":293,"value":15944},"Das BFSG setzt die EU-Richtlinie über Barrierefreiheitsanforderungen (European Accessibility Act, EAA) in deutsches\nRecht um. Es tritt am 28. Juni 2025 in Kraft\n",{"type":283,"tag":288,"props":15946,"children":15947},{"href":15909},[15948],{"type":293,"value":15912},{"type":293,"value":15950},".\nAb dann müssen die darin genannten Produkte und Dienstleistungen für Verbraucher*innen barrierefrei bereitgestellt\nwerden. Jedoch fällt nicht jeder Webauftritt automatisch darunter! Das Gesetz nennt abschließend die betroffenen\nBereiche (§1 Abs. 2 und 3\nBFSG)",{"type":283,"tag":288,"props":15952,"children":15954},{"href":15953},"https://www.bundesfachstelle-barrierefreiheit.de/SharedDocs/Downloads/DE/Externe-Veroeffentlichungen/bmas-leitlinien-bfsg.pdf?__blob=publicationFile#:~:text=des%20BFSG%20erf%C3%BCllen%20muss%2C%20findet,seine%20Produkte%20und%20Dienstleistungen%20freiwillig",[15955],{"type":293,"value":15956},"bundesfachstelle-barrierefreiheit.de",{"type":293,"value":15958},".\nFür folgende digitale Dienstleistungen gilt künftig Barrierefreiheitspflicht:\n",{"type":283,"tag":1321,"props":15960,"children":15961},{},[],{"type":283,"tag":1321,"props":15963,"children":15964},{},[],{"type":283,"tag":457,"props":15966,"children":15967},{},[15968,16000,16010,16020,16029,16039],{"type":283,"tag":461,"props":15969,"children":15970},{},[15971,15976,15978,15984,15986,15991,15993,15998],{"type":283,"tag":11399,"props":15972,"children":15973},{},[15974],{"type":293,"value":15975},"Elektronischer Geschäftsverkehr",{"type":293,"value":15977}," – also Online-Dienste, die den Abschluss von Verbraucherverträgen ermöglichen,\nz.B.\nOnline-Shops ",{"type":283,"tag":288,"props":15979,"children":15981},{"href":15980},"https://www.hwk-dresden.de/recht/aktuelle-themen/detail/barrierefreiheitsstaerkungsgesetz-barrierefreiheit-von-online-shops.html#:~:text=Betreiber%20eines%20Online,Erschwernis%20die%20Onlineangebote%20nutzen%20k%C3%B6nnen",[15982],{"type":293,"value":15983},"hwk-dresden.de",{"type":293,"value":15985},".\n(",{"type":283,"tag":11399,"props":15987,"children":15988},{},[15989],{"type":293,"value":15990},"B2B-Shops",{"type":293,"value":15992},", die sich nur an Geschäftskunden richten, fallen nicht unter die\nPflicht ",{"type":283,"tag":288,"props":15994,"children":15996},{"href":15995},"https://www.hwk-dresden.de/recht/aktuelle-themen/detail/barrierefreiheitsstaerkungsgesetz-barrierefreiheit-von-online-shops.html#:~:text=Ausnahmen%3A",[15997],{"type":293,"value":15983},{"type":293,"value":15999},".)",{"type":283,"tag":461,"props":16001,"children":16002},{},[16003,16008],{"type":283,"tag":11399,"props":16004,"children":16005},{},[16006],{"type":293,"value":16007},"Bankdienstleistungen für Verbraucher",{"type":293,"value":16009}," – insbesondere Online-Banking-Portale und Banking-Apps.",{"type":283,"tag":461,"props":16011,"children":16012},{},[16013,16018],{"type":283,"tag":11399,"props":16014,"children":16015},{},[16016],{"type":293,"value":16017},"Telekommunikationsdienste",{"type":293,"value":16019}," – z.B. Telefonie- und Messenger-Apps.",{"type":283,"tag":461,"props":16021,"children":16022},{},[16023,16028],{"type":283,"tag":11399,"props":16024,"children":16025},{},[16026],{"type":293,"value":16027},"E-Books und zugehörige Vertriebs-Plattformen",{"type":293,"value":1302},{"type":283,"tag":461,"props":16030,"children":16031},{},[16032,16037],{"type":283,"tag":11399,"props":16033,"children":16034},{},[16035],{"type":293,"value":16036},"Personenbeförderungsdienste",{"type":293,"value":16038}," – z.B. digitale Fahrkartenautomaten im öffentlichen Verkehr.",{"type":283,"tag":461,"props":16040,"children":16041},{},[16042,16047],{"type":283,"tag":11399,"props":16043,"children":16044},{},[16045],{"type":293,"value":16046},"Apps auf Mobilgeräten im Personenverkehr",{"type":293,"value":16048}," – etwa Apps von Bahn- oder Fluggesellschaften.",{"type":283,"tag":1321,"props":16050,"children":16051},{},[],{"type":283,"tag":284,"props":16053,"children":16054},{},[16055,16057,16062,16064,16069,16071,16076],{"type":293,"value":16056},"Auch diverse ",{"type":283,"tag":11399,"props":16058,"children":16059},{},[16060],{"type":293,"value":16061},"Produkte",{"type":293,"value":16063}," müssen ab 2025 barrierefrei sein, unter anderem Computer, Smartphones, Ticket- und\nGeldautomaten oder\nSmart-TVs ",{"type":283,"tag":288,"props":16065,"children":16067},{"href":16066},"https://www.bundesfachstelle-barrierefreiheit.de/DE/Fachwissen/Produkte-und-Dienstleistungen/Barrierefreiheitsstaerkungsgesetz/barrierefreiheitsstaerkungsgesetz_node.html",[16068],{"type":293,"value":15956},{"type":293,"value":16070},".\nFür die meisten unserer Kunden (KMU mit Web-Anwendungen) ist aber vor allem wichtig, dass ",{"type":283,"tag":11399,"props":16072,"children":16073},{},[16074],{"type":293,"value":16075},"Ihr consumer-facing\nOnline-Service muss ab Juli 2025 barrierefrei sein",{"type":293,"value":16077},", sofern er in eine der obigen Kategorien fällt.",{"type":283,"tag":284,"props":16079,"children":16080},{},[16081,16083,16088,16090,16095,16097,16102,16104,16109,16114,16116,16121,16122,16127,16129,16134,16136,16140,16142,16147,16149,16153,16158],{"type":293,"value":16082},"Es gibt aber eine ",{"type":283,"tag":11491,"props":16084,"children":16085},{},[16086],{"type":293,"value":16087},"Ausnahme",{"type":293,"value":16089}," für ",{"type":283,"tag":11399,"props":16091,"children":16092},{},[16093],{"type":293,"value":16094},"Kleinstunternehmen",{"type":293,"value":16096},"! Firmen mit ",{"type":283,"tag":11399,"props":16098,"children":16099},{},[16100],{"type":293,"value":16101},"weniger als 10 Beschäftigten und max. 2 Mio. €\nJahresumsatz",{"type":293,"value":16103}," sind von den BFSG-Vorgaben ",{"type":283,"tag":11399,"props":16105,"children":16106},{},[16107],{"type":293,"value":16108},"befreit, wenn sie Dienstleistungen erbringen",{"type":283,"tag":288,"props":16110,"children":16112},{"href":16111},"https://www.bundesfachstelle-barrierefreiheit.de/DE/Fachwissen/Produkte-und-Dienstleistungen/Barrierefreiheitsstaerkungsgesetz/barrierefreiheitsstaerkungsgesetz_node.html#:~:text=Unter%20das%20Barrierefreiheitsst%C3%A4rkungsgesetz%20fallen%20Hersteller%2C,fallen%20jedoch%20unter%20das%20BFSG",[16113],{"type":293,"value":15956},{"type":293,"value":16115},".\nEin Mini-Start-up, das einen Online-Shop betreibt, muss formal also nicht unbedingt nachrüsten\n",{"type":283,"tag":288,"props":16117,"children":16119},{"href":16118},"https://www.hwk-dresden.de/recht/aktuelle-themen/detail/barrierefreiheitsstaerkungsgesetz-barrierefreiheit-von-online-shops.html#:~:text=Beim%20Angebot%20von%20Dienstleistungen%20im,h%C3%B6chstens%202%20Millionen%20Euro%20bel%C3%A4uft",[16120],{"type":293,"value":15983},{"type":293,"value":9570},{"type":283,"tag":11399,"props":16123,"children":16124},{},[16125],{"type":293,"value":16126},"Achtung:",{"type":293,"value":16128}," Diese Ausnahme gilt ",{"type":283,"tag":11399,"props":16130,"children":16131},{},[16132],{"type":293,"value":16133},"nur für Dienstleistungen",{"type":293,"value":16135},"! Kleinstunternehmen, die ",{"type":283,"tag":11399,"props":16137,"children":16138},{},[16139],{"type":293,"value":16061},{"type":293,"value":16141}," (z.B. Hardware wie\nspezielle Lesegeräte) in den Verkehr bringen, ",{"type":283,"tag":11399,"props":16143,"children":16144},{},[16145],{"type":293,"value":16146},"fallen dennoch",{"type":293,"value":16148}," unter das BFSG\n",{"type":283,"tag":288,"props":16150,"children":16151},{"href":16111},[16152],{"type":293,"value":15956},{"type":283,"tag":288,"props":16154,"children":16156},{"href":16155},"https://www.hwk-dresden.de/recht/aktuelle-themen/detail/barrierefreiheitsstaerkungsgesetz-barrierefreiheit-von-online-shops.html#:~:text=bel%C3%A4uft",[16157],{"type":293,"value":15983},{"type":293,"value":1302},{"type":283,"tag":284,"props":16160,"children":16161},{},[16162,16164,16169],{"type":293,"value":16163},"Und mal ehrlich - Selbst wenn man rechtlich knapp ausgenommen ist, lohnt es sich ",{"type":283,"tag":11399,"props":16165,"children":16166},{},[16167],{"type":293,"value":16168},"trotzdem",{"type":293,"value":16170},", Barrierefreiheit\nfreiwillig umzusetzen, um Kundschaft nicht auszuschließen und auf zukünftige Anforderungen vorbereitet zu sein.",{"type":283,"tag":12814,"props":16172,"children":16174},{"id":16173},"was-bedeutet-barrierefrei-genau",[16175],{"type":293,"value":16176},"Was bedeutet “barrierefrei” genau?",{"type":283,"tag":284,"props":16178,"children":16179},{},[16180,16182,16187,16189,16193,16195,16200,16202,16207],{"type":293,"value":16181},"Nach gängiger Definition sind Angebote barrierefrei, wenn sie für Menschen mit Behinderungen in der üblichen Weise, ohne\nbesondere Erschwernis und grundsätzlich ohne fremde Hilfe auffindbar, zugänglich und nutzbar sind\n",{"type":283,"tag":288,"props":16183,"children":16185},{"href":16184},"https://www.hwk-dresden.de/recht/aktuelle-themen/detail/barrierefreiheitsstaerkungsgesetz-barrierefreiheit-von-online-shops.html#:~:text=Barrierefreiheit%20wird%20gew%C3%A4hrleistet%2C%20wenn%20Produkte,auffindbar%2C%20zug%C3%A4nglich%20und%20nutzbar%20sind",[16186],{"type":293,"value":15983},{"type":293,"value":16188},".\nIm Web-Bereich heißt das konkret: Man muss z.B. eine Website auch per Screenreader (Vorlesesoftware) oder nur mit der\nTastatur bedienen können; es dürfen keine Hürden für Sehbehinderte, Hörgeschädigte, motorisch oder kognitiv\neingeschränkte Menschen vorhanden sein. Technisch basieren die Anforderungen im ",{"type":283,"tag":11491,"props":16190,"children":16191},{},[16192],{"type":293,"value":12858},{"type":293,"value":16194}," auf der europäischen ",{"type":283,"tag":11491,"props":16196,"children":16197},{},[16198],{"type":293,"value":16199},"Norm EN 301\n549",{"type":293,"value":16201},", die wiederum die ",{"type":283,"tag":11491,"props":16203,"children":16204},{},[16205],{"type":293,"value":16206},"Web Content Accessibility Guidelines (WCAG) 2.1",{"type":293,"value":16208}," in Stufe AA referenziert.",{"type":283,"tag":284,"props":16210,"children":16211},{},[16212,16214,16219,16221,16225,16227,16231],{"type":293,"value":16213},"Das heißt, wer die Erfolgskriterien der WCAG 2.1 AA erfüllt, ist auf der sicheren Seite. Öffentliche Stellen\nkennen diese Standards bereits von der ",{"type":283,"tag":11491,"props":16215,"children":16216},{},[16217],{"type":293,"value":16218},"BITV 2.0 (Barrierefreie-Informationstechnik-Verordnung)",{"type":293,"value":16220},", die seit 2018 für\nBehörden-Websites gilt – dort sind zusätzlich Inhalte in Leichter Sprache und Gebärdensprache gefordert.\nFür private Anbieter verlangt das ",{"type":283,"tag":11491,"props":16222,"children":16223},{},[16224],{"type":293,"value":12858},{"type":293,"value":16226}," im Wesentlichen ",{"type":283,"tag":11399,"props":16228,"children":16229},{},[16230],{"type":293,"value":11543},{"type":293,"value":1302},{"type":283,"tag":532,"props":16233,"children":16235},{"id":16234},"welche-fristen-und-folgen-gelten-übergangszeiten-und-strafen",[16236],{"type":293,"value":16237},"Welche Fristen und Folgen gelten? – Übergangszeiten und Strafen",{"type":283,"tag":284,"props":16239,"children":16240},{},[16241,16246,16248,16253,16254,16257],{"type":283,"tag":11399,"props":16242,"children":16243},{},[16244],{"type":293,"value":16245},"Stichtag 28.06.2025:",{"type":293,"value":16247}," Ab diesem Datum müssen neue Produkte und Services konform sein. Doch das Gesetz sieht ein paar\nÜbergangsfristen vor. Wichtig zu wissen, dass ",{"type":283,"tag":11399,"props":16249,"children":16250},{},[16251],{"type":293,"value":16252},"bestehende Verträge und Systeme bekommen teilweise Aufschub",{"type":293,"value":337},{"type":283,"tag":1321,"props":16255,"children":16256},{},[],{"type":283,"tag":1321,"props":16258,"children":16259},{},[],{"type":283,"tag":457,"props":16261,"children":16262},{},[16263,16312,16334],{"type":283,"tag":461,"props":16264,"children":16265},{},[16266,16271,16273,16278,16280,16285,16287,16290,16296,16299,16304,16306,16311],{"type":283,"tag":11399,"props":16267,"children":16268},{},[16269],{"type":293,"value":16270},"Laufende Dienstleistungen:",{"type":293,"value":16272}," Wurde ein langfristiger Vertrag ",{"type":283,"tag":11399,"props":16274,"children":16275},{},[16276],{"type":293,"value":16277},"vor dem 28.06.2025",{"type":293,"value":16279}," abgeschlossen und wird er\nunverändert fortgeführt, hat der Anbieter bis ",{"type":283,"tag":11399,"props":16281,"children":16282},{},[16283],{"type":293,"value":16284},"27.06.2030",{"type":293,"value":16286}," Zeit, den Dienst barrierefrei zu machen",{"type":283,"tag":1321,"props":16288,"children":16289},{},[],{"type":283,"tag":288,"props":16291,"children":16293},{"href":16292},"https://www.bfsg-barrierefreiheitsstaerkungsgesetz.de/#:~:text=Laut%20BMAS%20gilt%20die%20%C3%9Cbergangsfrist,und%20nur%20in%20zwei%20F%C3%A4llen",[16294],{"type":293,"value":16295},"bfsg-barrierefreiheitsstaerkungsgesetz.de",{"type":283,"tag":1321,"props":16297,"children":16298},{},[],{"type":283,"tag":11491,"props":16300,"children":16301},{},[16302],{"type":293,"value":16303},"Beispiel:",{"type":293,"value":16305}," Ein Online-Banking-System, das seit Jahren läuft und von Bestandskunden genutzt wird, muss spätestens\n2030 umgestellt sein – ",{"type":283,"tag":11399,"props":16307,"children":16308},{},[16309],{"type":293,"value":16310},"bei neuen Angeboten aber sofort ab 2025",{"type":293,"value":1302},{"type":283,"tag":461,"props":16313,"children":16314},{},[16315,16320,16322,16327,16329,16333],{"type":283,"tag":11399,"props":16316,"children":16317},{},[16318],{"type":293,"value":16319},"Ältere Technik im Einsatz:",{"type":293,"value":16321}," Wird für die Dienstleistung ein Produkt verwendet, das bereits ",{"type":283,"tag":11399,"props":16323,"children":16324},{},[16325],{"type":293,"value":16326},"vor Juni 2025 im\nEinsatz",{"type":293,"value":16328},"\nwar (z.B. ein vorhandenes SB-Terminal), gilt ebenfalls die Frist bis 2030\n",{"type":283,"tag":288,"props":16330,"children":16331},{"href":16292},[16332],{"type":293,"value":16295},{"type":293,"value":1302},{"type":283,"tag":461,"props":16335,"children":16336},{},[16337,16342,16344,16347],{"type":283,"tag":11399,"props":16338,"children":16339},{},[16340],{"type":293,"value":16341},"Selbstbedienungsterminals:",{"type":293,"value":16343}," Für Geldautomaten, Ticketautomaten & Co, die schon stehen, erlaubt das Gesetz sogar 15\nJahre Übergangszeit. Diese dürfen bis 2040 weitergenutzt werden, bevor sie ersetzt oder nachgerüstet sein müssen",{"type":283,"tag":1321,"props":16345,"children":16346},{},[],{"type":283,"tag":288,"props":16348,"children":16350},{"href":16349},"https://www.bundesfachstelle-barrierefreiheit.de/DE/Fachwissen/Produkte-und-Dienstleistungen/Barrierefreiheitsstaerkungsgesetz/barrierefreiheitsstaerkungsgesetz_node.html#:~:text=F%C3%BCr%20einige%20Produkte%20und%20Dienstleistungen,eine%20%C3%9Cbergangsfrist%20von%2015%20Jahren",[16351],{"type":293,"value":15956},{"type":283,"tag":1321,"props":16353,"children":16354},{},[],{"type":283,"tag":284,"props":16356,"children":16357},{},[16358,16363,16365,16370,16372,16377,16379,16384,16386,16391],{"type":283,"tag":11399,"props":16359,"children":16360},{},[16361],{"type":293,"value":16362},"Wichtig:",{"type":293,"value":16364}," Sobald ein Anbieter jedoch ",{"type":283,"tag":11399,"props":16366,"children":16367},{},[16368],{"type":293,"value":16369},"einen bestehenden Service wesentlich überarbeitet",{"type":293,"value":16371}," oder einen\n",{"type":283,"tag":11399,"props":16373,"children":16374},{},[16375],{"type":293,"value":16376},"neuen Vertrag",{"type":293,"value":16378},"\nmit einem Verbraucher ",{"type":283,"tag":11399,"props":16380,"children":16381},{},[16382],{"type":293,"value":16383},"nach Juni 2025",{"type":293,"value":16385}," schließt, müssen die aktuellen Teile barrierefrei sein – man kann also nicht\nbei Updates\nerneut 5 Jahre Aufschub einfordern\n",{"type":283,"tag":288,"props":16387,"children":16389},{"href":16388},"https://www.bfsg-barrierefreiheitsstaerkungsgesetz.de/#:~:text=match%20at%20L720%20gr%C3%B6%C3%9Feren%20Updates,sie%20m%C3%BCssen%20sofort%20barrierefrei%20sein",[16390],{"type":293,"value":16295},{"type":293,"value":16392},".\nDie Übergangsfristen sind als Schonzeit für Altbestände gedacht, nicht als Schlupfloch zum Hinauszögern.",{"type":283,"tag":1252,"props":16394,"children":16396},{"id":16395},"kontrolle-und-sanktionen",[16397],{"type":293,"value":16398},"Kontrolle und Sanktionen",{"type":283,"tag":284,"props":16400,"children":16401},{},[16402,16404,16409],{"type":293,"value":16403},"Die Einhaltung wird durch Marktüberwachungsbehörden geprüft. Bei Verstößen drohen erst\nAufforderungen zur Nachbesserung und letztlich empfindliche Maßnahmen. Im Extremfall kann die Behörde anordnen, dass ein\nnicht barrierefreier Online-Dienst vom Markt genommen bzw. abgeschaltet wird\n",{"type":283,"tag":288,"props":16405,"children":16407},{"href":16406},"https://www.bundesfachstelle-barrierefreiheit.de/SharedDocs/Downloads/DE/Externe-Veroeffentlichungen/bmas-leitlinien-bfsg.pdf?__blob=publicationFile#:~:text=Kommt%20der%20Dienstleistungserbringer%20dieser%20Aufforderung,so%20ergreift%20die%20Markt%C3%BCberwachungsbeh%C3%B6rde%20die",[16408],{"type":293,"value":15956},{"type":293,"value":16410},"!",{"type":283,"tag":284,"props":16412,"children":16413},{},[16414,16416,16420,16422,16427,16432],{"type":293,"value":16415},"Zusätzlich können Bußgelder verhängt werden – das ",{"type":283,"tag":11491,"props":16417,"children":16418},{},[16419],{"type":293,"value":12858},{"type":293,"value":16421}," nennt hier je nach Verstoß Summen ",{"type":283,"tag":11399,"props":16423,"children":16424},{},[16425],{"type":293,"value":16426},"bis zu 100.000 Euro",{"type":283,"tag":288,"props":16428,"children":16430},{"href":16429},"https://www.bundesfachstelle-barrierefreiheit.de/SharedDocs/Downloads/DE/Externe-Veroeffentlichungen/bmas-leitlinien-bfsg.pdf?__blob=publicationFile#:~:text=Bu%C3%9Fgeld%20von%20bis%20zu%20100,innen%20und%20Verb%C3%A4nde",[16431],{"type":293,"value":15956},{"type":293,"value":16433},".\nAuch Verbraucher*innen und Verbände haben Rechte - sie können Mängel rügen und (ähnlich wie bei AGG-Verstößen) im\nZweifel rechtlich Druck machen. Man sollte also die Sache ernst nehmen. Wer ab 2025 einfach weitermacht wie bisher,\nriskiert Image-Schäden, Beschwerden und im Worst Case Umsatzeinbußen.",{"type":283,"tag":284,"props":16435,"children":16436},{},[16437,16439,16444,16446,16451,16453,16458],{"type":293,"value":16438},"Neben der Pflicht zur Barrierefreiheit an sich, fordert das Gesetz von Unternehmen auch bürokratische Nachweise. So muss\nfür jedes Produkt oder jede Dienstleistung eine Konformitätserklärung bzw. technische Dokumentation erstellt werden, die\nbeschreibt, wie die Anforderungen erfüllt werden\n",{"type":283,"tag":288,"props":16440,"children":16442},{"href":16441},"https://www.bfsg-barrierefreiheitsstaerkungsgesetz.de/#:~:text=F%C3%BCr%20jedes%20Produkt%20und%20jede,wie%20die%20Barrierefreiheitsanforderungen%20erf%C3%BCllt%20werden",[16443],{"type":293,"value":16295},{"type":293,"value":16445},".\nDienstleistungs-Anbieter müssen außerdem leicht zugänglich informieren (z.B. auf der Website oder in AGB) und angeben,\nwelche Marktüberwachungsbehörde zuständig ist\n",{"type":283,"tag":288,"props":16447,"children":16449},{"href":16448},"https://www.bfsg-barrierefreiheitsstaerkungsgesetz.de/#:~:text=Dienstleister%20m%C3%BCssen%20Informationen%20%C3%BCber%20ihre,werden%20und%20folgende%20Elemente%20enthalten",[16450],{"type":293,"value":16295},{"type":293,"value":16452},".\nIn der Praxis dürfte das analog zur behördlichen Barrierefrei-Erklärung laufen, die man schon von öffentlichen\nWebsites kennt – ein Abschnitt ",{"type":283,"tag":11399,"props":16454,"children":16455},{},[16456],{"type":293,"value":16457},"“Erklärung zur Barrierefreiheit”",{"type":293,"value":16459}," mit Informationen zum Stand der Umsetzung,\nKontaktmöglichkeit\nfür Feedback und Hinweis auf die Durchsetzungsstelle.",{"type":283,"tag":532,"props":16461,"children":16463},{"id":16462},"barrierefreiheit-früh-einplanen-vs-nachträglich-umsetzen-der-kostenvergleich",[16464],{"type":293,"value":16465},"Barrierefreiheit früh einplanen vs. nachträglich umsetzen – der Kostenvergleich",{"type":283,"tag":284,"props":16467,"children":16468},{},[16469,16471,16476,16478,16483,16485,16491],{"type":293,"value":16470},"Eine oft gehörte Sorge ist: ",{"type":283,"tag":11491,"props":16472,"children":16473},{},[16474],{"type":293,"value":16475},"“Wird das nicht unglaublich teuer?”",{"type":293,"value":16477},"\nDie gute Nachricht ist, wenn man Barrierefreiheit von Anfang an mitdenkt, hält sich der Mehraufwand stark in Grenzen.\nEine Studie zum barrierefreien Bauen ergab, dass ein Gebäude, das von vornherein barrierefrei geplant wird, nur etwa 1%\nMehrkosten\nverursacht",{"type":283,"tag":288,"props":16479,"children":16481},{"href":16480},"https://www.bundesfachstelle-barrierefreiheit.de/SharedDocs/Kurzmeldungen/DE/barrierefreies-bauen-neubau-verursacht-kaum-mehrkosten.html#:~:text=Die%20Studie%20von%20Terrogon%20und,durch%20einen%20Umbau%20zu%20realisieren",[16482],{"type":293,"value":15956},{"type":293,"value":16484},"\n– und ähnlich verhält es sich tatsächlich auch bei Softwareprojekten. Bedienfunktionen direkt barrierefrei zu designen\nist grundsätzlich\nnicht aufwändiger, als sie mit Barrieren zu entwickeln\n",{"type":283,"tag":288,"props":16486,"children":16488},{"href":16487},"https://www.aktion-mensch.de/inklusion/barrierefreiheit/barrierefreie-website/kosten-barrierefreie-website#:~:text=Denken%20Sie%20Barrierefreiheit%20von%20Anfang,mit",[16489],{"type":293,"value":16490},"aktion-mensch.de",{"type":293,"value":1302},{"type":283,"tag":284,"props":16493,"children":16494},{},[16495],{"type":283,"tag":11491,"props":16496,"children":16497},{},[16498],{"type":283,"tag":11399,"props":16499,"children":16500},{},[16501],{"type":293,"value":16502},"Ob ein Entwickler nun ein Kontaktformular zugänglich oder mit unnötigen Barrieren codet, macht\nzeitlich kaum einen Unterschied, solange das Ziel bekannt ist!",{"type":283,"tag":284,"props":16504,"children":16505},{},[16506,16508,16513,16514,16519,16520,16525,16527,16532],{"type":293,"value":16507},"Es kommt auf die richtige Denke im Team an. Wenn U",{"type":283,"tag":11399,"props":16509,"children":16510},{},[16511],{"type":293,"value":16512},"X-Designer",{"type":293,"value":9934},{"type":283,"tag":11399,"props":16515,"children":16516},{},[16517],{"type":293,"value":16518},"Developer",{"type":293,"value":9440},{"type":283,"tag":11399,"props":16521,"children":16522},{},[16523],{"type":293,"value":16524},"Redakteure",{"type":293,"value":16526}," geschult sind und von\nBeginn an wissen, worauf es ankommt, entstehen ",{"type":283,"tag":11491,"props":16528,"children":16529},{},[16530],{"type":293,"value":16531},"barrierefreie Webseiten",{"type":293,"value":16533}," quasi “nebenbei”. Viele Maßnahmen kosten nichts\nextra. Beispielsweise kosten von Anfang an gescheit geplante Überschriftenstrukturen und Alternativtexte zu verwenden\nnur\nein bisschen Aufmerksamkeit aber kein zusätzliches Budget!",{"type":283,"tag":1252,"props":16535,"children":16537},{"id":16536},"richtig-teuer-wird-barrierefreiheit-meist-erst-wenn-sie-nachträglich-draufgesattelt-werden-muss",[16538],{"type":293,"value":16539},"Richtig teuer wird Barrierefreiheit meist erst, wenn sie nachträglich draufgesattelt werden muss.",{"type":283,"tag":284,"props":16541,"children":16542},{},[16543],{"type":293,"value":16544},"Dann entdeckt man plötzlich, dass an zig Stellen Anpassungen nötig sind: Bilder ohne Alt-Text, schlechte\nFarbkombinationen im Design,\ninteraktive Komponenten, die nur mit der Maus funktionieren, Videos ohne Untertitel, PDF-Dokumente ohne Tags, etc. Jede\ndieser Barrieren zu beheben erfordert Analyse, Designänderungen, erneutes Development und Test – kurz: zusätzliche\nRunden im Projekt, die man sich hätte sparen können. Je später im Entwicklungsprozess man solche Änderungen vornimmt,\ndesto höher die Kosten. Erfahrungen im IT-Bereich (auch aus unseren eigenen Projekten) zeigen, dass Fehlerbehebung im\nNachhinein um ein Vielfaches teurer ist als Prävention. Bei Accessibility ist es ähnlich: “Shift Left” lautet die Devise\n– früh im Prozess ansetzen.",{"type":283,"tag":284,"props":16546,"children":16547},{},[16548],{"type":283,"tag":11399,"props":16549,"children":16550},{},[16551],{"type":283,"tag":11491,"props":16552,"children":16553},{},[16554],{"type":293,"value":16555},"Wenn Barrierefreiheit integraler Projektbestandteil ist, bleibt der Mehraufwand nominal –\ndoch Wartung und Retrofit im Nachgang können richtig ins Geld gehen.",{"type":283,"tag":284,"props":16557,"children":16558},{},[16559,16564],{"type":283,"tag":11399,"props":16560,"children":16561},{},[16562],{"type":293,"value":16563},"Ein Beispiel aus der Praxis:",{"type":293,"value":16565}," Eine mittelständische Firma ließ ihren bestehenden Online-Shop auf Barrierefreiheit\nprüfen.\nEs wurden über 50 Einzelprobleme gefunden, von fehlenden Formularbeschriftungen bis zu unbedienbaren Dropdown-Menüs. Die\nBehebung erforderte mehrere Entwickler-Sprints und teils größere Umbauten im Frontend – Kostenpunkt im hohen\nvierstelligen Bereich. Hätte man diese Standards von Beginn an eingehalten, wäre fast keiner dieser Posten entstanden.\nZusätzlich kam es zu Opportunity Costs, d.h. während der Überarbeitung konnten andere Features nicht entwickelt werden.",{"type":283,"tag":284,"props":16567,"children":16568},{},[16569,16574],{"type":283,"tag":11399,"props":16570,"children":16571},{},[16572],{"type":293,"value":16573},"Unser Tipp:",{"type":293,"value":16575}," Barrierefreiheit von Anfang an in neue Projekte einplanen! Die Kosten dafür sind überschaubar und\nfließen in\nein besseres Nutzererlebnis für alle!",{"type":283,"tag":532,"props":16577,"children":16579},{"id":16578},"so-wirds-barrierefrei-tests-und-unterstützung-für-unternehmen",[16580],{"type":293,"value":16581},"So wird’s barrierefrei: Tests und Unterstützung für Unternehmen",{"type":283,"tag":284,"props":16583,"children":16584},{},[16585,16587,16592,16594,16599,16601,16606],{"type":293,"value":16586},"Falls Sie jetzt denken ",{"type":283,"tag":11491,"props":16588,"children":16589},{},[16590],{"type":293,"value":16591},"“Alles schön und gut, aber wie stelle ich konkret fest, ob meine Website barrierefrei ist – und\nwer hilft mir dabei?”",{"type":293,"value":16593}," – keine Sorge, Sie müssen das Rad nicht neu erfinden. Es gibt erprobte ",{"type":283,"tag":11399,"props":16595,"children":16596},{},[16597],{"type":293,"value":16598},"Testverfahren",{"type":293,"value":16600}," und\nviele ",{"type":283,"tag":11399,"props":16602,"children":16603},{},[16604],{"type":293,"value":16605},"Experten",{"type":293,"value":16607},", die Unternehmen auf dem Weg zur Barrierefreiheit begleiten.",{"type":283,"tag":284,"props":16609,"children":16610},{},[16611,16616,16618,16623,16625,16630,16632,16637,16639,16644,16646,16651,16653,16658,16660,16665,16667,16672],{"type":283,"tag":11399,"props":16612,"children":16613},{},[16614],{"type":293,"value":16615},"1. Selbstcheck mit Tools:",{"type":293,"value":16617}," Ein guter erster Schritt ist ein einfacher Selbsttest. Es stehen ",{"type":283,"tag":11399,"props":16619,"children":16620},{},[16621],{"type":293,"value":16622},"kostenlose Prüftools",{"type":293,"value":16624},"\nzur Verfügung, mit denen man typische Probleme aufspüren kann. Beliebt sind z.B. der ",{"type":283,"tag":11399,"props":16626,"children":16627},{},[16628],{"type":293,"value":16629},"WAVE Accessibility Checker",{"type":293,"value":16631},"\n(eine Browser-Erweiterung) oder ",{"type":283,"tag":11399,"props":16633,"children":16634},{},[16635],{"type":293,"value":16636},"axe DevTools",{"type":293,"value":16638},", sowie ",{"type":283,"tag":11399,"props":16640,"children":16641},{},[16642],{"type":293,"value":16643},"Google Lighthouse",{"type":293,"value":16645}," (im Chrome-Browser integriert).\nDiese Tools analysieren den Code der Website und melden z.B. fehlende Alt-Texte, unzureichende Kontraste oder\nFormulare ohne Labels. Wichtig ist zu allerdings zu wissen, dass automatische Tests zwar viele ",{"type":283,"tag":11399,"props":16647,"children":16648},{},[16649],{"type":293,"value":16650},"technische",{"type":293,"value":16652}," Barrieren\nfinden, aber sie finden nicht alles und nicht alles, was sie finden ist sinnvoll. Einige Kriterien – etwa ",{"type":283,"tag":11491,"props":16654,"children":16655},{},[16656],{"type":293,"value":16657},"ob\nAlternativtexte inhaltlich sinnvoll sind",{"type":293,"value":16659}," oder ob d",{"type":283,"tag":11491,"props":16661,"children":16662},{},[16663],{"type":293,"value":16664},"ie Bedien-Reihenfolge logisch ist",{"type":293,"value":16666}," – können ",{"type":283,"tag":11399,"props":16668,"children":16669},{},[16670],{"type":293,"value":16671},"nur menschliche\nTester",{"type":293,"value":16673},"\nbeurteilen. Trotzdem lohnt ein solcher Tool-Check. Man erhält in wenigen Minuten einen groben Überblick über ganz\noffensichtliche\nBaustellen.",{"type":283,"tag":284,"props":16675,"children":16676},{},[16677,16682,16684,16689,16691,16696,16698,16706,16707,16712,16714,16718,16720,16724,16726,16731,16733,16738,16740,16745],{"type":283,"tag":11399,"props":16678,"children":16679},{},[16680],{"type":293,"value":16681},"2. Experten-Audit (BITV-Test):",{"type":293,"value":16683}," Für ein belastbares Ergebnis empfiehlt sich ein ",{"type":283,"tag":11399,"props":16685,"children":16686},{},[16687],{"type":293,"value":16688},"manueller Prüfbericht",{"type":293,"value":16690}," durch\nSpezialist",{"type":283,"tag":11491,"props":16692,"children":16693},{},[16694],{"type":293,"value":16695},"innen. In Deutschland hat sich der",{"type":293,"value":16697}," ",{"type":283,"tag":11491,"props":16699,"children":16700},{},[16701],{"type":283,"tag":11399,"props":16702,"children":16703},{},[16704],{"type":293,"value":16705},"BITV-Test",{"type":293,"value":16697},{"type":283,"tag":11491,"props":16708,"children":16709},{},[16710],{"type":293,"value":16711},"als Standardverfahren etabliert",{"type":293,"value":16713},". Dieser Test umfasst\nderzeit rund 60 Prüfschritte, die an die ",{"type":283,"tag":11491,"props":16715,"children":16716},{},[16717],{"type":293,"value":11543},{"type":293,"value":16719}," und die gesetzlichen Anforderungen (",{"type":283,"tag":11491,"props":16721,"children":16722},{},[16723],{"type":293,"value":11919},{"type":293,"value":16725},")\nangepasst sind. Er wird von geschulten Auditor*innen durchgeführt – viele bieten das als Dienstleistung an. Das Ergebnis\nist ein\ndetaillierter Report, der Stärken und Schwächen der Website aufzeigt und eine Prozentbewertung gibt. Für kleine Websites\nbewegt sich der Aufwand oft im Rahmen von ein paar Personentagen. Laut ",{"type":283,"tag":11491,"props":16727,"children":16728},{},[16729],{"type":293,"value":16730},"Aktion Mensch",{"type":293,"value":16732}," liegen\ndie Kosten für eine komplette Experten-Analyse je nach Umfang etwa zwischen ",{"type":283,"tag":11399,"props":16734,"children":16735},{},[16736],{"type":293,"value":16737},"2.500 und 10.000 Euro",{"type":293,"value":16739}," (von einfacher\nSeite bis komplexem Online-Shop)\n",{"type":283,"tag":288,"props":16741,"children":16743},{"href":16742},"https://www.aktion-mensch.de/inklusion/barrierefreiheit/barrierefreie-website/kosten-barrierefreie-website#:~:text=Mehr%20Budget%20brauchen%20Sie%20f%C3%BCr,000%20Euro%20rechnen",[16744],{"type":293,"value":16490},{"type":293,"value":16746},".\nDas ist gut investiertes Geld, denn man bekommt eine klare To-do-Liste, um rechtskonform zu werden.",{"type":283,"tag":284,"props":16748,"children":16749},{},[16750,16755,16757,16762],{"type":283,"tag":11399,"props":16751,"children":16752},{},[16753],{"type":293,"value":16754},"3. Nutzer-Feedback:",{"type":293,"value":16756}," Nichts ersetzt den Praxistest mit echten Nutzenden. Eine barrierefreie Seite sollte\nidealerweise von Personen mit unterschiedlichen Behinderungen ausprobiert werden – z.B. ein blinder User mit\nScreenreader, jemand mit Sehbehinderung und Vergrößerungssoftware, jemand mit motorischer Einschränkung nur per\nTastatur, etc. Diese Tests kann man über spezialisierte Dienstleister organisieren oder im eigenen Umfeld Freiwillige\nfragen. Die Erkenntnisse sind ungemein wertvoll. Man sieht beispielsweise, wo die Bedienung hakt oder verwirrend ist.\nOft offenbart sich dabei auch ein genereller Nutzen für alle (Stichwort ",{"type":283,"tag":11491,"props":16758,"children":16759},{},[16760],{"type":293,"value":16761},"Usability",{"type":293,"value":16763},"). Wenn zum Beispiel ein Senior mit\nzitternder Hand das kleine Dropdown nicht treffen kann, ist es vermutlich für viele andere auch nicht optimal gelöst –\nhier kann eine einfachere UI viel bringen.",{"type":283,"tag":284,"props":16765,"children":16766},{},[16767,16772,16774,16779,16781,16786],{"type":283,"tag":11399,"props":16768,"children":16769},{},[16770],{"type":293,"value":16771},"4. Unterstützung durch Agenturen und Beratende:",{"type":293,"value":16773}," Wenn intern das Know-how fehlt, zögern Sie nicht, ",{"type":283,"tag":11399,"props":16775,"children":16776},{},[16777],{"type":293,"value":16778},"externe\nProfis",{"type":293,"value":16780},"\nhinzuzuziehen. Es gibt Beratungsfirmen und Agenturen (wie unsere) mit Expertise im Bereich oder gar Fokus auf digitale\nBarrierefreiheit. Achten Sie bei der Auswahl auf ",{"type":283,"tag":11399,"props":16782,"children":16783},{},[16784],{"type":293,"value":16785},"Erfahrung und Qualifikation",{"type":293,"value":16787},".\nGute Dienstleister werden mit Ihnen gemeinsam priorisieren, was zu tun ist, und können auch Ihre Entwickler schulen,\ndamit Barrierefreiheit nachhaltig im Prozess verankert wird.",{"type":283,"tag":284,"props":16789,"children":16790},{},[16791,16795,16797,16802,16804,16809,16811,16816,16818,16823,16825,16830],{"type":283,"tag":11399,"props":16792,"children":16793},{},[16794],{"type":293,"value":16573},{"type":293,"value":16796}," Beginnen Sie mit einem ",{"type":283,"tag":11399,"props":16798,"children":16799},{},[16800],{"type":293,"value":16801},"einfachen Selbsttest",{"type":293,"value":16803},", um ein Gefühl zu bekommen. Dann holen Sie sich bei\nBedarf Angebote für einen professionellen Audit. Die ",{"type":283,"tag":11399,"props":16805,"children":16806},{},[16807],{"type":293,"value":16808},"Knappschaft-Bahn-See",{"type":293,"value":16810}," bzw. die ",{"type":283,"tag":11491,"props":16812,"children":16813},{},[16814],{"type":293,"value":16815},"Bundesfachstelle\nBarrierefreiheit",{"type":293,"value":16817}," (eine staatliche Fachstelle, getragen von der KBS) bietet übrigens viele ",{"type":283,"tag":11399,"props":16819,"children":16820},{},[16821],{"type":293,"value":16822},"Infos und Webinare",{"type":293,"value":16824}," an,\ndie gerade E-Commerce-Unternehmen den Einstieg\nerleichtern ",{"type":283,"tag":288,"props":16826,"children":16828},{"href":16827},"https://www.bundesfachstelle-barrierefreiheit.de/DE/Fachwissen/Produkte-und-Dienstleistungen/Barrierefreiheitsstaerkungsgesetz/barrierefreiheitsstaerkungsgesetz_node.html#:~:text=Die%20Bundesfachstelle%20Barrierefreiheit%20hat%20speziell,Reihe%20BFSG%202025",[16829],{"type":293,"value":15956},{"type":293,"value":1302},{"type":283,"tag":532,"props":16832,"children":16834},{"id":16833},"missverständnisse-sonderfälle-und-mythen-rund-um-das-bfsg",[16835],{"type":293,"value":16836},"Missverständnisse, Sonderfälle und “Mythen” rund um das BFSG",{"type":283,"tag":284,"props":16838,"children":16839},{},[16840,16842,16847],{"type":293,"value":16841},"Im Vorfeld des Inkrafttretens kursieren einige ",{"type":283,"tag":11399,"props":16843,"children":16844},{},[16845],{"type":293,"value":16846},"Thesen und Unsicherheiten",{"type":293,"value":16848},", die wir hier gerne beleuchten möchten:",{"type":283,"tag":457,"props":16850,"children":16851},{},[16852,16944,17023],{"type":283,"tag":461,"props":16853,"children":16854},{},[16855,16856,16861,16863,16868,16870,16874,16876,16881,16883,16888,16891,16895,16897,16902,16904,16909,16911,16915,16917,16922,16924,16929,16931,16935,16937,16942],{"type":293,"value":12394},{"type":283,"tag":11399,"props":16857,"children":16858},{},[16859],{"type":293,"value":16860},"Ab 2025 müssen alle Websites barrierefrei sein.”",{"type":293,"value":16862}," – ",{"type":283,"tag":11491,"props":16864,"children":16865},{},[16866],{"type":293,"value":16867},"Nicht ganz.",{"type":293,"value":16869}," Es stimmt, dass das ",{"type":283,"tag":11491,"props":16871,"children":16872},{},[16873],{"type":293,"value":12858},{"type":293,"value":16875}," viele private\nWebangebote abdecken wird, aber eben ",{"type":283,"tag":11399,"props":16877,"children":16878},{},[16879],{"type":293,"value":16880},"nur bestimmte Kategorien",{"type":293,"value":16882},". Ein rein informeller Firmenwebauftritt ohne\nOnline-Shop, der keine Verträge mit Verbrauchern abschließt, ist vom Gesetz ",{"type":283,"tag":11399,"props":16884,"children":16885},{},[16886],{"type":293,"value":16887},"nicht direkt erfasst",{"type":283,"tag":1321,"props":16889,"children":16890},{},[],{"type":283,"tag":288,"props":16892,"children":16893},{"href":15953},[16894],{"type":293,"value":15956},{"type":293,"value":16896},".\nDas heißt aber nicht, dass Sie ihn ignorieren sollten! Zum einen kann Barrierefreiheit auch hier Wettbewerbsvorteile\nbringen zum anderen ist es möglich, dass der Gesetzgeber den Geltungsbereich in Zukunft ",{"type":283,"tag":11399,"props":16898,"children":16899},{},[16900],{"type":293,"value":16901},"ausweitet",{"type":293,"value":16903},".\nFür öffentliche Webseiten von Behörden gilt ohnehin schon seit Jahren eine Pflicht (",{"type":283,"tag":11491,"props":16905,"children":16906},{},[16907],{"type":293,"value":16908},"BITV 2.0)",{"type":293,"value":16910}," – das ",{"type":283,"tag":11491,"props":16912,"children":16913},{},[16914],{"type":293,"value":12858},{"type":293,"value":16916}," schließt\njetzt die große Lücke im ",{"type":283,"tag":11399,"props":16918,"children":16919},{},[16920],{"type":293,"value":16921},"privaten Sektor",{"type":293,"value":16923}," für Verbraucherangebote. ",{"type":283,"tag":11399,"props":16925,"children":16926},{},[16927],{"type":293,"value":16928},"Unser Rat:",{"type":293,"value":16930}," Wenn Ihre Seite heute nicht unter\n",{"type":283,"tag":11491,"props":16932,"children":16933},{},[16934],{"type":293,"value":12858},{"type":293,"value":16936}," fällt, nutzen Sie die Gelegenheit, freiwillig Barrierefreiheit umzusetzen. Sie verbessern damit Ihr Image und\nsind vorbereitet, falls demnächst doch ",{"type":283,"tag":11399,"props":16938,"children":16939},{},[16940],{"type":293,"value":16941},"alle Webseiten",{"type":293,"value":16943}," dran sein sollten.",{"type":283,"tag":461,"props":16945,"children":16946},{},[16947,16948,16953,16954,16959,16961,16966,16968,16973,16977,16979,16990,16992,16996,16998,17003,17005,17010,17014,17016,17021],{"type":293,"value":12394},{"type":283,"tag":11399,"props":16949,"children":16950},{},[16951],{"type":293,"value":16952},"Kleine Unternehmen sind ausgenommen – das trifft uns nicht.”",{"type":293,"value":16862},{"type":283,"tag":11491,"props":16955,"children":16956},{},[16957],{"type":293,"value":16958},"Vorsicht:",{"type":293,"value":16960}," Die ",{"type":283,"tag":11399,"props":16962,"children":16963},{},[16964],{"type":293,"value":16965},"Kleinstunternehmer-Regel",{"type":293,"value":16967},"\n(weniger als 10 Mitarbeiter, \u003C2 Mio € Umsatz) gilt ",{"type":283,"tag":11491,"props":16969,"children":16970},{},[16971],{"type":293,"value":16972},"nur für Dienstleister",{"type":283,"tag":288,"props":16974,"children":16975},{"href":16111},[16976],{"type":293,"value":15956},{"type":293,"value":16978},".\nSobald Ihr Unternehmen diese Schwelle überschreitet – und das tun viele kleine Mittelständler – ",{"type":283,"tag":11399,"props":16980,"children":16981},{},[16982,16984,16988],{"type":293,"value":16983},"müssen Sie\ndas ",{"type":283,"tag":11491,"props":16985,"children":16986},{},[16987],{"type":293,"value":12858},{"type":293,"value":16989},"\neinhalten",{"type":293,"value":16991},", sofern Sie relevante Angebote betreiben. Ein Online-Händler mit 15 Angestellten zum Beispiel ist\ndefinitiv in der Pflicht. Zudem gilt das ",{"type":283,"tag":11491,"props":16993,"children":16994},{},[16995],{"type":293,"value":12858},{"type":293,"value":16997}," selbst, wenn Sie formal als Kleinstunternehmen zählen, aber z.B. einen\n",{"type":283,"tag":11399,"props":16999,"children":17000},{},[17001],{"type":293,"value":17002},"physischen\nVerkaufskanal",{"type":293,"value":17004}," (Produkt) im BFSG-Bereich haben, denn dann greift die Ausnahme ",{"type":283,"tag":11399,"props":17006,"children":17007},{},[17008],{"type":293,"value":17009},"nicht",{"type":283,"tag":288,"props":17011,"children":17012},{"href":16155},[17013],{"type":293,"value":15983},{"type":293,"value":17015},".\nPrüfen Sie also genau, ob Sie wirklich ausgenommen sind. In den meisten Fällen\nsind eher ",{"type":283,"tag":11399,"props":17017,"children":17018},{},[17019],{"type":293,"value":17020},"Mikro-Betriebe",{"type":293,"value":17022}," wie der Ein-Mann-Onlineshop befreit. Für wachstumsorientierte Start-ups und KMU ist das\nThema sehr wohl relevant.",{"type":283,"tag":461,"props":17024,"children":17025},{},[17026,17027,17032,17034,17039,17041,17046,17048,17053,17055,17060,17062,17067,17069,17074],{"type":293,"value":12394},{"type":283,"tag":11399,"props":17028,"children":17029},{},[17030],{"type":293,"value":17031},"Wir würden ja gern, aber das ist wirtschaftlich nicht zumutbar.”",{"type":293,"value":17033}," – Das Gesetz kennt einen Passus zur\n",{"type":283,"tag":11399,"props":17035,"children":17036},{},[17037],{"type":293,"value":17038},"unverhältnismäßigen Belastung",{"type":293,"value":17040},"! Wenn die Erfüllung der Anforderungen ein ",{"type":283,"tag":11491,"props":17042,"children":17043},{},[17044],{"type":293,"value":17045},"untragbares",{"type":293,"value":17047}," finanzielles Risiko\ndarstellt, kann man sich im Ausnahmefall darauf berufen\n",{"type":283,"tag":288,"props":17049,"children":17051},{"href":17050},"https://www.bundesfachstelle-barrierefreiheit.de/SharedDocs/Downloads/DE/Externe-Veroeffentlichungen/bmas-leitlinien-bfsg.pdf?__blob=publicationFile#:~:text=Einhaltung%20der%20Barrierefreiheitsanforderungen%20eine%20unverh%C3%A4ltnism%C3%A4%C3%9Fige,oder%20mehrere%20der%20Barrierefreiheitsanforderungen%20dieses",[17052],{"type":293,"value":15956},{"type":293,"value":17054},"\nAber aufgepasst - die Hürden dafür sind hoch. Man muss eine ",{"type":283,"tag":11399,"props":17056,"children":17057},{},[17058],{"type":293,"value":17059},"ausführliche Dokumentation",{"type":293,"value":17061}," nach bestimmten Kriterien\nanfertigen und regelmäßig (mindestens alle 5 Jahre) überprüfen.\nZusätzlich muss man muss die Marktüberwachungsbehörde darüber informieren und auf Verlangen alle Fakten liefern.\nFür die allermeisten Unternehmen dürfte Barrierefreiheit hingegen ",{"type":283,"tag":11399,"props":17063,"children":17064},{},[17065],{"type":293,"value":17066},"zumutbar",{"type":293,"value":17068}," sein, zumal es ja auch langfristig\n",{"type":283,"tag":11399,"props":17070,"children":17071},{},[17072],{"type":293,"value":17073},"zusätzliche Kundengruppen",{"type":293,"value":17075}," erschließt.",{"type":283,"tag":532,"props":17077,"children":17079},{"id":17078},"fazit-barrierefreiheit-als-chance-begreifen",[17080],{"type":293,"value":17081},"Fazit: Barrierefreiheit als Chance begreifen",{"type":283,"tag":284,"props":17083,"children":17084},{},[17085,17087,17091,17093,17098,17100,17105,17107,17112],{"type":293,"value":17086},"Anstatt das ",{"type":283,"tag":11491,"props":17088,"children":17089},{},[17090],{"type":293,"value":12858},{"type":293,"value":17092}," nur als lästige Verpflichtung zu sehen, lohnt es sich, die ",{"type":283,"tag":11399,"props":17094,"children":17095},{},[17096],{"type":293,"value":17097},"Potenziale",{"type":293,"value":17099}," zu erkennen: Etwa 10\nMillionen Menschen in Deutschland leben mit einer anerkannten Behinderung – ein enormes Marktsegment. Dazu kommen viele\nÄltere mit nachlassenden Sinnesfähigkeiten, temporär eingeschränkte Personen (gebrochener Arm, etc.) und Nutzer mit\nsituativen Handicaps (blendendes Sonnenlicht auf dem Handy, laute Umgebung, …). ",{"type":283,"tag":11399,"props":17101,"children":17102},{},[17103],{"type":293,"value":17104},"Ein barrierefreies Angebot erreicht\nmehr Kunden und ist oft auch für alle Benutzer komfortabler.",{"type":293,"value":17106}," Viele Accessibility-Prinzipien sind schlicht ",{"type":283,"tag":11491,"props":17108,"children":17109},{},[17110],{"type":293,"value":17111},"Best\nPractices",{"type":293,"value":17113}," für gutes Webdesign (klare Struktur, aussagekräftige Links, genügend Kontrast usw.). Unternehmen, die hier\nvorangehen, können sich mit einem inklusiven Image profilieren und rechtliche Risiken gleichzeitig minimieren.",{"type":283,"tag":284,"props":17115,"children":17116},{},[17117,17118,17126,17128,17133,17135,17140],{"type":293,"value":11512},{"type":283,"tag":11399,"props":17119,"children":17120},{},[17121],{"type":283,"tag":11491,"props":17122,"children":17123},{},[17124],{"type":293,"value":17125},"Barrierefreiheitsstärkungsgesetz",{"type":293,"value":17127}," mag zunächst wie ein weiterer Compliance-Brocken wirken. Doch mit dem richtigen\nPartner und Ansatz lässt es sich bewältigen – und zwar, ohne dass Ihr Budget explodiert oder Ihr Team verzweifelt. ",{"type":283,"tag":11399,"props":17129,"children":17130},{},[17131],{"type":293,"value":17132},"Wir\nunterstützen Sie gern",{"type":293,"value":17134}," dabei, frühzeitig die Weichen zu stellen, damit Ihr Web-Projekt nicht nur gesetzeskonform,\nsondern für ",{"type":283,"tag":11491,"props":17136,"children":17137},{},[17138],{"type":293,"value":17139},"alle",{"type":293,"value":17141}," Nutzer ein echter Mehrwert wird!",{"type":283,"tag":284,"props":17143,"children":17144},{},[17145,17149],{"type":283,"tag":11399,"props":17146,"children":17147},{},[17148],{"type":293,"value":12162},{"type":293,"value":17150}," Dieser Artikel wurde auch mit Unterstützung von KI generiert (Modell: GPT-4).",{"title":8,"searchDepth":340,"depth":340,"links":17152},[17153,17156,17159,17162,17163,17164],{"id":11391,"depth":340,"text":11394,"children":17154},[17155],{"id":15936,"depth":353,"text":15939},{"id":16234,"depth":340,"text":16237,"children":17157},[17158],{"id":16395,"depth":353,"text":16398},{"id":16462,"depth":340,"text":16465,"children":17160},[17161],{"id":16536,"depth":353,"text":16539},{"id":16578,"depth":340,"text":16581},{"id":16833,"depth":340,"text":16836},{"id":17078,"depth":340,"text":17081},{"_path":122,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":123,"description":124,"author":87,"image":12,"releaseDate":125,"blogCategories":17166,"articleTags":17167,"tags":17168,"body":17169,"_type":20,"_id":129,"_source":22,"_file":130,"_stem":131,"_extension":25},[77],[16],[19],{"type":280,"children":17170,"toc":18417},[17171,17177,17193,17199,17245,17309,17321,17327,17337,17378,17387,17419,17458,17467,17500,17519,17572,17578,17587,17618,17663,17688,17713,17719,17728,17763,17884,17887,17891,17935,17941,17950,18003,18034,18058,18089,18108,18114,18123,18155,18174,18210,18229,18255,18267,18273,18282,18308,18363,18369,18397,18409],{"type":283,"tag":1607,"props":17172,"children":17176},{"alt":17173,"aspect-ratio":17174,"height":1610,"object-fit":1611,"src":17175},"Eine Person hällt einen Sticker mit dem Schriftzug \"Dev-ops\" in der Hand","2.07","/blog/person_holding_devops_sticker.jpg",[],{"type":283,"tag":321,"props":17178,"children":17180},{"className":17179},[11485,15884],[17181],{"type":283,"tag":284,"props":17182,"children":17183},{},[17184],{"type":283,"tag":11491,"props":17185,"children":17186},{},[17187],{"type":283,"tag":288,"props":17188,"children":17190},{"href":17189},"https://www.pexels.com/photo/person-holding-a-sticker-11035393/",[17191],{"type":293,"value":17192},"Photo by RealToughCandy.com",{"type":283,"tag":532,"props":17194,"children":17196},{"id":17195},"warum-die-entwicklung-einer-web-applikation-nur-der-anfang-ist",[17197],{"type":293,"value":17198},"Warum die Entwicklung einer (Web-)Applikation nur der Anfang ist",{"type":283,"tag":284,"props":17200,"children":17201},{},[17202,17204,17209,17211,17216,17218,17222,17224,17229,17231,17236,17238,17243],{"type":293,"value":17203},"Web-Anwendungen werden meistens in einer ",{"type":283,"tag":11491,"props":17205,"children":17206},{},[17207],{"type":293,"value":17208},"Dev",{"type":293,"value":17210},"-Umgebung (Development-Umgebung) entwickelt und getestet – doch der\neigentliche Härtetest kommt in der Praxis auf den ",{"type":283,"tag":11491,"props":17212,"children":17213},{},[17214],{"type":293,"value":17215},"Prod",{"type":293,"value":17217},"-Systemen (Produktivumgebung). ",{"type":283,"tag":11399,"props":17219,"children":17220},{},[17221],{"type":293,"value":16},{"type":293,"value":17223}," (kurz für\n",{"type":283,"tag":11491,"props":17225,"children":17226},{},[17227],{"type":293,"value":17228},"Development Operations",{"type":293,"value":17230},", also die enge Verzahnung von Entwicklung und IT-Betrieb) spielt hier eine Schlüsselrolle.\nInsbesondere bei Web-Anwendungen auf ",{"type":283,"tag":11399,"props":17232,"children":17233},{},[17234],{"type":293,"value":17235},"Linux-Servern",{"type":293,"value":17237}," mit komplexer ",{"type":283,"tag":11399,"props":17239,"children":17240},{},[17241],{"type":293,"value":17242},"Netzwerkinfrastruktur",{"type":293,"value":17244}," stellt sich oft erst\n„live“ heraus, wie stabil und performant eine Anwendung wirklich läuft. In diesem Beitrag werfen wir einen Blick auf\ngängige Thesen rund um DevOps im Web-Umfeld und prüfen, was dran ist. Dabei betrachten wir vor allem Aspekte, die für\nKunden aus dem Mittelstand und Partnerfirmen einer Software-Agentur relevant sind.",{"type":283,"tag":284,"props":17246,"children":17247},{},[17248,17250,17255,17257,17262,17263,17268,17270,17278,17280,17289,17291,17300,17302,17307],{"type":293,"value":17249},"Wir beleuchten, warum Entwicklungsumgebungen an ihre Grenzen stoßen, wieso echte Lasttests und ",{"type":283,"tag":11491,"props":17251,"children":17252},{},[17253],{"type":293,"value":17254},"Edge Cases",{"type":293,"value":17256}," (Randfälle)\nschwer simulierbar sind und weshalb die Arbeit nach dem Launch (Stichwort ",{"type":283,"tag":11491,"props":17258,"children":17259},{},[17260],{"type":293,"value":17261},"Monitoring",{"type":293,"value":9440},{"type":283,"tag":11491,"props":17264,"children":17265},{},[17266],{"type":293,"value":17267},"Continuous Improvement",{"type":293,"value":17269},")\ngerade erst richtig beginnt. Außerdem gehen wir darauf ein, welche Tools – von ",{"type":283,"tag":288,"props":17271,"children":17273},{"href":17272},"https://sentry.io/",[17274],{"type":283,"tag":11399,"props":17275,"children":17276},{},[17277],{"type":293,"value":1542},{"type":293,"value":17279}," über ",{"type":283,"tag":288,"props":17281,"children":17283},{"href":17282},"https://grafana.com/",[17284],{"type":283,"tag":11399,"props":17285,"children":17286},{},[17287],{"type":293,"value":17288},"Grafana",{"type":293,"value":17290}," bis\n",{"type":283,"tag":288,"props":17292,"children":17294},{"href":17293},"https://www.zabbix.com/",[17295],{"type":283,"tag":11399,"props":17296,"children":17297},{},[17298],{"type":293,"value":17299},"Zabbix",{"type":293,"value":17301}," – im Alltag unverzichtbar sind und wie ",{"type":283,"tag":11399,"props":17303,"children":17304},{},[17305],{"type":293,"value":17306},"CI/CD-Pipelines",{"type":293,"value":17308}," auch weniger erfahrenen Entwicklern helfen,\ngefahrlos zu deployen.",{"type":283,"tag":321,"props":17310,"children":17312},{"className":17311},[11485],[17313],{"type":283,"tag":284,"props":17314,"children":17315},{},[17316],{"type":283,"tag":11491,"props":17317,"children":17318},{},[17319],{"type":293,"value":17320},"Lesedauer: ca. 20 Minuten",{"type":283,"tag":532,"props":17322,"children":17324},{"id":17323},"entwicklungsumgebung-vs-realität-begrenzte-leistung-und-unbekannte-randfälle",[17325],{"type":293,"value":17326},"Entwicklungsumgebung vs. Realität: Begrenzte Leistung und unbekannte Randfälle",{"type":283,"tag":284,"props":17328,"children":17329},{},[17330,17335],{"type":283,"tag":11399,"props":17331,"children":17332},{},[17333],{"type":293,"value":17334},"These:",{"type":293,"value":17336}," Software-Projekte und Web-Anwendungen werden in Entwicklungsumgebungen gebaut, die in Leistung und Testdaten\nlimitiert sind.",{"type":283,"tag":284,"props":17338,"children":17339},{},[17340,17342,17347,17349,17354,17356,17361,17363,17368,17370,17376],{"type":293,"value":17341},"In der Entwicklungsphase läuft eine Web-Anwendung oft auf dem Laptop, einem Desktop-PC oder in einer isolierten\nTest-Umgebung der Entwickler. Diese ",{"type":283,"tag":11399,"props":17343,"children":17344},{},[17345],{"type":293,"value":17346},"Dev-Umgebung",{"type":293,"value":17348}," ist typischerweise ",{"type":283,"tag":11399,"props":17350,"children":17351},{},[17352],{"type":293,"value":17353},"weniger leistungsfähig",{"type":293,"value":17355}," als die späteren\nProduktionsserver und enthält nur einen Bruchteil echter Daten. Das ist zunächst normal – niemand hat eine vollständige\nKopie der Produktionsdatenbank auf seinem Laptop, und man will ja auch lokal schnell arbeiten können. Allerdings führt\ndiese Diskrepanz dazu, dass manche Probleme in der Dev-Umgebung gar nicht erst sichtbar werden. Ebenfalls kann sich bei\nperformance-Problemen schnell der Gedanke einschleichen, dass das Produktivsystem mit seiner überlegenen Leistung schon\nnicht so schwer damit zu kämpfen hat. Eine ",{"type":283,"tag":11399,"props":17357,"children":17358},{},[17359],{"type":293,"value":17360},"staging",{"type":293,"value":17362},"- oder Test-Umgebung kann versuchen, die Produktionsumgebung\nnachzuahmen, ",{"type":283,"tag":11399,"props":17364,"children":17365},{},[17366],{"type":293,"value":17367},"stößt aber an Grenzen",{"type":293,"value":17369},": Production environments haben Feinheiten, die in Staging nur schwer zu\nsimulieren sind – etwa das reale Nutzerverhalten, große Datenmengen oder komplexe System-Interaktionen\n",{"type":283,"tag":288,"props":17371,"children":17373},{"href":17372},"https://www.browserstack.com/guide/testing-in-production#:~:text=1.%20Real,only%20surface%20under%20specific%20conditions",[17374],{"type":293,"value":17375},"browserstack.com",{"type":293,"value":17377},"\n. Mit anderen Worten: In der Testumgebung läuft alles „schön sauber“, aber in der Realität kommen ganz andere Faktoren\nins Spiel.",{"type":283,"tag":284,"props":17379,"children":17380},{},[17381,17385],{"type":283,"tag":11399,"props":17382,"children":17383},{},[17384],{"type":293,"value":17334},{"type":293,"value":17386}," Entwickler und Kunden haben oft nicht den vollständigen Überblick über reale Anwendungsfälle, Edge-Cases und\nLastspitzen.",{"type":283,"tag":284,"props":17388,"children":17389},{},[17390,17392,17397,17399,17404,17406,17410,17412,17417],{"type":293,"value":17391},"Entwicklungsteams und selbst die Kunden kennen zwar die ",{"type":283,"tag":11491,"props":17393,"children":17394},{},[17395],{"type":293,"value":17396},"Hauptanwendungsfälle",{"type":293,"value":17398}," ihrer Software, doch ",{"type":283,"tag":11399,"props":17400,"children":17401},{},[17402],{"type":293,"value":17403},"reale Benutzer",{"type":293,"value":17405},"\ntreiben Anwendungen gerne an ihre Grenzen. Plötzlich nutzen sie Features in Kombinationen, an die niemand gedacht hat,\noder geben unerwartete Daten ein. Solche ",{"type":283,"tag":11399,"props":17407,"children":17408},{},[17409],{"type":293,"value":17254},{"type":293,"value":17411}," (Rand- oder Grenzfälle) bleiben in der Spezifikation oft\nunentdeckt. Erst im Echtbetrieb tauchen dann Fehler auf, die vorher niemand vorausgesehen hat. Ein Grund dafür ist,\ndass einige Bugs nur unter spezifischen Bedingungen auftreten, die man in Pre-Production-Tests nicht antizipiert.\nBeispielsweise könnte ein Nutzerprofil mit einem ",{"type":283,"tag":11491,"props":17413,"children":17414},{},[17415],{"type":293,"value":17416},"Emoji",{"type":293,"value":17418}," im Namen irgendwo in der Verarbeitung einen Fehler auslösen –\netwas, das im Testdatensatz nicht vorkam. Oder ein Kunde nutzt die Web-App auf einem älteren Browser und stößt auf\nDarstellungsprobleme. Solche Fälle zeigen sich oft erst, wenn die Anwendung „in freier Wildbahn“ verwendet wird.",{"type":283,"tag":284,"props":17420,"children":17421},{},[17422,17424,17429,17431,17436,17438,17443,17445,17450,17452,17456],{"type":293,"value":17423},"Zudem kennen Kunden zwar ihre Geschäftsprozesse, aber ",{"type":283,"tag":11399,"props":17425,"children":17426},{},[17427],{"type":293,"value":17428},"Lastspitzen",{"type":293,"value":17430}," durch Marketing-Aktionen oder völlig atypische\nNutzungszeiten (z.B. am Wochenende um 3 Uhr nachts) werden leicht unterschätzt. Die ",{"type":283,"tag":11399,"props":17432,"children":17433},{},[17434],{"type":293,"value":17435},"kritische Perspektive",{"type":293,"value":17437}," hier:\nModerne Ansätze versuchen diese Lücken zu schließen und propagieren, dass Entwicklungs- und Produktionsumgebung so\nähnlich wie möglich sein sollen (",{"type":283,"tag":11491,"props":17439,"children":17440},{},[17441],{"type":293,"value":17442},"dev/prod parity",{"type":293,"value":17444},"), um spätere Überraschungen zu minimieren.\n",{"type":283,"tag":11399,"props":17446,"children":17447},{},[17448],{"type":293,"value":17449},"Containerisierung",{"type":293,"value":17451}," (z.B. mit Docker) erlaubt es, lokal eine Umgebung zu schaffen, die zumindest in den\nAbhängigkeiten und Voraussetzungen der Software-Faktoren der Produktionsumgebung sehr nahekommt. Dennoch bleibt es\nillusorisch, wirklich ",{"type":283,"tag":11399,"props":17453,"children":17454},{},[17455],{"type":293,"value":17139},{"type":293,"value":17457}," realen Bedingungen vorwegzunehmen.",{"type":283,"tag":284,"props":17459,"children":17460},{},[17461,17465],{"type":283,"tag":11399,"props":17462,"children":17463},{},[17464],{"type":293,"value":17334},{"type":293,"value":17466}," Verhalten unter Dauerlast, externen Crawlern, Penetration-Tests oder Spam-Bots sind schwer simulierbar.",{"type":283,"tag":284,"props":17468,"children":17469},{},[17470,17472,17477,17479,17484,17486,17491,17493,17498],{"type":293,"value":17471},"Performance-Tests gehören zwar zum guten Ton, aber ",{"type":283,"tag":11399,"props":17473,"children":17474},{},[17475],{"type":293,"value":17476},"dauerhafte Last 24/7",{"type":293,"value":17478}," über Wochen hinweg lässt sich „im Labor“\nkaum vollständig nachstellen. Viele Unternehmen führen vor einem Launch Stresstests durch – doch diese laufen oft nur\nwenige Stunden oder Tage. Wie sich die Anwendung über Monate verhält (Memory Leaks? Datenbank wächst unvorhergesehen?\nLogs füllen die Festplatte?) bleibt offen. Auch ",{"type":283,"tag":11399,"props":17480,"children":17481},{},[17482],{"type":293,"value":17483},"böswillige Zugriffe",{"type":293,"value":17485}," sind ein Thema. Externe ",{"type":283,"tag":11399,"props":17487,"children":17488},{},[17489],{"type":293,"value":17490},"Crawler",{"type":293,"value":17492}," (z.B. von\nGoogle, Bing, oder sonstigen) könnten massenhaft Seiten aufrufen oder ",{"type":283,"tag":11399,"props":17494,"children":17495},{},[17496],{"type":293,"value":17497},"Spam-Bots",{"type":293,"value":17499}," atypische Eingaben und Aufrufe\nverursachen. Ein Dauerbeschuss durch ein Penetration-Testing-Tool oder gar eine echte Angriffssimulation (Stichwort\nDDoS) ist nur begrenzt machbar, ohne die echten Systeme evtl. zu gefährden oder für den Tagesbetrieb unbrauchbar zu\nmachen.",{"type":283,"tag":284,"props":17501,"children":17502},{},[17503,17505,17510,17512,17517],{"type":293,"value":17504},"Die Community der Entwickler und Dev-Ops ist sich hier einig: Es ist ",{"type":283,"tag":11399,"props":17506,"children":17507},{},[17508],{"type":293,"value":17509},"unheimlich schwierig, Produktionslast wirklich zu\nsimulieren",{"type":293,"value":17511},". Selbst mit Testumgebungen, die der Prod-Umgebung ähneln, können unvorhergesehene Effekte auftreten. Ein\ninteressanter Ansatz ist dabei beinahe kontraintuitiv: Manchmal nutzt man ",{"type":283,"tag":11399,"props":17513,"children":17514},{},[17515],{"type":293,"value":17516},"absichtlich unterdimensionierte\nTestumgebungen",{"type":293,"value":17518},", um Schwachstellen zu entdecken. In dem erwähnten Bericht führte eine kleine Test-Datenbank dazu, dass\nein wachsendes Log schneller die Platte füllte – ein Problem, das in einer großen Umgebung erst viel später aufgefallen\nwäre.",{"type":283,"tag":284,"props":17520,"children":17521},{},[17522,17523,17528,17530,17535,17537,17542,17544,17549,17550,17558,17559,17564,17570],{"type":293,"value":9340},{"type":283,"tag":11399,"props":17524,"children":17525},{},[17526],{"type":293,"value":17527},"überwiegende Meinung",{"type":293,"value":17529}," in der Tech-Community ist jedoch, dass ",{"type":283,"tag":11399,"props":17531,"children":17532},{},[17533],{"type":293,"value":17534},"nichts an echte Produktions-Tests herankommt",{"type":293,"value":17536},".\nGroße Player wie Netflix propagieren sogar ",{"type":283,"tag":11491,"props":17538,"children":17539},{},[17540],{"type":293,"value":17541},"Chaos Engineering",{"type":293,"value":17543},", bei dem in der laufenden Produktion gezielt Störungen\nerzeugt werden, um die Systemrobustheit zu prüfen. Ein Experte fasst es so zusammen: ",{"type":283,"tag":11491,"props":17545,"children":17546},{},[17547],{"type":293,"value":17548},"„Um effektiv zu testen, muss das\nSystem in Produktion laufen. Schließlich kann man erst",{"type":293,"value":16697},{"type":283,"tag":11491,"props":17551,"children":17552},{},[17553],{"type":283,"tag":11399,"props":17554,"children":17555},{},[17556],{"type":293,"value":17557},"in Produktion",{"type":293,"value":16697},{"type":283,"tag":11491,"props":17560,"children":17561},{},[17562],{"type":293,"value":17563},"mit Faktoren wie Zustandsdaten, echten\nInputs und dem Verhalten externer Systeme arbeiten“",{"type":283,"tag":288,"props":17565,"children":17567},{"href":17566},"https://www.techtarget.com/searchsoftwarequality/tip/9-techniques-for-fixing-bugs-in-production#:~:text=want%20it%20to%2C%20and%20code,and%20how%20external%20systems%20behave",[17568],{"type":293,"value":17569},"techtarget.com",{"type":293,"value":17571},"\n. Das heißt, einige Fehler werden wir erst sehen, wenn wir live gehen. Wichtig ist dann, schnell reagieren zu können –\nund genau hier setzt DevOps an.",{"type":283,"tag":532,"props":17573,"children":17575},{"id":17574},"nach-dem-launch-ist-vor-dem-launch-analyse-und-optimierung-im-laufenden-betrieb",[17576],{"type":293,"value":17577},"Nach dem Launch ist vor dem Launch: Analyse und Optimierung im laufenden Betrieb",{"type":283,"tag":284,"props":17579,"children":17580},{},[17581,17585],{"type":283,"tag":11399,"props":17582,"children":17583},{},[17584],{"type":293,"value":17334},{"type":293,"value":17586}," Weitergehende Analyse und Optimierung nach dem Launch ist essenziell.",{"type":283,"tag":284,"props":17588,"children":17589},{},[17590,17592,17596,17598,17603,17605,17610,17616],{"type":293,"value":17591},"Früher galt ein Software-Projekt mit dem Go-Live als abgeschlossen – heute weiß man, dass ",{"type":283,"tag":11399,"props":17593,"children":17594},{},[17595],{"type":293,"value":17267},{"type":293,"value":17597},"\n(kontinuierliche Verbesserung) ein zentraler Bestandteil erfolgreicher Software ist. Gerade ",{"type":283,"tag":11399,"props":17599,"children":17600},{},[17601],{"type":293,"value":17602},"nach dem Launch",{"type":293,"value":17604}," beginnt\ndie Phase, in der echte Nutzungsdaten ausgewertet, Engpässe erkannt und Optimierungen ausgerollt werden. So betont ein\nFachartikel: ",{"type":283,"tag":11491,"props":17606,"children":17607},{},[17608],{"type":293,"value":17609},"„Selbst mit gründlichem Pre-Launch-Testing können echte Anwender in der Praxis Performance-Probleme\naufdecken, die während der Entwicklung nicht offensichtlich waren. Post-Launch-Monitoring hilft, diese Probleme zu\nidentifizieren, bevor sie eine große Zahl von Nutzern beeinträchtigen“",{"type":283,"tag":288,"props":17611,"children":17613},{"href":17612},"https://www.topdevelopers.co/blog/post-launch-support-in-software-development/#:~:text=Even%20with%20rigorous%20pre,a%20large%20number%20of%20users",[17614],{"type":293,"value":17615},"topdevelopers.co",{"type":293,"value":17617},"\n. Anders ausgedrückt: Ein Launch ohne anschließende Überwachung ist wie die Jungfernfahrt ohne jemanden am Steuerrad.\nIn der Praxis unterschätzen gerade kleinere und mittelständische Unternehmen diesen Aufwand gern.",{"type":283,"tag":284,"props":17619,"children":17620},{},[17621,17626,17628,17633,17635,17640,17642,17647,17649,17654,17656,17661],{"type":283,"tag":11399,"props":17622,"children":17623},{},[17624],{"type":293,"value":17625},"Kritische Perspektive:",{"type":293,"value":17627}," Manche denken, eine gute Software würde „out of the box“ laufen – doch das ist nach unserer\nErfahrung nur extrem selten der Fall. Es braucht Zeit und iterative Verbesserungen, um eine (Web-)Anwendung zu\n",{"type":283,"tag":11399,"props":17629,"children":17630},{},[17631],{"type":293,"value":17632},"stabilisieren und zu beschleunigen",{"type":293,"value":17634},". Studien zeigen, dass ",{"type":283,"tag":11491,"props":17636,"children":17637},{},[17638],{"type":293,"value":17639},"kontinuierliche Pflege",{"type":293,"value":17641}," die ",{"type":283,"tag":11399,"props":17643,"children":17644},{},[17645],{"type":293,"value":17646},"Nutzerzufriedenheit und\n-bindung",{"type":293,"value":17648}," deutlich erhöhten kann. Dazu gehören regelmäßige ",{"type":283,"tag":11399,"props":17650,"children":17651},{},[17652],{"type":293,"value":17653},"Bugfixes",{"type":293,"value":17655},", Performance-Tuning (z.B. Caching-Strategien anpassen, Datenbank-Indices\noptimieren) und auch ",{"type":283,"tag":11399,"props":17657,"children":17658},{},[17659],{"type":293,"value":17660},"Security-Patches",{"type":293,"value":17662},". Gerade Sicherheitslücken, die erst nach und nach publik werden, müssen sofort\ngeschlossen werden, um Schaden abzuwenden.",{"type":283,"tag":284,"props":17664,"children":17665},{},[17666,17668,17673,17675,17680,17682,17687],{"type":293,"value":17667},"Ein weiterer Aspekt ist die ",{"type":283,"tag":11399,"props":17669,"children":17670},{},[17671],{"type":293,"value":17672},"Feedback-Schleife",{"type":293,"value":17674},": Durch echtes Nutzer-Feedback erfährt man, welche Features gut\nankommen und wo eventuell Usability-Probleme bestehen. Dieses Feedback fließt idealerweise direkt ins Backlog des\nEntwicklungsteams ein. Eine Kultur der ",{"type":283,"tag":11491,"props":17676,"children":17677},{},[17678],{"type":293,"value":17679},"Continuous Deployment",{"type":293,"value":17681}," stellt sicher, dass Verbesserungen zeitnah zu den Kunden\ngelangen und nicht bis zum nächsten großen „Release“ aufgeschoben werden. Moderne DevOps-Teams betrachten ihre Software\nals lebendiges Produkt: ",{"type":283,"tag":11491,"props":17683,"children":17684},{},[17685],{"type":293,"value":17686},"„Software endet nicht mit dem Launch – sie sollte als lebendiges Produkt gesehen werden.\nPost-Launch-Support ermöglicht kontinuierliche Verbesserung anhand von Nutzerfeedback und Performance-Daten“",{"type":293,"value":1302},{"type":283,"tag":284,"props":17689,"children":17690},{},[17691,17692,17697,17699,17704,17706,17711],{"type":293,"value":9340},{"type":283,"tag":11399,"props":17693,"children":17694},{},[17695],{"type":293,"value":17696},"aktuelle Praxis",{"type":293,"value":17698}," in erfolgreichen Unternehmen zeigt klar: Nach dem Launch ist vor dem Launch. ",{"type":283,"tag":11399,"props":17700,"children":17701},{},[17702],{"type":293,"value":17703},"Stagnation",{"type":293,"value":17705}," ist\ngefährlich – wer nach dem Go-Live nicht in ",{"type":283,"tag":11399,"props":17707,"children":17708},{},[17709],{"type":293,"value":17710},"Monitoring, Fehlerbehebung und Optimierung",{"type":293,"value":17712}," investiert, riskiert Ausfälle,\nunzufriedene Nutzende und veraltete Software. Für Mittelständler bedeutet das konkret, genügend Ressourcen für die\nBetriebsphase einzuplanen oder einen kompetenten Partner zu haben, der das Monitoring und die Wartung übernimmt.",{"type":283,"tag":532,"props":17714,"children":17716},{"id":17715},"monitoring-und-logging-ohne-beobachtung-geht-es-nicht",[17717],{"type":293,"value":17718},"Monitoring und Logging: Ohne Beobachtung geht es nicht",{"type":283,"tag":284,"props":17720,"children":17721},{},[17722,17726],{"type":283,"tag":11399,"props":17723,"children":17724},{},[17725],{"type":293,"value":17334},{"type":293,"value":17727}," Monitoring-Tools wie Sentry oder Grafana sind unerlässlich für Logging und Fehleranalyse.",{"type":283,"tag":284,"props":17729,"children":17730},{},[17731,17733,17738,17740,17747,17748,17755,17757,17760],{"type":293,"value":17732},"Um im laufenden Betrieb Probleme schnell zu erkennen, sind ",{"type":283,"tag":11399,"props":17734,"children":17735},{},[17736],{"type":293,"value":17737},"Monitoring- und Logging-Tools",{"type":293,"value":17739}," absolut entscheidend. Zwei\nprominente Vertreter sind ",{"type":283,"tag":288,"props":17741,"children":17742},{"href":17272},[17743],{"type":283,"tag":11399,"props":17744,"children":17745},{},[17746],{"type":293,"value":1542},{"type":293,"value":9440},{"type":283,"tag":288,"props":17749,"children":17750},{"href":17282},[17751],{"type":283,"tag":11399,"props":17752,"children":17753},{},[17754],{"type":293,"value":17288},{"type":293,"value":17756}," (oft in Kombination mit Time-Series-Datenbanken wie Prometheus oder\nLog-Datenbanken wie ElasticSearch/Loki).\n",{"type":283,"tag":1321,"props":17758,"children":17759},{},[],{"type":283,"tag":1321,"props":17761,"children":17762},{},[],{"type":283,"tag":457,"props":17764,"children":17765},{},[17766,17817],{"type":283,"tag":461,"props":17767,"children":17768},{},[17769,17776,17778,17783,17785,17790,17792,17801,17803,17808,17810,17815],{"type":283,"tag":288,"props":17770,"children":17771},{"href":17272},[17772],{"type":283,"tag":11399,"props":17773,"children":17774},{},[17775],{"type":293,"value":1542},{"type":293,"value":17777}," ist ein spezialisiertes Tool für ",{"type":283,"tag":11399,"props":17779,"children":17780},{},[17781],{"type":293,"value":17782},"Error Tracking",{"type":293,"value":17784},". Es fängt Fehler und Exceptions der Anwendung ab und\nsammelt sie zentral. Warum ist das wichtig? In Produktion kann ein Entwickler nicht einfach mit dem Debugger am Code\nhängen. Sentry schließt diese Lücke: Es liefert detaillierte Fehlerreports (mit Stacktrace, User-Informationen,\nKontextvariablen etc.), sobald irgendwo im Code eine Exception auftritt. In der Dev-Community gilt Sentry daher\nmittlerweile als ",{"type":283,"tag":11399,"props":17786,"children":17787},{},[17788],{"type":293,"value":17789},"industrieller Standard",{"type":293,"value":17791},", wenn es um Crash-Reporting geht\n",{"type":283,"tag":288,"props":17793,"children":17795},{"href":17794},"https://medium.com/@AndrzejSala/efficient-error-tracking-with-sentry-e975c186947c#:~:text=Sentry%20is%20a%20crash,an%20industry%20standard%20by%20TechRadar",[17796,17798],{"type":293,"value":17797},"medium.com",{"type":283,"tag":1321,"props":17799,"children":17800},{},[],{"type":293,"value":17802},".\nSelbst weniger erfahrene Entwickler finden mit Sentry schneller die Ursache von Fehlern, weil das Tool viel manuelle\nDetektivarbeit abnimmt. Ohne ein Tool wie Sentry bekommt man viele Fehler in einer komplexen Web-Anwendung gar nicht\nmit, bis Nutzende sich beschweren. Mit Sentry hingegen erfährt das Team oft ",{"type":283,"tag":11399,"props":17804,"children":17805},{},[17806],{"type":293,"value":17807},"sofort",{"type":293,"value":17809},", wenn irgendwo ein Fehler\npassiert – und kann proaktiv reagieren, ",{"type":283,"tag":11399,"props":17811,"children":17812},{},[17813],{"type":293,"value":17814},"bevor",{"type":293,"value":17816}," alle Nutzenden betroffen sind.",{"type":283,"tag":461,"props":17818,"children":17819},{},[17820,17827,17829,17834,17836,17841,17843,17848,17850,17855,17857,17862,17864,17869,17871,17876,17878,17883],{"type":283,"tag":288,"props":17821,"children":17822},{"href":17282},[17823],{"type":283,"tag":11399,"props":17824,"children":17825},{},[17826],{"type":293,"value":17288},{"type":293,"value":17828}," dagegen adressiert das ",{"type":283,"tag":11399,"props":17830,"children":17831},{},[17832],{"type":293,"value":17833},"Performance-Monitoring und die Visualisierung",{"type":293,"value":17835}," von Systemmetriken. Grafana\nselbst ist eigentlich ein Dashboard-Werkzeug, das verschiedene Datenquellen einbinden kann – von Server-CPU-Auslastung\nüber Datenbank-Performance bis hin zu anwendungsspezifischen KPIs. In Kombination mit z.B. ",{"type":283,"tag":11399,"props":17837,"children":17838},{},[17839],{"type":293,"value":17840},"Prometheus",{"type":293,"value":17842}," (für\nMetrik-Sammlung) oder ",{"type":283,"tag":11399,"props":17844,"children":17845},{},[17846],{"type":293,"value":17847},"Loki",{"type":293,"value":17849}," (für Log-Sammlung) entsteht so ein mächtiges ",{"type":283,"tag":11399,"props":17851,"children":17852},{},[17853],{"type":293,"value":17854},"Monitoring-Cockpit",{"type":293,"value":17856},". Man möchte ",{"type":283,"tag":11491,"props":17858,"children":17859},{},[17860],{"type":293,"value":17861},"auf\neinen Blick",{"type":293,"value":17863}," sehen können, ob alle Systeme grün sind, wo vielleicht Engpässe drohen oder ob ungewöhnliche Ausschläge\nauftreten. Konkret bedeutet dies: Grafana & Co. helfen dabei, ",{"type":283,"tag":11399,"props":17865,"children":17866},{},[17867],{"type":293,"value":17868},"Trends",{"type":293,"value":17870}," zu erkennen (z.B. stetig steigende\nSpeicherlast), ",{"type":283,"tag":11399,"props":17872,"children":17873},{},[17874],{"type":293,"value":17875},"Anomalien",{"type":293,"value":17877}," aufzuspüren (z.B. plötzlicher Traffic-Anstieg um Mitternacht) und im Fehlerfall schnell\ndie ",{"type":283,"tag":11399,"props":17879,"children":17880},{},[17881],{"type":293,"value":17882},"Ursache einzugrenzen",{"type":293,"value":1302},{"type":283,"tag":1321,"props":17885,"children":17886},{},[],{"type":283,"tag":17888,"props":17889,"children":17890},"icons-dev-ops",{},[],{"type":283,"tag":284,"props":17892,"children":17893},{},[17894,17898,17900,17905,17907,17912,17914,17919,17921,17926,17928,17933],{"type":283,"tag":11399,"props":17895,"children":17896},{},[17897],{"type":293,"value":17625},{"type":293,"value":17899}," Braucht jede kleinere Web-Anwendung gleich so ein Arsenal an Tools? Einige kleinere\nUnternehmen versuchen zunächst, ohne dediziertes Monitoring auszukommen, und verlassen sich auf einfache Logs oder\nmanuelles Überprüfen. Unsere persönliche Erfahrung zeigt jedoch: ",{"type":283,"tag":11399,"props":17901,"children":17902},{},[17903],{"type":293,"value":17904},"Spätestens beim ersten größeren Problem wird klar,\ndass Monitoring kein „nice-to-have“, sondern ein echter Mehrwert",{"type":293,"value":17906}," ist. Ohne diese Tools tappt man schnell und lange im\nDunkeln und wühlt sich durch Log-Dateien. Essentiell ist jedoch, die ",{"type":283,"tag":11399,"props":17908,"children":17909},{},[17910],{"type":293,"value":17911},"Flut an Daten",{"type":293,"value":17913}," richtig zu kanalisieren und dann\nzu interpretieren. Monitoring richtig aufzusetzen kostet anfangs Zeit (und erfordert etwas Expertise), zahlt sich aber\nbeim ersten Incident vielfach aus. Ein gut konfiguriertes Monitoring vermeidet zudem ",{"type":283,"tag":11491,"props":17915,"children":17916},{},[17917],{"type":293,"value":17918},"Alert Fatigue",{"type":293,"value":17920}," – also zu viele\nFehlalarme. Hier ist ",{"type":283,"tag":11399,"props":17922,"children":17923},{},[17924],{"type":293,"value":17925},"Qualität vor Quantität",{"type":293,"value":17927}," gefragt. Lieber wenige, dafür aussagekräftige Metriken und Alerts. Wir\nraten allen unseren Kunden mit Nachdruck: ",{"type":283,"tag":11491,"props":17929,"children":17930},{},[17931],{"type":293,"value":17932},"die Investition in Monitoring- und Logging-Tools sind unerlässlich",{"type":293,"value":17934},", um im\nFehlerfall handlungsfähig zu bleiben!",{"type":283,"tag":532,"props":17936,"children":17938},{"id":17937},"automatische-alerts-zabbix-und-co-als-wächter-der-systeme",[17939],{"type":293,"value":17940},"Automatische Alerts: Zabbix und Co. als Wächter der Systeme",{"type":283,"tag":284,"props":17942,"children":17943},{},[17944,17948],{"type":283,"tag":11399,"props":17945,"children":17946},{},[17947],{"type":293,"value":17334},{"type":293,"value":17949}," Überwachungstools wie Zabbix sind notwendig für Alerts bei kritischen Systemzuständen.",{"type":283,"tag":284,"props":17951,"children":17952},{},[17953,17955,17960,17962,17966,17967,17972,17973,17978,17980,17987,17989,17994,17996,18001],{"type":293,"value":17954},"Neben dem reinen Beobachten von Metriken wollen wir natürlich ",{"type":283,"tag":11399,"props":17956,"children":17957},{},[17958],{"type":293,"value":17959},"automatisch alarmiert",{"type":293,"value":17961}," werden, wenn etwas aus dem Ruder\nläuft. Hier kommen Systemüberwachungs-Tools wie ",{"type":283,"tag":11399,"props":17963,"children":17964},{},[17965],{"type":293,"value":17299},{"type":293,"value":9934},{"type":283,"tag":11399,"props":17968,"children":17969},{},[17970],{"type":293,"value":17971},"Nagios",{"type":293,"value":9934},{"type":283,"tag":11399,"props":17974,"children":17975},{},[17976],{"type":293,"value":17977},"Icinga",{"type":293,"value":17979}," etc. ins Spiel. Bleiben wir bei\n",{"type":283,"tag":288,"props":17981,"children":17982},{"href":17293},[17983],{"type":283,"tag":11399,"props":17984,"children":17985},{},[17986],{"type":293,"value":17299},{"type":293,"value":17988},"als Beispiel: Zabbix ist ein Open-Source-Monitoring-System, das vordefinierte ",{"type":283,"tag":11399,"props":17990,"children":17991},{},[17992],{"type":293,"value":17993},"Trigger",{"type":293,"value":17995}," und\n",{"type":283,"tag":11399,"props":17997,"children":17998},{},[17999],{"type":293,"value":18000},"Benachrichtigungen",{"type":293,"value":18002}," bietet. Man kann Grenzwerte festlegen – z.B. „CPU-Last > 90% über 5 Minuten“ oder „weniger als 10%\nfreier Plattenplatz“ – und sobald diese erreicht sind, sendet Zabbix einen Alarm (per E-Mail, SMS, Slack usw.).",{"type":283,"tag":284,"props":18004,"children":18005},{},[18006,18008,18012,18014,18019,18021,18025,18027,18032],{"type":293,"value":18007},"Warum braucht man das, wo wir doch eben Grafana & Co. gelobt haben? Der Unterschied: ",{"type":283,"tag":11399,"props":18009,"children":18010},{},[18011],{"type":293,"value":17288},{"type":293,"value":18013}," ist super für\nVisualisierung und Analyse, aber ",{"type":283,"tag":11399,"props":18015,"children":18016},{},[18017],{"type":293,"value":18018},"aktive Alarmierung",{"type":293,"value":18020}," übernimmt oft ein dediziertes Tool wie Zabbix (oder Grafana wird\nmit einem Alertmanager kombiniert). ",{"type":283,"tag":11399,"props":18022,"children":18023},{},[18024],{"type":293,"value":17299},{"type":293,"value":18026}," und ähnliche Tools sind quasi die ",{"type":283,"tag":11399,"props":18028,"children":18029},{},[18030],{"type":293,"value":18031},"Nachtwächter",{"type":293,"value":18033},", die unermüdlich auf\ndefinierte Bedingungen achten.",{"type":283,"tag":284,"props":18035,"children":18036},{},[18037,18039,18044,18050,18052,18056],{"type":293,"value":18038},"Die Wichtigkeit solcher Alerts kann man gar nicht überschätzen. Ein treffendes Zitat aus einem Linux-Journal-Artikel:\n",{"type":283,"tag":11491,"props":18040,"children":18041},{},[18042],{"type":293,"value":18043},"„Alerts und Trigger sind der Herzschlag des Monitorings. Zabbix lässt einen spezifische Bedingungen definieren, bei\nderen Eintreten Benachrichtigungen über verschiedene Kanäle versendet werden, sodass man unverzüglich über kritische\nEreignisse informiert wird“",{"type":283,"tag":288,"props":18045,"children":18047},{"href":18046},"https://www.linuxjournal.com/content/how-monitor-your-system-zabbix#:~:text=Alerts%20and%20triggers%20are%20the,that%20could%20impact%20system%20performance",[18048],{"type":293,"value":18049},"linuxjournal.com",{"type":293,"value":18051},"\n. Ohne ein Alerting-System kann es passieren, dass ein Problem stundenlang unentdeckt bleibt – im schlimmsten Fall\nerfährt man es zuerst vom verärgerten Kunden am Telefon. Mit richtig konfigurierten Alerts erfährt das Team hingegen\n",{"type":283,"tag":11399,"props":18053,"children":18054},{},[18055],{"type":293,"value":17807},{"type":293,"value":18057},", wenn zum Beispiel der Webserver ausgefallen ist oder die Antwortzeiten kritisch hochgehen.",{"type":283,"tag":284,"props":18059,"children":18060},{},[18061,18066,18068,18073,18075,18080,18082,18087],{"type":283,"tag":11399,"props":18062,"children":18063},{},[18064],{"type":293,"value":18065},"Praxisblick:",{"type":293,"value":18067}," Für mittelständische Unternehmen, die vielleicht kein 24/7-Betriebsteam haben, ist ein gutes Alerting\nnoch wichtiger. Es ermöglicht kleinen Teams, effizient zu arbeiten, weil sie sich auf die Warnmeldungen verlassen\nkönnen, anstatt ständig manuell alles zu überprüfen. Allerdings gilt auch hier, dass ein schlecht konfiguriertes System,\ndas andauernd „Wölfe, Wölfe, …“ schreit (Stichwort ",{"type":283,"tag":11491,"props":18069,"children":18070},{},[18071],{"type":293,"value":18072},"false positives",{"type":293,"value":18074},"), wird schnell ignoriert. Die Kunst ist,\n",{"type":283,"tag":11399,"props":18076,"children":18077},{},[18078],{"type":293,"value":18079},"sinnvolle Grenzwerte",{"type":293,"value":18081}," zu definieren und ",{"type":283,"tag":11399,"props":18083,"children":18084},{},[18085],{"type":293,"value":18086},"kontextreiche Alerts",{"type":293,"value":18088}," zu versenden (z.B. direkt mit Hinweis, welche\nKomponente betroffen ist, Logs anhängen etc.).",{"type":283,"tag":284,"props":18090,"children":18091},{},[18092,18099,18101,18106],{"type":283,"tag":288,"props":18093,"children":18094},{"href":17293},[18095],{"type":283,"tag":11399,"props":18096,"children":18097},{},[18098],{"type":293,"value":17299},{"type":293,"value":18100}," hat sich in vielen unserer Projekte bewährt und wird bei uns intern oft als ",{"type":283,"tag":11399,"props":18102,"children":18103},{},[18104],{"type":293,"value":18105},"unverzichtbares Werkzeug",{"type":293,"value":18107},"\ngenannt.",{"type":283,"tag":532,"props":18109,"children":18111},{"id":18110},"cicd-pipelines-standardisierte-deployments-auch-für-anfänger",[18112],{"type":293,"value":18113},"CI/CD-Pipelines: Standardisierte Deployments – auch für Anfänger",{"type":283,"tag":284,"props":18115,"children":18116},{},[18117,18121],{"type":283,"tag":11399,"props":18118,"children":18119},{},[18120],{"type":293,"value":17334},{"type":293,"value":18122}," CI/CD-Pipelines ermöglichen standardisierte, sichere Deployments auch für wenig erfahrene Entwickler.",{"type":283,"tag":284,"props":18124,"children":18125},{},[18126,18128,18132,18134,18139,18141,18146,18148,18153],{"type":293,"value":18127},"Die Begriffe ",{"type":283,"tag":11399,"props":18129,"children":18130},{},[18131],{"type":293,"value":1564},{"type":293,"value":18133}," stehen für ",{"type":283,"tag":11491,"props":18135,"children":18136},{},[18137],{"type":293,"value":18138},"Continuous Integration",{"type":293,"value":18140}," (kontinuierliche Integration) und ",{"type":283,"tag":11491,"props":18142,"children":18143},{},[18144],{"type":293,"value":18145},"Continuous\nDelivery/Deployment",{"type":293,"value":18147}," (kontinuierliche Auslieferung bzw. Bereitstellung). Eine ",{"type":283,"tag":11399,"props":18149,"children":18150},{},[18151],{"type":293,"value":18152},"CI/CD-Pipeline",{"type":293,"value":18154}," ist eine automatisierte\nProzesskette, die Code vom Commit bis zum Rollout durchbaut, testet und schließlich deployt. Warum ist das so wichtig –\nund wie hilft es weniger erfahrenen Entwicklern?",{"type":283,"tag":284,"props":18156,"children":18157},{},[18158,18160,18165,18167,18172],{"type":293,"value":18159},"In traditionellen Entwicklungsabläufen war das ",{"type":283,"tag":11399,"props":18161,"children":18162},{},[18163],{"type":293,"value":18164},"Deployment",{"type":293,"value":18166}," oft Handarbeit, ausgeführt von erfahrenen Admins oder\nDevOps-Engineers, weil viel schiefgehen konnte (fehlende Abhängigkeiten, falsche Configs, Downtime vermeiden etc.). Mit\neiner gut eingerichteten CI/CD-Pipeline wird Deployment jedoch zu einem ",{"type":283,"tag":11399,"props":18168,"children":18169},{},[18170],{"type":293,"value":18171},"standardisierten, wiederholbaren Vorgang",{"type":293,"value":18173}," –\nim Idealfall auf Knopfdruck. Selbst wenn ein Entwickler noch nie manuell einen Linux-Server eingerichtet hat, kann er\ndurch die Pipeline-Funktionalität Code live stellen, weil die Pipeline ihm die nötigen Schritte abnimmt.",{"type":283,"tag":284,"props":18175,"children":18176},{},[18177,18182,18184,18189,18191,18195,18196,18201,18203,18208],{"type":283,"tag":11399,"props":18178,"children":18179},{},[18180],{"type":293,"value":18181},"Sicherheit und Qualität",{"type":293,"value":18183}," kommen dabei nicht zu kurz – im Gegenteil. Gerade weniger erfahrene Entwickler profitieren\ndavon, dass die Pipeline ",{"type":283,"tag":11491,"props":18185,"children":18186},{},[18187],{"type":293,"value":18188},"vor",{"type":293,"value":18190}," dem Deployment automatisierte ",{"type":283,"tag":11399,"props":18192,"children":18193},{},[18194],{"type":293,"value":6786},{"type":293,"value":9440},{"type":283,"tag":11399,"props":18197,"children":18198},{},[18199],{"type":293,"value":18200},"Code-Checks",{"type":293,"value":18202}," ausführt. So werden Fehler\nabgefangen, bevor sie auf die Nutzerschaft losgelassen werden. Zudem sorgt die Pipeline dafür, dass immer auf ",{"type":283,"tag":11399,"props":18204,"children":18205},{},[18206],{"type":293,"value":18207},"die\ngleiche Weise",{"type":293,"value":18209}," deployed wird – es gibt keine Abweichungen, die durch menschliches Vergessen passieren (z.B. „Oops, die\nstaging Config auf Prod geladen“ – solche Patzer werden eliminiert). Für KMUs bedeutet das: schnellere Updates bei\ngleichzeitig geringerer Fehlerquote.",{"type":283,"tag":284,"props":18211,"children":18212},{},[18213,18215,18220,18222,18227],{"type":293,"value":18214},"Natürlich erfordert das Einrichten einer CI/CD-Pipeline zunächst ",{"type":283,"tag":11399,"props":18216,"children":18217},{},[18218],{"type":293,"value":18219},"Know-how und Aufwand",{"type":293,"value":18221},". Hier kommt oft ein\nDevOps-Spezialist ins Spiel, der eine solche Pipeline (z.B. mit Jenkins, GitLab CI, GitHub Actions oder Bitbucket\nPipelines) aufbaut. ",{"type":283,"tag":11399,"props":18223,"children":18224},{},[18225],{"type":293,"value":18226},"Kritisch betrachtet",{"type":293,"value":18228}," argumentieren manche, dass in einem perfekten DevOps-Team diese\nUnterscheidung zwischen Entwicklern und DevOps gar nicht mehr nötig wäre, weil alle für den Prozess verantwortlich sind.\nIn der Realität ist es aber gerade für weniger erfahrene Entwickler eine enorme Erleichterung, wenn ein robustes\nCI/CD-System existiert – es nimmt ihnen die Deployment-Angst (das gilt auch für mich selbst als\nProjekt-Verantwortlicher). Ein Junior-Entwickler kann mit ruhigem Gewissen auf „Deploy“ klicken, weil er weiß, wenn\nautomatisierte Tests durchlaufen sind und der Rollout kontrolliert abläuft, besteht ein Mindestmaß an Sicherheit, dass\ndas Produktivsystem nicht beeinträchtigt wird.",{"type":283,"tag":284,"props":18230,"children":18231},{},[18232,18234,18239,18241,18246,18248,18253],{"type":293,"value":18233},"Wichtig ist, dass CI/CD nicht nur technische, sondern auch ",{"type":283,"tag":11399,"props":18235,"children":18236},{},[18237],{"type":293,"value":18238},"kulturelle Veränderungen",{"type":293,"value":18240}," mit sich bringt. Deployments\nwerden kleiner, dafür häufiger. Das reduziert Risiko und Fehler-Impact. Teams gewöhnen sich daran, dass Deployments\n",{"type":283,"tag":11491,"props":18242,"children":18243},{},[18244],{"type":293,"value":18245},"Alltag",{"type":293,"value":18247}," sind und nicht „Großkampftage“. Gerade in der ",{"type":283,"tag":11399,"props":18249,"children":18250},{},[18251],{"type":293,"value":18252},"Agilen Entwicklung",{"type":293,"value":18254}," ist CI/CD quasi das Rückgrat, um schnelle\nIterationen überhaupt zu ermöglichen.",{"type":283,"tag":284,"props":18256,"children":18257},{},[18258,18260,18265],{"type":293,"value":18259},"Zusammengefasst: CI/CD-Pipelines sind ein Game-Changer, der auch weniger erfahrene Entwickler befähigt,\n",{"type":283,"tag":11399,"props":18261,"children":18262},{},[18263],{"type":293,"value":18264},"auf Knopfdruck",{"type":293,"value":18266}," auszuliefern – zuverlässig und wiederholbar.",{"type":283,"tag":532,"props":18268,"children":18270},{"id":18269},"erfahrung-zählt-live-daten-spezielle-fehler-und-die-rolle-von-devops-experten",[18271],{"type":293,"value":18272},"Erfahrung zählt: Live-Daten, spezielle Fehler und die Rolle von DevOps-Experten",{"type":283,"tag":284,"props":18274,"children":18275},{},[18276,18280],{"type":283,"tag":11399,"props":18277,"children":18278},{},[18279],{"type":293,"value":17334},{"type":293,"value":18281}," Bestimmte Fehler und Performance-Probleme zeigen sich nur auf Live-Daten und erfordern erfahrene\nDevOps-Spezialisten.",{"type":283,"tag":284,"props":18283,"children":18284},{},[18285,18287,18292,18294,18299,18301,18306],{"type":293,"value":18286},"Trotz aller Automatisierung und Testing bleibt die ",{"type":283,"tag":11399,"props":18288,"children":18289},{},[18290],{"type":293,"value":18291},"Erfahrung",{"type":293,"value":18293}," im Umgang mit Produktionssystemen ist durch nichts zu\nersetzen. Es gibt Fehlerbilder, die erst bei echten ",{"type":283,"tag":11399,"props":18295,"children":18296},{},[18297],{"type":293,"value":18298},"Live-Daten und Lasten",{"type":293,"value":18300}," auftreten – etwa aufgrund komplexer\nDatenkonstellationen oder schlichter Skalierungseffekte. Ein Query, der mit 100 Test-Datensätzen blitzschnell ist, kann\nmit 100 Millionen echten Datensätzen plötzlich zum Flaschenhals werden. Oder ein ",{"type":283,"tag":11399,"props":18302,"children":18303},{},[18304],{"type":293,"value":18305},"Memory-Leak",{"type":293,"value":18307}," in einer bestimmten\nLibrary fällt erst nach Wochen Dauerbetrieb auf, wenn der Prozess immer mehr Speicher belegt. Solche Probleme zu\nerkennen und zu beheben, erfordert oft einen erfahrenen Blick.",{"type":283,"tag":284,"props":18309,"children":18310},{},[18311,18313,18318,18320,18326,18327,18333,18334,18340,18342,18347,18349,18354,18356,18361],{"type":293,"value":18312},"Ein DevOps-Engineer mit viel Betriebserfahrung hat meist ein Repertoire an ",{"type":283,"tag":11399,"props":18314,"children":18315},{},[18316],{"type":293,"value":18317},"Diagnosetechniken",{"type":293,"value":18319},". Beispielsweise wissen\nerfahrene Leute, wie man mit Tools wie ",{"type":283,"tag":317,"props":18321,"children":18323},{"className":18322},[],[18324],{"type":293,"value":18325},"htop",{"type":293,"value":9934},{"type":283,"tag":317,"props":18328,"children":18330},{"className":18329},[],[18331],{"type":293,"value":18332},"iotop",{"type":293,"value":10941},{"type":283,"tag":317,"props":18335,"children":18337},{"className":18336},[],[18338],{"type":293,"value":18339},"strace",{"type":293,"value":18341}," auf Linux debuggt, was weniger routinierte Entwickler\nvielleicht nie gebraucht haben. Auch ",{"type":283,"tag":11399,"props":18343,"children":18344},{},[18345],{"type":293,"value":18346},"Dauerlast-Phänomene",{"type":293,"value":18348}," (Stichwort ",{"type":283,"tag":11491,"props":18350,"children":18351},{},[18352],{"type":293,"value":18353},"Floating-Point-Precision Bugs",{"type":293,"value":18355},",\nspeicherbedingte Rounding Errors, etc.) kennen erfahrene DevOps aus der Praxis. Ein drastisches, aber reales Szenario:\nEin Speicherfehler tritt ",{"type":283,"tag":11491,"props":18357,"children":18358},{},[18359],{"type":293,"value":18360},"nur",{"type":293,"value":18362}," unter richtiger Volllast auf und nur in Kombination mit bestimmten Hardwarebedingungen –\nhier braucht es Experten, die vielleicht schon mal ähnliches gesehen haben oder wissen, wo man ansetzt.",{"type":283,"tag":532,"props":18364,"children":18366},{"id":18365},"fazit",[18367],{"type":293,"value":18368},"Fazit",{"type":283,"tag":284,"props":18370,"children":18371},{},[18372,18374,18379,18381,18386,18388,18395],{"type":293,"value":18373},"Für (Web-)Anwendungen im produktiven Einsatz sind ",{"type":283,"tag":11399,"props":18375,"children":18376},{},[18377],{"type":293,"value":18378},"DevOps kein Luxus, sondern eine Notwendigkeit",{"type":293,"value":18380},".\nEntwicklungsumgebungen stoßen an Grenzen, echte Nutzer sorgen für Überraschungen, und ohne kontinuierliches Monitoring\nfliegt man blind. Mittelständische Unternehmen, die vielleicht keine riesigen IT-Abteilungen haben, können durch einen\nDevOps-Ansatz enorm profitieren. Stabilere Systeme, schnellere Reaktionszeiten bei Problemen und zufriedenere Kunden.\nAllerdings muss man bereit sein, auch nach dem Launch ",{"type":283,"tag":11399,"props":18382,"children":18383},{},[18384],{"type":293,"value":18385},"Zeit und Ressourcen zu investieren",{"type":293,"value":18387},", um Daten zu analysieren\nund Verbesserungen einzuspielen. Tools wie ",{"type":283,"tag":288,"props":18389,"children":18390},{"href":17272},[18391],{"type":283,"tag":11399,"props":18392,"children":18393},{},[18394],{"type":293,"value":1542},{"type":293,"value":18396},", Grafana und Zabbix bilden dabei das Rückgrat der Überwachung – sie\nliefern die nötigen Daten und Unterstützungsmechanismen. Automatisierung mittels CI/CD nimmt viel Risiko aus Deployments\nund erlaubt auch weniger erfahrenen Team-Mitgliedern, Änderungen sicher live zu bringen.",{"type":283,"tag":284,"props":18398,"children":18399},{},[18400,18402,18407],{"type":293,"value":18401},"Am Ende zeigt sich: ",{"type":283,"tag":11399,"props":18403,"children":18404},{},[18405],{"type":293,"value":18406},"Menschen",{"type":293,"value":18408}," machen den Unterschied. Erfahrene DevOps-Spezialisten können knifflige Live-Probleme\nlösen und eine Brücke zwischen Entwicklern und Betrieb schlagen.",{"type":283,"tag":284,"props":18410,"children":18411},{},[18412,18416],{"type":283,"tag":11399,"props":18413,"children":18414},{},[18415],{"type":293,"value":12162},{"type":293,"value":17150},{"title":8,"searchDepth":340,"depth":340,"links":18418},[18419,18420,18421,18422,18423,18424,18425,18426],{"id":17195,"depth":340,"text":17198},{"id":17323,"depth":340,"text":17326},{"id":17574,"depth":340,"text":17577},{"id":17715,"depth":340,"text":17718},{"id":17937,"depth":340,"text":17940},{"id":18110,"depth":340,"text":18113},{"id":18269,"depth":340,"text":18272},{"id":18365,"depth":340,"text":18368},{"_path":133,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":134,"description":135,"author":136,"image":137,"releaseDate":138,"blogCategories":18428,"articleTags":18429,"tags":18430,"body":18431,"_type":20,"_id":145,"_source":22,"_file":146,"_stem":147,"_extension":25},[77,16],[141,33],[143,144],{"type":280,"children":18432,"toc":18498},[18433,18439,18460,18465,18470,18476,18488,18493],{"type":283,"tag":532,"props":18434,"children":18436},{"id":18435},"was-ist-das",[18437],{"type":293,"value":18438},"Was ist das?",{"type":283,"tag":284,"props":18440,"children":18441},{},[18442,18444,18450,18452,18458],{"type":293,"value":18443},"Dieser Wrapper dient als einfache und kosteneffiziente Brücke, die Aufrufe von der\n",{"type":283,"tag":288,"props":18445,"children":18447},{"href":18446},"https://docs.developer.amazonservices.com/en_US/dev_guide/index.html",[18448],{"type":293,"value":18449},"Amazon Marketplace Web Service (MWS)",{"type":293,"value":18451},"\nAPI zu ",{"type":283,"tag":288,"props":18453,"children":18455},{"href":18454},"https://developer-docs.amazon.com/sp-api",[18456],{"type":293,"value":18457},"Selling Partner (SP) API",{"type":293,"value":18459}," Aufrufen übersetzt. Er wurde speziell für Kunden mit veralteten Systemen und begrenztem\nBudget entwickelt, für die eine komplette Neuentwicklung der Amazon-Schnittstelle wirtschaftlich untragbar wäre. Der\nWrapper ermöglicht es diesen Kunden, ihr Geschäft auch nach der Abschaltung der MWS-Schnittstelle fortzuführen.",{"type":283,"tag":284,"props":18461,"children":18462},{},[18463],{"type":293,"value":18464},"Technisch basiert das Projekt auf einem Docker-Container, der als Webserver fungiert. Dieser nimmt MWS-API-Aufrufe\nentgegen, übersetzt sie in SP-API-Aufrufe und wandelt die Antworten der SP-API wieder in das Format der MWS-API um.",{"type":283,"tag":284,"props":18466,"children":18467},{},[18468],{"type":293,"value":18469},"Die Idee für diesen Wrapper entstand aus einem Proof of Concept, mit dem Ziel zu überprüfen, ob die Schnittstellen\nausreichend ähnlich sind, um eine direkte Übersetzung zu ermöglichen. Trotz der Befürchtung, dass der Teufel im Detail\nliegen könnte, erwiesen sich die Aufrufe als relativ einfach zu übersetzen. Es war lediglich notwendig, einige\nFeed-Namen anzupassen und gelegentlich aus einem API-Aufruf zwei zu machen, um alle notwendigen Informationen zu erhalten.\nInsgesamt gestaltete sich das Projekt überraschend problemlos.",{"type":283,"tag":532,"props":18471,"children":18473},{"id":18472},"download",[18474],{"type":293,"value":18475},"Download",{"type":283,"tag":284,"props":18477,"children":18478},{},[18479,18481,18487],{"type":293,"value":18480},"Interesse geweckt? Das Projekt wurde als Open-Source auf Github veröffentlicht:\n",{"type":283,"tag":288,"props":18482,"children":18484},{"href":18483},"https://github.com/bhelm/Amazon-MWS-SP-Wrapper",[18485],{"type":293,"value":18486},"Amazon-MWS-SP-API-Wrapper",{"type":293,"value":1302},{"type":283,"tag":284,"props":18489,"children":18490},{},[18491],{"type":293,"value":18492},"Mit diesem Angebot streben wir danach, zur Open-Source-Kultur beizutragen und erhoffen uns konstruktives Feedback von\nanderen Entwicklern.",{"type":283,"tag":284,"props":18494,"children":18495},{},[18496],{"type":293,"value":18497},"Bei Bedarf an Unterstützung bei der Integration in Ihre Anwendung oder falls Anpassungen bzw. Erweiterungen am Wrapper\nnotwendig sind, stehen wir gerne zur Verfügung. Da der Wrapper bisher nur von einer begrenzten Anzahl an Kunden genutzt\nwird, deckt er momentan auch nur einen Teil der möglichen API-Aufrufe und Parameter ab.",{"title":8,"searchDepth":340,"depth":340,"links":18499},[18500,18501],{"id":18435,"depth":340,"text":18438},{"id":18472,"depth":340,"text":18475},{"_path":18503,"_dir":1506,"_draft":7,"_partial":7,"_locale":8,"slug":136,"teams":18504,"primaryTeam":1509,"firstName":18506,"lastName":18507,"prefixTitle":8,"suffixTitle":8,"education":18508,"executiveRole":18512,"role":18513,"workingSince":18518,"inTheCompanySince":18519,"techSkills":18520,"skills":18547,"projects":18556,"contactDetails":18566,"_image":18569,"image":18570,"_id":18571,"_type":1596,"title":18572,"_source":1506,"_file":18573,"_stem":18574,"_extension":1596},"/employees/bernd-helm",[18505,1509],"ai","Bernd","Helm",[18509],[18510,18511,12899],"B. Sc. Angewandte Informatik","FHDW Dresden","CTO",[18514,18515,1509,18516,1521,1519,18517,1522],"founder","chiefTechnologyOfficer","databaseSpecialist","backendDeveloper","2005","2008",[18521,18522,18523,18524,18527,18529,18532,18533,18534,18536,18537,18540,18541,18542,18543,18546],{"name":1527,"level":1528,"icon":1529},{"name":157,"level":1528,"icon":191},{"name":17299,"level":1528},{"name":18525,"level":1528,"icon":18526},"MariaDB ColumnStore","/images/maria-db-logo.svg",{"name":18528,"level":1528},"OpenAI",{"name":18530,"level":1528,"icon":18531},"Pytorch","/images/PyTorch.svg",{"name":1555,"level":1528},{"name":12913,"level":1528},{"name":18535,"level":1528},"Python",{"name":1557,"level":1528,"icon":1558},{"name":18538,"level":1549,"icon":18539},"C++","/images/cpp-logo.svg",{"name":12906,"level":1549,"icon":12907},{"name":1548,"level":1549,"icon":1550},{"name":1552,"level":1549,"icon":1553},{"name":18544,"level":1549,"icon":18545},"OpenCV","/images/OpenCV.svg",{"name":12911,"level":1549,"icon":1561},[18548,18550,18552,18553,18554,18555],{"name":18549,"level":1528},"artificialIntelligence",{"name":18551,"level":1528},"codingGuidelines",{"name":235,"level":1528},{"name":1576,"level":1528},{"name":1578,"level":1528},{"name":1566,"level":1549},[18557,18560,18561,18562,18565],{"project":18558,"position":18559},"Gridside","Technical Consultant",{"project":1581,"position":18559},{"project":12939,"position":18559},{"project":18563,"position":18564},"Orsee","Technical Manager",{"project":12942,"position":18559},{"eMail":18567,"phone":18568,"visibility":1592},"bernd.helm@helmundwalter.de","+49 351 799 035 20","images/employees/Portraits/bernd_helm.webp","images/employees/Portraits/BerndHelm_MS.webp","employees:employees:1.bernd-helm.json","Bernd Helm","employees/1.bernd-helm.json","employees/1.bernd-helm",{"_path":149,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":150,"description":151,"author":136,"image":152,"releaseDate":153,"blogCategories":18576,"articleTags":18577,"tags":18578,"body":18579,"_type":20,"_id":159,"_source":22,"_file":160,"_stem":161,"_extension":25},[77,16],[156,157],[19],{"type":280,"children":18580,"toc":19122},[18581,18587,18592,18597,18613,18626,18632,18659,18677,18683,18688,18701,18714,18745,18772,18793,18847,18863,18889,18932,18961,19011,19030,19043,19086,19098,19118],{"type":283,"tag":532,"props":18582,"children":18584},{"id":18583},"wie-man-ausgewählte-domains-über-vpn-unter-linux-auflöst",[18585],{"type":293,"value":18586},"Wie man ausgewählte Domains über VPN unter Linux auflöst",{"type":283,"tag":284,"props":18588,"children":18589},{},[18590],{"type":293,"value":18591},"In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist\nes jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu\nleiten. Selbst wenn der VPN-Server möchte, dass der Client genau so\nkonfiguriert werden soll, kann der Client so konfiguriert werden, dass er die Anforderung, den gesamten Datenverkehr\nüber die VPN-Verbindung zu leiten, ignoriert.",{"type":283,"tag":284,"props":18593,"children":18594},{},[18595],{"type":293,"value":18596},"Zum Beispiel kann bei Openvpn die Option",{"type":283,"tag":303,"props":18598,"children":18602},{"className":18599,"code":18600,"language":18601,"meta":8,"style":8},"language-apache shiki shiki-themes github-dark github-dark monokai","pull-filter ignore redirect-gateway\n","apache",[18603],{"type":283,"tag":317,"props":18604,"children":18605},{"__ignoreMap":8},[18606],{"type":283,"tag":321,"props":18607,"children":18608},{"class":323,"line":324},[18609],{"type":283,"tag":321,"props":18610,"children":18611},{"style":334},[18612],{"type":293,"value":18600},{"type":283,"tag":284,"props":18614,"children":18615},{},[18616,18618,18624],{"type":293,"value":18617},"verwendet werden, um den ",{"type":283,"tag":317,"props":18619,"children":18621},{"className":18620},[],[18622],{"type":293,"value":18623},"openvpn-client",{"type":293,"value":18625}," anzuweisen, alle \"route all\"-Anfragen des Servers zu ignorieren.",{"type":283,"tag":532,"props":18627,"children":18629},{"id":18628},"fritzbox-beispiel",[18630],{"type":293,"value":18631},"FRITZ!Box Beispiel",{"type":283,"tag":284,"props":18633,"children":18634},{},[18635,18637,18642,18644,18650,18652,18658],{"type":293,"value":18636},"Kürzlich musste ich eine VPN-Verbindung zu einer ",{"type":283,"tag":11399,"props":18638,"children":18639},{},[18640],{"type":293,"value":18641},"FRITZ!Box",{"type":293,"value":18643}," nutzen. Das ist ein sehr beliebter Router in Deutschland,\nder nicht nur\neinfache\nVPN-Verbindungen anbietet, sondern auch alle Hosts in seinem Netzwerk zu seinem eigenen DNS hinzufügt. Wenn Sie mit\neinem Rechner mit dem Namen ",{"type":283,"tag":317,"props":18645,"children":18647},{"className":18646},[],[18648],{"type":293,"value":18649}," workstation",{"type":293,"value":18651}," ansprechen wollen, können Sie ihn über den dns-Namen \"workstation.fritz.box\" erreichen. Die fritz-box\nselbst ist auch unter dem\ndns-Namen ",{"type":283,"tag":317,"props":18653,"children":18655},{"className":18654},[],[18656],{"type":293,"value":18657},"fritz.box",{"type":293,"value":1302},{"type":283,"tag":284,"props":18660,"children":18661},{},[18662,18664,18669,18671,18675],{"type":293,"value":18663},"In meinem Fall ziehe ich es aus Geschwindigkeits- und Datenschutzgründen vor, meinen eigenen DNS-Server für alle\nAbfragen zu verwenden - das heißt, ich möchte nur\ndie Domains mit dem Suffix ",{"type":283,"tag":317,"props":18665,"children":18667},{"className":18666},[],[18668],{"type":293,"value":18657},{"type":293,"value":18670}," über die ",{"type":283,"tag":11399,"props":18672,"children":18673},{},[18674],{"type":293,"value":18641},{"type":293,"value":18676}," auflösen.",{"type":283,"tag":532,"props":18678,"children":18680},{"id":18679},"lösung-mit-einem-lokalen-dns-server-dnsmasq",[18681],{"type":293,"value":18682},"Lösung mit einem lokalen DNS-Server - dnsmasq",{"type":283,"tag":284,"props":18684,"children":18685},{},[18686],{"type":293,"value":18687},"Dnsmasq ist ein leichtgewichtiger DNS-Server, den man auf dem eigenen Rechner laufen lassen kann, um die Kontrolle über\ndie Namensauflösung zu bekommen. Ein netter Nebeneffekt ist, dass er seinen eigenen DNS-Cache hat, was wiederkehrende\nDNS-Abfragen schneller macht. Hier ist, wie ich ihn eingerichtet habe:",{"type":283,"tag":284,"props":18689,"children":18690},{},[18691,18693,18699],{"type":293,"value":18692},"Bevor Sie beginnen, müssen Sie herausfinden, welcher DNS-Server im VPN verwendet wird. Normalerweise ist es das\nStandard-Gateway, das normalerweise\nein ",{"type":283,"tag":317,"props":18694,"children":18696},{"className":18695},[],[18697],{"type":293,"value":18698},".1",{"type":293,"value":18700}," am Ende hat. Sie können die VPN-Protokolle genau beobachten, um herauszufinden, welcher DNS-Server bei der\nVerbindung verwendet wird.",{"type":283,"tag":284,"props":18702,"children":18703},{},[18704,18706,18712],{"type":293,"value":18705},"Es gibt ein Tool namens ",{"type":283,"tag":317,"props":18707,"children":18709},{"className":18708},[],[18710],{"type":293,"value":18711},"dig",{"type":293,"value":18713},", das DNS-Abfragen über bestimmte DNS-Server durchführen kann, zum Beispiel",{"type":283,"tag":303,"props":18715,"children":18719},{"className":18716,"code":18717,"language":18718,"meta":8,"style":8},"language-bash shiki shiki-themes github-dark github-dark monokai","dig @192.168.1.1 a fritz.box\n\n","bash",[18720],{"type":283,"tag":317,"props":18721,"children":18722},{"__ignoreMap":8},[18723],{"type":283,"tag":321,"props":18724,"children":18725},{"class":323,"line":324},[18726,18730,18735,18740],{"type":283,"tag":321,"props":18727,"children":18728},{"style":1715},[18729],{"type":293,"value":18711},{"type":283,"tag":321,"props":18731,"children":18732},{"style":367},[18733],{"type":293,"value":18734}," @192.168.1.1",{"type":283,"tag":321,"props":18736,"children":18737},{"style":367},[18738],{"type":293,"value":18739}," a",{"type":283,"tag":321,"props":18741,"children":18742},{"style":367},[18743],{"type":293,"value":18744}," fritz.box\n",{"type":283,"tag":284,"props":18746,"children":18747},{},[18748,18750,18756,18758,18763,18765,18771],{"type":293,"value":18749},"wird den DNS-Server ",{"type":283,"tag":317,"props":18751,"children":18753},{"className":18752},[],[18754],{"type":293,"value":18755},"192.168.1.1",{"type":293,"value":18757}," nach der IP von ",{"type":283,"tag":317,"props":18759,"children":18761},{"className":18760},[],[18762],{"type":293,"value":18657},{"type":293,"value":18764}," fragen. Dig ist sehr praktisch bei der Fehlersuche bei DNS-Problemen und Ihrer Einrichtung zu testen.  Sie müssen es eventuell auf Ihrem System installieren. Unter Debian befindet es sich in einem Paket namens ",{"type":283,"tag":317,"props":18766,"children":18768},{"className":18767},[],[18769],{"type":293,"value":18770},"dnsutils",{"type":293,"value":1302},{"type":283,"tag":284,"props":18773,"children":18774},{},[18775,18777,18783,18785,18791],{"type":293,"value":18776},"Installieren Sie zuerst ",{"type":283,"tag":317,"props":18778,"children":18780},{"className":18779},[],[18781],{"type":293,"value":18782},"dnsmasq",{"type":293,"value":18784}," auf Ihrem Linux und bearbeiten Sie seine Konfiguration (normalerweise in ",{"type":283,"tag":317,"props":18786,"children":18788},{"className":18787},[],[18789],{"type":293,"value":18790},"/etc/dnsmasq.conf",{"type":293,"value":18792},"). Fügen Sie diese Zeilen\nhier ein:",{"type":283,"tag":303,"props":18794,"children":18796},{"className":18599,"code":18795,"language":18601,"meta":8,"style":8},"resolv-datei=/etc/resolv.dnsmasq.conf\nserver=/fritz.box/192.168.1.1\n",[18797],{"type":283,"tag":317,"props":18798,"children":18799},{"__ignoreMap":8},[18800,18808],{"type":283,"tag":321,"props":18801,"children":18802},{"class":323,"line":324},[18803],{"type":283,"tag":321,"props":18804,"children":18805},{"style":334},[18806],{"type":293,"value":18807},"resolv-datei=/etc/resolv.dnsmasq.conf\n",{"type":283,"tag":321,"props":18809,"children":18810},{"class":323,"line":340},[18811,18816,18821,18825,18830,18834,18838,18842],{"type":283,"tag":321,"props":18812,"children":18813},{"style":334},[18814],{"type":293,"value":18815},"server=/fritz.box/",{"type":283,"tag":321,"props":18817,"children":18818},{"style":1730},[18819],{"type":293,"value":18820},"192",{"type":283,"tag":321,"props":18822,"children":18823},{"style":334},[18824],{"type":293,"value":1302},{"type":283,"tag":321,"props":18826,"children":18827},{"style":1730},[18828],{"type":293,"value":18829},"168",{"type":283,"tag":321,"props":18831,"children":18832},{"style":334},[18833],{"type":293,"value":1302},{"type":283,"tag":321,"props":18835,"children":18836},{"style":1730},[18837],{"type":293,"value":1592},{"type":283,"tag":321,"props":18839,"children":18840},{"style":334},[18841],{"type":293,"value":1302},{"type":283,"tag":321,"props":18843,"children":18844},{"style":1730},[18845],{"type":293,"value":18846},"1\n",{"type":283,"tag":284,"props":18848,"children":18849},{},[18850,18855,18857,18862],{"type":283,"tag":317,"props":18851,"children":18853},{"className":18852},[],[18854],{"type":293,"value":18657},{"type":293,"value":18856}," ist die Domain, die über den VPN-Dnsserver aufgelöst werden soll, in diesem Beispiel ",{"type":283,"tag":317,"props":18858,"children":18860},{"className":18859},[],[18861],{"type":293,"value":18755},{"type":293,"value":1302},{"type":283,"tag":284,"props":18864,"children":18865},{},[18866,18867,18872,18874,18879,18881,18887],{"type":293,"value":9340},{"type":283,"tag":11399,"props":18868,"children":18869},{},[18870],{"type":293,"value":18871},"Resolv-Datei",{"type":293,"value":18873}," wird ",{"type":283,"tag":317,"props":18875,"children":18877},{"className":18876},[],[18878],{"type":293,"value":18782},{"type":293,"value":18880}," mitteilen, wie es seine DNS-Anfragen auflösen soll, falls es keine anderen Regeln\ngibt, also erstellen wir ",{"type":283,"tag":317,"props":18882,"children":18884},{"className":18883},[],[18885],{"type":293,"value":18886},"/etc/resolv.dnsmasq.conf",{"type":293,"value":18888},"\nmit dem Inhalt",{"type":283,"tag":303,"props":18890,"children":18892},{"className":18599,"code":18891,"language":18601,"meta":8,"style":8},"Nameserver 1.1.1.1\n",[18893],{"type":283,"tag":317,"props":18894,"children":18895},{"__ignoreMap":8},[18896],{"type":283,"tag":321,"props":18897,"children":18898},{"class":323,"line":324},[18899,18904,18908,18912,18916,18920,18924,18928],{"type":283,"tag":321,"props":18900,"children":18901},{"style":334},[18902],{"type":293,"value":18903},"Nameserver ",{"type":283,"tag":321,"props":18905,"children":18906},{"style":1730},[18907],{"type":293,"value":1592},{"type":283,"tag":321,"props":18909,"children":18910},{"style":334},[18911],{"type":293,"value":1302},{"type":283,"tag":321,"props":18913,"children":18914},{"style":1730},[18915],{"type":293,"value":1592},{"type":283,"tag":321,"props":18917,"children":18918},{"style":334},[18919],{"type":293,"value":1302},{"type":283,"tag":321,"props":18921,"children":18922},{"style":1730},[18923],{"type":293,"value":1592},{"type":283,"tag":321,"props":18925,"children":18926},{"style":334},[18927],{"type":293,"value":1302},{"type":283,"tag":321,"props":18929,"children":18930},{"style":1730},[18931],{"type":293,"value":18846},{"type":283,"tag":284,"props":18933,"children":18934},{},[18935,18937,18943,18945,18951,18953,18959],{"type":293,"value":18936},"Wenn Sie eine statische Netzwerkkonfiguration verwenden, können Sie diese jetzt einfach bearbeiten, um ",{"type":283,"tag":317,"props":18938,"children":18940},{"className":18939},[],[18941],{"type":293,"value":18942},"127.0.0.1",{"type":293,"value":18944}," als\nNameserver zu verwenden. Wenn Sie\nautomatische IP-Konfiguration mit dhcp verwenden, müssen Sie Ihren dhcp-Client so konfigurieren, dass er den neuen\nlokalen DNS-Server verwendet. Unter Debian,\nist der Standard ",{"type":283,"tag":317,"props":18946,"children":18948},{"className":18947},[],[18949],{"type":293,"value":18950},"dhclient",{"type":293,"value":18952},". In diesem Fall editieren Sie ",{"type":283,"tag":317,"props":18954,"children":18956},{"className":18955},[],[18957],{"type":293,"value":18958},"/etc/dhcp/dhclient.conf",{"type":293,"value":18960}," und fügen hinzu:",{"type":283,"tag":303,"props":18962,"children":18964},{"className":18599,"code":18963,"language":18601,"meta":8,"style":8},"domain-name-servers 127.0.0.1 vorangestellt;\n\n",[18965],{"type":283,"tag":317,"props":18966,"children":18967},{"__ignoreMap":8},[18968],{"type":283,"tag":321,"props":18969,"children":18970},{"class":323,"line":324},[18971,18976,18981,18985,18990,18994,18998,19002,19006],{"type":283,"tag":321,"props":18972,"children":18973},{"style":334},[18974],{"type":293,"value":18975},"domain-name-servers ",{"type":283,"tag":321,"props":18977,"children":18978},{"style":1730},[18979],{"type":293,"value":18980},"127",{"type":283,"tag":321,"props":18982,"children":18983},{"style":334},[18984],{"type":293,"value":1302},{"type":283,"tag":321,"props":18986,"children":18987},{"style":1730},[18988],{"type":293,"value":18989},"0",{"type":283,"tag":321,"props":18991,"children":18992},{"style":334},[18993],{"type":293,"value":1302},{"type":283,"tag":321,"props":18995,"children":18996},{"style":1730},[18997],{"type":293,"value":18989},{"type":283,"tag":321,"props":18999,"children":19000},{"style":334},[19001],{"type":293,"value":1302},{"type":283,"tag":321,"props":19003,"children":19004},{"style":1730},[19005],{"type":293,"value":1592},{"type":283,"tag":321,"props":19007,"children":19008},{"style":334},[19009],{"type":293,"value":19010}," vorangestellt;\n",{"type":283,"tag":284,"props":19012,"children":19013},{},[19014,19016,19021,19023,19028],{"type":293,"value":19015},"Das war's. Alles, was Sie jetzt noch tun müssen, ist ",{"type":283,"tag":317,"props":19017,"children":19019},{"className":19018},[],[19020],{"type":293,"value":18782},{"type":293,"value":19022}," neu zu starten, damit es seine Konfiguration neu lädt und ",{"type":283,"tag":317,"props":19024,"children":19026},{"className":19025},[],[19027],{"type":293,"value":18950},{"type":293,"value":19029}," neu zu verbinden/starten\n(das Trennen und erneute Verbinden des Netzwerks kann funktionieren, im Zweifelsfall starten Sie den Rechner neu).",{"type":283,"tag":284,"props":19031,"children":19032},{},[19033,19035,19041],{"type":293,"value":19034},"Jetzt können Sie überprüfen, ob die Datei ",{"type":283,"tag":317,"props":19036,"children":19038},{"className":19037},[],[19039],{"type":293,"value":19040},"/etc/resolv.conf",{"type":293,"value":19042}," folgendes enthält",{"type":283,"tag":303,"props":19044,"children":19046},{"className":18599,"code":19045,"language":18601,"meta":8,"style":8},"nameserver 127.0.0.1\n",[19047],{"type":283,"tag":317,"props":19048,"children":19049},{"__ignoreMap":8},[19050],{"type":283,"tag":321,"props":19051,"children":19052},{"class":323,"line":324},[19053,19058,19062,19066,19070,19074,19078,19082],{"type":283,"tag":321,"props":19054,"children":19055},{"style":334},[19056],{"type":293,"value":19057},"nameserver ",{"type":283,"tag":321,"props":19059,"children":19060},{"style":1730},[19061],{"type":293,"value":18980},{"type":283,"tag":321,"props":19063,"children":19064},{"style":334},[19065],{"type":293,"value":1302},{"type":283,"tag":321,"props":19067,"children":19068},{"style":1730},[19069],{"type":293,"value":18989},{"type":283,"tag":321,"props":19071,"children":19072},{"style":334},[19073],{"type":293,"value":1302},{"type":283,"tag":321,"props":19075,"children":19076},{"style":1730},[19077],{"type":293,"value":18989},{"type":283,"tag":321,"props":19079,"children":19080},{"style":334},[19081],{"type":293,"value":1302},{"type":283,"tag":321,"props":19083,"children":19084},{"style":1730},[19085],{"type":293,"value":18846},{"type":283,"tag":284,"props":19087,"children":19088},{},[19089,19091,19096],{"type":293,"value":19090},"als ersten Nameserver enthält. Wenn dies der Fall ist, sollte die ausgewählte Domain (in meinem Beispiel ",{"type":283,"tag":317,"props":19092,"children":19094},{"className":19093},[],[19095],{"type":293,"value":18657},{"type":293,"value":19097},")\nnun aufgelöst werden.",{"type":283,"tag":284,"props":19099,"children":19100},{},[19101,19103,19108,19110,19116],{"type":293,"value":19102},"Bei ",{"type":283,"tag":317,"props":19104,"children":19106},{"className":19105},[],[19107],{"type":293,"value":18782},{"type":293,"value":19109}," können Sie mehrere ",{"type":283,"tag":317,"props":19111,"children":19113},{"className":19112},[],[19114],{"type":293,"value":19115},"server=",{"type":293,"value":19117},"-Zeilen hinzufügen, was praktisch ist, wenn Sie mehrere Domains haben, die\nüber verschiedene DNS-Server aufgelöst werden müssen.",{"type":283,"tag":1489,"props":19119,"children":19120},{},[19121],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":19123},[19124,19125,19126],{"id":18583,"depth":340,"text":18586},{"id":18628,"depth":340,"text":18631},{"id":18679,"depth":340,"text":18682},{"_path":163,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":164,"description":165,"author":136,"image":166,"releaseDate":167,"blogCategories":19128,"articleTags":19129,"tags":19130,"body":19131,"_type":20,"_id":171,"_source":22,"_file":172,"_stem":173,"_extension":25},[34,16],[156],[36],{"type":280,"children":19132,"toc":19651},[19133,19139,19144,19155,19187,19193,19198,19217,19226,19231,19236,19554,19559,19564,19569,19574,19585,19635,19641,19647],{"type":283,"tag":532,"props":19134,"children":19136},{"id":19135},"shopware-5-parallele-thumbnail-generierung-nach-dem-verschieben-eines-shopware-5-systems-auf-einen-anderen-server",[19137],{"type":293,"value":19138},"Shopware 5 - Parallele Thumbnail-Generierung nach dem Verschieben eines Shopware 5-Systems auf einen anderen Server",{"type":283,"tag":284,"props":19140,"children":19141},{},[19142],{"type":293,"value":19143},"Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-basierten umziehen musste. Das Problem war, dass der alte Server so langsam war, dass er bereits 2 Tage brauchte, um alle Bilder durchzuzählen, ganz zu schweigen vom Kopieren der Bilder.",{"type":283,"tag":284,"props":19145,"children":19146},{},[19147,19149],{"type":293,"value":19148},"Also haben wir beschlossen, nur die Originalbilder zu kopieren und die Thumbnails neu zu generieren. Um die Originalbilder zu kopieren, habe ich einen kleinen Konsolenbefehl erstellt, der alle Pfade der Originalbilder, die wir kopieren müssen, exportiert: ",{"type":283,"tag":288,"props":19150,"children":19152},{"href":19151},"https://gist.github.com/bhelm/2d30f0cebcf4a7d8ea41c532ec67cd62",[19153],{"type":293,"value":19154},"ExportImagesCommand.php",{"type":283,"tag":284,"props":19156,"children":19157},{},[19158,19160,19165,19166,19171,19173,19178,19180,19185],{"type":293,"value":19159},"Diese Dateiliste kann mit den Optionen ",{"type":283,"tag":11491,"props":19161,"children":19162},{},[19163],{"type":293,"value":19164},"tar -T",{"type":293,"value":10941},{"type":283,"tag":11491,"props":19167,"children":19168},{},[19169],{"type":293,"value":19170},"rsync --files-from=",{"type":293,"value":19172}," verwendet werden, die diese Tools anweisen, nur die aufgelisteten Dateien zu verarbeiten. Für den anfänglichen Kopiervorgang ist ",{"type":283,"tag":11491,"props":19174,"children":19175},{},[19176],{"type":293,"value":19177},"tar",{"type":293,"value":19179}," sehr zu empfehlen, da es nur die aufgelisteten Dateien abholt, ohne irgendeine \"Berechnung\" wie bei ",{"type":283,"tag":11491,"props":19181,"children":19182},{},[19183],{"type":293,"value":19184},"rsync",{"type":293,"value":19186}," vorzunehmen.",{"type":283,"tag":532,"props":19188,"children":19190},{"id":19189},"sw5-standard-thumbnails-generieren-hätte-80-stunden-gedauert",[19191],{"type":293,"value":19192},"SW5 Standard-Thumbnails generieren hätte 80 Stunden gedauert",{"type":283,"tag":284,"props":19194,"children":19195},{},[19196],{"type":293,"value":19197},"... und würde nur die Hälfte eines Kerns nutzen.",{"type":283,"tag":284,"props":19199,"children":19200},{},[19201,19203,19208,19210,19215],{"type":293,"value":19202},"Ich war neugierig, ob ich diesen Generierungsprozess beschleunigen kann. Der Server selbst hat 32 Kerne zur Verfügung, also habe ich den Befehl ",{"type":283,"tag":11491,"props":19204,"children":19205},{},[19206],{"type":293,"value":19207},"generate thumbnail",{"type":293,"value":19209}," aus sw5 kopiert und ihn so modifiziert, dass er mit dem Parameter ",{"type":283,"tag":11491,"props":19211,"children":19212},{},[19213],{"type":293,"value":19214},"--batch",{"type":293,"value":19216}," in Batches arbeitet:",{"type":283,"tag":284,"props":19218,"children":19219},{},[19220],{"type":283,"tag":288,"props":19221,"children":19223},{"href":19222},"https://gist.github.com/bhelm/2015d3829d4a3f24f9760f6e4e1aac1f",[19224],{"type":293,"value":19225},"ParallelThumbnailGenerateCommand.php",{"type":283,"tag":284,"props":19227,"children":19228},{},[19229],{"type":293,"value":19230},"Damit es funktioniert, habe ich einfach den Shopware-Kern unter engine/Shopware/Models/Media/Repository.php geändert",{"type":283,"tag":284,"props":19232,"children":19233},{},[19234],{"type":293,"value":19235},"Ich habe einfach die getAlbumMediaQuery Funktion geändert in:",{"type":283,"tag":303,"props":19237,"children":19241},{"className":19238,"code":19239,"language":19240,"meta":8,"style":8},"language-cpp shiki shiki-themes github-dark github-dark monokai","public function getAlbumMediaQuery($albumId, $filter = null, $orderBy = null, $offset = null, $limit = null, $validTypes = null, $batch = null)\n{\n$builder = $this->getAlbumMediaQueryBuilder($albumId, $filter, $orderBy, $validTypes);\nif (is_numeric($batch)) {\n$builder->andWhere('MOD(media.id, 1000) = ?3');\n$builder->setParameter(3, $batch);\n}\n\n    if ($limit !== null) {\n        $builder->setFirstResult($offset)\n                ->setMaxResults($limit);\n    }\n\n    return $builder->getQuery();\n}\n","cpp",[19242],{"type":283,"tag":317,"props":19243,"children":19244},{"__ignoreMap":8},[19245,19318,19325,19363,19384,19412,19438,19445,19452,19474,19492,19510,19517,19524,19547],{"type":283,"tag":321,"props":19246,"children":19247},{"class":323,"line":324},[19248,19253,19258,19263,19268,19273,19277,19282,19286,19291,19295,19300,19304,19309,19313],{"type":283,"tag":321,"props":19249,"children":19250},{"style":334},[19251],{"type":293,"value":19252},"public function ",{"type":283,"tag":321,"props":19254,"children":19255},{"style":1715},[19256],{"type":293,"value":19257},"getAlbumMediaQuery",{"type":283,"tag":321,"props":19259,"children":19260},{"style":334},[19261],{"type":293,"value":19262},"($albumId, $filter ",{"type":283,"tag":321,"props":19264,"children":19265},{"style":8079},[19266],{"type":293,"value":19267},"=",{"type":283,"tag":321,"props":19269,"children":19270},{"style":334},[19271],{"type":293,"value":19272}," null, $orderBy ",{"type":283,"tag":321,"props":19274,"children":19275},{"style":8079},[19276],{"type":293,"value":19267},{"type":283,"tag":321,"props":19278,"children":19279},{"style":334},[19280],{"type":293,"value":19281}," null, $offset ",{"type":283,"tag":321,"props":19283,"children":19284},{"style":8079},[19285],{"type":293,"value":19267},{"type":283,"tag":321,"props":19287,"children":19288},{"style":334},[19289],{"type":293,"value":19290}," null, $limit ",{"type":283,"tag":321,"props":19292,"children":19293},{"style":8079},[19294],{"type":293,"value":19267},{"type":283,"tag":321,"props":19296,"children":19297},{"style":334},[19298],{"type":293,"value":19299}," null, $validTypes ",{"type":283,"tag":321,"props":19301,"children":19302},{"style":8079},[19303],{"type":293,"value":19267},{"type":283,"tag":321,"props":19305,"children":19306},{"style":334},[19307],{"type":293,"value":19308}," null, $batch ",{"type":283,"tag":321,"props":19310,"children":19311},{"style":8079},[19312],{"type":293,"value":19267},{"type":283,"tag":321,"props":19314,"children":19315},{"style":334},[19316],{"type":293,"value":19317}," null)\n",{"type":283,"tag":321,"props":19319,"children":19320},{"class":323,"line":340},[19321],{"type":283,"tag":321,"props":19322,"children":19323},{"style":334},[19324],{"type":293,"value":5164},{"type":283,"tag":321,"props":19326,"children":19327},{"class":323,"line":353},[19328,19333,19337,19342,19348,19353,19358],{"type":283,"tag":321,"props":19329,"children":19330},{"style":334},[19331],{"type":293,"value":19332},"$builder ",{"type":283,"tag":321,"props":19334,"children":19335},{"style":8079},[19336],{"type":293,"value":19267},{"type":283,"tag":321,"props":19338,"children":19339},{"style":334},[19340],{"type":293,"value":19341}," $",{"type":283,"tag":321,"props":19343,"children":19345},{"style":19344},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F",[19346],{"type":293,"value":19347},"this",{"type":283,"tag":321,"props":19349,"children":19350},{"style":334},[19351],{"type":293,"value":19352},"->",{"type":283,"tag":321,"props":19354,"children":19355},{"style":1715},[19356],{"type":293,"value":19357},"getAlbumMediaQueryBuilder",{"type":283,"tag":321,"props":19359,"children":19360},{"style":334},[19361],{"type":293,"value":19362},"($albumId, $filter, $orderBy, $validTypes);\n",{"type":283,"tag":321,"props":19364,"children":19365},{"class":323,"line":373},[19366,19370,19374,19379],{"type":283,"tag":321,"props":19367,"children":19368},{"style":8079},[19369],{"type":293,"value":2005},{"type":283,"tag":321,"props":19371,"children":19372},{"style":334},[19373],{"type":293,"value":12474},{"type":283,"tag":321,"props":19375,"children":19376},{"style":1715},[19377],{"type":293,"value":19378},"is_numeric",{"type":283,"tag":321,"props":19380,"children":19381},{"style":334},[19382],{"type":293,"value":19383},"($batch)) {\n",{"type":283,"tag":321,"props":19385,"children":19386},{"class":323,"line":308},[19387,19392,19397,19402,19407],{"type":283,"tag":321,"props":19388,"children":19389},{"style":334},[19390],{"type":293,"value":19391},"$builder->",{"type":283,"tag":321,"props":19393,"children":19394},{"style":1715},[19395],{"type":293,"value":19396},"andWhere",{"type":283,"tag":321,"props":19398,"children":19399},{"style":334},[19400],{"type":293,"value":19401},"(",{"type":283,"tag":321,"props":19403,"children":19404},{"style":367},[19405],{"type":293,"value":19406},"'MOD(media.id, 1000) = ?3'",{"type":283,"tag":321,"props":19408,"children":19409},{"style":334},[19410],{"type":293,"value":19411},");\n",{"type":283,"tag":321,"props":19413,"children":19414},{"class":323,"line":309},[19415,19419,19424,19428,19433],{"type":283,"tag":321,"props":19416,"children":19417},{"style":334},[19418],{"type":293,"value":19391},{"type":283,"tag":321,"props":19420,"children":19421},{"style":1715},[19422],{"type":293,"value":19423},"setParameter",{"type":283,"tag":321,"props":19425,"children":19426},{"style":334},[19427],{"type":293,"value":19401},{"type":283,"tag":321,"props":19429,"children":19430},{"style":1730},[19431],{"type":293,"value":19432},"3",{"type":283,"tag":321,"props":19434,"children":19435},{"style":334},[19436],{"type":293,"value":19437},", $batch);\n",{"type":283,"tag":321,"props":19439,"children":19440},{"class":323,"line":310},[19441],{"type":283,"tag":321,"props":19442,"children":19443},{"style":334},[19444],{"type":293,"value":6153},{"type":283,"tag":321,"props":19446,"children":19447},{"class":323,"line":311},[19448],{"type":283,"tag":321,"props":19449,"children":19450},{"emptyLinePlaceholder":1046},[19451],{"type":293,"value":1049},{"type":283,"tag":321,"props":19453,"children":19454},{"class":323,"line":312},[19455,19459,19464,19469],{"type":283,"tag":321,"props":19456,"children":19457},{"style":8079},[19458],{"type":293,"value":8652},{"type":283,"tag":321,"props":19460,"children":19461},{"style":334},[19462],{"type":293,"value":19463}," ($limit ",{"type":283,"tag":321,"props":19465,"children":19466},{"style":8079},[19467],{"type":293,"value":19468},"!==",{"type":283,"tag":321,"props":19470,"children":19471},{"style":334},[19472],{"type":293,"value":19473}," null) {\n",{"type":283,"tag":321,"props":19475,"children":19476},{"class":323,"line":977},[19477,19482,19487],{"type":283,"tag":321,"props":19478,"children":19479},{"style":334},[19480],{"type":293,"value":19481},"        $builder->",{"type":283,"tag":321,"props":19483,"children":19484},{"style":1715},[19485],{"type":293,"value":19486},"setFirstResult",{"type":283,"tag":321,"props":19488,"children":19489},{"style":334},[19490],{"type":293,"value":19491},"($offset)\n",{"type":283,"tag":321,"props":19493,"children":19494},{"class":323,"line":990},[19495,19500,19505],{"type":283,"tag":321,"props":19496,"children":19497},{"style":8079},[19498],{"type":293,"value":19499},"                ->",{"type":283,"tag":321,"props":19501,"children":19502},{"style":1715},[19503],{"type":293,"value":19504},"setMaxResults",{"type":283,"tag":321,"props":19506,"children":19507},{"style":334},[19508],{"type":293,"value":19509},"($limit);\n",{"type":283,"tag":321,"props":19511,"children":19512},{"class":323,"line":1003},[19513],{"type":283,"tag":321,"props":19514,"children":19515},{"style":334},[19516],{"type":293,"value":5726},{"type":283,"tag":321,"props":19518,"children":19519},{"class":323,"line":1016},[19520],{"type":283,"tag":321,"props":19521,"children":19522},{"emptyLinePlaceholder":1046},[19523],{"type":293,"value":1049},{"type":283,"tag":321,"props":19525,"children":19526},{"class":323,"line":1029},[19527,19532,19537,19542],{"type":283,"tag":321,"props":19528,"children":19529},{"style":8079},[19530],{"type":293,"value":19531},"    return",{"type":283,"tag":321,"props":19533,"children":19534},{"style":334},[19535],{"type":293,"value":19536}," $builder->",{"type":283,"tag":321,"props":19538,"children":19539},{"style":1715},[19540],{"type":293,"value":19541},"getQuery",{"type":283,"tag":321,"props":19543,"children":19544},{"style":334},[19545],{"type":293,"value":19546},"();\n",{"type":283,"tag":321,"props":19548,"children":19549},{"class":323,"line":1042},[19550],{"type":283,"tag":321,"props":19551,"children":19552},{"style":334},[19553],{"type":293,"value":6153},{"type":283,"tag":284,"props":19555,"children":19556},{},[19557],{"type":293,"value":19558},"Es ist ein optionaler Parameter und wird nichts kaputt machen. Wenn man ein Shopware-Update durchführt, würde dies verschwinden, aber da ich auf der Suche nach einer einmaligen Aufgabe war, um die Dinge zu beschleunigen, habe ich es einfach im Kern geändert, anstatt eine langfristige Lösung zu finden.",{"type":283,"tag":284,"props":19560,"children":19561},{},[19562],{"type":293,"value":19563},"Diese Funktion berechnet ein Modulo von 1000 auf der Medien-ID und vergleicht es mit der Chargen-ID. Wir haben also im Grunde 1000 Stapel zu verarbeiten, bis alle Arbeit erledigt ist.",{"type":283,"tag":284,"props":19565,"children":19566},{},[19567],{"type":293,"value":19568},"Jetzt müssen wir nur noch alle 1000 Stapel parallel starten. Dazu habe ich das sehr hilfreiche Tool parallel verwendet, das unter Linux verfügbar ist:",{"type":283,"tag":284,"props":19570,"children":19571},{},[19572],{"type":293,"value":19573},"Es startet 64 Batches parallel und setzt seine Arbeit fort, bis alle 1000 Batches fertig sind.",{"type":283,"tag":284,"props":19575,"children":19576},{},[19577,19579,19583],{"type":293,"value":19578},"Und so sieht es bei ",{"type":283,"tag":11491,"props":19580,"children":19581},{},[19582],{"type":293,"value":18325},{"type":293,"value":19584}," aus:",{"type":283,"tag":303,"props":19586,"children":19588},{"className":18716,"code":19587,"language":18718,"meta":8,"style":8},"parallel -j 64 ./bin/console my:image:generate:thumbnails --batch ::: {0..999}\n",[19589],{"type":283,"tag":317,"props":19590,"children":19591},{"__ignoreMap":8},[19592],{"type":283,"tag":321,"props":19593,"children":19594},{"class":323,"line":324},[19595,19600,19605,19610,19615,19620,19625,19630],{"type":283,"tag":321,"props":19596,"children":19597},{"style":1715},[19598],{"type":293,"value":19599},"parallel",{"type":283,"tag":321,"props":19601,"children":19602},{"style":1730},[19603],{"type":293,"value":19604}," -j",{"type":283,"tag":321,"props":19606,"children":19607},{"style":1730},[19608],{"type":293,"value":19609}," 64",{"type":283,"tag":321,"props":19611,"children":19612},{"style":367},[19613],{"type":293,"value":19614}," ./bin/console",{"type":283,"tag":321,"props":19616,"children":19617},{"style":367},[19618],{"type":293,"value":19619}," my:image:generate:thumbnails",{"type":283,"tag":321,"props":19621,"children":19622},{"style":1730},[19623],{"type":293,"value":19624}," --batch",{"type":283,"tag":321,"props":19626,"children":19627},{"style":367},[19628],{"type":293,"value":19629}," :::",{"type":283,"tag":321,"props":19631,"children":19632},{"style":367},[19633],{"type":293,"value":19634}," {0..999}\n",{"type":283,"tag":1607,"props":19636,"children":19640},{"alt":18325,"aspect-ratio":19637,"height":1610,"object-fit":19638,"src":19639},"2","contain","/blog/htop.png",[],{"type":283,"tag":532,"props":19642,"children":19644},{"id":19643},"schließlich-ist-die-ganze-arbeit-jetzt-in-35-stunden-statt-in-80-stunden-erledigt",[19645],{"type":293,"value":19646},"Schließlich ist die ganze Arbeit jetzt in 3,5 Stunden statt in 80 Stunden erledigt.",{"type":283,"tag":1489,"props":19648,"children":19649},{},[19650],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":19652},[19653,19654,19655],{"id":19135,"depth":340,"text":19138},{"id":19189,"depth":340,"text":19192},{"id":19643,"depth":340,"text":19646},{"_path":175,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":176,"description":177,"author":136,"image":178,"releaseDate":179,"blogCategories":19657,"articleTags":19658,"tags":19659,"body":19660,"_type":20,"_id":184,"_source":22,"_file":185,"_stem":186,"_extension":25},[77,104],[182],[19],{"type":280,"children":19661,"toc":20125},[19662,19668,19680,19686,19691,19697,19702,19741,19747,19752,19758,19770,19888,19906,19912,20068,20073,20079,20115,20121],{"type":283,"tag":532,"props":19663,"children":19665},{"id":19664},"was-ist-btrfs-fragmentierung",[19666],{"type":293,"value":19667},"Was ist BTRFS-Fragmentierung?",{"type":283,"tag":284,"props":19669,"children":19670},{},[19671,19673,19678],{"type":293,"value":19672},"Die meisten der besten BTRFS-Funktionen beruhen auf der ",{"type":283,"tag":11491,"props":19674,"children":19675},{},[19676],{"type":293,"value":19677},"Copy-on-Write-Technologie",{"type":293,"value":19679},". Wenn eine Anwendung einen Teil einer Datei umschreiben will, z.B. das erste MegaByte, werden die Daten nicht an Ort und Stelle geschrieben, sondern in einer sogenannten Erweiterung. Dadurch ist BTRFS in der Lage, mehrere Versionen von teilweise umgeschriebenen Dateien aufzubewahren, wobei nur der den Änderungen zugewiesene Speicherplatz beansprucht wird und nicht mehrere vollständige Kopien einer Datei. Die alten Daten können zu einem bestimmten Zeitpunkt verworfen werden (z.B. wenn sie nicht mehr von Snapshots verwendet werden) und die Erweiterung dient der aktuellen Version der Datei.",{"type":283,"tag":532,"props":19681,"children":19683},{"id":19682},"btrfs-fragmentierung-kann-die-leistung-ihres-systems-beeinträchtigen",[19684],{"type":293,"value":19685},"BTRFS-Fragmentierung kann die Leistung Ihres Systems beeinträchtigen",{"type":283,"tag":284,"props":19687,"children":19688},{},[19689],{"type":293,"value":19690},"Sie können sich vorstellen, dass das Lesen einer Datei mit 100k+ Erweiterungen und das Hinzufügen weiterer Erweiterungen eine Menge Buchführung und Speichersuchvorgänge von Ihrem System erfordert. Diese 10 GB große Datei ist intern in 100k+ Teile zerlegt, die gesammelt werden müssen, wenn Sie die gesamte Datei lesen wollen. Dies erhöht eindeutig die Komplexität - und verringert die Leistung.",{"type":283,"tag":532,"props":19692,"children":19694},{"id":19693},"btrfs-fragmentierung-kann-große-mengen-an-speicherplatz-blockieren",[19695],{"type":293,"value":19696},"BTRFS-Fragmentierung kann große Mengen an Speicherplatz blockieren",{"type":283,"tag":284,"props":19698,"children":19699},{},[19700],{"type":293,"value":19701},"Ja, BTRFS muss die Speicherorte dieser 100k Erweiterungen irgendwo speichern, was leicht einige zusätzliche GB an belegtem Speicherplatz zu Ihrem System hinzufügen kann. Das Schlimme daran ist, dass BTRFS Ihnen das nicht mitteilt.",{"type":283,"tag":284,"props":19703,"children":19704},{},[19705,19707,19712,19714,19719,19720,19725,19727,19732,19734,19739],{"type":293,"value":19706},"Wenn Sie sehen, dass Ihr btrfs-Dateisystem ",{"type":283,"tag":11399,"props":19708,"children":19709},{},[19710],{"type":293,"value":19711},"80GB",{"type":293,"value":19713}," in ",{"type":283,"tag":11491,"props":19715,"children":19716},{},[19717],{"type":293,"value":19718},"df",{"type":293,"value":9440},{"type":283,"tag":11491,"props":19721,"children":19722},{},[19723],{"type":293,"value":19724},"btrfs fi show",{"type":293,"value":19726}," verwendet, während ",{"type":283,"tag":11491,"props":19728,"children":19729},{},[19730],{"type":293,"value":19731},"du -hsx",{"type":293,"value":19733}," nur ",{"type":283,"tag":11399,"props":19735,"children":19736},{},[19737],{"type":293,"value":19738},"54GB",{"type":293,"value":19740}," anzeigt, gibt es nur zwei Gründe, die mir bekannt sind: entweder Sie haben Snapshots, die alte Erweiterungen behalten - oder Sie haben eine massive Fragmentierung.",{"type":283,"tag":532,"props":19742,"children":19744},{"id":19743},"btrfs-dateisystem-defragmentieren",[19745],{"type":293,"value":19746},"BTRFS-Dateisystem defragmentieren",{"type":283,"tag":284,"props":19748,"children":19749},{},[19750],{"type":293,"value":19751},"Es ist möglich, das BTRFS-Dateisystem auf dem gesamten Dateisystem zu defragmentieren, aber das führt dazu, dass alle Snapshots die Daten duplizieren. Es verursacht auch eine Menge IO, so dass dies nichts ist, was Sie auf Ihrem Produktionsserver ohne Grund tun wollen. Es macht wirklich keinen Sinn, statische Dateien zu defragmentieren, die fast nie geändert werden.",{"type":283,"tag":532,"props":19753,"children":19755},{"id":19754},"finden-sie-die-am-meisten-fragmentierten-dateien-auf-ihrem-system",[19756],{"type":293,"value":19757},"Finden Sie die am meisten fragmentierten Dateien auf Ihrem System",{"type":283,"tag":284,"props":19759,"children":19760},{},[19761,19763,19768],{"type":293,"value":19762},"Es gibt ein Linux-Tool namens ",{"type":283,"tag":11491,"props":19764,"children":19765},{},[19766],{"type":293,"value":19767},"filefrag",{"type":293,"value":19769},", das anzeigt, aus wie vielen Fragmenten eine Datei besteht. Also dachte ich ... \"warum nicht versuchen, die am meisten fragmentierten Dateien zu finden und nur diese zu reparieren?\" Hier ist es:",{"type":283,"tag":303,"props":19771,"children":19773},{"className":18716,"code":19772,"language":18718,"meta":8,"style":8},"find / -xdev -type f| xargs filefrag 2>/dev/null | sed 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/' | awk -F ' ' '$1 > 500' | sort -n -r\n",[19774],{"type":283,"tag":317,"props":19775,"children":19776},{"__ignoreMap":8},[19777],{"type":283,"tag":321,"props":19778,"children":19779},{"class":323,"line":324},[19780,19785,19790,19795,19800,19805,19810,19815,19820,19825,19830,19835,19840,19845,19849,19854,19859,19864,19869,19873,19878,19883],{"type":283,"tag":321,"props":19781,"children":19782},{"style":1715},[19783],{"type":293,"value":19784},"find",{"type":283,"tag":321,"props":19786,"children":19787},{"style":367},[19788],{"type":293,"value":19789}," /",{"type":283,"tag":321,"props":19791,"children":19792},{"style":1730},[19793],{"type":293,"value":19794}," -xdev",{"type":283,"tag":321,"props":19796,"children":19797},{"style":1730},[19798],{"type":293,"value":19799}," -type",{"type":283,"tag":321,"props":19801,"children":19802},{"style":367},[19803],{"type":293,"value":19804}," f",{"type":283,"tag":321,"props":19806,"children":19807},{"style":8079},[19808],{"type":293,"value":19809},"|",{"type":283,"tag":321,"props":19811,"children":19812},{"style":1715},[19813],{"type":293,"value":19814}," xargs",{"type":283,"tag":321,"props":19816,"children":19817},{"style":367},[19818],{"type":293,"value":19819}," filefrag",{"type":283,"tag":321,"props":19821,"children":19822},{"style":8079},[19823],{"type":293,"value":19824}," 2>",{"type":283,"tag":321,"props":19826,"children":19827},{"style":367},[19828],{"type":293,"value":19829},"/dev/null",{"type":283,"tag":321,"props":19831,"children":19832},{"style":8079},[19833],{"type":293,"value":19834}," |",{"type":283,"tag":321,"props":19836,"children":19837},{"style":1715},[19838],{"type":293,"value":19839}," sed",{"type":283,"tag":321,"props":19841,"children":19842},{"style":367},[19843],{"type":293,"value":19844}," 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/'",{"type":283,"tag":321,"props":19846,"children":19847},{"style":8079},[19848],{"type":293,"value":19834},{"type":283,"tag":321,"props":19850,"children":19851},{"style":1715},[19852],{"type":293,"value":19853}," awk",{"type":283,"tag":321,"props":19855,"children":19856},{"style":1730},[19857],{"type":293,"value":19858}," -F",{"type":283,"tag":321,"props":19860,"children":19861},{"style":367},[19862],{"type":293,"value":19863}," ' '",{"type":283,"tag":321,"props":19865,"children":19866},{"style":367},[19867],{"type":293,"value":19868}," '$1 > 500'",{"type":283,"tag":321,"props":19870,"children":19871},{"style":8079},[19872],{"type":293,"value":19834},{"type":283,"tag":321,"props":19874,"children":19875},{"style":1715},[19876],{"type":293,"value":19877}," sort",{"type":283,"tag":321,"props":19879,"children":19880},{"style":1730},[19881],{"type":293,"value":19882}," -n",{"type":283,"tag":321,"props":19884,"children":19885},{"style":1730},[19886],{"type":293,"value":19887}," -r\n",{"type":283,"tag":284,"props":19889,"children":19890},{},[19891,19893,19898,19900,19904],{"type":293,"value":19892},"Sie sollten diese Liste überprüfen. Wenn es etwas mit mehr als 10k Erstreckungen gibt, ist es ein Kandidat, um als ",{"type":283,"tag":11491,"props":19894,"children":19895},{},[19896],{"type":293,"value":19897},"nodatacow",{"type":293,"value":19899}," gekennzeichnet zu werden. In meinem Fall habe ich festgestellt, dass die Fail2ban-Sqlite-Datenbank 170k Erweiterungen verwendet, was sehr viel ist! Wenn Sie Datenbankdateien mit einer hohen Fragmentierung haben, während Sie ",{"type":283,"tag":11491,"props":19901,"children":19902},{},[19903],{"type":293,"value":19897},{"type":293,"value":19905}," verwenden, ist es besser, eine \"optimize table\" auf ihnen laufen zu lassen, da dies auch die datenbankbezogene Fragmentierung von häufig neu geschriebenen Tabellen bereinigt. Wenn Sie Snapshots verwenden, stellen Sie sicher, dass Sie etwas freien Speicherplatz haben, da die Defragmentierung eine Kopie der Dateien an Ort und Stelle erstellt, während Snapshots die Freigabe der alten Version blockieren.",{"type":283,"tag":532,"props":19907,"children":19909},{"id":19908},"wenn-alles-in-ordnung-ist-können-sie-fortfahren-und-alle-dateien-in-dieser-liste-defragmentieren",[19910],{"type":293,"value":19911},"Wenn alles in Ordnung ist, können Sie fortfahren und alle Dateien in dieser Liste defragmentieren",{"type":283,"tag":303,"props":19913,"children":19915},{"className":18716,"code":19914,"language":18718,"meta":8,"style":8},"find / -xdev -type f| xargs filefrag 2>/dev/null | sed 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/' |\nawk -F ' ' '$1 > 500' | cut -d ' ' -f2 2>/dev/null | xargs -r btrfs fi defrag -f -v\n",[19916],{"type":283,"tag":317,"props":19917,"children":19918},{"__ignoreMap":8},[19919,19979],{"type":283,"tag":321,"props":19920,"children":19921},{"class":323,"line":324},[19922,19926,19930,19934,19938,19942,19946,19950,19954,19958,19962,19966,19970,19974],{"type":283,"tag":321,"props":19923,"children":19924},{"style":1715},[19925],{"type":293,"value":19784},{"type":283,"tag":321,"props":19927,"children":19928},{"style":367},[19929],{"type":293,"value":19789},{"type":283,"tag":321,"props":19931,"children":19932},{"style":1730},[19933],{"type":293,"value":19794},{"type":283,"tag":321,"props":19935,"children":19936},{"style":1730},[19937],{"type":293,"value":19799},{"type":283,"tag":321,"props":19939,"children":19940},{"style":367},[19941],{"type":293,"value":19804},{"type":283,"tag":321,"props":19943,"children":19944},{"style":8079},[19945],{"type":293,"value":19809},{"type":283,"tag":321,"props":19947,"children":19948},{"style":1715},[19949],{"type":293,"value":19814},{"type":283,"tag":321,"props":19951,"children":19952},{"style":367},[19953],{"type":293,"value":19819},{"type":283,"tag":321,"props":19955,"children":19956},{"style":8079},[19957],{"type":293,"value":19824},{"type":283,"tag":321,"props":19959,"children":19960},{"style":367},[19961],{"type":293,"value":19829},{"type":283,"tag":321,"props":19963,"children":19964},{"style":8079},[19965],{"type":293,"value":19834},{"type":283,"tag":321,"props":19967,"children":19968},{"style":1715},[19969],{"type":293,"value":19839},{"type":283,"tag":321,"props":19971,"children":19972},{"style":367},[19973],{"type":293,"value":19844},{"type":283,"tag":321,"props":19975,"children":19976},{"style":8079},[19977],{"type":293,"value":19978}," |\n",{"type":283,"tag":321,"props":19980,"children":19981},{"class":323,"line":340},[19982,19987,19991,19995,19999,20003,20008,20013,20017,20022,20026,20030,20034,20038,20043,20048,20053,20058,20063],{"type":283,"tag":321,"props":19983,"children":19984},{"style":1715},[19985],{"type":293,"value":19986},"awk",{"type":283,"tag":321,"props":19988,"children":19989},{"style":1730},[19990],{"type":293,"value":19858},{"type":283,"tag":321,"props":19992,"children":19993},{"style":367},[19994],{"type":293,"value":19863},{"type":283,"tag":321,"props":19996,"children":19997},{"style":367},[19998],{"type":293,"value":19868},{"type":283,"tag":321,"props":20000,"children":20001},{"style":8079},[20002],{"type":293,"value":19834},{"type":283,"tag":321,"props":20004,"children":20005},{"style":1715},[20006],{"type":293,"value":20007}," cut",{"type":283,"tag":321,"props":20009,"children":20010},{"style":1730},[20011],{"type":293,"value":20012}," -d",{"type":283,"tag":321,"props":20014,"children":20015},{"style":367},[20016],{"type":293,"value":19863},{"type":283,"tag":321,"props":20018,"children":20019},{"style":1730},[20020],{"type":293,"value":20021}," -f2",{"type":283,"tag":321,"props":20023,"children":20024},{"style":8079},[20025],{"type":293,"value":19824},{"type":283,"tag":321,"props":20027,"children":20028},{"style":367},[20029],{"type":293,"value":19829},{"type":283,"tag":321,"props":20031,"children":20032},{"style":8079},[20033],{"type":293,"value":19834},{"type":283,"tag":321,"props":20035,"children":20036},{"style":1715},[20037],{"type":293,"value":19814},{"type":283,"tag":321,"props":20039,"children":20040},{"style":1730},[20041],{"type":293,"value":20042}," -r",{"type":283,"tag":321,"props":20044,"children":20045},{"style":367},[20046],{"type":293,"value":20047}," btrfs",{"type":283,"tag":321,"props":20049,"children":20050},{"style":367},[20051],{"type":293,"value":20052}," fi",{"type":283,"tag":321,"props":20054,"children":20055},{"style":367},[20056],{"type":293,"value":20057}," defrag",{"type":283,"tag":321,"props":20059,"children":20060},{"style":1730},[20061],{"type":293,"value":20062}," -f",{"type":283,"tag":321,"props":20064,"children":20065},{"style":1730},[20066],{"type":293,"value":20067}," -v\n",{"type":283,"tag":284,"props":20069,"children":20070},{},[20071],{"type":293,"value":20072},"Dies gibt alle Dateinamen aus, die verarbeitet wurden.",{"type":283,"tag":532,"props":20074,"children":20076},{"id":20075},"eine-kurze-erklärung-des-befehls",[20077],{"type":293,"value":20078},"Eine kurze Erklärung des Befehls",{"type":283,"tag":284,"props":20080,"children":20081},{},[20082,20086,20088,20093,20095,20099,20101,20106,20108,20113],{"type":283,"tag":11491,"props":20083,"children":20084},{},[20085],{"type":293,"value":19784},{"type":293,"value":20087}," ermittelt alle Dateien auf dem angegebenen Pfad (/), ohne in andere eingehängte Dateisysteme zu gehen (-xdev). Dann bestimmt filefrag die Fragmentierung, der Befehl ",{"type":283,"tag":11491,"props":20089,"children":20090},{},[20091],{"type":293,"value":20092},"sed",{"type":293,"value":20094}," formatiert die Ausgabe so um, dass die Anzahl der Erweiterungen an erster Stelle steht, gefolgt vom Dateinamen. Dann analysiert ",{"type":283,"tag":11491,"props":20096,"children":20097},{},[20098],{"type":293,"value":19986},{"type":293,"value":20100}," diese Liste und filtert nur Dateien, die mehr als 500 Erweiterungen haben. Danach wird die Ausgabe so \"geschnitten\", dass sie nur die Dateinamen enthält, und an ",{"type":283,"tag":11491,"props":20102,"children":20103},{},[20104],{"type":293,"value":20105},"btrfs defrag",{"type":293,"value":20107}," zur Defragmentierung übergeben. Die Option ",{"type":283,"tag":11491,"props":20109,"children":20110},{},[20111],{"type":293,"value":20112},"-v",{"type":293,"value":20114}," des Defrag-Befehls gibt alle verarbeiteten Dateien aus. Werfen Sie auch einen Blick auf die langfristige IO-Nutzung vor und nach der Defragmentierung, um zu sehen, wie groß der Unterschied in der realen Welt ist.",{"type":283,"tag":532,"props":20116,"children":20118},{"id":20117},"viel-spaß",[20119],{"type":293,"value":20120},"Viel Spaß!",{"type":283,"tag":1489,"props":20122,"children":20123},{},[20124],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":20126},[20127,20128,20129,20130,20131,20132,20133,20134],{"id":19664,"depth":340,"text":19667},{"id":19682,"depth":340,"text":19685},{"id":19693,"depth":340,"text":19696},{"id":19743,"depth":340,"text":19746},{"id":19754,"depth":340,"text":19757},{"id":19908,"depth":340,"text":19911},{"id":20075,"depth":340,"text":20078},{"id":20117,"depth":340,"text":20120},{"_path":188,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":189,"description":190,"author":136,"image":191,"releaseDate":192,"blogCategories":20136,"articleTags":20137,"tags":20138,"body":20139,"_type":20,"_id":196,"_source":22,"_file":197,"_stem":198,"_extension":25},[77,104],[157],[19],{"type":280,"children":20140,"toc":20367},[20141,20146,20151,20176,20181,20232,20237,20358,20363],{"type":283,"tag":284,"props":20142,"children":20143},{},[20144],{"type":293,"value":20145},"Die meisten Sysadmins wissen, wie man ein einfaches chroot auf einem gemounteten Dateisystem einrichtet (mount-binding dev, proc und sys), aber das funktioniert nicht in jedem Fall; für eine vollständige chroot-Einrichtung bräuchte man außerdem dev/pts dev/shm, run, tmp, eine funktionierende resolve.conf und mehr. Nachdem Sie es eingerichtet haben und es wieder herunterfahren wollen, müssen Sie wieder eine Menge tippen. Aber halt! Es gibt eine bessere Lösung.",{"type":283,"tag":284,"props":20147,"children":20148},{},[20149],{"type":293,"value":20150},"Es gibt ein Skript namens arch-chroot, das mit der Archlinux-Distribution ausgeliefert wird, aber es ist nicht darauf beschränkt, mit Archlinux ausgeführt zu werden. Es funktioniert auf jeder Linux-Distri!",{"type":283,"tag":284,"props":20152,"children":20153},{},[20154,20156,20161,20162,20167,20169,20175],{"type":293,"value":20155},"Zu Ihrer Erleichterung habe ich ",{"type":283,"tag":321,"props":20157,"children":20158},{},[20159],{"type":293,"value":20160},"einen Gist",{"type":293,"value":12474},{"type":283,"tag":288,"props":20163,"children":20165},{"href":20164},"https://gist.github.com/bhelm/65283c37a0cb585089041214002df4f7",[20166],{"type":293,"value":20164},{"type":293,"value":20168},") für Sie erstellt. Sie können auch den direkten ",{"type":283,"tag":288,"props":20170,"children":20172},{"href":20171},"https://gist.githubusercontent.com/bhelm/65283c37a0cb585089041214002df4f7/raw/536099a5f969a6888c85e48a487ec19870c596a2/arch-chroot.sh",[20173],{"type":293,"value":20174},"Download-Link für wget",{"type":293,"value":1700},{"type":283,"tag":284,"props":20177,"children":20178},{},[20179],{"type":293,"value":20180},"können Sie es wie folgt installieren:",{"type":283,"tag":303,"props":20182,"children":20184},{"className":18716,"code":20183,"language":18718,"meta":8,"style":8},"wget https://gist.githubusercontent.com/bhelm/65283c37a0cb585089041214002df4f7/raw/536099a5f969a6888c85e48a487ec19870c596a2/arch-chroot.sh\nchmod +x arch-chroot.sh\n./arch-chroot.sh -h\n",[20185],{"type":283,"tag":317,"props":20186,"children":20187},{"__ignoreMap":8},[20188,20201,20219],{"type":283,"tag":321,"props":20189,"children":20190},{"class":323,"line":324},[20191,20196],{"type":283,"tag":321,"props":20192,"children":20193},{"style":1715},[20194],{"type":293,"value":20195},"wget",{"type":283,"tag":321,"props":20197,"children":20198},{"style":367},[20199],{"type":293,"value":20200}," https://gist.githubusercontent.com/bhelm/65283c37a0cb585089041214002df4f7/raw/536099a5f969a6888c85e48a487ec19870c596a2/arch-chroot.sh\n",{"type":283,"tag":321,"props":20202,"children":20203},{"class":323,"line":340},[20204,20209,20214],{"type":283,"tag":321,"props":20205,"children":20206},{"style":1715},[20207],{"type":293,"value":20208},"chmod",{"type":283,"tag":321,"props":20210,"children":20211},{"style":367},[20212],{"type":293,"value":20213}," +x",{"type":283,"tag":321,"props":20215,"children":20216},{"style":367},[20217],{"type":293,"value":20218}," arch-chroot.sh\n",{"type":283,"tag":321,"props":20220,"children":20221},{"class":323,"line":353},[20222,20227],{"type":283,"tag":321,"props":20223,"children":20224},{"style":1715},[20225],{"type":293,"value":20226},"./arch-chroot.sh",{"type":283,"tag":321,"props":20228,"children":20229},{"style":1730},[20230],{"type":293,"value":20231}," -h\n",{"type":283,"tag":284,"props":20233,"children":20234},{},[20235],{"type":293,"value":20236},"Mit diesem Skript war ich in der Lage, grub zu installieren, ohne Fehler wie:",{"type":283,"tag":303,"props":20238,"children":20240},{"className":18716,"code":20239,"language":18718,"meta":8,"style":8},"grub-install: error: cannot find a device for /boot/grub (is /dev mounted?).\ngrub-probe: error: cannot find a device for / (is /dev mounted?).\n",[20241],{"type":283,"tag":317,"props":20242,"children":20243},{"__ignoreMap":8},[20244,20306],{"type":283,"tag":321,"props":20245,"children":20246},{"class":323,"line":324},[20247,20252,20257,20262,20267,20271,20276,20281,20286,20291,20296,20301],{"type":283,"tag":321,"props":20248,"children":20249},{"style":1715},[20250],{"type":293,"value":20251},"grub-install:",{"type":283,"tag":321,"props":20253,"children":20254},{"style":367},[20255],{"type":293,"value":20256}," error:",{"type":283,"tag":321,"props":20258,"children":20259},{"style":367},[20260],{"type":293,"value":20261}," cannot",{"type":283,"tag":321,"props":20263,"children":20264},{"style":367},[20265],{"type":293,"value":20266}," find",{"type":283,"tag":321,"props":20268,"children":20269},{"style":367},[20270],{"type":293,"value":18739},{"type":283,"tag":321,"props":20272,"children":20273},{"style":367},[20274],{"type":293,"value":20275}," device",{"type":283,"tag":321,"props":20277,"children":20278},{"style":367},[20279],{"type":293,"value":20280}," for",{"type":283,"tag":321,"props":20282,"children":20283},{"style":367},[20284],{"type":293,"value":20285}," /boot/grub",{"type":283,"tag":321,"props":20287,"children":20288},{"style":334},[20289],{"type":293,"value":20290}," (is ",{"type":283,"tag":321,"props":20292,"children":20293},{"style":367},[20294],{"type":293,"value":20295},"/dev",{"type":283,"tag":321,"props":20297,"children":20298},{"style":367},[20299],{"type":293,"value":20300}," mounted?",{"type":283,"tag":321,"props":20302,"children":20303},{"style":334},[20304],{"type":293,"value":20305},").\n",{"type":283,"tag":321,"props":20307,"children":20308},{"class":323,"line":340},[20309,20314,20318,20322,20326,20330,20334,20338,20342,20346,20350,20354],{"type":283,"tag":321,"props":20310,"children":20311},{"style":1715},[20312],{"type":293,"value":20313},"grub-probe:",{"type":283,"tag":321,"props":20315,"children":20316},{"style":367},[20317],{"type":293,"value":20256},{"type":283,"tag":321,"props":20319,"children":20320},{"style":367},[20321],{"type":293,"value":20261},{"type":283,"tag":321,"props":20323,"children":20324},{"style":367},[20325],{"type":293,"value":20266},{"type":283,"tag":321,"props":20327,"children":20328},{"style":367},[20329],{"type":293,"value":18739},{"type":283,"tag":321,"props":20331,"children":20332},{"style":367},[20333],{"type":293,"value":20275},{"type":283,"tag":321,"props":20335,"children":20336},{"style":367},[20337],{"type":293,"value":20280},{"type":283,"tag":321,"props":20339,"children":20340},{"style":367},[20341],{"type":293,"value":19789},{"type":283,"tag":321,"props":20343,"children":20344},{"style":334},[20345],{"type":293,"value":20290},{"type":283,"tag":321,"props":20347,"children":20348},{"style":367},[20349],{"type":293,"value":20295},{"type":283,"tag":321,"props":20351,"children":20352},{"style":367},[20353],{"type":293,"value":20300},{"type":283,"tag":321,"props":20355,"children":20356},{"style":334},[20357],{"type":293,"value":20305},{"type":283,"tag":284,"props":20359,"children":20360},{},[20361],{"type":293,"value":20362},"Wenn Sie ein wirklich gutes Rettungssystem suchen, empfehle ich Ihnen das archlinux-Installations-Image; es enthält das arch-chroot-Skript, alle Low-Level-Tools, die zum Formatieren von Festplatten benötigt werden und unterstützt sogar das Mounten von ntfs read-write und den Zugriff auf Samba-Shares.",{"type":283,"tag":1489,"props":20364,"children":20365},{},[20366],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":20368},[],{"_path":200,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":201,"description":202,"author":136,"image":203,"releaseDate":204,"blogCategories":20370,"articleTags":20371,"tags":20372,"body":20373,"_type":20,"_id":209,"_source":22,"_file":210,"_stem":211,"_extension":25},[77,104],[207],[19],{"type":280,"children":20374,"toc":20882},[20375,20381,20386,20391,20773,20778,20783,20791,20796,20878],{"type":283,"tag":532,"props":20376,"children":20378},{"id":20377},"untersuchung-der-leistung",[20379],{"type":293,"value":20380},"Untersuchung der Leistung",{"type":283,"tag":284,"props":20382,"children":20383},{},[20384],{"type":293,"value":20385},"Wenn es darum geht, eine NVME-SSD für eine Softwareentwickler-Workstation zu kaufen, steht man vor der Wahl: eine billige oder eine teure zu kaufen. Bisher habe ich mich für die teureren entschieden, weil sie eine bessere Leistung und längere Lebensdauer versprachen - jetzt sehe ich, wie falsch ich lag.",{"type":283,"tag":284,"props":20387,"children":20388},{},[20389],{"type":293,"value":20390},"Alles begann damit, dass ein Mitarbeiter sagte, seine NVME-SSD sei langsamer als seine Sata-SSD. Das kann nicht wahr sein, denn die Sata-SSD ist auf 600 MB/s begrenzt und 3 Jahre alt, während seine neue NVME-SSD angeblich 3000 MB/s lesen und schreiben kann. Und doch ist es wahr. Ich habe einige schmutzige Benchmarks durchgeführt und die Ergebnisse sind beeindruckend. Ich nenne die Benchmarks \"schmutzig\", weil eindeutig unterschiedliche PCs verwendet werden; unterschiedliche CPUs, offensichtlich unterschiedliche Betriebssystemversionen, unterschiedliche MySQL-Versionen und Konfigurationen. Aber die Unterschiede in den Ergebnissen lassen sich meiner Meinung nach so nicht erklären. Irgendetwas stimmt nicht mit den Samsung NVME SSDs.",{"type":283,"tag":20392,"props":20393,"children":20394},"table",{},[20395,20433],{"type":283,"tag":20396,"props":20397,"children":20398},"thead",{},[20399],{"type":283,"tag":20400,"props":20401,"children":20402},"tr",{},[20403,20409,20413,20418,20423,20428],{"type":283,"tag":20404,"props":20405,"children":20406},"th",{},[20407],{"type":293,"value":20408},"User",{"type":283,"tag":20404,"props":20410,"children":20411},{},[20412],{"type":293,"value":207},{"type":283,"tag":20404,"props":20414,"children":20415},{},[20416],{"type":293,"value":20417},"Note",{"type":283,"tag":20404,"props":20419,"children":20420},{},[20421],{"type":293,"value":20422},"Allocation",{"type":283,"tag":20404,"props":20424,"children":20425},{},[20426],{"type":293,"value":20427},"TPS",{"type":283,"tag":20404,"props":20429,"children":20430},{},[20431],{"type":293,"value":20432},"QPS",{"type":283,"tag":20434,"props":20435,"children":20436},"tbody",{},[20437,20469,20498,20529,20558,20589,20621,20652,20684,20714,20744],{"type":283,"tag":20400,"props":20438,"children":20439},{},[20440,20446,20451,20454,20459,20464],{"type":283,"tag":20441,"props":20442,"children":20443},"td",{},[20444],{"type":293,"value":20445},"Markus",{"type":283,"tag":20441,"props":20447,"children":20448},{},[20449],{"type":293,"value":20450},"Curical CT1000P1SSD8",{"type":283,"tag":20441,"props":20452,"children":20453},{},[],{"type":283,"tag":20441,"props":20455,"children":20456},{},[20457],{"type":293,"value":20458},"1,00 %",{"type":283,"tag":20441,"props":20460,"children":20461},{},[20462],{"type":293,"value":20463},"304",{"type":283,"tag":20441,"props":20465,"children":20466},{},[20467],{"type":293,"value":20468},"6091",{"type":283,"tag":20400,"props":20470,"children":20471},{},[20472,20476,20480,20483,20488,20493],{"type":283,"tag":20441,"props":20473,"children":20474},{},[20475],{"type":293,"value":1510},{"type":283,"tag":20441,"props":20477,"children":20478},{},[20479],{"type":293,"value":20450},{"type":283,"tag":20441,"props":20481,"children":20482},{},[],{"type":283,"tag":20441,"props":20484,"children":20485},{},[20486],{"type":293,"value":20487},"4,00 %",{"type":283,"tag":20441,"props":20489,"children":20490},{},[20491],{"type":293,"value":20492},"412",{"type":283,"tag":20441,"props":20494,"children":20495},{},[20496],{"type":293,"value":20497},"8241",{"type":283,"tag":20400,"props":20499,"children":20500},{},[20501,20506,20511,20514,20519,20524],{"type":283,"tag":20441,"props":20502,"children":20503},{},[20504],{"type":293,"value":20505},"Reiner",{"type":283,"tag":20441,"props":20507,"children":20508},{},[20509],{"type":293,"value":20510},"Samsung SSD 970 PRO 512GB",{"type":283,"tag":20441,"props":20512,"children":20513},{},[],{"type":283,"tag":20441,"props":20515,"children":20516},{},[20517],{"type":293,"value":20518},"66,00 %",{"type":283,"tag":20441,"props":20520,"children":20521},{},[20522],{"type":293,"value":20523},"160",{"type":283,"tag":20441,"props":20525,"children":20526},{},[20527],{"type":293,"value":20528},"3214",{"type":283,"tag":20400,"props":20530,"children":20531},{},[20532,20536,20540,20543,20548,20553],{"type":283,"tag":20441,"props":20533,"children":20534},{},[20535],{"type":293,"value":20445},{"type":283,"tag":20441,"props":20537,"children":20538},{},[20539],{"type":293,"value":20510},{"type":283,"tag":20441,"props":20541,"children":20542},{},[],{"type":283,"tag":20441,"props":20544,"children":20545},{},[20546],{"type":293,"value":20547},"14,00 %",{"type":283,"tag":20441,"props":20549,"children":20550},{},[20551],{"type":293,"value":20552},"120",{"type":283,"tag":20441,"props":20554,"children":20555},{},[20556],{"type":293,"value":20557},"2414",{"type":283,"tag":20400,"props":20559,"children":20560},{},[20561,20565,20569,20574,20579,20584],{"type":283,"tag":20441,"props":20562,"children":20563},{},[20564],{"type":293,"value":18506},{"type":283,"tag":20441,"props":20566,"children":20567},{},[20568],{"type":293,"value":20510},{"type":283,"tag":20441,"props":20570,"children":20571},{},[20572],{"type":293,"value":20573},"crypt",{"type":283,"tag":20441,"props":20575,"children":20576},{},[20577],{"type":293,"value":20578},"80,00 %",{"type":283,"tag":20441,"props":20580,"children":20581},{},[20582],{"type":293,"value":20583},"148",{"type":283,"tag":20441,"props":20585,"children":20586},{},[20587],{"type":293,"value":20588},"2976",{"type":283,"tag":20400,"props":20590,"children":20591},{},[20592,20597,20602,20606,20611,20616],{"type":283,"tag":20441,"props":20593,"children":20594},{},[20595],{"type":293,"value":20596},"Daniel",{"type":283,"tag":20441,"props":20598,"children":20599},{},[20600],{"type":293,"value":20601},"Samsung SSD 960 PRO 512GB",{"type":283,"tag":20441,"props":20603,"children":20604},{},[20605],{"type":293,"value":20573},{"type":283,"tag":20441,"props":20607,"children":20608},{},[20609],{"type":293,"value":20610},"46,00 %",{"type":283,"tag":20441,"props":20612,"children":20613},{},[20614],{"type":293,"value":20615},"30",{"type":283,"tag":20441,"props":20617,"children":20618},{},[20619],{"type":293,"value":20620},"614",{"type":283,"tag":20400,"props":20622,"children":20623},{},[20624,20628,20633,20638,20643,20647],{"type":283,"tag":20441,"props":20625,"children":20626},{},[20627],{"type":293,"value":20505},{"type":283,"tag":20441,"props":20629,"children":20630},{},[20631],{"type":293,"value":20632},"Samsung SSD 850 PRO 128GB",{"type":283,"tag":20441,"props":20634,"children":20635},{},[20636],{"type":293,"value":20637},"sata",{"type":283,"tag":20441,"props":20639,"children":20640},{},[20641],{"type":293,"value":20642},"37,00 %",{"type":283,"tag":20441,"props":20644,"children":20645},{},[20646],{"type":293,"value":20552},{"type":283,"tag":20441,"props":20648,"children":20649},{},[20650],{"type":293,"value":20651},"2437",{"type":283,"tag":20400,"props":20653,"children":20654},{},[20655,20659,20664,20669,20674,20679],{"type":283,"tag":20441,"props":20656,"children":20657},{},[20658],{"type":293,"value":20596},{"type":283,"tag":20441,"props":20660,"children":20661},{},[20662],{"type":293,"value":20663},"Samsung SSD 860 PRO 512GB",{"type":283,"tag":20441,"props":20665,"children":20666},{},[20667],{"type":293,"value":20668},"SATA",{"type":283,"tag":20441,"props":20670,"children":20671},{},[20672],{"type":293,"value":20673},"87,00 %",{"type":283,"tag":20441,"props":20675,"children":20676},{},[20677],{"type":293,"value":20678},"185",{"type":283,"tag":20441,"props":20680,"children":20681},{},[20682],{"type":293,"value":20683},"3700",{"type":283,"tag":20400,"props":20685,"children":20686},{},[20687,20692,20697,20700,20704,20709],{"type":283,"tag":20441,"props":20688,"children":20689},{},[20690],{"type":293,"value":20691},"Daneil",{"type":283,"tag":20441,"props":20693,"children":20694},{},[20695],{"type":293,"value":20696},"Samsung SSD 970 EVO Plus 1TB",{"type":283,"tag":20441,"props":20698,"children":20699},{},[],{"type":283,"tag":20441,"props":20701,"children":20702},{},[20703],{"type":293,"value":20458},{"type":283,"tag":20441,"props":20705,"children":20706},{},[20707],{"type":293,"value":20708},"480",{"type":283,"tag":20441,"props":20710,"children":20711},{},[20712],{"type":293,"value":20713},"9614",{"type":283,"tag":20400,"props":20715,"children":20716},{},[20717,20721,20726,20729,20734,20739],{"type":283,"tag":20441,"props":20718,"children":20719},{},[20720],{"type":293,"value":18506},{"type":283,"tag":20441,"props":20722,"children":20723},{},[20724],{"type":293,"value":20725},"Sabrent Rocket Q 2TB",{"type":283,"tag":20441,"props":20727,"children":20728},{},[],{"type":283,"tag":20441,"props":20730,"children":20731},{},[20732],{"type":293,"value":20733},"26,00 %",{"type":283,"tag":20441,"props":20735,"children":20736},{},[20737],{"type":293,"value":20738},"237",{"type":283,"tag":20441,"props":20740,"children":20741},{},[20742],{"type":293,"value":20743},"4749",{"type":283,"tag":20400,"props":20745,"children":20746},{},[20747,20752,20757,20760,20764,20768],{"type":283,"tag":20441,"props":20748,"children":20749},{},[20750],{"type":293,"value":20751},"Marcel",{"type":283,"tag":20441,"props":20753,"children":20754},{},[20755],{"type":293,"value":20756},"Patriot Scorch M2 256GB",{"type":283,"tag":20441,"props":20758,"children":20759},{},[],{"type":283,"tag":20441,"props":20761,"children":20762},{},[20763],{"type":293,"value":20458},{"type":283,"tag":20441,"props":20765,"children":20766},{},[20767],{"type":293,"value":20552},{"type":283,"tag":20441,"props":20769,"children":20770},{},[20771],{"type":293,"value":20772},"2440",{"type":283,"tag":284,"props":20774,"children":20775},{},[20776],{"type":293,"value":20777},"Wie Sie sehen können, ist die Curical P1 SSD 2x, teilweise 3x schneller als die Samsung Pro SSDs - obwohl die Curical nur ein Drittel kostet. Man kann auch sehen, dass die 860 Pro Sata SSD von Daniel schneller ist als alle Samsung NVME Pro SSDs. Wenn Sie bei Google nach dem Phänomen suchen, werden Sie andere Personen finden, die das gleiche Problem beobachtet haben. Die Samsung PRO NVME SSDs scheinen ein Problem mit häufigen fsync-Aufrufen zu haben. Ich habe sysbench 1.0.18 mit dem oltp_read_write Benchmark auf allen Maschinen verwendet. Sie verwenden alle BTRFS als Dateisystem und das MySQL-Dateisystem wurde mit nodatacow gemountet, was die Leistung verbessert. In der Tabelle steht TPS für Transaktionen pro Sekunde und QPS für Abfragen pro Sekunde - beide Werte wurden aus den Sysbench-Statistiken ausgelesen.",{"type":283,"tag":284,"props":20779,"children":20780},{},[20781],{"type":293,"value":20782},"Da die Leistung unserer Datenbank für unsere Softwareentwickler sehr wichtig ist, werde ich in Zukunft die Samsung pro NVME SSDs meiden und anderen Herstellern eine Chance geben. Die SSD ist immer noch gut für Spiele, Filmbearbeitung und so weiter, nur nicht für notwendige fsyncs.",{"type":283,"tag":284,"props":20784,"children":20785},{},[20786],{"type":283,"tag":11399,"props":20787,"children":20788},{},[20789],{"type":293,"value":20790},"Edit: Es sieht so aus, als ob die 970 EVO Plus SSD nicht von diesem Problem betroffen ist.",{"type":283,"tag":284,"props":20792,"children":20793},{},[20794],{"type":293,"value":20795},"Verwendete Sysbench-Befehle:",{"type":283,"tag":303,"props":20797,"children":20799},{"className":18716,"code":20798,"language":18718,"meta":8,"style":8},"sysbench oltp_read_write --table-size=2500000 --mysql-user=root --db-driver=mysql --mysql-password=  prepare\nsysbench oltp_read_write --table-size=2500000 --mysql-user=root --db-driver=mysql --mysql-password=  --time=120 run\n",[20800],{"type":283,"tag":317,"props":20801,"children":20802},{"__ignoreMap":8},[20803,20841],{"type":283,"tag":321,"props":20804,"children":20805},{"class":323,"line":324},[20806,20811,20816,20821,20826,20831,20836],{"type":283,"tag":321,"props":20807,"children":20808},{"style":1715},[20809],{"type":293,"value":20810},"sysbench",{"type":283,"tag":321,"props":20812,"children":20813},{"style":367},[20814],{"type":293,"value":20815}," oltp_read_write",{"type":283,"tag":321,"props":20817,"children":20818},{"style":1730},[20819],{"type":293,"value":20820}," --table-size=2500000",{"type":283,"tag":321,"props":20822,"children":20823},{"style":1730},[20824],{"type":293,"value":20825}," --mysql-user=root",{"type":283,"tag":321,"props":20827,"children":20828},{"style":1730},[20829],{"type":293,"value":20830}," --db-driver=mysql",{"type":283,"tag":321,"props":20832,"children":20833},{"style":1730},[20834],{"type":293,"value":20835}," --mysql-password=",{"type":283,"tag":321,"props":20837,"children":20838},{"style":367},[20839],{"type":293,"value":20840},"  prepare\n",{"type":283,"tag":321,"props":20842,"children":20843},{"class":323,"line":340},[20844,20848,20852,20856,20860,20864,20868,20873],{"type":283,"tag":321,"props":20845,"children":20846},{"style":1715},[20847],{"type":293,"value":20810},{"type":283,"tag":321,"props":20849,"children":20850},{"style":367},[20851],{"type":293,"value":20815},{"type":283,"tag":321,"props":20853,"children":20854},{"style":1730},[20855],{"type":293,"value":20820},{"type":283,"tag":321,"props":20857,"children":20858},{"style":1730},[20859],{"type":293,"value":20825},{"type":283,"tag":321,"props":20861,"children":20862},{"style":1730},[20863],{"type":293,"value":20830},{"type":283,"tag":321,"props":20865,"children":20866},{"style":1730},[20867],{"type":293,"value":20835},{"type":283,"tag":321,"props":20869,"children":20870},{"style":1730},[20871],{"type":293,"value":20872},"  --time=120",{"type":283,"tag":321,"props":20874,"children":20875},{"style":367},[20876],{"type":293,"value":20877}," run\n",{"type":283,"tag":1489,"props":20879,"children":20880},{},[20881],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":20883},[20884],{"id":20377,"depth":340,"text":20380},{"_path":213,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":214,"description":215,"author":136,"image":216,"releaseDate":217,"blogCategories":20886,"articleTags":20887,"tags":20888,"body":20889,"_type":20,"_id":221,"_source":22,"_file":222,"_stem":223,"_extension":25},[77,104],[207],[19],{"type":280,"children":20890,"toc":21048},[20891,20897,20902,20907,20913,20931,20937,20942,20948,20953,20958,20963,20968,20974,20979,20984,20989,20994,20999,21004,21009,21014,21022,21027,21033,21038,21043],{"type":283,"tag":532,"props":20892,"children":20894},{"id":20893},"kommentar-und-untersuchung-der-raid-leistung",[20895],{"type":293,"value":20896},"Kommentar und Untersuchung der RAID-Leistung",{"type":283,"tag":284,"props":20898,"children":20899},{},[20900],{"type":293,"value":20901},"RAID 5 vs. RAID10 wird seit Ewigkeiten diskutiert; es ist allgemein bekannt, dass RAID10 eine bessere Leistung bietet -\naber wie viel, hängt von der tatsächlichen Implementierung, der Hardware und dem Anwendungsfall ab.",{"type":283,"tag":284,"props":20903,"children":20904},{},[20905],{"type":293,"value":20906},"Ich habe gerade einen Server mit 4 x 16 TB Festplatten bekommen, alle nagelneu, und beschloss, ihn zu testen, um\nherauszufinden, ob der Leistungsgewinn von Raid 10 den geringeren nutzbaren Speicherplatz rechtfertigt. Wir planen, ihn\nals Backup-Server zu verwenden, so dass unsere Arbeitslast hauptsächlich aus sequentiellen Schreibvorgängen besteht.",{"type":283,"tag":532,"props":20908,"children":20910},{"id":20909},"testmethodik",[20911],{"type":293,"value":20912},"Testmethodik",{"type":283,"tag":284,"props":20914,"children":20915},{},[20916,20918,20923,20924,20929],{"type":293,"value":20917},"Alle Tests werden mit ",{"type":283,"tag":11491,"props":20919,"children":20920},{},[20921],{"type":293,"value":20922},"fio",{"type":293,"value":10621},{"type":283,"tag":11491,"props":20925,"children":20926},{},[20927],{"type":293,"value":20928},"iodepth=32 direct=1 ioengine=libaio refill_buffers",{"type":293,"value":20930}," und einem Zeitlimit von 60 Sekunden\nausgeführt. die sequentiellen Lese- und Schreibtests werden mit 1024k Blockgröße und 1 Prozess durchgeführt. Die\nzufälligen Lese-/Schreibtests mit 4k Blockgröße und 4 Prozessen. Für die Tests wird eine 30 GB große Partition am Anfang\njeder Festplatte verwendet. Die Linux-Kernel-Version ist 5.10.",{"type":283,"tag":532,"props":20932,"children":20934},{"id":20933},"einfache-festplattenleistung",[20935],{"type":293,"value":20936},"Einfache Festplattenleistung",{"type":283,"tag":284,"props":20938,"children":20939},{},[20940],{"type":293,"value":20941},"Bevor ich mit den eigentlichen Tests beginne, möchte ich die Grundlinie der Leistung einer einzelnen Festplatte\nermitteln und auch sicherstellen, dass alle Festplatten ähnlich arbeiten.",{"type":283,"tag":1607,"props":20943,"children":20947},{"alt":20944,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20946},"raid_1",200,"/blog/raid_1.png",[],{"type":283,"tag":1607,"props":20949,"children":20952},{"alt":20950,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20951},"raid_2","/blog/raid_2.png",[],{"type":283,"tag":1607,"props":20954,"children":20957},{"alt":20955,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20956},"raid_3","/blog/raid_3.png",[],{"type":283,"tag":1607,"props":20959,"children":20962},{"alt":20960,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20961},"raid_4","/blog/raid_4.png",[],{"type":283,"tag":284,"props":20964,"children":20965},{},[20966],{"type":293,"value":20967},"Hier sieht alles schön flach aus, so wie es sein sollte. Wir haben etwa 268 MB/s beim sequentiellen Lesen und Schreiben\nund eine zufällige IOPS-Leistung von 550 beim Lesen und 480 beim Schreiben.",{"type":283,"tag":532,"props":20969,"children":20971},{"id":20970},"raid-5-vs-raid-10",[20972],{"type":293,"value":20973},"Raid 5 vs Raid 10",{"type":283,"tag":1607,"props":20975,"children":20978},{"alt":20976,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20977},"raid_5","/blog/raid_5.png",[],{"type":283,"tag":1607,"props":20980,"children":20983},{"alt":20981,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20982},"raid_6","/blog/raid_6.png",[],{"type":283,"tag":284,"props":20985,"children":20986},{},[20987],{"type":293,"value":20988},"Die sequentille Leseleistung zwischen RAID5 und RAID10 ist geringer als ich vermutet hätte. Das far2 Layout macht hier\nwirklich einen Unterschied.",{"type":283,"tag":1607,"props":20990,"children":20993},{"alt":20991,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":20992},"raid_7","/blog/raid_7.png",[],{"type":283,"tag":284,"props":20995,"children":20996},{},[20997],{"type":293,"value":20998},"Interessanterweise gibt es keinen großen Unterschied beim Zufallslesetest, was ich nicht erwartet hätte.",{"type":283,"tag":1607,"props":21000,"children":21003},{"alt":21001,"aspect-ratio":19637,"height":20945,"object-fit":19638,"src":21002},"raid_8","/blog/raid_8.png",[],{"type":283,"tag":284,"props":21005,"children":21006},{},[21007],{"type":293,"value":21008},"Das Rand Write Diagramm sieht dem Seq Write Diagramm sehr ähnlich. Der einzige Unterschied ist, dass das klassische\nraid10 besser mit zufälligen als mit sequentiellen Schreibvorgängen umgehen kann.",{"type":283,"tag":284,"props":21010,"children":21011},{},[21012],{"type":293,"value":21013},"MDADM hat mehrere Implementierungen, wie das Raid intern arbeitet. Für raid10 habe ich die Layouts \"near 2\" und \"far 2\"\ngetestet, wobei \"near 2\" der Standard ist. Aus der Doku:",{"type":283,"tag":10885,"props":21015,"children":21016},{},[21017],{"type":283,"tag":284,"props":21018,"children":21019},{},[21020],{"type":293,"value":21021},"Der Vorteil dieser (... Far 2) Anordnung besteht darin, dass MD sequentielle Lesevorgänge leicht auf die Geräte\nverteilen kann, was sie in Bezug auf die Geschwindigkeit mit RAID0 vergleichbar macht. Der Preis dafür ist, dass bei\nSchreibvorgängen mehr gesucht wird, was sie wesentlich langsamer macht.",{"type":283,"tag":284,"props":21023,"children":21024},{},[21025],{"type":293,"value":21026},"Ja, dies ist in den Benchmark-Diagrammen zu sehen",{"type":283,"tag":532,"props":21028,"children":21030},{"id":21029},"schlussfolgerungen",[21031],{"type":293,"value":21032},"Schlussfolgerungen",{"type":283,"tag":284,"props":21034,"children":21035},{},[21036],{"type":293,"value":21037},"Aus meinen Tests geht hervor, dass der Unterschied in der Leseleistung vernachlässigbar ist. Beim Schreiben hat Raid10\neinen großen Vorteil.",{"type":283,"tag":284,"props":21039,"children":21040},{},[21041],{"type":293,"value":21042},"Für unseren Backup-Server verwenden wir Raid 5, da es 3x schneller ist als die 1GBit Netzwerkkarte des Servers und\nunsere Backup- oder Restore-Prozesse nicht ausbremst.",{"type":283,"tag":284,"props":21044,"children":21045},{},[21046],{"type":293,"value":21047},"Wenn Sie einen kritischeren Anwendungsfall haben, rate ich Ihnen, Ihre eigenen Benchmarks durchzuführen, die Ihre\nArbeitslast besser widerspiegeln. Besonders wenn Sie SSDs verwenden, können die Ergebnisse drastisch anders ausfallen.",{"title":8,"searchDepth":340,"depth":340,"links":21049},[21050,21051,21052,21053,21054],{"id":20893,"depth":340,"text":20896},{"id":20909,"depth":340,"text":20912},{"id":20933,"depth":340,"text":20936},{"id":20970,"depth":340,"text":20973},{"id":21029,"depth":340,"text":21032},{"_path":225,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":226,"description":227,"author":228,"image":229,"releaseDate":230,"blogCategories":21056,"articleTags":21057,"tags":21058,"body":21059,"_type":20,"_id":236,"_source":22,"_file":237,"_stem":238,"_extension":25},[77,232],[207],[235,19],{"type":280,"children":21060,"toc":22590},[21061,21065,21070,21075,21081,21130,21135,21141,21153,21158,21163,21169,21187,21192,22484,22489,22568,22572,22580,22586],{"type":283,"tag":532,"props":21062,"children":21063},{"id":534},[21064],{"type":293,"value":537},{"type":283,"tag":284,"props":21066,"children":21067},{},[21068],{"type":293,"value":21069},"Wenn man versucht, Speicherplatz zurückzugewinnen, scheint das Löschen von Daten der naheliegende erste Schritt zu sein. In Riak ist dies jedoch nicht unbedingt die beste Lösung, wenn die Festplatte fast voll ist.\nDer Grund dafür ist, dass das Löschen von Objekten in Riak kompliziert ist. Wie im Abschnitt zum Löschen von Objekten in der aktuellen Riak-Dokumentation beschrieben:",{"type":283,"tag":284,"props":21071,"children":21072},{},[21073],{"type":293,"value":21074},"*In Single-Server, nicht geclusterten Datenspeichersystemen ist das Löschen von Objekten ein trivialer Prozess. In einem konsistenten, geclusterten System wie Riak ist das Löschen von Objekten jedoch weit weniger trivial, da sich die Objekte auf mehreren Knoten befinden, was bedeutet, dass ein Löschprozess gewählt werden muss, um zu bestimmen, wann ein Objekt aus dem Speicher-Backend entfernt werden kann.",{"type":283,"tag":532,"props":21076,"children":21078},{"id":21077},"wie-die-löschung-funktioniert",[21079],{"type":293,"value":21080},"Wie die Löschung funktioniert",{"type":283,"tag":613,"props":21082,"children":21083},{},[21084,21097,21110,21115,21120,21125],{"type":283,"tag":461,"props":21085,"children":21086},{},[21087,21089,21095],{"type":293,"value":21088},"Riak schreibt einen ",{"type":283,"tag":288,"props":21090,"children":21092},{"href":21091},"https://riak.docs.hw.ag/riak/kv/latest/using/reference/object-deletion/#tombstones",[21093],{"type":293,"value":21094},"\"tombstone\"",{"type":293,"value":21096}," Wert für den Schlüssel zu den N vnodes, die ihn enthalten\n(dies ist ein neuer Datensatz)",{"type":283,"tag":461,"props":21098,"children":21099},{},[21100,21102,21108],{"type":293,"value":21101},"Riak wartet ",{"type":283,"tag":288,"props":21103,"children":21105},{"href":21104},"https://riak.docs.hw.ag/riak/kv/latest/configuring/reference/#other-settings",[21106],{"type":293,"value":21107},"standardmäßig 3 Sekunden",{"type":293,"value":21109},", um zu überprüfen, ob alle vnodes mit dem\nTombstone/Löschen",{"type":283,"tag":461,"props":21111,"children":21112},{},[21113],{"type":293,"value":21114},"Riak gibt eine tatsächliche Löschoperation gegen den Schlüssel an leveldb aus",{"type":283,"tag":461,"props":21116,"children":21117},{},[21118],{"type":293,"value":21119},"leveldb erstellt seinen eigenen Tombstone",{"type":283,"tag":461,"props":21121,"children":21122},{},[21123],{"type":293,"value":21124},"Der Tombstone von Leveldb \"schwebt\" durch Level-0 und Level-1 als Teil der normalen\nKomprimierungen",{"type":283,"tag":461,"props":21126,"children":21127},{},[21128],{"type":293,"value":21129},"Beim Erreichen von Level-2 wird Leveldb sofort die Komprimierung und Verbreitung\nder Tombstones in .sst-Tabellendateien mit 1000 oder mehr Tombstones eingeleitet.",{"type":283,"tag":284,"props":21131,"children":21132},{},[21133],{"type":293,"value":21134},"Dies hat zur Folge, dass die Freigabe von Plattenplatz, wenn überhaupt, nur sehr langsam erfolgt.",{"type":283,"tag":532,"props":21136,"children":21138},{"id":21137},"lösung-für-eleveldb",[21139],{"type":293,"value":21140},"Lösung für e/leveldb",{"type":283,"tag":284,"props":21142,"children":21143},{},[21144,21146,21152],{"type":293,"value":21145},"Kurz gesagt, es gibt eine C++-Funktion in Leveldb, die zur Komprimierung des zugrunde liegenden Speichers verwendet wird. Die Funktion heißt ",{"type":283,"tag":288,"props":21147,"children":21149},{"href":21148},"https://github.com/hw-dwalter/leveldb/blob/5db913fdc28801714d587c44524d90b48e51210e/include/leveldb/db.h#L157",[21150],{"type":293,"value":21151},"\"CompactRange\"",{"type":293,"value":1302},{"type":283,"tag":284,"props":21154,"children":21155},{},[21156],{"type":293,"value":21157},"Insbesondere werden gelöschte und überschriebene Versionen verworfen, und die Daten werden neu angeordnet, um die Kosten der für den Zugriff auf die Daten erforderlichen Operationen zu verringern.",{"type":283,"tag":284,"props":21159,"children":21160},{},[21161],{"type":293,"value":21162},"Diese Funktion ist im Erlang-Code, der diese C++-Bibliothek verwendet, nicht vorhanden. Das bedeutet, dass wir ein eigenständiges Tool entwickeln mussten, das diese Bibliotheksfunktion für alle Leveldb-Dateien in Riak aufruft. Der Nachteil dabei ist, dass der Riak Server offline sein muss, während ein solches 3rd Party Tool läuft.",{"type":283,"tag":532,"props":21164,"children":21166},{"id":21165},"anwendungsfall",[21167],{"type":293,"value":21168},"Anwendungsfall",{"type":283,"tag":284,"props":21170,"children":21171},{},[21172,21174,21179,21181,21185],{"type":293,"value":21173},"Wir haben ein solches Tool gebaut, Sie können es von github RiakToolsCxx.git auschecken und mit ",{"type":283,"tag":11491,"props":21175,"children":21176},{},[21177],{"type":293,"value":21178},"cmake",{"type":293,"value":21180}," bauen. Die externe Abhängigkeit leveldb-basho wird automatisch von ",{"type":283,"tag":11491,"props":21182,"children":21183},{},[21184],{"type":293,"value":21178},{"type":293,"value":21186}," gezogen.",{"type":283,"tag":284,"props":21188,"children":21189},{},[21190],{"type":293,"value":21191},"Der Checkout- und Build-Prozess könnte wie folgt aussehen:",{"type":283,"tag":303,"props":21193,"children":21195},{"className":18716,"code":21194,"language":18718,"meta":8,"style":8},"dwalter@knxwork:~/Projects$ git clone https://github.com/hw-dwalter/RiakToolsCxx.git RiakToolsCxx\nCloning into 'RiakToolsCxx'...\nremote: Counting objects: 11, done.\nremote: Total 11 (delta 0), reused 0 (delta 0), pack-reused 11\nUnpacking objects: 100% (11/11), done.\ndwalter@knxwork:~/Projects$ cd RiakToolsCxx/\ndwalter@knxwork:~/Projects/RiakToolsCxx$ mkdir build\ndwalter@knxwork:~/Projects/RiakToolsCxx$ cd build/\ndwalter@knxwork:~/Projects/RiakToolsCxx/build$ cmake ..\n-- The CXX compiler identification is GNU 6.3.0\n-- Check for working CXX compiler: /usr/bin/c++\n-- Check for working CXX compiler: /usr/bin/c++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Detecting CXX compile features\n-- Detecting CXX compile features - done\n-- Performing Test COMPILER_SUPPORTS_CXX11\n-- Performing Test COMPILER_SUPPORTS_CXX11 - Success\n-- Performing Test COMPILER_SUPPORTS_CXX0X\n-- Performing Test COMPILER_SUPPORTS_CXX0X - Success\n-- The C compiler identification is GNU 6.3.0\n-- Check for working C compiler: /usr/bin/cc\n-- Check for working C compiler: /usr/bin/cc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Detecting C compile features\n-- Detecting C compile features - done\n-- Boost version: 1.62.0\n-- Found the following Boost libraries:\n--   filesystem\n--   system\n-- Configuring done\n-- Generating done\n-- Build files have been written to: /home/dwalter/Projects/RiakToolsCxx/build\ndwalter@knxwork:~/Projects/RiakToolsCxx/build$ make\nScanning dependencies of target leveldb-basho\n[ 10%] Creating directories for 'leveldb-basho'\n[ 20%] Performing download step (git clone) for 'leveldb-basho'\nCloning into 'leveldb-basho'...\nAlready on 'develop'\nYour branch is up-to-date with 'origin/develop'.\n[ 30%] No patch step for 'leveldb-basho'\n[ 40%] No update step for 'leveldb-basho'\n[ 50%] No configure step for 'leveldb-basho'\n[ 60%] Performing build step for 'leveldb-basho'\nar: creating libleveldb.a\n[ 70%] No install step for 'leveldb-basho'\n[ 80%] Completed 'leveldb-basho'\n[ 80%] Built target leveldb-basho\nScanning dependencies of target riakcompact\n[ 90%] Building CXX object src/CMakeFiles/riakcompact.dir/main.cpp.o\n[100%] Linking CXX executable riakcompact\n[100%] Built target riakcompact\ndwalter@knxwork:~/Projects/RiakToolsCxx/build$ ./src/riakcompact \nusage:   ./src/riakcompact [path]\n",[21196],{"type":283,"tag":317,"props":21197,"children":21198},{"__ignoreMap":8},[21199,21227,21245,21273,21319,21341,21358,21376,21392,21410,21453,21488,21530,21560,21598,21623,21655,21677,21706,21726,21754,21790,21822,21862,21889,21924,21947,21978,22000,22031,22043,22055,22071,22087,22129,22141,22169,22187,22216,22232,22250,22282,22298,22314,22330,22346,22364,22380,22393,22401,22425,22433,22441,22449,22466],{"type":283,"tag":321,"props":21200,"children":21201},{"class":323,"line":324},[21202,21207,21212,21217,21222],{"type":283,"tag":321,"props":21203,"children":21204},{"style":1715},[21205],{"type":293,"value":21206},"dwalter@knxwork:~/Projects$",{"type":283,"tag":321,"props":21208,"children":21209},{"style":367},[21210],{"type":293,"value":21211}," git",{"type":283,"tag":321,"props":21213,"children":21214},{"style":367},[21215],{"type":293,"value":21216}," clone",{"type":283,"tag":321,"props":21218,"children":21219},{"style":367},[21220],{"type":293,"value":21221}," https://github.com/hw-dwalter/RiakToolsCxx.git",{"type":283,"tag":321,"props":21223,"children":21224},{"style":367},[21225],{"type":293,"value":21226}," RiakToolsCxx\n",{"type":283,"tag":321,"props":21228,"children":21229},{"class":323,"line":340},[21230,21235,21240],{"type":283,"tag":321,"props":21231,"children":21232},{"style":1715},[21233],{"type":293,"value":21234},"Cloning",{"type":283,"tag":321,"props":21236,"children":21237},{"style":367},[21238],{"type":293,"value":21239}," into",{"type":283,"tag":321,"props":21241,"children":21242},{"style":367},[21243],{"type":293,"value":21244}," 'RiakToolsCxx'...\n",{"type":283,"tag":321,"props":21246,"children":21247},{"class":323,"line":353},[21248,21253,21258,21263,21268],{"type":283,"tag":321,"props":21249,"children":21250},{"style":1715},[21251],{"type":293,"value":21252},"remote:",{"type":283,"tag":321,"props":21254,"children":21255},{"style":367},[21256],{"type":293,"value":21257}," Counting",{"type":283,"tag":321,"props":21259,"children":21260},{"style":367},[21261],{"type":293,"value":21262}," objects:",{"type":283,"tag":321,"props":21264,"children":21265},{"style":367},[21266],{"type":293,"value":21267}," 11,",{"type":283,"tag":321,"props":21269,"children":21270},{"style":367},[21271],{"type":293,"value":21272}," done.\n",{"type":283,"tag":321,"props":21274,"children":21275},{"class":323,"line":373},[21276,21280,21285,21290,21295,21299,21304,21309,21314],{"type":283,"tag":321,"props":21277,"children":21278},{"style":1715},[21279],{"type":293,"value":21252},{"type":283,"tag":321,"props":21281,"children":21282},{"style":367},[21283],{"type":293,"value":21284}," Total",{"type":283,"tag":321,"props":21286,"children":21287},{"style":1730},[21288],{"type":293,"value":21289}," 11",{"type":283,"tag":321,"props":21291,"children":21292},{"style":334},[21293],{"type":293,"value":21294}," (delta ",{"type":283,"tag":321,"props":21296,"children":21297},{"style":1730},[21298],{"type":293,"value":18989},{"type":283,"tag":321,"props":21300,"children":21301},{"style":334},[21302],{"type":293,"value":21303},"), reused 0 (",{"type":283,"tag":321,"props":21305,"children":21306},{"style":1715},[21307],{"type":293,"value":21308},"delta",{"type":283,"tag":321,"props":21310,"children":21311},{"style":1730},[21312],{"type":293,"value":21313}," 0",{"type":283,"tag":321,"props":21315,"children":21316},{"style":334},[21317],{"type":293,"value":21318},"), pack-reused 11\n",{"type":283,"tag":321,"props":21320,"children":21321},{"class":323,"line":308},[21322,21327,21331,21336],{"type":283,"tag":321,"props":21323,"children":21324},{"style":1715},[21325],{"type":293,"value":21326},"Unpacking",{"type":283,"tag":321,"props":21328,"children":21329},{"style":367},[21330],{"type":293,"value":21262},{"type":283,"tag":321,"props":21332,"children":21333},{"style":367},[21334],{"type":293,"value":21335}," 100%",{"type":283,"tag":321,"props":21337,"children":21338},{"style":334},[21339],{"type":293,"value":21340}," (11/11), done.\n",{"type":283,"tag":321,"props":21342,"children":21343},{"class":323,"line":309},[21344,21348,21353],{"type":283,"tag":321,"props":21345,"children":21346},{"style":1715},[21347],{"type":293,"value":21206},{"type":283,"tag":321,"props":21349,"children":21350},{"style":367},[21351],{"type":293,"value":21352}," cd",{"type":283,"tag":321,"props":21354,"children":21355},{"style":367},[21356],{"type":293,"value":21357}," RiakToolsCxx/\n",{"type":283,"tag":321,"props":21359,"children":21360},{"class":323,"line":310},[21361,21366,21371],{"type":283,"tag":321,"props":21362,"children":21363},{"style":1715},[21364],{"type":293,"value":21365},"dwalter@knxwork:~/Projects/RiakToolsCxx$",{"type":283,"tag":321,"props":21367,"children":21368},{"style":367},[21369],{"type":293,"value":21370}," mkdir",{"type":283,"tag":321,"props":21372,"children":21373},{"style":367},[21374],{"type":293,"value":21375}," build\n",{"type":283,"tag":321,"props":21377,"children":21378},{"class":323,"line":311},[21379,21383,21387],{"type":283,"tag":321,"props":21380,"children":21381},{"style":1715},[21382],{"type":293,"value":21365},{"type":283,"tag":321,"props":21384,"children":21385},{"style":367},[21386],{"type":293,"value":21352},{"type":283,"tag":321,"props":21388,"children":21389},{"style":367},[21390],{"type":293,"value":21391}," build/\n",{"type":283,"tag":321,"props":21393,"children":21394},{"class":323,"line":312},[21395,21400,21405],{"type":283,"tag":321,"props":21396,"children":21397},{"style":1715},[21398],{"type":293,"value":21399},"dwalter@knxwork:~/Projects/RiakToolsCxx/build$",{"type":283,"tag":321,"props":21401,"children":21402},{"style":367},[21403],{"type":293,"value":21404}," cmake",{"type":283,"tag":321,"props":21406,"children":21407},{"style":367},[21408],{"type":293,"value":21409}," ..\n",{"type":283,"tag":321,"props":21411,"children":21412},{"class":323,"line":977},[21413,21418,21423,21428,21433,21438,21443,21448],{"type":283,"tag":321,"props":21414,"children":21415},{"style":1715},[21416],{"type":293,"value":21417},"--",{"type":283,"tag":321,"props":21419,"children":21420},{"style":367},[21421],{"type":293,"value":21422}," The",{"type":283,"tag":321,"props":21424,"children":21425},{"style":367},[21426],{"type":293,"value":21427}," CXX",{"type":283,"tag":321,"props":21429,"children":21430},{"style":367},[21431],{"type":293,"value":21432}," compiler",{"type":283,"tag":321,"props":21434,"children":21435},{"style":367},[21436],{"type":293,"value":21437}," identification",{"type":283,"tag":321,"props":21439,"children":21440},{"style":367},[21441],{"type":293,"value":21442}," is",{"type":283,"tag":321,"props":21444,"children":21445},{"style":367},[21446],{"type":293,"value":21447}," GNU",{"type":283,"tag":321,"props":21449,"children":21450},{"style":1730},[21451],{"type":293,"value":21452}," 6.3.0\n",{"type":283,"tag":321,"props":21454,"children":21455},{"class":323,"line":990},[21456,21460,21465,21469,21474,21478,21483],{"type":283,"tag":321,"props":21457,"children":21458},{"style":1715},[21459],{"type":293,"value":21417},{"type":283,"tag":321,"props":21461,"children":21462},{"style":367},[21463],{"type":293,"value":21464}," Check",{"type":283,"tag":321,"props":21466,"children":21467},{"style":367},[21468],{"type":293,"value":20280},{"type":283,"tag":321,"props":21470,"children":21471},{"style":367},[21472],{"type":293,"value":21473}," working",{"type":283,"tag":321,"props":21475,"children":21476},{"style":367},[21477],{"type":293,"value":21427},{"type":283,"tag":321,"props":21479,"children":21480},{"style":367},[21481],{"type":293,"value":21482}," compiler:",{"type":283,"tag":321,"props":21484,"children":21485},{"style":367},[21486],{"type":293,"value":21487}," /usr/bin/c++\n",{"type":283,"tag":321,"props":21489,"children":21490},{"class":323,"line":1003},[21491,21495,21499,21503,21507,21511,21515,21520,21525],{"type":283,"tag":321,"props":21492,"children":21493},{"style":1715},[21494],{"type":293,"value":21417},{"type":283,"tag":321,"props":21496,"children":21497},{"style":367},[21498],{"type":293,"value":21464},{"type":283,"tag":321,"props":21500,"children":21501},{"style":367},[21502],{"type":293,"value":20280},{"type":283,"tag":321,"props":21504,"children":21505},{"style":367},[21506],{"type":293,"value":21473},{"type":283,"tag":321,"props":21508,"children":21509},{"style":367},[21510],{"type":293,"value":21427},{"type":283,"tag":321,"props":21512,"children":21513},{"style":367},[21514],{"type":293,"value":21482},{"type":283,"tag":321,"props":21516,"children":21517},{"style":367},[21518],{"type":293,"value":21519}," /usr/bin/c++",{"type":283,"tag":321,"props":21521,"children":21522},{"style":1730},[21523],{"type":293,"value":21524}," --",{"type":283,"tag":321,"props":21526,"children":21527},{"style":367},[21528],{"type":293,"value":21529}," works\n",{"type":283,"tag":321,"props":21531,"children":21532},{"class":323,"line":1016},[21533,21537,21542,21546,21550,21555],{"type":283,"tag":321,"props":21534,"children":21535},{"style":1715},[21536],{"type":293,"value":21417},{"type":283,"tag":321,"props":21538,"children":21539},{"style":367},[21540],{"type":293,"value":21541}," Detecting",{"type":283,"tag":321,"props":21543,"children":21544},{"style":367},[21545],{"type":293,"value":21427},{"type":283,"tag":321,"props":21547,"children":21548},{"style":367},[21549],{"type":293,"value":21432},{"type":283,"tag":321,"props":21551,"children":21552},{"style":367},[21553],{"type":293,"value":21554}," ABI",{"type":283,"tag":321,"props":21556,"children":21557},{"style":367},[21558],{"type":293,"value":21559}," info\n",{"type":283,"tag":321,"props":21561,"children":21562},{"class":323,"line":1029},[21563,21567,21571,21575,21579,21583,21588,21593],{"type":283,"tag":321,"props":21564,"children":21565},{"style":1715},[21566],{"type":293,"value":21417},{"type":283,"tag":321,"props":21568,"children":21569},{"style":367},[21570],{"type":293,"value":21541},{"type":283,"tag":321,"props":21572,"children":21573},{"style":367},[21574],{"type":293,"value":21427},{"type":283,"tag":321,"props":21576,"children":21577},{"style":367},[21578],{"type":293,"value":21432},{"type":283,"tag":321,"props":21580,"children":21581},{"style":367},[21582],{"type":293,"value":21554},{"type":283,"tag":321,"props":21584,"children":21585},{"style":367},[21586],{"type":293,"value":21587}," info",{"type":283,"tag":321,"props":21589,"children":21590},{"style":367},[21591],{"type":293,"value":21592}," -",{"type":283,"tag":321,"props":21594,"children":21595},{"style":367},[21596],{"type":293,"value":21597}," done\n",{"type":283,"tag":321,"props":21599,"children":21600},{"class":323,"line":1042},[21601,21605,21609,21613,21618],{"type":283,"tag":321,"props":21602,"children":21603},{"style":1715},[21604],{"type":293,"value":21417},{"type":283,"tag":321,"props":21606,"children":21607},{"style":367},[21608],{"type":293,"value":21541},{"type":283,"tag":321,"props":21610,"children":21611},{"style":367},[21612],{"type":293,"value":21427},{"type":283,"tag":321,"props":21614,"children":21615},{"style":367},[21616],{"type":293,"value":21617}," compile",{"type":283,"tag":321,"props":21619,"children":21620},{"style":367},[21621],{"type":293,"value":21622}," features\n",{"type":283,"tag":321,"props":21624,"children":21625},{"class":323,"line":1052},[21626,21630,21634,21638,21642,21647,21651],{"type":283,"tag":321,"props":21627,"children":21628},{"style":1715},[21629],{"type":293,"value":21417},{"type":283,"tag":321,"props":21631,"children":21632},{"style":367},[21633],{"type":293,"value":21541},{"type":283,"tag":321,"props":21635,"children":21636},{"style":367},[21637],{"type":293,"value":21427},{"type":283,"tag":321,"props":21639,"children":21640},{"style":367},[21641],{"type":293,"value":21617},{"type":283,"tag":321,"props":21643,"children":21644},{"style":367},[21645],{"type":293,"value":21646}," features",{"type":283,"tag":321,"props":21648,"children":21649},{"style":367},[21650],{"type":293,"value":21592},{"type":283,"tag":321,"props":21652,"children":21653},{"style":367},[21654],{"type":293,"value":21597},{"type":283,"tag":321,"props":21656,"children":21657},{"class":323,"line":1065},[21658,21662,21667,21672],{"type":283,"tag":321,"props":21659,"children":21660},{"style":1715},[21661],{"type":293,"value":21417},{"type":283,"tag":321,"props":21663,"children":21664},{"style":367},[21665],{"type":293,"value":21666}," Performing",{"type":283,"tag":321,"props":21668,"children":21669},{"style":367},[21670],{"type":293,"value":21671}," Test",{"type":283,"tag":321,"props":21673,"children":21674},{"style":367},[21675],{"type":293,"value":21676}," COMPILER_SUPPORTS_CXX11\n",{"type":283,"tag":321,"props":21678,"children":21679},{"class":323,"line":1078},[21680,21684,21688,21692,21697,21701],{"type":283,"tag":321,"props":21681,"children":21682},{"style":1715},[21683],{"type":293,"value":21417},{"type":283,"tag":321,"props":21685,"children":21686},{"style":367},[21687],{"type":293,"value":21666},{"type":283,"tag":321,"props":21689,"children":21690},{"style":367},[21691],{"type":293,"value":21671},{"type":283,"tag":321,"props":21693,"children":21694},{"style":367},[21695],{"type":293,"value":21696}," COMPILER_SUPPORTS_CXX11",{"type":283,"tag":321,"props":21698,"children":21699},{"style":367},[21700],{"type":293,"value":21592},{"type":283,"tag":321,"props":21702,"children":21703},{"style":367},[21704],{"type":293,"value":21705}," Success\n",{"type":283,"tag":321,"props":21707,"children":21708},{"class":323,"line":1087},[21709,21713,21717,21721],{"type":283,"tag":321,"props":21710,"children":21711},{"style":1715},[21712],{"type":293,"value":21417},{"type":283,"tag":321,"props":21714,"children":21715},{"style":367},[21716],{"type":293,"value":21666},{"type":283,"tag":321,"props":21718,"children":21719},{"style":367},[21720],{"type":293,"value":21671},{"type":283,"tag":321,"props":21722,"children":21723},{"style":367},[21724],{"type":293,"value":21725}," COMPILER_SUPPORTS_CXX0X\n",{"type":283,"tag":321,"props":21727,"children":21728},{"class":323,"line":1100},[21729,21733,21737,21741,21746,21750],{"type":283,"tag":321,"props":21730,"children":21731},{"style":1715},[21732],{"type":293,"value":21417},{"type":283,"tag":321,"props":21734,"children":21735},{"style":367},[21736],{"type":293,"value":21666},{"type":283,"tag":321,"props":21738,"children":21739},{"style":367},[21740],{"type":293,"value":21671},{"type":283,"tag":321,"props":21742,"children":21743},{"style":367},[21744],{"type":293,"value":21745}," COMPILER_SUPPORTS_CXX0X",{"type":283,"tag":321,"props":21747,"children":21748},{"style":367},[21749],{"type":293,"value":21592},{"type":283,"tag":321,"props":21751,"children":21752},{"style":367},[21753],{"type":293,"value":21705},{"type":283,"tag":321,"props":21755,"children":21756},{"class":323,"line":1113},[21757,21761,21765,21770,21774,21778,21782,21786],{"type":283,"tag":321,"props":21758,"children":21759},{"style":1715},[21760],{"type":293,"value":21417},{"type":283,"tag":321,"props":21762,"children":21763},{"style":367},[21764],{"type":293,"value":21422},{"type":283,"tag":321,"props":21766,"children":21767},{"style":367},[21768],{"type":293,"value":21769}," C",{"type":283,"tag":321,"props":21771,"children":21772},{"style":367},[21773],{"type":293,"value":21432},{"type":283,"tag":321,"props":21775,"children":21776},{"style":367},[21777],{"type":293,"value":21437},{"type":283,"tag":321,"props":21779,"children":21780},{"style":367},[21781],{"type":293,"value":21442},{"type":283,"tag":321,"props":21783,"children":21784},{"style":367},[21785],{"type":293,"value":21447},{"type":283,"tag":321,"props":21787,"children":21788},{"style":1730},[21789],{"type":293,"value":21452},{"type":283,"tag":321,"props":21791,"children":21792},{"class":323,"line":1126},[21793,21797,21801,21805,21809,21813,21817],{"type":283,"tag":321,"props":21794,"children":21795},{"style":1715},[21796],{"type":293,"value":21417},{"type":283,"tag":321,"props":21798,"children":21799},{"style":367},[21800],{"type":293,"value":21464},{"type":283,"tag":321,"props":21802,"children":21803},{"style":367},[21804],{"type":293,"value":20280},{"type":283,"tag":321,"props":21806,"children":21807},{"style":367},[21808],{"type":293,"value":21473},{"type":283,"tag":321,"props":21810,"children":21811},{"style":367},[21812],{"type":293,"value":21769},{"type":283,"tag":321,"props":21814,"children":21815},{"style":367},[21816],{"type":293,"value":21482},{"type":283,"tag":321,"props":21818,"children":21819},{"style":367},[21820],{"type":293,"value":21821}," /usr/bin/cc\n",{"type":283,"tag":321,"props":21823,"children":21824},{"class":323,"line":1134},[21825,21829,21833,21837,21841,21845,21849,21854,21858],{"type":283,"tag":321,"props":21826,"children":21827},{"style":1715},[21828],{"type":293,"value":21417},{"type":283,"tag":321,"props":21830,"children":21831},{"style":367},[21832],{"type":293,"value":21464},{"type":283,"tag":321,"props":21834,"children":21835},{"style":367},[21836],{"type":293,"value":20280},{"type":283,"tag":321,"props":21838,"children":21839},{"style":367},[21840],{"type":293,"value":21473},{"type":283,"tag":321,"props":21842,"children":21843},{"style":367},[21844],{"type":293,"value":21769},{"type":283,"tag":321,"props":21846,"children":21847},{"style":367},[21848],{"type":293,"value":21482},{"type":283,"tag":321,"props":21850,"children":21851},{"style":367},[21852],{"type":293,"value":21853}," /usr/bin/cc",{"type":283,"tag":321,"props":21855,"children":21856},{"style":1730},[21857],{"type":293,"value":21524},{"type":283,"tag":321,"props":21859,"children":21860},{"style":367},[21861],{"type":293,"value":21529},{"type":283,"tag":321,"props":21863,"children":21864},{"class":323,"line":1147},[21865,21869,21873,21877,21881,21885],{"type":283,"tag":321,"props":21866,"children":21867},{"style":1715},[21868],{"type":293,"value":21417},{"type":283,"tag":321,"props":21870,"children":21871},{"style":367},[21872],{"type":293,"value":21541},{"type":283,"tag":321,"props":21874,"children":21875},{"style":367},[21876],{"type":293,"value":21769},{"type":283,"tag":321,"props":21878,"children":21879},{"style":367},[21880],{"type":293,"value":21432},{"type":283,"tag":321,"props":21882,"children":21883},{"style":367},[21884],{"type":293,"value":21554},{"type":283,"tag":321,"props":21886,"children":21887},{"style":367},[21888],{"type":293,"value":21559},{"type":283,"tag":321,"props":21890,"children":21891},{"class":323,"line":1160},[21892,21896,21900,21904,21908,21912,21916,21920],{"type":283,"tag":321,"props":21893,"children":21894},{"style":1715},[21895],{"type":293,"value":21417},{"type":283,"tag":321,"props":21897,"children":21898},{"style":367},[21899],{"type":293,"value":21541},{"type":283,"tag":321,"props":21901,"children":21902},{"style":367},[21903],{"type":293,"value":21769},{"type":283,"tag":321,"props":21905,"children":21906},{"style":367},[21907],{"type":293,"value":21432},{"type":283,"tag":321,"props":21909,"children":21910},{"style":367},[21911],{"type":293,"value":21554},{"type":283,"tag":321,"props":21913,"children":21914},{"style":367},[21915],{"type":293,"value":21587},{"type":283,"tag":321,"props":21917,"children":21918},{"style":367},[21919],{"type":293,"value":21592},{"type":283,"tag":321,"props":21921,"children":21922},{"style":367},[21923],{"type":293,"value":21597},{"type":283,"tag":321,"props":21925,"children":21926},{"class":323,"line":1173},[21927,21931,21935,21939,21943],{"type":283,"tag":321,"props":21928,"children":21929},{"style":1715},[21930],{"type":293,"value":21417},{"type":283,"tag":321,"props":21932,"children":21933},{"style":367},[21934],{"type":293,"value":21541},{"type":283,"tag":321,"props":21936,"children":21937},{"style":367},[21938],{"type":293,"value":21769},{"type":283,"tag":321,"props":21940,"children":21941},{"style":367},[21942],{"type":293,"value":21617},{"type":283,"tag":321,"props":21944,"children":21945},{"style":367},[21946],{"type":293,"value":21622},{"type":283,"tag":321,"props":21948,"children":21949},{"class":323,"line":1186},[21950,21954,21958,21962,21966,21970,21974],{"type":283,"tag":321,"props":21951,"children":21952},{"style":1715},[21953],{"type":293,"value":21417},{"type":283,"tag":321,"props":21955,"children":21956},{"style":367},[21957],{"type":293,"value":21541},{"type":283,"tag":321,"props":21959,"children":21960},{"style":367},[21961],{"type":293,"value":21769},{"type":283,"tag":321,"props":21963,"children":21964},{"style":367},[21965],{"type":293,"value":21617},{"type":283,"tag":321,"props":21967,"children":21968},{"style":367},[21969],{"type":293,"value":21646},{"type":283,"tag":321,"props":21971,"children":21972},{"style":367},[21973],{"type":293,"value":21592},{"type":283,"tag":321,"props":21975,"children":21976},{"style":367},[21977],{"type":293,"value":21597},{"type":283,"tag":321,"props":21979,"children":21980},{"class":323,"line":1199},[21981,21985,21990,21995],{"type":283,"tag":321,"props":21982,"children":21983},{"style":1715},[21984],{"type":293,"value":21417},{"type":283,"tag":321,"props":21986,"children":21987},{"style":367},[21988],{"type":293,"value":21989}," Boost",{"type":283,"tag":321,"props":21991,"children":21992},{"style":367},[21993],{"type":293,"value":21994}," version:",{"type":283,"tag":321,"props":21996,"children":21997},{"style":1730},[21998],{"type":293,"value":21999}," 1.62.0\n",{"type":283,"tag":321,"props":22001,"children":22002},{"class":323,"line":2160},[22003,22007,22012,22017,22022,22026],{"type":283,"tag":321,"props":22004,"children":22005},{"style":1715},[22006],{"type":293,"value":21417},{"type":283,"tag":321,"props":22008,"children":22009},{"style":367},[22010],{"type":293,"value":22011}," Found",{"type":283,"tag":321,"props":22013,"children":22014},{"style":367},[22015],{"type":293,"value":22016}," the",{"type":283,"tag":321,"props":22018,"children":22019},{"style":367},[22020],{"type":293,"value":22021}," following",{"type":283,"tag":321,"props":22023,"children":22024},{"style":367},[22025],{"type":293,"value":21989},{"type":283,"tag":321,"props":22027,"children":22028},{"style":367},[22029],{"type":293,"value":22030}," libraries:\n",{"type":283,"tag":321,"props":22032,"children":22033},{"class":323,"line":2161},[22034,22038],{"type":283,"tag":321,"props":22035,"children":22036},{"style":1715},[22037],{"type":293,"value":21417},{"type":283,"tag":321,"props":22039,"children":22040},{"style":367},[22041],{"type":293,"value":22042},"   filesystem\n",{"type":283,"tag":321,"props":22044,"children":22045},{"class":323,"line":2162},[22046,22050],{"type":283,"tag":321,"props":22047,"children":22048},{"style":1715},[22049],{"type":293,"value":21417},{"type":283,"tag":321,"props":22051,"children":22052},{"style":367},[22053],{"type":293,"value":22054},"   system\n",{"type":283,"tag":321,"props":22056,"children":22057},{"class":323,"line":2163},[22058,22062,22067],{"type":283,"tag":321,"props":22059,"children":22060},{"style":1715},[22061],{"type":293,"value":21417},{"type":283,"tag":321,"props":22063,"children":22064},{"style":367},[22065],{"type":293,"value":22066}," Configuring",{"type":283,"tag":321,"props":22068,"children":22069},{"style":367},[22070],{"type":293,"value":21597},{"type":283,"tag":321,"props":22072,"children":22073},{"class":323,"line":2164},[22074,22078,22083],{"type":283,"tag":321,"props":22075,"children":22076},{"style":1715},[22077],{"type":293,"value":21417},{"type":283,"tag":321,"props":22079,"children":22080},{"style":367},[22081],{"type":293,"value":22082}," Generating",{"type":283,"tag":321,"props":22084,"children":22085},{"style":367},[22086],{"type":293,"value":21597},{"type":283,"tag":321,"props":22088,"children":22089},{"class":323,"line":2165},[22090,22094,22099,22104,22109,22114,22119,22124],{"type":283,"tag":321,"props":22091,"children":22092},{"style":1715},[22093],{"type":293,"value":21417},{"type":283,"tag":321,"props":22095,"children":22096},{"style":367},[22097],{"type":293,"value":22098}," Build",{"type":283,"tag":321,"props":22100,"children":22101},{"style":367},[22102],{"type":293,"value":22103}," files",{"type":283,"tag":321,"props":22105,"children":22106},{"style":367},[22107],{"type":293,"value":22108}," have",{"type":283,"tag":321,"props":22110,"children":22111},{"style":367},[22112],{"type":293,"value":22113}," been",{"type":283,"tag":321,"props":22115,"children":22116},{"style":367},[22117],{"type":293,"value":22118}," written",{"type":283,"tag":321,"props":22120,"children":22121},{"style":367},[22122],{"type":293,"value":22123}," to:",{"type":283,"tag":321,"props":22125,"children":22126},{"style":367},[22127],{"type":293,"value":22128}," /home/dwalter/Projects/RiakToolsCxx/build\n",{"type":283,"tag":321,"props":22130,"children":22131},{"class":323,"line":2166},[22132,22136],{"type":283,"tag":321,"props":22133,"children":22134},{"style":1715},[22135],{"type":293,"value":21399},{"type":283,"tag":321,"props":22137,"children":22138},{"style":367},[22139],{"type":293,"value":22140}," make\n",{"type":283,"tag":321,"props":22142,"children":22143},{"class":323,"line":2167},[22144,22149,22154,22159,22164],{"type":283,"tag":321,"props":22145,"children":22146},{"style":1715},[22147],{"type":293,"value":22148},"Scanning",{"type":283,"tag":321,"props":22150,"children":22151},{"style":367},[22152],{"type":293,"value":22153}," dependencies",{"type":283,"tag":321,"props":22155,"children":22156},{"style":367},[22157],{"type":293,"value":22158}," of",{"type":283,"tag":321,"props":22160,"children":22161},{"style":367},[22162],{"type":293,"value":22163}," target",{"type":283,"tag":321,"props":22165,"children":22166},{"style":367},[22167],{"type":293,"value":22168}," leveldb-basho\n",{"type":283,"tag":321,"props":22170,"children":22171},{"class":323,"line":2691},[22172,22177,22182],{"type":283,"tag":321,"props":22173,"children":22174},{"style":334},[22175],{"type":293,"value":22176},"[ 10%] Creating directories ",{"type":283,"tag":321,"props":22178,"children":22179},{"style":8079},[22180],{"type":293,"value":22181},"for",{"type":283,"tag":321,"props":22183,"children":22184},{"style":367},[22185],{"type":293,"value":22186}," 'leveldb-basho'\n",{"type":283,"tag":321,"props":22188,"children":22189},{"class":323,"line":2168},[22190,22195,22199,22203,22208,22212],{"type":283,"tag":321,"props":22191,"children":22192},{"style":334},[22193],{"type":293,"value":22194},"[ 20%] Performing download step (",{"type":283,"tag":321,"props":22196,"children":22197},{"style":1715},[22198],{"type":293,"value":555},{"type":283,"tag":321,"props":22200,"children":22201},{"style":367},[22202],{"type":293,"value":21216},{"type":283,"tag":321,"props":22204,"children":22205},{"style":334},[22206],{"type":293,"value":22207},") ",{"type":283,"tag":321,"props":22209,"children":22210},{"style":8079},[22211],{"type":293,"value":22181},{"type":283,"tag":321,"props":22213,"children":22214},{"style":367},[22215],{"type":293,"value":22186},{"type":283,"tag":321,"props":22217,"children":22218},{"class":323,"line":2717},[22219,22223,22227],{"type":283,"tag":321,"props":22220,"children":22221},{"style":1715},[22222],{"type":293,"value":21234},{"type":283,"tag":321,"props":22224,"children":22225},{"style":367},[22226],{"type":293,"value":21239},{"type":283,"tag":321,"props":22228,"children":22229},{"style":367},[22230],{"type":293,"value":22231}," 'leveldb-basho'...\n",{"type":283,"tag":321,"props":22233,"children":22234},{"class":323,"line":2725},[22235,22240,22245],{"type":283,"tag":321,"props":22236,"children":22237},{"style":1715},[22238],{"type":293,"value":22239},"Already",{"type":283,"tag":321,"props":22241,"children":22242},{"style":367},[22243],{"type":293,"value":22244}," on",{"type":283,"tag":321,"props":22246,"children":22247},{"style":367},[22248],{"type":293,"value":22249}," 'develop'\n",{"type":283,"tag":321,"props":22251,"children":22252},{"class":323,"line":2738},[22253,22258,22263,22267,22272,22277],{"type":283,"tag":321,"props":22254,"children":22255},{"style":1715},[22256],{"type":293,"value":22257},"Your",{"type":283,"tag":321,"props":22259,"children":22260},{"style":367},[22261],{"type":293,"value":22262}," branch",{"type":283,"tag":321,"props":22264,"children":22265},{"style":367},[22266],{"type":293,"value":21442},{"type":283,"tag":321,"props":22268,"children":22269},{"style":367},[22270],{"type":293,"value":22271}," up-to-date",{"type":283,"tag":321,"props":22273,"children":22274},{"style":367},[22275],{"type":293,"value":22276}," with",{"type":283,"tag":321,"props":22278,"children":22279},{"style":367},[22280],{"type":293,"value":22281}," 'origin/develop'.\n",{"type":283,"tag":321,"props":22283,"children":22284},{"class":323,"line":2760},[22285,22290,22294],{"type":283,"tag":321,"props":22286,"children":22287},{"style":334},[22288],{"type":293,"value":22289},"[ 30%] No patch step ",{"type":283,"tag":321,"props":22291,"children":22292},{"style":8079},[22293],{"type":293,"value":22181},{"type":283,"tag":321,"props":22295,"children":22296},{"style":367},[22297],{"type":293,"value":22186},{"type":283,"tag":321,"props":22299,"children":22300},{"class":323,"line":2773},[22301,22306,22310],{"type":283,"tag":321,"props":22302,"children":22303},{"style":334},[22304],{"type":293,"value":22305},"[ 40%] No update step ",{"type":283,"tag":321,"props":22307,"children":22308},{"style":8079},[22309],{"type":293,"value":22181},{"type":283,"tag":321,"props":22311,"children":22312},{"style":367},[22313],{"type":293,"value":22186},{"type":283,"tag":321,"props":22315,"children":22316},{"class":323,"line":2787},[22317,22322,22326],{"type":283,"tag":321,"props":22318,"children":22319},{"style":334},[22320],{"type":293,"value":22321},"[ 50%] No configure step ",{"type":283,"tag":321,"props":22323,"children":22324},{"style":8079},[22325],{"type":293,"value":22181},{"type":283,"tag":321,"props":22327,"children":22328},{"style":367},[22329],{"type":293,"value":22186},{"type":283,"tag":321,"props":22331,"children":22332},{"class":323,"line":2805},[22333,22338,22342],{"type":283,"tag":321,"props":22334,"children":22335},{"style":334},[22336],{"type":293,"value":22337},"[ 60%] Performing build step ",{"type":283,"tag":321,"props":22339,"children":22340},{"style":8079},[22341],{"type":293,"value":22181},{"type":283,"tag":321,"props":22343,"children":22344},{"style":367},[22345],{"type":293,"value":22186},{"type":283,"tag":321,"props":22347,"children":22348},{"class":323,"line":2818},[22349,22354,22359],{"type":283,"tag":321,"props":22350,"children":22351},{"style":1715},[22352],{"type":293,"value":22353},"ar:",{"type":283,"tag":321,"props":22355,"children":22356},{"style":367},[22357],{"type":293,"value":22358}," creating",{"type":283,"tag":321,"props":22360,"children":22361},{"style":367},[22362],{"type":293,"value":22363}," libleveldb.a\n",{"type":283,"tag":321,"props":22365,"children":22366},{"class":323,"line":2831},[22367,22372,22376],{"type":283,"tag":321,"props":22368,"children":22369},{"style":334},[22370],{"type":293,"value":22371},"[ 70%] No install step ",{"type":283,"tag":321,"props":22373,"children":22374},{"style":8079},[22375],{"type":293,"value":22181},{"type":283,"tag":321,"props":22377,"children":22378},{"style":367},[22379],{"type":293,"value":22186},{"type":283,"tag":321,"props":22381,"children":22382},{"class":323,"line":2844},[22383,22388],{"type":283,"tag":321,"props":22384,"children":22385},{"style":334},[22386],{"type":293,"value":22387},"[ 80%] Completed ",{"type":283,"tag":321,"props":22389,"children":22390},{"style":367},[22391],{"type":293,"value":22392},"'leveldb-basho'\n",{"type":283,"tag":321,"props":22394,"children":22395},{"class":323,"line":2862},[22396],{"type":283,"tag":321,"props":22397,"children":22398},{"style":334},[22399],{"type":293,"value":22400},"[ 80%] Built target leveldb-basho\n",{"type":283,"tag":321,"props":22402,"children":22403},{"class":323,"line":2880},[22404,22408,22412,22416,22420],{"type":283,"tag":321,"props":22405,"children":22406},{"style":1715},[22407],{"type":293,"value":22148},{"type":283,"tag":321,"props":22409,"children":22410},{"style":367},[22411],{"type":293,"value":22153},{"type":283,"tag":321,"props":22413,"children":22414},{"style":367},[22415],{"type":293,"value":22158},{"type":283,"tag":321,"props":22417,"children":22418},{"style":367},[22419],{"type":293,"value":22163},{"type":283,"tag":321,"props":22421,"children":22422},{"style":367},[22423],{"type":293,"value":22424}," riakcompact\n",{"type":283,"tag":321,"props":22426,"children":22427},{"class":323,"line":2893},[22428],{"type":283,"tag":321,"props":22429,"children":22430},{"style":334},[22431],{"type":293,"value":22432},"[ 90%] Building CXX object src/CMakeFiles/riakcompact.dir/main.cpp.o\n",{"type":283,"tag":321,"props":22434,"children":22435},{"class":323,"line":2913},[22436],{"type":283,"tag":321,"props":22437,"children":22438},{"style":334},[22439],{"type":293,"value":22440},"[100%] Linking CXX executable riakcompact\n",{"type":283,"tag":321,"props":22442,"children":22443},{"class":323,"line":2933},[22444],{"type":283,"tag":321,"props":22445,"children":22446},{"style":334},[22447],{"type":293,"value":22448},"[100%] Built target riakcompact\n",{"type":283,"tag":321,"props":22450,"children":22451},{"class":323,"line":2950},[22452,22456,22461],{"type":283,"tag":321,"props":22453,"children":22454},{"style":1715},[22455],{"type":293,"value":21399},{"type":283,"tag":321,"props":22457,"children":22458},{"style":367},[22459],{"type":293,"value":22460}," ./src/riakcompact",{"type":283,"tag":321,"props":22462,"children":22463},{"style":334},[22464],{"type":293,"value":22465}," \n",{"type":283,"tag":321,"props":22467,"children":22468},{"class":323,"line":3720},[22469,22474,22479],{"type":283,"tag":321,"props":22470,"children":22471},{"style":1715},[22472],{"type":293,"value":22473},"usage:",{"type":283,"tag":321,"props":22475,"children":22476},{"style":367},[22477],{"type":293,"value":22478},"   ./src/riakcompact",{"type":283,"tag":321,"props":22480,"children":22481},{"style":334},[22482],{"type":293,"value":22483}," [path]\n",{"type":283,"tag":284,"props":22485,"children":22486},{},[22487],{"type":293,"value":22488},"Nachdem dieses Tool erstellt wurde, können Sie es wie folgt verwenden. Beachten Sie, dass Ihr Riak-Knoten ausgeschaltet sein muss!",{"type":283,"tag":303,"props":22490,"children":22492},{"className":18716,"code":22491,"language":18718,"meta":8,"style":8},"root@knxwork:/home/dwalter/Projects/RiakToolsCxx/build# ./src/riakcompact /var/lib/riak/leveldb/\n\"/var/lib/riak/leveldb/91343852333181432387730302044767688728495783936\" [directory]\ncompacting...\ndone\n\"/var/lib/riak/leveldb/685078892498860742907977265335757665463718379520\" [directory]\ncompacting...\ndone\n",[22493],{"type":283,"tag":317,"props":22494,"children":22495},{"__ignoreMap":8},[22496,22513,22526,22534,22542,22554,22561],{"type":283,"tag":321,"props":22497,"children":22498},{"class":323,"line":324},[22499,22504,22508],{"type":283,"tag":321,"props":22500,"children":22501},{"style":1715},[22502],{"type":293,"value":22503},"root@knxwork:/home/dwalter/Projects/RiakToolsCxx/build#",{"type":283,"tag":321,"props":22505,"children":22506},{"style":367},[22507],{"type":293,"value":22460},{"type":283,"tag":321,"props":22509,"children":22510},{"style":367},[22511],{"type":293,"value":22512}," /var/lib/riak/leveldb/\n",{"type":283,"tag":321,"props":22514,"children":22515},{"class":323,"line":340},[22516,22521],{"type":283,"tag":321,"props":22517,"children":22518},{"style":1715},[22519],{"type":293,"value":22520},"\"/var/lib/riak/leveldb/91343852333181432387730302044767688728495783936\"",{"type":283,"tag":321,"props":22522,"children":22523},{"style":334},[22524],{"type":293,"value":22525}," [directory]\n",{"type":283,"tag":321,"props":22527,"children":22528},{"class":323,"line":353},[22529],{"type":283,"tag":321,"props":22530,"children":22531},{"style":1715},[22532],{"type":293,"value":22533},"compacting...\n",{"type":283,"tag":321,"props":22535,"children":22536},{"class":323,"line":373},[22537],{"type":283,"tag":321,"props":22538,"children":22539},{"style":8079},[22540],{"type":293,"value":22541},"done\n",{"type":283,"tag":321,"props":22543,"children":22544},{"class":323,"line":308},[22545,22550],{"type":283,"tag":321,"props":22546,"children":22547},{"style":1715},[22548],{"type":293,"value":22549},"\"/var/lib/riak/leveldb/685078892498860742907977265335757665463718379520\"",{"type":283,"tag":321,"props":22551,"children":22552},{"style":334},[22553],{"type":293,"value":22525},{"type":283,"tag":321,"props":22555,"children":22556},{"class":323,"line":309},[22557],{"type":283,"tag":321,"props":22558,"children":22559},{"style":1715},[22560],{"type":293,"value":22533},{"type":283,"tag":321,"props":22562,"children":22563},{"class":323,"line":310},[22564],{"type":283,"tag":321,"props":22565,"children":22566},{"style":8079},[22567],{"type":293,"value":22541},{"type":283,"tag":532,"props":22569,"children":22570},{"id":18365},[22571],{"type":293,"value":18368},{"type":283,"tag":284,"props":22573,"children":22574},{},[22575],{"type":283,"tag":11399,"props":22576,"children":22577},{},[22578],{"type":293,"value":22579},"Nach dem Löschen eines kompletten Buckets in unserem riak (Schlüssel für Schlüssel), sind wir in der Lage, den verbrauchten Speicherplatz von 75 GB auf 25 GB mit diesem Tool zu reduzieren!",{"type":283,"tag":11634,"props":22581,"children":22583},{"id":22582},"durch-die-komprimierung-wurden-mehr-als-66-der-daten-freigegeben",[22584],{"type":293,"value":22585},"Durch die Komprimierung wurden mehr als 66% der Daten freigegeben!",{"type":283,"tag":1489,"props":22587,"children":22588},{},[22589],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":22591},[22592,22593,22594,22595,22596],{"id":534,"depth":340,"text":537},{"id":21077,"depth":340,"text":21080},{"id":21137,"depth":340,"text":21140},{"id":21165,"depth":340,"text":21168},{"id":18365,"depth":340,"text":18368},{"_path":22598,"_dir":1506,"_draft":7,"_partial":7,"_locale":8,"slug":228,"teams":22599,"primaryTeam":36,"firstName":20596,"lastName":22600,"prefixTitle":8,"suffixTitle":8,"education":22601,"executiveRole":22604,"role":22605,"workingSince":18519,"inTheCompanySince":18519,"techSkills":22607,"skills":22614,"projects":22620,"contactDetails":22621,"_image":22624,"image":22625,"_id":22626,"_type":1596,"title":22627,"_source":1506,"_file":22628,"_stem":22629,"_extension":1596},"/employees/daniel-walter",[36,1509],"Walter",[22602],[18510,22603,12899],"FHDW","CEO",[18514,22606,12901,1519,1520,1521,1522],"chiefExecutiveOfficer",[22608,22609,22610,22611],{"name":18538,"level":1528,"icon":18539},{"name":12906,"level":1528,"icon":12907},{"name":1557,"level":1528,"icon":1558},{"name":22612,"level":1549,"icon":22613},"Flutter","/images/Flutter.svg",[22615,22616,22617,22618,22619],{"name":235,"level":1528},{"name":1576,"level":1528},{"name":12927,"level":1528},{"name":36,"level":1528},{"name":1578,"level":1549},[],{"eMail":22622,"phone":22623,"visibility":1592},"daniel.walter@helmundwalter.de","+49 351 799 035 21","images/employees/Portraits/daniel_walter.webp","images/employees/Portraits/DanielWalter_MS.webp","employees:employees:2.daniel-walter.json","Daniel Walter","employees/2.daniel-walter.json","employees/2.daniel-walter",{"_path":240,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":241,"description":242,"author":136,"image":178,"releaseDate":243,"blogCategories":22631,"articleTags":22632,"tags":22633,"body":22634,"_type":20,"_id":248,"_source":22,"_file":249,"_stem":250,"_extension":25},[77,245],[207],[19,235],{"type":280,"children":22635,"toc":23428},[22636,22642,22647,22653,22670,22675,22681,22725,22731,22736,22853,22858,22863,22869,22874,22880,22939,22945,22950,22955,22990,23146,23162,23168,23173,23229,23235,23240,23294,23300,23305,23336,23348,23361,23380,23406,23424],{"type":283,"tag":532,"props":22637,"children":22639},{"id":22638},"wozu-es-gut-ist",[22640],{"type":293,"value":22641},"Wozu es gut ist",{"type":283,"tag":284,"props":22643,"children":22644},{},[22645],{"type":293,"value":22646},"In diesem Artikel geht es um die Verwendung von BTRFS-Snapshots als Backup-Lösung, die für Datenbanken und vollständige Backups der Root-Partition verwendet werden können. Dies ist keine detaillierte Schritt-für-Schritt-Anleitung und erfordert einige Linux-Kenntnisse. Mit diesem Beitrag möchte ich meine Erfahrungen teilen und Ihnen etwas Ärger ersparen. Wir verwenden es seit Jahren in der Produktion.",{"type":283,"tag":1607,"props":22648,"children":22652},{"alt":22649,"aspect-ratio":22650,"height":20945,"object-fit":19638,"src":22651},"btrfs","5","/blog/btrfs.png",[],{"type":283,"tag":284,"props":22654,"children":22655},{},[22656,22658,22663,22665],{"type":293,"value":22657},"Btrfs-Snapshots speichern eine \"eingefrorene\" Version des gesamten Dateisystems. Dies wird durch die ",{"type":283,"tag":11491,"props":22659,"children":22660},{},[22661],{"type":293,"value":22662},"Copy-On-Write",{"type":293,"value":22664}," (COW) Technik von BTRFS erreicht. Das bedeutet, dass Änderungen an Snapshot-Dateien nicht direkt in die Datei geschrieben werden, wie es bei klassischen Dateisystemen wie ext4 der Fall ist, sondern dass alle Änderungen an einer anderen Stelle geschrieben werden, so dass sowohl die aktuelle als auch die Snapshot-Version der Datei vorhanden ist. Diese Copy-On-Write (COW)-Technik bringt viele nette Funktionen in BTRFS, ",{"type":283,"tag":11399,"props":22666,"children":22667},{},[22668],{"type":293,"value":22669},"hat aber auch einige Nachteile, die Sie kennen sollten, bevor Sie BTRFS in der Produktion einsetzen. Siehe \"COW auf Datenbankverzeichnissen immer deaktivieren\" unten.",{"type":283,"tag":284,"props":22671,"children":22672},{},[22673],{"type":293,"value":22674},"BTRFS verfügt über eine leistungsstarke Snapshot-Funktion, die es ermöglicht, Snapshots inkrementell auf entfernte Systeme zu übertragen. Es ist ganz einfach: Erstellen Sie einen Snapshot, übertragen Sie ihn auf ein entferntes System, erstellen Sie einen zweiten Snapshot und übertragen Sie nur die geänderten Blöcke aus dem vorherigen Snapshot. Solaris/FreeBSD-Benutzer machen das schon seit fast einem Jahrzehnt mit ZFS. Eine ZFS-Portierung ist auch für Linux verfügbar, so dass Sie es auch anstelle von BTRFS verwenden können, wenn Sie es aus irgendeinem Grund bevorzugen.",{"type":283,"tag":532,"props":22676,"children":22678},{"id":22677},"anwendungsfälle-von-btrfs-snapshots",[22679],{"type":293,"value":22680},"Anwendungsfälle von BTRFS-Snapshots",{"type":283,"tag":457,"props":22682,"children":22683},{},[22684,22702,22707,22712],{"type":283,"tag":461,"props":22685,"children":22686},{},[22687,22689],{"type":293,"value":22688},"Sicherung von Root-Partitionen eines oder mehrerer Linux-Server auf einen zentralen Backup-Server\n",{"type":283,"tag":457,"props":22690,"children":22691},{},[22692,22697],{"type":283,"tag":461,"props":22693,"children":22694},{},[22695],{"type":293,"value":22696},"Es ist möglich, den Backup-Server direkt in einen der Snapshots zu booten, so dass ein manuelles Failover möglich ist",{"type":283,"tag":461,"props":22698,"children":22699},{},[22700],{"type":293,"value":22701},"Die Snapshots können auch in virtuelle Maschinen übertragen werden. Dies ist sehr praktisch, wenn Sie möchten, dass Ihre \"dev vm\" mit dem Live-System auf dem neuesten Stand ist und sie regelmäßig mit inkrementellen Snapshots aktualisiert wird.",{"type":283,"tag":461,"props":22703,"children":22704},{},[22705],{"type":293,"value":22706},"Sichern Sie MySQL-, Postgres- oder andere Datenpartitionen separat in einem anderen Zyklus als andere Einhängepunkte",{"type":283,"tag":461,"props":22708,"children":22709},{},[22710],{"type":293,"value":22711},"Sie können BTRFS-Snapshots auf den Root-Partitionen verwenden, um nach einem fehlgeschlagenen System-Upgrade zu einem funktionierenden Rootfs zurückzukehren",{"type":283,"tag":461,"props":22713,"children":22714},{},[22715,22717],{"type":293,"value":22716},"Wenn Sie Entwickler sind, können Sie BTRFS-Snapshots lokal mit Ihrer Datenbank verwenden, um Ihre datenverändernde Anwendung immer wieder mit demselben Ausgangsdatensatz zu testen.\n",{"type":283,"tag":457,"props":22718,"children":22719},{},[22720],{"type":283,"tag":461,"props":22721,"children":22722},{},[22723],{"type":293,"value":22724},"Sie können auch Ihre Dev-Datenbank-Snapshots mit Ihren Mitarbeitern teilen und ihnen inkrementelle Updates zur Verfügung stellen.",{"type":283,"tag":532,"props":22726,"children":22728},{"id":22727},"sicherung-einer-datenbank-vor-und-nachteile-der-verschiedenen-methoden",[22729],{"type":293,"value":22730},"Sicherung einer Datenbank, Vor- und Nachteile der verschiedenen Methoden",{"type":283,"tag":284,"props":22732,"children":22733},{},[22734],{"type":293,"value":22735},"Wenn Sie über Backups von MySQL/MariaDB (und einigen anderen Datenbanken) nachdenken, haben Sie einige Möglichkeiten, die Sie in Betracht ziehen können:",{"type":283,"tag":613,"props":22737,"children":22738},{},[22739,22770,22796,22817],{"type":283,"tag":461,"props":22740,"children":22741},{},[22742,22747],{"type":283,"tag":11399,"props":22743,"children":22744},{},[22745],{"type":293,"value":22746},"Mysqldump verwenden, um ein logisches Backup zu erstellen (auch auf Basis der einzelnen Tabellen)",{"type":283,"tag":613,"props":22748,"children":22749},{},[22750,22755,22760,22765],{"type":283,"tag":461,"props":22751,"children":22752},{},[22753],{"type":293,"value":22754},"Es ist langsam und belastet den Server spürbar",{"type":283,"tag":461,"props":22756,"children":22757},{},[22758],{"type":293,"value":22759},"Es ist schwierig, einen konsistenten Zustand zu erzeugen (erfordert Sperren oder einen Desync-Replikationsslave)",{"type":283,"tag":461,"props":22761,"children":22762},{},[22763],{"type":293,"value":22764},"Nicht inkrementell, selbst wenn nur geänderte Tabellen gesichert werden; wenn diese Tabellen groß sind, ist dies ein Problem.",{"type":283,"tag":461,"props":22766,"children":22767},{},[22768],{"type":293,"value":22769},"Wiederherstellung: Importieren Sie den Dump irgendwo, kann bei großen Datenmengen ewig dauern.",{"type":283,"tag":461,"props":22771,"children":22772},{},[22773,22778],{"type":283,"tag":11399,"props":22774,"children":22775},{},[22776],{"type":293,"value":22777},"Mysql-Binärprotokolle für inkrementelles Backup verwenden",{"type":283,"tag":613,"props":22779,"children":22780},{},[22781,22786,22791],{"type":283,"tag":461,"props":22782,"children":22783},{},[22784],{"type":293,"value":22785},"ermöglicht Point-in-Time-Recovery (Wiederherstellung zu einem beliebigen Zeitpunkt in der Vergangenheit)",{"type":283,"tag":461,"props":22787,"children":22788},{},[22789],{"type":293,"value":22790},"das Abspielen von Binär-Logs kann bei schreibintensiven Setups sehr lange dauern",{"type":283,"tag":461,"props":22792,"children":22793},{},[22794],{"type":293,"value":22795},"aus diesem Grund müssen Sie regelmäßig Vollsicherungen durchführen",{"type":283,"tag":461,"props":22797,"children":22798},{},[22799,22804],{"type":283,"tag":11399,"props":22800,"children":22801},{},[22802],{"type":293,"value":22803},"verwendet die inkrementelle Methode von innobackupex",{"type":283,"tag":613,"props":22805,"children":22806},{},[22807,22812],{"type":283,"tag":461,"props":22808,"children":22809},{},[22810],{"type":293,"value":22811},"obwohl es fortschrittlicher ist, scheint es die gleichen Eigenschaften zu haben wie die Binär-Logs von mysql.",{"type":283,"tag":461,"props":22813,"children":22814},{},[22815],{"type":293,"value":22816},"Sie ist ebenfalls ressourcenintensiv und erfordert eine vollständige Datenbanksperre am Ende der Datenübertragung.",{"type":283,"tag":461,"props":22818,"children":22819},{},[22820,22825],{"type":283,"tag":11399,"props":22821,"children":22822},{},[22823],{"type":293,"value":22824},"Verwendung von Dateisystem-Snapshots",{"type":283,"tag":613,"props":22826,"children":22827},{},[22828,22833,22838,22843,22848],{"type":283,"tag":461,"props":22829,"children":22830},{},[22831],{"type":293,"value":22832},"keine Point-in-Time-Wiederherstellung",{"type":283,"tag":461,"props":22834,"children":22835},{},[22836],{"type":293,"value":22837},"endlos inkrementell, erst eine Vollsicherung und dann nur noch inkrementelle Sicherungen.",{"type":283,"tag":461,"props":22839,"children":22840},{},[22841],{"type":293,"value":22842},"schneller und ressourcenschonender Sicherungsprozess",{"type":283,"tag":461,"props":22844,"children":22845},{},[22846],{"type":293,"value":22847},"Wiederherstellung: Sie können eine Instanz Ihrer Datenbank von jedem Snapshot direkt auf dem Backup-System starten oder das komplette Mysql-Verzeichnis zurück auf den Quellserver verschieben, falls nötig.",{"type":283,"tag":461,"props":22849,"children":22850},{},[22851],{"type":293,"value":22852},"Der einzige Nachteil ist, dass Sie sich auf den datenbankeigenen Wiederherstellungsmechanismus bei Stromausfall verlassen müssen.",{"type":283,"tag":284,"props":22854,"children":22855},{},[22856],{"type":293,"value":22857},"Während wir in der Vergangenheit mysqldump-Backups gemacht haben, verwenden wir jetzt die Dateisystem-Snapshot-Methode. Diese Methode hat sich als sehr zuverlässig, schnell und ressourcensparend erwiesen und ermöglicht außerdem eine einfache Wiederherstellung der gesicherten Daten. Es kommt sehr häufig vor, dass unsere Entwickler darum bitten, eine bestimmte Datenversion auf dem Backup-Server zu starten. Dies ist innerhalb von 10 Minuten erledigt und spart ihnen viel Zeit.",{"type":283,"tag":284,"props":22859,"children":22860},{},[22861],{"type":293,"value":22862},"Ein Dateisystem-Snapshot ist ein konsistenter Zustand eines Dateisystems, der nicht mehr verändert wird. Aus Sicht der Datenintegrität stellt ein Snapshot einen unsauberen Zustand dar, wie man ihn nach einem Stromausfall, einem kill -9 oder einem \"Out of Memory\"-Fehler hat. Da MySQL/MariaDB und andere Datenbank-Engines so konzipiert sind, dass sie Stromausfälle überstehen, können Sie immer auch von einem Snapshot wiederhergestellt werden.",{"type":283,"tag":532,"props":22864,"children":22866},{"id":22865},"stabilität-von-btrfs-und-produktionsreife",[22867],{"type":293,"value":22868},"Stabilität von BTRFS und Produktionsreife",{"type":283,"tag":284,"props":22870,"children":22871},{},[22872],{"type":293,"value":22873},"Über die Stabilität und Zuverlässigkeit von BTRFS ist in der Vergangenheit viel diskutiert worden. Obwohl es immer noch einige Bugs und Probleme haben kann, ist es unwahrscheinlich, dass diese zu Datenverlusten führen. BTRFS wird mit jeder neuen Linux-Kernel-Version verbessert, wir verwenden es seit Linux 3.17 in der Produktion und sogar noch länger auf unseren Workstations.",{"type":283,"tag":532,"props":22875,"children":22877},{"id":22876},"btrfs-snapshots-für-backups-verwenden",[22878],{"type":293,"value":22879},"BTRFS-Snapshots für Backups verwenden",{"type":283,"tag":457,"props":22881,"children":22882},{},[22883,22888,22893,22898,22903,22924,22929],{"type":283,"tag":461,"props":22884,"children":22885},{},[22886],{"type":293,"value":22887},"Wie bereits erwähnt, wird BTRFS mit jeder Linux-Kernel-Version verbessert, daher wird empfohlen, eine aktuelle Kernel-Version wie 4.9 LTS oder eine neuere zu verwenden.",{"type":283,"tag":461,"props":22889,"children":22890},{},[22891],{"type":293,"value":22892},"Offensichtlich: da wir BTRFS-Snapshotting verwenden wollen, müssen wir die Daten, die wir sichern wollen, auf ein BTRFS-Volume legen.",{"type":283,"tag":461,"props":22894,"children":22895},{},[22896],{"type":293,"value":22897},"Sie müssen BTRFS-Dateisysteme sowohl auf dem Quell- (Produktions-) als auch auf dem Zielserver (Backup) laufen haben.",{"type":283,"tag":461,"props":22899,"children":22900},{},[22901],{"type":293,"value":22902},"Wenn Sie noch kein btrfs haben, können Sie die Größe Ihres aktuellen Dateisystems ändern, um Platz auf der Festplatte zu schaffen, und dort ein btrfs erstellen. Wenn Sie nur testen wollen, können Sie eine Image-Datei erstellen und diese mit losetup einbinden.",{"type":283,"tag":461,"props":22904,"children":22905},{},[22906,22908,22914,22916],{"type":293,"value":22907},"Wenn Sie bereits btrfs als rootfs verwenden, können Sie btrfs subvolume create ",{"type":283,"tag":317,"props":22909,"children":22911},{"className":22910},[],[22912],{"type":293,"value":22913},"\u003Cpath>",{"type":293,"value":22915}," verwenden, um ein neues Subvolume zu erstellen, z.B. für MySQL. Weil Sie vielleicht das MySQL-Datenverzeichnis häufiger sichern wollen als den Rest des Systems. Btrfs-Snapshots funktionieren auf der Basis von einzelnen Volumes. Wenn Sie also Dateien unabhängig voneinander sichern (oder von der Sicherung ausschließen) wollen, müssen Sie sie in ein Subvolume legen. Sie können mehrere Subvolumes von einem Rechner aus sichern, Sie müssen nur für jedes einen eigenen Sicherungsauftrag erstellen.\n",{"type":283,"tag":457,"props":22917,"children":22918},{},[22919],{"type":283,"tag":461,"props":22920,"children":22921},{},[22922],{"type":293,"value":22923},"Ich erstelle ein Subvolume, um schnell wachsende Log-Verzeichnisse und temporäre Ordner mit Cache-Dateien, die nicht gesichert werden müssen, auszuschließen.",{"type":283,"tag":461,"props":22925,"children":22926},{},[22927],{"type":293,"value":22928},"können Sie die BTRFS-Komprimierungsoptionen (wie compress=lzo) auf der Quelle, dem Ziel oder beiden verwenden.",{"type":283,"tag":461,"props":22930,"children":22931},{},[22932,22934],{"type":293,"value":22933},"Weitere Informationen über inkrementelle Backups mit BTRFS finden Sie im offiziellen Kernel-Wiki, ",{"type":283,"tag":288,"props":22935,"children":22937},{"href":22936},"https://btrfs.wiki.kernel.org/index.php/Incremental_Backup",[22938],{"type":293,"value":22936},{"type":283,"tag":532,"props":22940,"children":22942},{"id":22941},"deaktivieren-sie-immer-cow-auf-datenbankverzeichnissen",[22943],{"type":293,"value":22944},"Deaktivieren Sie immer COW auf Datenbankverzeichnissen!",{"type":283,"tag":284,"props":22946,"children":22947},{},[22948],{"type":293,"value":22949},"Dies ist die wichtigste Lektion, die ich in Jahren der BTRFS-Nutzung gelernt habe: Deaktivieren Sie immer Copy-On-Write auf Datenbankdatenverzeichnissen. BTRFS hat eine COW-Funktion, die standardmäßig aktiviert ist, auch wenn kein Snapshot oder Hardlink vorhanden ist. Soweit ich weiß, sollte dies im Falle eines Stromausfalls eine Datenbeschädigung bei teilweise überschriebenen Dateien verhindern. Da dieses \"Feature\" aber btrfs-spezifisch ist und in den meisten anderen Dateisystemen nicht vorhanden ist, kann es als optional betrachtet werden. Für rootfs und die meisten Teile des Dateisystems schadet dies nicht, da die Dateien nur selten verändert werden. Alle DBMS wie Mysql oder Postgres erwarten keine COW-Funktion und führen COW und transaktionale Schreibvorgänge selbst durch.",{"type":283,"tag":284,"props":22951,"children":22952},{},[22953],{"type":293,"value":22954},"Es macht keinen Sinn, COW auf FS-Ebene für ein Datenbankverzeichnis zu haben. Ganz im Gegenteil: BTRFS-COW auf einem Datenbankverzeichnis aktiviert zu haben, führt zu einer massiven Fragmentierung des Dateisystems, verlangsamt es und kann innerhalb einiger Monate zu BTRFS-Abstürzen führen. Wenn Sie Ihre Datenbank bereits auf BTRFS laufen lassen, ohne COW explizit zu deaktivieren, sollten Sie dies so schnell wie möglich tun, bevor es noch schlimmer wird.",{"type":283,"tag":457,"props":22956,"children":22957},{},[22958,22969,22980,22985],{"type":283,"tag":461,"props":22959,"children":22960},{},[22961,22963,22967],{"type":293,"value":22962},"Wenn Sie ein neues BTRFS für Ihre Datenbank erstellen, mounten Sie es immer mit der Option ",{"type":283,"tag":11491,"props":22964,"children":22965},{},[22966],{"type":293,"value":19897},{"type":293,"value":22968},", BEVOR Sie die erste Datei schreiben.",{"type":283,"tag":461,"props":22970,"children":22971},{},[22972,22974,22978],{"type":293,"value":22973},"COW wird zum Zeitpunkt der Dateierstellung aktiviert/deaktiviert. Wenn Sie Dateien mit COW erstellt haben und das Dateisystem später mit ",{"type":283,"tag":11491,"props":22975,"children":22976},{},[22977],{"type":293,"value":19897},{"type":293,"value":22979}," einhängen, sind die alten Dateien immer noch COW-aktiviert. Sie müssen sie kopieren, um COW tatsächlich zu deaktivieren.",{"type":283,"tag":461,"props":22981,"children":22982},{},[22983],{"type":293,"value":22984},"Es gibt ein no-COW-Flag, das Sie für Verzeichnisse mit chattr +C /pfad setzen können. Das Setzen von +C für ein Verzeichnis bewirkt, dass alle untergeordneten Verzeichnisse/Dateien COW-frei sind.",{"type":283,"tag":461,"props":22986,"children":22987},{},[22988],{"type":293,"value":22989},"Wenn Sie bereits eine Datenbank mit COW haben, können Sie es auf diese Weise deaktivieren (z.B. für MySQL):",{"type":283,"tag":303,"props":22991,"children":22993},{"className":18716,"code":22992,"language":18718,"meta":8,"style":8},"/etc/init.d/mysql stop # make sure your database is stopped!\nmv /var/lib/mysql /var/lib/mysql_old\nmkdir /var/lib/mysql\nchattr +C /var/lib/mysql\ncp -a /var/lib/mysql_old/* /var/lib/mysql\nrm -rf /var/lib/mysql_old\nchown -R mysql:mysql /var/lib/mysql\n/etc/init.d/mysql start #start db again\n",[22994],{"type":283,"tag":317,"props":22995,"children":22996},{"__ignoreMap":8},[22997,23015,23033,23046,23063,23090,23107,23129],{"type":283,"tag":321,"props":22998,"children":22999},{"class":323,"line":324},[23000,23005,23010],{"type":283,"tag":321,"props":23001,"children":23002},{"style":1715},[23003],{"type":293,"value":23004},"/etc/init.d/mysql",{"type":283,"tag":321,"props":23006,"children":23007},{"style":367},[23008],{"type":293,"value":23009}," stop",{"type":283,"tag":321,"props":23011,"children":23012},{"style":1447},[23013],{"type":293,"value":23014}," # make sure your database is stopped!\n",{"type":283,"tag":321,"props":23016,"children":23017},{"class":323,"line":340},[23018,23023,23028],{"type":283,"tag":321,"props":23019,"children":23020},{"style":1715},[23021],{"type":293,"value":23022},"mv",{"type":283,"tag":321,"props":23024,"children":23025},{"style":367},[23026],{"type":293,"value":23027}," /var/lib/mysql",{"type":283,"tag":321,"props":23029,"children":23030},{"style":367},[23031],{"type":293,"value":23032}," /var/lib/mysql_old\n",{"type":283,"tag":321,"props":23034,"children":23035},{"class":323,"line":353},[23036,23041],{"type":283,"tag":321,"props":23037,"children":23038},{"style":1715},[23039],{"type":293,"value":23040},"mkdir",{"type":283,"tag":321,"props":23042,"children":23043},{"style":367},[23044],{"type":293,"value":23045}," /var/lib/mysql\n",{"type":283,"tag":321,"props":23047,"children":23048},{"class":323,"line":373},[23049,23054,23059],{"type":283,"tag":321,"props":23050,"children":23051},{"style":1715},[23052],{"type":293,"value":23053},"chattr",{"type":283,"tag":321,"props":23055,"children":23056},{"style":367},[23057],{"type":293,"value":23058}," +C",{"type":283,"tag":321,"props":23060,"children":23061},{"style":367},[23062],{"type":293,"value":23045},{"type":283,"tag":321,"props":23064,"children":23065},{"class":323,"line":308},[23066,23071,23076,23081,23086],{"type":283,"tag":321,"props":23067,"children":23068},{"style":1715},[23069],{"type":293,"value":23070},"cp",{"type":283,"tag":321,"props":23072,"children":23073},{"style":1730},[23074],{"type":293,"value":23075}," -a",{"type":283,"tag":321,"props":23077,"children":23078},{"style":367},[23079],{"type":293,"value":23080}," /var/lib/mysql_old/",{"type":283,"tag":321,"props":23082,"children":23083},{"style":19344},[23084],{"type":293,"value":23085},"*",{"type":283,"tag":321,"props":23087,"children":23088},{"style":367},[23089],{"type":293,"value":23045},{"type":283,"tag":321,"props":23091,"children":23092},{"class":323,"line":309},[23093,23098,23103],{"type":283,"tag":321,"props":23094,"children":23095},{"style":1715},[23096],{"type":293,"value":23097},"rm",{"type":283,"tag":321,"props":23099,"children":23100},{"style":1730},[23101],{"type":293,"value":23102}," -rf",{"type":283,"tag":321,"props":23104,"children":23105},{"style":367},[23106],{"type":293,"value":23032},{"type":283,"tag":321,"props":23108,"children":23109},{"class":323,"line":310},[23110,23115,23120,23125],{"type":283,"tag":321,"props":23111,"children":23112},{"style":1715},[23113],{"type":293,"value":23114},"chown",{"type":283,"tag":321,"props":23116,"children":23117},{"style":1730},[23118],{"type":293,"value":23119}," -R",{"type":283,"tag":321,"props":23121,"children":23122},{"style":367},[23123],{"type":293,"value":23124}," mysql:mysql",{"type":283,"tag":321,"props":23126,"children":23127},{"style":367},[23128],{"type":293,"value":23045},{"type":283,"tag":321,"props":23130,"children":23131},{"class":323,"line":311},[23132,23136,23141],{"type":283,"tag":321,"props":23133,"children":23134},{"style":1715},[23135],{"type":293,"value":23004},{"type":283,"tag":321,"props":23137,"children":23138},{"style":367},[23139],{"type":293,"value":23140}," start",{"type":283,"tag":321,"props":23142,"children":23143},{"style":1447},[23144],{"type":293,"value":23145}," #start db again\n",{"type":283,"tag":457,"props":23147,"children":23148},{},[23149],{"type":283,"tag":461,"props":23150,"children":23151},{},[23152,23154],{"type":293,"value":23153},"Beachten Sie, dass der Kopiervorgang sehr (in manchen Fällen sehr) lange dauern kann, wenn Ihre Datenbank groß und bereits stark fragmentiert ist. Sie können testen, wie lange der Kopiervorgang dauert, bevor Sie die Datenbank auf einem Produktionssystem herunterfahren.\n",{"type":283,"tag":457,"props":23155,"children":23156},{},[23157],{"type":283,"tag":461,"props":23158,"children":23159},{},[23160],{"type":293,"value":23161},"Wenn Sie den Kopiervorgang beschleunigen wollen, können Sie btrfs filesystem defrag -v -r -f /var/lib/mysql/ verwenden, während Ihre Datenbank läuft.",{"type":283,"tag":532,"props":23163,"children":23165},{"id":23164},"btrfs-sxbackup-als-sicherungsmanager",[23166],{"type":293,"value":23167},"BTRFS-SxBackup als Sicherungsmanager",{"type":283,"tag":284,"props":23169,"children":23170},{},[23171],{"type":293,"value":23172},"BTRFS-SxBackup ist eine einfache Python-CLI-Applikation, die es sehr einfach macht, BTRFS-Snapshots zu erstellen, zu übertragen und zu verwalten. Ich empfehle sie sehr, da sie einfach zu benutzen ist. Nach dem Einrichten können Sie es mit einem Cronjob ausführen.",{"type":283,"tag":457,"props":23174,"children":23175},{},[23176,23211],{"type":283,"tag":461,"props":23177,"children":23178},{},[23179,23181,23186,23188],{"type":293,"value":23180},"Installieren Sie BTRFS-SxBackup von ",{"type":283,"tag":288,"props":23182,"children":23184},{"href":23183},"https://github.com/masc3d/btrfs-sxbackup",[23185],{"type":293,"value":23183},{"type":293,"value":23187}," auf dem Backup-Server. Mit btrfs-sxbackup auf dem Zielsystem wird das Backup \"gezogen\" und zentral vom Backup-Server verwaltet (der Client muss nur ssh laufen haben). Sie können auch btrfs-sxbackup auf dem Quellsystem einrichten und ein \"Push\"-Backup durchführen, wenn Sie möchten.\n",{"type":283,"tag":457,"props":23189,"children":23190},{},[23191,23196,23201,23206],{"type":283,"tag":461,"props":23192,"children":23193},{},[23194],{"type":293,"value":23195},"Auf dem Ziel-(Backup-)Server ** empfehle ich dringend, LVM zu verwenden und ein BTRFS-Volume für jeden Backup-Auftrag zu erstellen.** Machen Sie die Volumes nicht zu groß, Sie können sie leicht erweitern, wenn Sie mehr Platz benötigen. In der Vergangenheit hatten wir das Problem, dass die Speicherung und Verwaltung vieler Snapshots in einem btrfs-Zielvolume zu Fehlern führen kann, die ein Dateisystem unbeschreibbar machen. Die Erstellung eines btrfs-Volumes pro Backup-Auftrag macht BTRFS schneller und sicherer - und im Falle von BTRFS-Problemen ist nur ein Backup betroffen. (und Sie haben noch Platz, um ein neues BTRFS zu erstellen und die Backups dort fortzusetzen). Nachdem wir es auf diese Weise auf dem Backup-Server gemacht haben, sind alle Probleme, die wir vorher mit einem einzigen btrfs-backup-fs hatten, verschwunden.",{"type":283,"tag":461,"props":23197,"children":23198},{},[23199],{"type":293,"value":23200},"Erstellen Sie einen ssh-Schlüssel für root auf dem Backup-Server und fügen Sie ihn der authorized_keys-Datei auf der Quelle hinzu. Auch für den root-Benutzer. btrfs-sxbackup erfordert das Erstellen, Übertragen und Löschen von Snapshots und nur root kann das tun.",{"type":283,"tag":461,"props":23202,"children":23203},{},[23204],{"type":293,"value":23205},"Sie müssen die Befehle btrfs-sxbackup init und run verwenden, um den Sicherungsprozess einzurichten und zu starten. Weitere Informationen finden Sie in der BTRFS-SxBackup git readme. Sie können auch die Übertragungskomprimierung einschalten.",{"type":283,"tag":461,"props":23207,"children":23208},{},[23209],{"type":293,"value":23210},"BTRFS-SxBackup hat eine Aufbewahrungsfunktion; d.h. wenn Sie jede Stunde eine Datenbanksicherung machen, können Sie die letzten beiden auf der Quelle aufbewahren und Regeln konfigurieren wie \"nach zwei Wochen nur noch 4 Sicherungen pro Tag\".",{"type":283,"tag":461,"props":23212,"children":23213},{},[23214,23216],{"type":293,"value":23215},"Wiederherstellung: Wenn Sie btrfs für (Root-)Dateisystem-Backups verwenden, können Sie die einfachen Dateien direkt aus dem Dateisystem des Backup-Servers lesen. Wenn Sie eine vollständige Wiederherstellung benötigen, können Sie die Befehle btrfs send und btrfs receive verwenden, um Ihr Backup wiederherzustellen.\n",{"type":283,"tag":457,"props":23217,"children":23218},{},[23219],{"type":283,"tag":461,"props":23220,"children":23221},{},[23222,23224],{"type":293,"value":23223},"Sie können Ihren Backup-Server auch in einen Snapshot booten, indem Sie die Kernel-Option subvol= verwenden. Siehe auch ",{"type":283,"tag":288,"props":23225,"children":23227},{"href":23226},"https://wiki.archlinux.org/index.php/Btrfs#Mounting_subvolumes",[23228],{"type":293,"value":1759},{"type":283,"tag":532,"props":23230,"children":23232},{"id":23231},"tipps-zur-wiederherstellung-eines-mysqlmariadb-datenbank-snapshots",[23233],{"type":293,"value":23234},"Tipps zur Wiederherstellung eines MySql/MariaDB-Datenbank-Snapshots",{"type":283,"tag":284,"props":23236,"children":23237},{},[23238],{"type":293,"value":23239},"Wenn Sie BTRFS für MySQL-Backups verwenden, möchten Sie wahrscheinlich die Daten Ihrer MySQL-Tabellen untersuchen oder eine einzelne Tabelle oder Datenbank wiederherstellen.",{"type":283,"tag":457,"props":23241,"children":23242},{},[23243,23248,23266,23271,23284,23289],{"type":283,"tag":461,"props":23244,"children":23245},{},[23246],{"type":293,"value":23247},"Installieren Sie in diesem Fall die gleiche Hauptversion von MySQL/MariaDB wie auf dem Quellsystem.",{"type":283,"tag":461,"props":23249,"children":23250},{},[23251,23253,23259,23260],{"type":293,"value":23252},"Die Snapshots auf dem Backup-Server sind schreibgeschützt, mysql kann auf einem schreibgeschützten Dateisystem nicht starten. Um dies zu beheben, erstellen Sie einen neuen Snapshot des schreibgeschützten Snapshots, der standardmäßig beschreibbar sein wird: btrfs sub snap ",{"type":283,"tag":317,"props":23254,"children":23256},{"className":23255},[],[23257],{"type":293,"value":23258},"sx-\u003Cbackupname>",{"type":293,"value":16697},{"type":283,"tag":317,"props":23261,"children":23263},{"className":23262},[],[23264],{"type":293,"value":23265},"\u003Crestorename>",{"type":283,"tag":461,"props":23267,"children":23268},{},[23269],{"type":293,"value":23270},"Falls das Quellsystem eine andere Benutzerkennung für mysql hat als das Backup-System, müssen Sie einen chown -R mysql:mysql auf dem beschreibbaren Volume durchführen.",{"type":283,"tag":461,"props":23272,"children":23273},{},[23274,23276,23282],{"type":293,"value":23275},"Konfigurieren Sie das Datenverzeichnis my.cnf so, dass es auf das Restore-Volume zeigt und starten Sie mysql. Beobachten Sie die Logdatei ",{"type":283,"tag":317,"props":23277,"children":23279},{"className":23278},[],[23280],{"type":293,"value":23281},"\u003Chostname>.err",{"type":293,"value":23283}," auf dem Restore-Volume für den Startvorgang. Sie brauchen die Live-MySQL-Konfiguration nicht zu kopieren, stellen Sie nur sicher, dass die wichtigsten Optionen korrekt eingestellt sind.",{"type":283,"tag":461,"props":23285,"children":23286},{},[23287],{"type":293,"value":23288},"Nachdem das Starten/Wiederherstellen erfolgreich abgeschlossen wurde, können Sie sich mit Ihren Produktionsbenutzern/Passwörtern auf der Sicherungsinstanz anmelden, die Daten prüfen und mysqldump verwenden, um die Tabellen zurück auf das Produktionssystem zu übertragen. Sie können auch btrfs send/receive verwenden, um den kompletten Snapshot zurück zur Quelle zu übertragen, falls eine Notfallwiederherstellung erforderlich ist.",{"type":283,"tag":461,"props":23290,"children":23291},{},[23292],{"type":293,"value":23293},"Wenn Sie eine Backup-Instanz laufen haben, ist dies ein voll funktionsfähiger und beschreibbarer Snapshot der Produktionsdaten, der auch für Tests vor dem Einsatz verwendet werden kann.",{"type":283,"tag":532,"props":23295,"children":23297},{"id":23296},"bekannte-probleme-und-lösungen",[23298],{"type":293,"value":23299},"Bekannte Probleme und Lösungen",{"type":283,"tag":284,"props":23301,"children":23302},{},[23303],{"type":293,"value":23304},"Hilfe! Ich bekomme die Meldung  \"kein Speicherplatz auf dem Gerät verfügbar\", aber ich habe noch eine Menge Speicher übrig!",{"type":283,"tag":284,"props":23306,"children":23307},{},[23308,23310,23321,23323,23328,23330,23334],{"type":293,"value":23309},"Dies ist ein häufiges Problem mit BTRFS. Ich habe einige Zeit gebraucht, um eine Idee zu bekommen, was da schief läuft. Meine Erklärung dafür ist, dass BTRFS Daten- und Metadatenblöcke auf dem physischen Gerät zugewiesen hat. Manchmal kommt es vor, dass der gesamte freie Platz durch fast leere Datenblöcke belegt ist. Wenn neue Daten geschrieben werden, kommt BTRFS an den Punkt, an dem die neuen Metadaten nicht mehr in die vorhandenen Blöcke passen und btrfs muss einen neuen Metadatenblock zuweisen. Da der gesamte freie Speicherplatz bereits von teilweise oder vollständig leeren Datenblöcken beansprucht wird, ist kein Platz mehr vorhanden, um einen neuen Metadatenblock zuzuweisen. Dies führt zu der Meldung \"no space left on device\", nicht weil die Daten nicht passen, sondern weil BTRFS nicht in der Lage ist, Platz für die Metadaten zu schaffen.\nDie Lösung besteht darin, einen ",{"type":283,"tag":11491,"props":23311,"children":23312},{},[23313,23315],{"type":293,"value":23314},"btrfs balance start ",{"type":283,"tag":317,"props":23316,"children":23318},{"className":23317},[],[23319],{"type":293,"value":23320},"/path -dusage=x",{"type":293,"value":23322}," auszuführen. Der ",{"type":283,"tag":11491,"props":23324,"children":23325},{},[23326],{"type":293,"value":23327},"balance",{"type":293,"value":23329},"-Befehl sucht nach Blöcken, die nur zu x% oder weniger belegt sind, verschiebt deren Daten in andere Blöcke und löscht sie anschließend, wodurch Platz für neue Blockzuweisungen frei wird. Man kann mit 5 oder 10% beginnen und bis zu dem von ",{"type":283,"tag":11491,"props":23331,"children":23332},{},[23333],{"type":293,"value":19718},{"type":293,"value":23335}," angezeigten Prozentsatz (oder knapp darunter) gehen.",{"type":283,"tag":284,"props":23337,"children":23338},{},[23339,23341,23346],{"type":293,"value":23340},"Ich habe in den BTRFS-Dokumenten gelesen, dass BTRFS sich bei Bedarf selbst ausgleicht. Ich kann dies nicht bestätigen, daher habe ich auf wichtigen Produktionssystemen einen täglichen Cronjob mit ",{"type":283,"tag":11491,"props":23342,"children":23343},{},[23344],{"type":293,"value":23345},"btrfs balance start -dusage=20",{"type":293,"value":23347}," eingerichtet, um sicherzustellen, dass ich keine Probleme bekomme. Vielleicht ist das Problem behoben oder wird in den nächsten btrfs-Versionen behoben, aber ich möchte nicht darauf wetten.",{"type":283,"tag":532,"props":23349,"children":23351},{"id":23350},"ich-erhalte-auch-no-space-left-on-device-wenn-ich-btrfs-balance-ausführe",[23352,23354,23359],{"type":293,"value":23353},"Ich erhalte auch \"no space left on device\" wenn ich ",{"type":283,"tag":11491,"props":23355,"children":23356},{},[23357],{"type":293,"value":23358},"btrfs balance",{"type":293,"value":23360}," ausführe",{"type":283,"tag":284,"props":23362,"children":23363},{},[23364,23366,23371,23373,23378],{"type":293,"value":23365},"BTRFS braucht etwas Speicherplatz, um Plattenplatz freizugeben, ja. Versuchen Sie zunächst ",{"type":283,"tag":11491,"props":23367,"children":23368},{},[23369],{"type":293,"value":23370},"-musage",{"type":293,"value":23372}," statt ",{"type":283,"tag":11491,"props":23374,"children":23375},{},[23376],{"type":293,"value":23377},"-dusage",{"type":293,"value":23379}," und sehen Sie, ob dies das Problem löst. Sie können auch versuchen, einige Dateien zu löschen, aber auch das kann zu der Fehlermeldung \"no space left on device\" führen.",{"type":283,"tag":284,"props":23381,"children":23382},{},[23383,23385,23390,23392,23397,23399,23404],{"type":293,"value":23384},"Die endgültige Lösung für dieses Problem besteht darin, dem vollständigen Dateisystem vorübergehend ein neues Blockgerät hinzuzufügen, damit es ausgeglichen werden kann. Wenn Sie keine freie Partition zum Hinzufügen haben, können Sie auch mit dd eine Datei in ein anderes Dateisystem schreiben, z. B. in ein reines RAM-Dateisystem (tmpfs), dann mit ",{"type":283,"tag":11491,"props":23386,"children":23387},{},[23388],{"type":293,"value":23389},"losetup",{"type":293,"value":23391}," ein Blockdevice erstellen und es zu BTRFS hinzufügen. Eine Größe von 2-5GB funktioniert meistens. Beginnen Sie den Ausgleich mit ",{"type":283,"tag":11491,"props":23393,"children":23394},{},[23395],{"type":293,"value":23396},"-dusage=0",{"type":293,"value":23398}," und erhöhen Sie langsam, bis einige Blöcke verschoben sind. Nach einigen Verlagerungen können Sie das hinzugefügte Gerät mit dem Befehl ",{"type":283,"tag":11491,"props":23400,"children":23401},{},[23402],{"type":293,"value":23403},"btrfs drive remove",{"type":293,"value":23405}," entfernen.",{"type":283,"tag":284,"props":23407,"children":23408},{},[23409,23411,23416,23417,23422],{"type":293,"value":23410},"Achtung: Wenn Sie eine TMPFS-Datei zu Ihrem BTRFS-Dateisystem hinzufügen, klopfen Sie auf Holz, dass es keinen Stromausfall oder Kernel-Crash gibt, sonst beschädigen Sie Ihr Dateisystem. Die Verwendung eines TMPFS ist eine Notlösung. Fügen Sie besser einen USB-Speicher oder einen Netzwerkspeicher mit ",{"type":283,"tag":11491,"props":23412,"children":23413},{},[23414],{"type":293,"value":23415},"nfs",{"type":293,"value":10941},{"type":283,"tag":11491,"props":23418,"children":23419},{},[23420],{"type":293,"value":23421},"sshfs",{"type":293,"value":23423}," hinzu, wenn möglich.",{"type":283,"tag":1489,"props":23425,"children":23426},{},[23427],{"type":293,"value":1493},{"title":8,"searchDepth":340,"depth":340,"links":23429},[23430,23431,23432,23433,23434,23435,23436,23437,23438,23439],{"id":22638,"depth":340,"text":22641},{"id":22677,"depth":340,"text":22680},{"id":22727,"depth":340,"text":22730},{"id":22865,"depth":340,"text":22868},{"id":22876,"depth":340,"text":22879},{"id":22941,"depth":340,"text":22944},{"id":23164,"depth":340,"text":23167},{"id":23231,"depth":340,"text":23234},{"id":23296,"depth":340,"text":23299},{"id":23350,"depth":340,"text":23440},"Ich erhalte auch \"no space left on device\" wenn ich btrfs balance ausführe",{"_path":252,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":253,"description":254,"image":229,"author":228,"releaseDate":255,"blogCategories":23442,"articleTags":23443,"tags":23444,"body":23445,"_type":20,"_id":259,"_source":22,"_file":260,"_stem":261,"_extension":25},[77,245],[207],[235,19],{"type":280,"children":23446,"toc":23480},[23447,23453,23458,23464,23474],{"type":283,"tag":532,"props":23448,"children":23450},{"id":23449},"finden-sie-was-sie-wissen-müssen",[23451],{"type":293,"value":23452},"Finden Sie, was Sie wissen müssen",{"type":283,"tag":284,"props":23454,"children":23455},{},[23456],{"type":293,"value":23457},"Da die Basho RIAK KV TS CS Dokumentation im Moment nicht erreichbar ist,",{"type":283,"tag":1607,"props":23459,"children":23463},{"alt":23460,"aspect-ratio":22650,"height":23461,"object-fit":19638,"src":23462},"bashoriak",100,"/blog/bashoriak.png",[],{"type":283,"tag":284,"props":23465,"children":23466},{},[23467,23469],{"type":293,"value":23468},"haben wir eine Kopie erstellt:\n",{"type":283,"tag":288,"props":23470,"children":23472},{"href":23471},"https://riak.docs.hw.ag/",[23473],{"type":293,"value":23471},{"type":283,"tag":1607,"props":23475,"children":23479},{"alt":23476,"aspect-ratio":23477,"height":1610,"object-fit":19638,"src":23478},"bashoriak_mirror","1.5","/blog/bashoriak_mirror.png",[],{"title":8,"searchDepth":340,"depth":340,"links":23481},[23482],{"id":23449,"depth":340,"text":23452},{"_path":263,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":264,"description":265,"image":266,"author":136,"releaseDate":267,"blogCategories":23484,"articleTags":23485,"tags":23486,"body":23487,"_type":20,"_id":272,"_source":22,"_file":273,"_stem":274,"_extension":25},[77,269],[269],[144,235],{"type":280,"children":23488,"toc":23578},[23489,23494,23499,23504,23509,23514,23519,23524,23529,23535,23540,23546,23551,23557,23562,23567,23573],{"type":283,"tag":284,"props":23490,"children":23491},{},[23492],{"type":293,"value":23493},"Wir arbeiten nicht mit beliebigen Frameworks, Bibliotheken, Plugins und Programmiersprachen. Wir lieben es professionell.",{"type":283,"tag":284,"props":23495,"children":23496},{},[23497],{"type":293,"value":23498},"Software, die bei Helm & Walter entsteht, soll leistungsfähig und schlank sein. Hier unsere Favoriten:",{"type":283,"tag":532,"props":23500,"children":23502},{"id":23501},"php",[23503],{"type":293,"value":1555},{"type":283,"tag":284,"props":23505,"children":23506},{},[23507],{"type":293,"value":23508},"PHP (rekursives Akronym für PHP: Hypertext Preprocessor) ist eine weit verbreitete und für den allgemeinen Gebrauch bestimmte Open-Source-Skriptsprache, welche speziell für die Webprogrammierung geeignet ist und in HTML eingebettet werden kann.",{"type":283,"tag":532,"props":23510,"children":23512},{"id":23511},"c",[23513],{"type":293,"value":18538},{"type":283,"tag":284,"props":23515,"children":23516},{},[23517],{"type":293,"value":23518},"C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau. Sie ist besonders für native Desktop- und Serveranwendungen geeignet und zeichnet sich durch eine sehr gute Performance aus.",{"type":283,"tag":532,"props":23520,"children":23522},{"id":23521},"java",[23523],{"type":293,"value":12913},{"type":283,"tag":284,"props":23525,"children":23526},{},[23527],{"type":293,"value":23528},"Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems, welches 2010 von Oracle aufgekauft wurde. Sie beweist ihre Stärke besonders in der Plattformunabhängigkeit, kann also überall verwendet werden wo eine entsprechende Laufzeitumgebung eingerichtet ist, und wird fast vollständig objektorientiert formuliert.",{"type":283,"tag":532,"props":23530,"children":23532},{"id":23531},"scala",[23533],{"type":293,"value":23534},"Scala",{"type":283,"tag":284,"props":23536,"children":23537},{},[23538],{"type":293,"value":23539},"Scala ist eine von der École polytechnique fédérale de Lausanne unter Leitung von Martin Odersky entwickelte Programmiersprache. Der Name leitet sich von ‘scalable language’ ab und bringt zum Ausdruck, dass der sehr kompakt gehaltene Sprachkern die Möglichkeit bietet, häufig verwendete Sprachelemente wie z. B. Operatoren oder zusätzliche Kontrollstrukturen in Benutzerklassen zu implementieren und dadurch den Sprachumfang zu erweitern. Sie kann mit oben erwähnten Java-Programmen zusammenarbeiten, ist aber im Gegensatz zu Java komplett objektorientiert formuliert. Scala eignet sich besonders für die parallele Verarbeitung von Daten.",{"type":283,"tag":532,"props":23541,"children":23543},{"id":23542},"zend-framework",[23544],{"type":293,"value":23545},"Zend Framework",{"type":283,"tag":284,"props":23547,"children":23548},{},[23549],{"type":293,"value":23550},"Das Zend Framework ist ein komponenten-orientiertes Webframework für PHP mit über 135 Millionen Installationen, darunter auch namhafte Unternehmen wie beispielsweise BBC. Es ermöglicht eine einfache Projektstruktur und arbeitet problemlos mit den meisten Lösungen anderer Hersteller zusammen. Es wird von Zend Technologies entwickelt und ist durch die PHP-Grundlage ebenfalls plattformunabhängig.",{"type":283,"tag":532,"props":23552,"children":23554},{"id":23553},"dhtmlx",[23555],{"type":293,"value":23556},"DHTMLX",{"type":283,"tag":284,"props":23558,"children":23559},{},[23560],{"type":293,"value":23561},"Die von Dinamenta UAB entwickelte DHTMLX Suite ist eine auf JavaScript basierende Programmbibliothek für die Entwicklung dynamischer Webanwendungen mit desktop-ähnlicher Benutzererfahrung. Die modulare Architektur erlaubt das Hinzufügen oder Entfernen beliebiger performancestarker Programmteile für eine optimale Ressourcenverwendung auf Clientseite. Zudem kann DHTMLX problemlos sowohl auf Desktop als auch in mobilen Umgebungen on- und offline verwendet werden.",{"type":283,"tag":284,"props":23563,"children":23564},{},[23565],{"type":293,"value":23566},"DHTMLX, als eine der Grundlagen für unser Verdandi, wurde von uns durch einige Plugins und andere Erweiterungen verbessert – beispielsweise die “Row-Actions”, welche eine kompakte und flexible Möglichkeit bieten, zeilenspezifische Aufgaben durchzuführen.",{"type":283,"tag":532,"props":23568,"children":23570},{"id":23569},"infinidb",[23571],{"type":293,"value":23572},"InfiniDB",{"type":283,"tag":284,"props":23574,"children":23575},{},[23576],{"type":293,"value":23577},"InfiniDB wurde von der gleichnamigen Firma InfiniDB (vormals Calpont Corporation) als ein skalierbares, spaltenbasiertes Datenbank-Management-System für analytische Anwendungen entwickelt. Sie ist spezialisiert auf Big Data Analysen, Business Intelligence, Data Warehousing und andere lese-intensiven Applikationen. Die verwendete Column-Store-Architektur ermöglicht extrem schnelle Lade- und Query-Ausführungszeiten.",{"title":8,"searchDepth":340,"depth":340,"links":23579},[23580,23581,23582,23583,23584,23585,23586],{"id":23501,"depth":340,"text":1555},{"id":23511,"depth":340,"text":18538},{"id":23521,"depth":340,"text":12913},{"id":23531,"depth":340,"text":23534},{"id":23542,"depth":340,"text":23545},{"id":23553,"depth":340,"text":23556},{"id":23569,"depth":340,"text":23572},1782284035614]