[{"data":1,"prerenderedAt":7342},["ShallowReactive",2],{"blog-current-shopware-plugin-gitlab-pipeline-release-de":3,"blog-previous-shopware-plugin-gitlab-pipeline-release-de":4492,"blog-next-shopware-plugin-gitlab-pipeline-release-de":4503,"blog-alt-de-shopware-plugin-gitlab-pipeline-release-de":4514,"blog-alt-en-shopware-plugin-gitlab-pipeline-release-de":4515,"employee-robert-juzak":4517,"content-query-TVldk4ROTj":4614,"content-query-w8qtEh68yX":6096,"content-query-KtO3wftRle":7257,"related-refs-shopware_devops--de":7292},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"author":10,"image":11,"releaseDate":12,"blogCategories":13,"articleTags":16,"tags":19,"body":22,"_type":4486,"_id":4487,"_source":4488,"_file":4489,"_stem":4490,"_extension":4491},"/blog/shopware-plugin-gitlab-pipeline-release","blog",false,"","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","robert-juzak","/images/dev-ops-dark.svg","2026-02-26",[14,15],"Was uns bewegt","DevOps",[15,17,18],"Open Source","Shopware",[20,21],"shopware","devops",{"type":23,"children":24,"toc":4474},"root",[25,34,41,55,60,65,104,109,116,121,128,141,1227,1232,1260,1270,1274,1287,1310,1447,1460,1465,1471,1483,1504,1906,1947,1952,1973,2115,2127,2133,2145,2150,2162,2197,2202,3129,3134,3233,3238,3297,3308,3313,3334,3469,3479,3485,3506,3509,3513,3519,3525,3530,3548,3598,3758,3764,3769,3780,3793,4016,4421,4426,4468],{"type":26,"tag":27,"props":28,"children":33},"element","img",{"alt":7,"aspect-ratio":29,"height":30,"object-fit":31,"src":32},"1.78",300,"fill","/blog/shopware-plugin-release.png",[],{"type":26,"tag":35,"props":36,"children":37},"p",{},[38],{"type":39,"value":40},"text","Es gibt viele Möglichkeiten, Shopware 6 Plugins zu installieren. Sie können sie direkt im Admin-Panel herunterladen oder mit Composer installieren.",{"type":26,"tag":35,"props":42,"children":43},{},[44,46,53],{"type":39,"value":45},"Einen detaillierten Vergleich finden Sie in der ",{"type":26,"tag":47,"props":48,"children":50},"a",{"href":49},"https://developer.shopware.com/docs/guides/plugins/plugins/",[51],{"type":39,"value":52},"offiziellen Dokumentation",{"type":39,"value":54},".",{"type":26,"tag":35,"props":56,"children":57},{},[58],{"type":39,"value":59},"Als Entwickler und Betreuer von Themes, Anpassungen, Drittanbieter-APIs usw. konzentriere ich mich auf statische Plugins.",{"type":26,"tag":35,"props":61,"children":62},{},[63],{"type":39,"value":64},"Der Workflow ist einfach:",{"type":26,"tag":66,"props":67,"children":68},"ol",{},[69,82,93],{"type":26,"tag":70,"props":71,"children":72},"li",{},[73,75],{"type":39,"value":74},"Erstelle ein Plugin mit ",{"type":26,"tag":76,"props":77,"children":79},"code",{"className":78},[],[80],{"type":39,"value":81},"bin/console plugin:create --static",{"type":26,"tag":70,"props":83,"children":84},{},[85,87],{"type":39,"value":86},"Installiere es mit ",{"type":26,"tag":47,"props":88,"children":90},{"href":89},"https://developer.shopware.com/docs/guides/plugins/plugins/#static-plugins",[91],{"type":39,"value":92},"Composer",{"type":26,"tag":70,"props":94,"children":95},{},[96,98],{"type":39,"value":97},"Baue das Projekt mit ",{"type":26,"tag":47,"props":99,"children":101},{"href":100},"https://developer.shopware.com/docs/products/cli/project-commands/build.html#example-docker-image",[102],{"type":39,"value":103},"shopware-cli",{"type":26,"tag":35,"props":105,"children":106},{},[107],{"type":39,"value":108},"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":26,"tag":110,"props":111,"children":113},"h2",{"id":112},"das-plugin-extrahieren",[114],{"type":39,"value":115},"Das Plugin extrahieren",{"type":26,"tag":35,"props":117,"children":118},{},[119],{"type":39,"value":120},"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":26,"tag":122,"props":123,"children":125},"h3",{"id":124},"download-mit-git",[126],{"type":39,"value":127},"Download mit Git",{"type":26,"tag":35,"props":129,"children":130},{},[131,133,139],{"type":39,"value":132},"Wir müssen ",{"type":26,"tag":76,"props":134,"children":136},{"className":135},[],[137],{"type":39,"value":138},"composer",{"type":39,"value":140}," nur mitteilen, wo unser Plugin zu finden ist.",{"type":26,"tag":142,"props":143,"children":153},"pre",{"className":144,"code":145,"filename":146,"highlights":147,"language":152,"meta":7,"style":7},"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",[148,149,150,151],36,37,38,39,"json",[154],{"type":26,"tag":76,"props":155,"children":156},{"__ignoreMap":7},[157,169,195,217,239,253,275,297,319,341,362,383,401,410,424,433,455,477,490,509,518,527,535,555,576,588,604,612,620,628,648,669,681,697,705,713,722,743,760,769,778,791,804,833,841,849,871,884,897,918,935,943,964,981,989,1002,1015,1033,1041,1054,1063,1072,1085,1093,1102,1110,1123,1136,1157,1170,1183,1192,1201,1209,1218],{"type":26,"tag":158,"props":159,"children":162},"span",{"class":160,"line":161},"line",1,[163],{"type":26,"tag":158,"props":164,"children":166},{"style":165},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2",[167],{"type":39,"value":168},"{\n",{"type":26,"tag":158,"props":170,"children":172},{"class":160,"line":171},2,[173,179,184,190],{"type":26,"tag":158,"props":174,"children":176},{"style":175},"--shiki-default:#79B8FF;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic",[177],{"type":39,"value":178},"  \"name\"",{"type":26,"tag":158,"props":180,"children":181},{"style":165},[182],{"type":39,"value":183},": ",{"type":26,"tag":158,"props":185,"children":187},{"style":186},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2",[188],{"type":39,"value":189},"\"shopware/production\"",{"type":26,"tag":158,"props":191,"children":192},{"style":165},[193],{"type":39,"value":194},",\n",{"type":26,"tag":158,"props":196,"children":198},{"class":160,"line":197},3,[199,204,208,213],{"type":26,"tag":158,"props":200,"children":201},{"style":175},[202],{"type":39,"value":203},"  \"license\"",{"type":26,"tag":158,"props":205,"children":206},{"style":165},[207],{"type":39,"value":183},{"type":26,"tag":158,"props":209,"children":210},{"style":186},[211],{"type":39,"value":212},"\"MIT\"",{"type":26,"tag":158,"props":214,"children":215},{"style":165},[216],{"type":39,"value":194},{"type":26,"tag":158,"props":218,"children":220},{"class":160,"line":219},4,[221,226,230,235],{"type":26,"tag":158,"props":222,"children":223},{"style":175},[224],{"type":39,"value":225},"  \"type\"",{"type":26,"tag":158,"props":227,"children":228},{"style":165},[229],{"type":39,"value":183},{"type":26,"tag":158,"props":231,"children":232},{"style":186},[233],{"type":39,"value":234},"\"project\"",{"type":26,"tag":158,"props":236,"children":237},{"style":165},[238],{"type":39,"value":194},{"type":26,"tag":158,"props":240,"children":242},{"class":160,"line":241},5,[243,248],{"type":26,"tag":158,"props":244,"children":245},{"style":175},[246],{"type":39,"value":247},"  \"require\"",{"type":26,"tag":158,"props":249,"children":250},{"style":165},[251],{"type":39,"value":252},": {\n",{"type":26,"tag":158,"props":254,"children":256},{"class":160,"line":255},6,[257,262,266,271],{"type":26,"tag":158,"props":258,"children":259},{"style":175},[260],{"type":39,"value":261},"    \"composer-runtime-api\"",{"type":26,"tag":158,"props":263,"children":264},{"style":165},[265],{"type":39,"value":183},{"type":26,"tag":158,"props":267,"children":268},{"style":186},[269],{"type":39,"value":270},"\"^2.0\"",{"type":26,"tag":158,"props":272,"children":273},{"style":165},[274],{"type":39,"value":194},{"type":26,"tag":158,"props":276,"children":278},{"class":160,"line":277},7,[279,284,288,293],{"type":26,"tag":158,"props":280,"children":281},{"style":175},[282],{"type":39,"value":283},"    \"acme/sample-plugin\"",{"type":26,"tag":158,"props":285,"children":286},{"style":165},[287],{"type":39,"value":183},{"type":26,"tag":158,"props":289,"children":290},{"style":186},[291],{"type":39,"value":292},"\"^1.0\"",{"type":26,"tag":158,"props":294,"children":295},{"style":165},[296],{"type":39,"value":194},{"type":26,"tag":158,"props":298,"children":300},{"class":160,"line":299},8,[301,306,310,315],{"type":26,"tag":158,"props":302,"children":303},{"style":175},[304],{"type":39,"value":305},"    \"shopware/administration\"",{"type":26,"tag":158,"props":307,"children":308},{"style":165},[309],{"type":39,"value":183},{"type":26,"tag":158,"props":311,"children":312},{"style":186},[313],{"type":39,"value":314},"\"*\"",{"type":26,"tag":158,"props":316,"children":317},{"style":165},[318],{"type":39,"value":194},{"type":26,"tag":158,"props":320,"children":322},{"class":160,"line":321},9,[323,328,332,337],{"type":26,"tag":158,"props":324,"children":325},{"style":175},[326],{"type":39,"value":327},"    \"shopware/core\"",{"type":26,"tag":158,"props":329,"children":330},{"style":165},[331],{"type":39,"value":183},{"type":26,"tag":158,"props":333,"children":334},{"style":186},[335],{"type":39,"value":336},"\"6.6.10.2\"",{"type":26,"tag":158,"props":338,"children":339},{"style":165},[340],{"type":39,"value":194},{"type":26,"tag":158,"props":342,"children":344},{"class":160,"line":343},10,[345,350,354,358],{"type":26,"tag":158,"props":346,"children":347},{"style":175},[348],{"type":39,"value":349},"    \"shopware/elasticsearch\"",{"type":26,"tag":158,"props":351,"children":352},{"style":165},[353],{"type":39,"value":183},{"type":26,"tag":158,"props":355,"children":356},{"style":186},[357],{"type":39,"value":314},{"type":26,"tag":158,"props":359,"children":360},{"style":165},[361],{"type":39,"value":194},{"type":26,"tag":158,"props":363,"children":365},{"class":160,"line":364},11,[366,371,375,379],{"type":26,"tag":158,"props":367,"children":368},{"style":175},[369],{"type":39,"value":370},"    \"shopware/storefront\"",{"type":26,"tag":158,"props":372,"children":373},{"style":165},[374],{"type":39,"value":183},{"type":26,"tag":158,"props":376,"children":377},{"style":186},[378],{"type":39,"value":314},{"type":26,"tag":158,"props":380,"children":381},{"style":165},[382],{"type":39,"value":194},{"type":26,"tag":158,"props":384,"children":386},{"class":160,"line":385},12,[387,392,396],{"type":26,"tag":158,"props":388,"children":389},{"style":175},[390],{"type":39,"value":391},"    \"symfony/flex\"",{"type":26,"tag":158,"props":393,"children":394},{"style":165},[395],{"type":39,"value":183},{"type":26,"tag":158,"props":397,"children":398},{"style":186},[399],{"type":39,"value":400},"\"~2\"\n",{"type":26,"tag":158,"props":402,"children":404},{"class":160,"line":403},13,[405],{"type":26,"tag":158,"props":406,"children":407},{"style":165},[408],{"type":39,"value":409},"  },\n",{"type":26,"tag":158,"props":411,"children":413},{"class":160,"line":412},14,[414,419],{"type":26,"tag":158,"props":415,"children":416},{"style":175},[417],{"type":39,"value":418},"  \"repositories\"",{"type":26,"tag":158,"props":420,"children":421},{"style":165},[422],{"type":39,"value":423},": [\n",{"type":26,"tag":158,"props":425,"children":427},{"class":160,"line":426},15,[428],{"type":26,"tag":158,"props":429,"children":430},{"style":165},[431],{"type":39,"value":432},"    {\n",{"type":26,"tag":158,"props":434,"children":436},{"class":160,"line":435},16,[437,442,446,451],{"type":26,"tag":158,"props":438,"children":439},{"style":175},[440],{"type":39,"value":441},"      \"type\"",{"type":26,"tag":158,"props":443,"children":444},{"style":165},[445],{"type":39,"value":183},{"type":26,"tag":158,"props":447,"children":448},{"style":186},[449],{"type":39,"value":450},"\"path\"",{"type":26,"tag":158,"props":452,"children":453},{"style":165},[454],{"type":39,"value":194},{"type":26,"tag":158,"props":456,"children":458},{"class":160,"line":457},17,[459,464,468,473],{"type":26,"tag":158,"props":460,"children":461},{"style":175},[462],{"type":39,"value":463},"      \"url\"",{"type":26,"tag":158,"props":465,"children":466},{"style":165},[467],{"type":39,"value":183},{"type":26,"tag":158,"props":469,"children":470},{"style":186},[471],{"type":39,"value":472},"\"custom/plugins/*\"",{"type":26,"tag":158,"props":474,"children":475},{"style":165},[476],{"type":39,"value":194},{"type":26,"tag":158,"props":478,"children":480},{"class":160,"line":479},18,[481,486],{"type":26,"tag":158,"props":482,"children":483},{"style":175},[484],{"type":39,"value":485},"      \"options\"",{"type":26,"tag":158,"props":487,"children":488},{"style":165},[489],{"type":39,"value":252},{"type":26,"tag":158,"props":491,"children":493},{"class":160,"line":492},19,[494,499,503],{"type":26,"tag":158,"props":495,"children":496},{"style":175},[497],{"type":39,"value":498},"        \"symlink\"",{"type":26,"tag":158,"props":500,"children":501},{"style":165},[502],{"type":39,"value":183},{"type":26,"tag":158,"props":504,"children":506},{"style":505},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF",[507],{"type":39,"value":508},"true\n",{"type":26,"tag":158,"props":510,"children":512},{"class":160,"line":511},20,[513],{"type":26,"tag":158,"props":514,"children":515},{"style":165},[516],{"type":39,"value":517},"      }\n",{"type":26,"tag":158,"props":519,"children":521},{"class":160,"line":520},21,[522],{"type":26,"tag":158,"props":523,"children":524},{"style":165},[525],{"type":39,"value":526},"    },\n",{"type":26,"tag":158,"props":528,"children":530},{"class":160,"line":529},22,[531],{"type":26,"tag":158,"props":532,"children":533},{"style":165},[534],{"type":39,"value":432},{"type":26,"tag":158,"props":536,"children":538},{"class":160,"line":537},23,[539,543,547,551],{"type":26,"tag":158,"props":540,"children":541},{"style":175},[542],{"type":39,"value":441},{"type":26,"tag":158,"props":544,"children":545},{"style":165},[546],{"type":39,"value":183},{"type":26,"tag":158,"props":548,"children":549},{"style":186},[550],{"type":39,"value":450},{"type":26,"tag":158,"props":552,"children":553},{"style":165},[554],{"type":39,"value":194},{"type":26,"tag":158,"props":556,"children":558},{"class":160,"line":557},24,[559,563,567,572],{"type":26,"tag":158,"props":560,"children":561},{"style":175},[562],{"type":39,"value":463},{"type":26,"tag":158,"props":564,"children":565},{"style":165},[566],{"type":39,"value":183},{"type":26,"tag":158,"props":568,"children":569},{"style":186},[570],{"type":39,"value":571},"\"custom/plugins/*/packages/*\"",{"type":26,"tag":158,"props":573,"children":574},{"style":165},[575],{"type":39,"value":194},{"type":26,"tag":158,"props":577,"children":579},{"class":160,"line":578},25,[580,584],{"type":26,"tag":158,"props":581,"children":582},{"style":175},[583],{"type":39,"value":485},{"type":26,"tag":158,"props":585,"children":586},{"style":165},[587],{"type":39,"value":252},{"type":26,"tag":158,"props":589,"children":591},{"class":160,"line":590},26,[592,596,600],{"type":26,"tag":158,"props":593,"children":594},{"style":175},[595],{"type":39,"value":498},{"type":26,"tag":158,"props":597,"children":598},{"style":165},[599],{"type":39,"value":183},{"type":26,"tag":158,"props":601,"children":602},{"style":505},[603],{"type":39,"value":508},{"type":26,"tag":158,"props":605,"children":607},{"class":160,"line":606},27,[608],{"type":26,"tag":158,"props":609,"children":610},{"style":165},[611],{"type":39,"value":517},{"type":26,"tag":158,"props":613,"children":615},{"class":160,"line":614},28,[616],{"type":26,"tag":158,"props":617,"children":618},{"style":165},[619],{"type":39,"value":526},{"type":26,"tag":158,"props":621,"children":623},{"class":160,"line":622},29,[624],{"type":26,"tag":158,"props":625,"children":626},{"style":165},[627],{"type":39,"value":432},{"type":26,"tag":158,"props":629,"children":631},{"class":160,"line":630},30,[632,636,640,644],{"type":26,"tag":158,"props":633,"children":634},{"style":175},[635],{"type":39,"value":441},{"type":26,"tag":158,"props":637,"children":638},{"style":165},[639],{"type":39,"value":183},{"type":26,"tag":158,"props":641,"children":642},{"style":186},[643],{"type":39,"value":450},{"type":26,"tag":158,"props":645,"children":646},{"style":165},[647],{"type":39,"value":194},{"type":26,"tag":158,"props":649,"children":651},{"class":160,"line":650},31,[652,656,660,665],{"type":26,"tag":158,"props":653,"children":654},{"style":175},[655],{"type":39,"value":463},{"type":26,"tag":158,"props":657,"children":658},{"style":165},[659],{"type":39,"value":183},{"type":26,"tag":158,"props":661,"children":662},{"style":186},[663],{"type":39,"value":664},"\"custom/static-plugins/*\"",{"type":26,"tag":158,"props":666,"children":667},{"style":165},[668],{"type":39,"value":194},{"type":26,"tag":158,"props":670,"children":672},{"class":160,"line":671},32,[673,677],{"type":26,"tag":158,"props":674,"children":675},{"style":175},[676],{"type":39,"value":485},{"type":26,"tag":158,"props":678,"children":679},{"style":165},[680],{"type":39,"value":252},{"type":26,"tag":158,"props":682,"children":684},{"class":160,"line":683},33,[685,689,693],{"type":26,"tag":158,"props":686,"children":687},{"style":175},[688],{"type":39,"value":498},{"type":26,"tag":158,"props":690,"children":691},{"style":165},[692],{"type":39,"value":183},{"type":26,"tag":158,"props":694,"children":695},{"style":505},[696],{"type":39,"value":508},{"type":26,"tag":158,"props":698,"children":700},{"class":160,"line":699},34,[701],{"type":26,"tag":158,"props":702,"children":703},{"style":165},[704],{"type":39,"value":517},{"type":26,"tag":158,"props":706,"children":708},{"class":160,"line":707},35,[709],{"type":26,"tag":158,"props":710,"children":711},{"style":165},[712],{"type":39,"value":526},{"type":26,"tag":158,"props":714,"children":717},{"class":715,"line":148},[160,716],"highlight",[718],{"type":26,"tag":158,"props":719,"children":720},{"style":165},[721],{"type":39,"value":432},{"type":26,"tag":158,"props":723,"children":725},{"class":724,"line":149},[160,716],[726,730,734,739],{"type":26,"tag":158,"props":727,"children":728},{"style":175},[729],{"type":39,"value":441},{"type":26,"tag":158,"props":731,"children":732},{"style":165},[733],{"type":39,"value":183},{"type":26,"tag":158,"props":735,"children":736},{"style":186},[737],{"type":39,"value":738},"\"git\"",{"type":26,"tag":158,"props":740,"children":741},{"style":165},[742],{"type":39,"value":194},{"type":26,"tag":158,"props":744,"children":746},{"class":745,"line":150},[160,716],[747,751,755],{"type":26,"tag":158,"props":748,"children":749},{"style":175},[750],{"type":39,"value":463},{"type":26,"tag":158,"props":752,"children":753},{"style":165},[754],{"type":39,"value":183},{"type":26,"tag":158,"props":756,"children":757},{"style":186},[758],{"type":39,"value":759},"\"https://\u003CDOMAIN-NAME>/\u003Cgroup>/\u003Crepo>.git\"\n",{"type":26,"tag":158,"props":761,"children":763},{"class":762,"line":151},[160,716],[764],{"type":26,"tag":158,"props":765,"children":766},{"style":165},[767],{"type":39,"value":768},"    }\n",{"type":26,"tag":158,"props":770,"children":772},{"class":160,"line":771},40,[773],{"type":26,"tag":158,"props":774,"children":775},{"style":165},[776],{"type":39,"value":777},"  ],\n",{"type":26,"tag":158,"props":779,"children":781},{"class":160,"line":780},41,[782,787],{"type":26,"tag":158,"props":783,"children":784},{"style":175},[785],{"type":39,"value":786},"  \"autoload\"",{"type":26,"tag":158,"props":788,"children":789},{"style":165},[790],{"type":39,"value":252},{"type":26,"tag":158,"props":792,"children":794},{"class":160,"line":793},42,[795,800],{"type":26,"tag":158,"props":796,"children":797},{"style":175},[798],{"type":39,"value":799},"    \"psr-4\"",{"type":26,"tag":158,"props":801,"children":802},{"style":165},[803],{"type":39,"value":252},{"type":26,"tag":158,"props":805,"children":807},{"class":160,"line":806},43,[808,813,819,824,828],{"type":26,"tag":158,"props":809,"children":810},{"style":175},[811],{"type":39,"value":812},"      \"App",{"type":26,"tag":158,"props":814,"children":816},{"style":815},"--shiki-default:#79B8FF;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#AE81FF;--shiki-sepia-font-style:italic",[817],{"type":39,"value":818},"\\\\",{"type":26,"tag":158,"props":820,"children":821},{"style":175},[822],{"type":39,"value":823},"\"",{"type":26,"tag":158,"props":825,"children":826},{"style":165},[827],{"type":39,"value":183},{"type":26,"tag":158,"props":829,"children":830},{"style":186},[831],{"type":39,"value":832},"\"src/\"\n",{"type":26,"tag":158,"props":834,"children":836},{"class":160,"line":835},44,[837],{"type":26,"tag":158,"props":838,"children":839},{"style":165},[840],{"type":39,"value":768},{"type":26,"tag":158,"props":842,"children":844},{"class":160,"line":843},45,[845],{"type":26,"tag":158,"props":846,"children":847},{"style":165},[848],{"type":39,"value":409},{"type":26,"tag":158,"props":850,"children":852},{"class":160,"line":851},46,[853,858,862,867],{"type":26,"tag":158,"props":854,"children":855},{"style":175},[856],{"type":39,"value":857},"  \"prefer-stable\"",{"type":26,"tag":158,"props":859,"children":860},{"style":165},[861],{"type":39,"value":183},{"type":26,"tag":158,"props":863,"children":864},{"style":505},[865],{"type":39,"value":866},"true",{"type":26,"tag":158,"props":868,"children":869},{"style":165},[870],{"type":39,"value":194},{"type":26,"tag":158,"props":872,"children":874},{"class":160,"line":873},47,[875,880],{"type":26,"tag":158,"props":876,"children":877},{"style":175},[878],{"type":39,"value":879},"  \"config\"",{"type":26,"tag":158,"props":881,"children":882},{"style":165},[883],{"type":39,"value":252},{"type":26,"tag":158,"props":885,"children":887},{"class":160,"line":886},48,[888,893],{"type":26,"tag":158,"props":889,"children":890},{"style":175},[891],{"type":39,"value":892},"    \"allow-plugins\"",{"type":26,"tag":158,"props":894,"children":895},{"style":165},[896],{"type":39,"value":252},{"type":26,"tag":158,"props":898,"children":900},{"class":160,"line":899},49,[901,906,910,914],{"type":26,"tag":158,"props":902,"children":903},{"style":175},[904],{"type":39,"value":905},"      \"symfony/flex\"",{"type":26,"tag":158,"props":907,"children":908},{"style":165},[909],{"type":39,"value":183},{"type":26,"tag":158,"props":911,"children":912},{"style":505},[913],{"type":39,"value":866},{"type":26,"tag":158,"props":915,"children":916},{"style":165},[917],{"type":39,"value":194},{"type":26,"tag":158,"props":919,"children":921},{"class":160,"line":920},50,[922,927,931],{"type":26,"tag":158,"props":923,"children":924},{"style":175},[925],{"type":39,"value":926},"      \"symfony/runtime\"",{"type":26,"tag":158,"props":928,"children":929},{"style":165},[930],{"type":39,"value":183},{"type":26,"tag":158,"props":932,"children":933},{"style":505},[934],{"type":39,"value":508},{"type":26,"tag":158,"props":936,"children":938},{"class":160,"line":937},51,[939],{"type":26,"tag":158,"props":940,"children":941},{"style":165},[942],{"type":39,"value":526},{"type":26,"tag":158,"props":944,"children":946},{"class":160,"line":945},52,[947,952,956,960],{"type":26,"tag":158,"props":948,"children":949},{"style":175},[950],{"type":39,"value":951},"    \"optimize-autoloader\"",{"type":26,"tag":158,"props":953,"children":954},{"style":165},[955],{"type":39,"value":183},{"type":26,"tag":158,"props":957,"children":958},{"style":505},[959],{"type":39,"value":866},{"type":26,"tag":158,"props":961,"children":962},{"style":165},[963],{"type":39,"value":194},{"type":26,"tag":158,"props":965,"children":967},{"class":160,"line":966},53,[968,973,977],{"type":26,"tag":158,"props":969,"children":970},{"style":175},[971],{"type":39,"value":972},"    \"sort-packages\"",{"type":26,"tag":158,"props":974,"children":975},{"style":165},[976],{"type":39,"value":183},{"type":26,"tag":158,"props":978,"children":979},{"style":505},[980],{"type":39,"value":508},{"type":26,"tag":158,"props":982,"children":984},{"class":160,"line":983},54,[985],{"type":26,"tag":158,"props":986,"children":987},{"style":165},[988],{"type":39,"value":409},{"type":26,"tag":158,"props":990,"children":992},{"class":160,"line":991},55,[993,998],{"type":26,"tag":158,"props":994,"children":995},{"style":175},[996],{"type":39,"value":997},"  \"scripts\"",{"type":26,"tag":158,"props":999,"children":1000},{"style":165},[1001],{"type":39,"value":252},{"type":26,"tag":158,"props":1003,"children":1005},{"class":160,"line":1004},56,[1006,1011],{"type":26,"tag":158,"props":1007,"children":1008},{"style":175},[1009],{"type":39,"value":1010},"    \"auto-scripts\"",{"type":26,"tag":158,"props":1012,"children":1013},{"style":165},[1014],{"type":39,"value":252},{"type":26,"tag":158,"props":1016,"children":1018},{"class":160,"line":1017},57,[1019,1024,1028],{"type":26,"tag":158,"props":1020,"children":1021},{"style":175},[1022],{"type":39,"value":1023},"      \"assets:install\"",{"type":26,"tag":158,"props":1025,"children":1026},{"style":165},[1027],{"type":39,"value":183},{"type":26,"tag":158,"props":1029,"children":1030},{"style":186},[1031],{"type":39,"value":1032},"\"symfony-cmd\"\n",{"type":26,"tag":158,"props":1034,"children":1036},{"class":160,"line":1035},58,[1037],{"type":26,"tag":158,"props":1038,"children":1039},{"style":165},[1040],{"type":39,"value":526},{"type":26,"tag":158,"props":1042,"children":1044},{"class":160,"line":1043},59,[1045,1050],{"type":26,"tag":158,"props":1046,"children":1047},{"style":175},[1048],{"type":39,"value":1049},"    \"post-install-cmd\"",{"type":26,"tag":158,"props":1051,"children":1052},{"style":165},[1053],{"type":39,"value":423},{"type":26,"tag":158,"props":1055,"children":1057},{"class":160,"line":1056},60,[1058],{"type":26,"tag":158,"props":1059,"children":1060},{"style":186},[1061],{"type":39,"value":1062},"      \"@auto-scripts\"\n",{"type":26,"tag":158,"props":1064,"children":1066},{"class":160,"line":1065},61,[1067],{"type":26,"tag":158,"props":1068,"children":1069},{"style":165},[1070],{"type":39,"value":1071},"    ],\n",{"type":26,"tag":158,"props":1073,"children":1075},{"class":160,"line":1074},62,[1076,1081],{"type":26,"tag":158,"props":1077,"children":1078},{"style":175},[1079],{"type":39,"value":1080},"    \"post-update-cmd\"",{"type":26,"tag":158,"props":1082,"children":1083},{"style":165},[1084],{"type":39,"value":423},{"type":26,"tag":158,"props":1086,"children":1088},{"class":160,"line":1087},63,[1089],{"type":26,"tag":158,"props":1090,"children":1091},{"style":186},[1092],{"type":39,"value":1062},{"type":26,"tag":158,"props":1094,"children":1096},{"class":160,"line":1095},64,[1097],{"type":26,"tag":158,"props":1098,"children":1099},{"style":165},[1100],{"type":39,"value":1101},"    ]\n",{"type":26,"tag":158,"props":1103,"children":1105},{"class":160,"line":1104},65,[1106],{"type":26,"tag":158,"props":1107,"children":1108},{"style":165},[1109],{"type":39,"value":409},{"type":26,"tag":158,"props":1111,"children":1113},{"class":160,"line":1112},66,[1114,1119],{"type":26,"tag":158,"props":1115,"children":1116},{"style":175},[1117],{"type":39,"value":1118},"  \"extra\"",{"type":26,"tag":158,"props":1120,"children":1121},{"style":165},[1122],{"type":39,"value":252},{"type":26,"tag":158,"props":1124,"children":1126},{"class":160,"line":1125},67,[1127,1132],{"type":26,"tag":158,"props":1128,"children":1129},{"style":175},[1130],{"type":39,"value":1131},"    \"symfony\"",{"type":26,"tag":158,"props":1133,"children":1134},{"style":165},[1135],{"type":39,"value":252},{"type":26,"tag":158,"props":1137,"children":1139},{"class":160,"line":1138},68,[1140,1145,1149,1153],{"type":26,"tag":158,"props":1141,"children":1142},{"style":175},[1143],{"type":39,"value":1144},"      \"allow-contrib\"",{"type":26,"tag":158,"props":1146,"children":1147},{"style":165},[1148],{"type":39,"value":183},{"type":26,"tag":158,"props":1150,"children":1151},{"style":505},[1152],{"type":39,"value":866},{"type":26,"tag":158,"props":1154,"children":1155},{"style":165},[1156],{"type":39,"value":194},{"type":26,"tag":158,"props":1158,"children":1160},{"class":160,"line":1159},69,[1161,1166],{"type":26,"tag":158,"props":1162,"children":1163},{"style":175},[1164],{"type":39,"value":1165},"      \"endpoint\"",{"type":26,"tag":158,"props":1167,"children":1168},{"style":165},[1169],{"type":39,"value":423},{"type":26,"tag":158,"props":1171,"children":1173},{"class":160,"line":1172},70,[1174,1179],{"type":26,"tag":158,"props":1175,"children":1176},{"style":186},[1177],{"type":39,"value":1178},"        \"https://raw.githubusercontent.com/shopware/recipes/flex/main/index.json\"",{"type":26,"tag":158,"props":1180,"children":1181},{"style":165},[1182],{"type":39,"value":194},{"type":26,"tag":158,"props":1184,"children":1186},{"class":160,"line":1185},71,[1187],{"type":26,"tag":158,"props":1188,"children":1189},{"style":186},[1190],{"type":39,"value":1191},"        \"flex://defaults\"\n",{"type":26,"tag":158,"props":1193,"children":1195},{"class":160,"line":1194},72,[1196],{"type":26,"tag":158,"props":1197,"children":1198},{"style":165},[1199],{"type":39,"value":1200},"      ]\n",{"type":26,"tag":158,"props":1202,"children":1204},{"class":160,"line":1203},73,[1205],{"type":26,"tag":158,"props":1206,"children":1207},{"style":165},[1208],{"type":39,"value":768},{"type":26,"tag":158,"props":1210,"children":1212},{"class":160,"line":1211},74,[1213],{"type":26,"tag":158,"props":1214,"children":1215},{"style":165},[1216],{"type":39,"value":1217},"  }\n",{"type":26,"tag":158,"props":1219,"children":1221},{"class":160,"line":1220},75,[1222],{"type":26,"tag":158,"props":1223,"children":1224},{"style":165},[1225],{"type":39,"value":1226},"}\n",{"type":26,"tag":35,"props":1228,"children":1229},{},[1230],{"type":39,"value":1231},"und installieren es mit",{"type":26,"tag":142,"props":1233,"children":1237},{"className":1234,"code":1235,"language":1236,"meta":7,"style":7},"language-shell shiki shiki-themes github-dark github-dark monokai","composer req acme/sample-plugin\n","shell",[1238],{"type":26,"tag":76,"props":1239,"children":1240},{"__ignoreMap":7},[1241],{"type":26,"tag":158,"props":1242,"children":1243},{"class":160,"line":161},[1244,1249,1255],{"type":26,"tag":158,"props":1245,"children":1247},{"style":1246},"--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E",[1248],{"type":39,"value":138},{"type":26,"tag":158,"props":1250,"children":1252},{"style":1251},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74",[1253],{"type":39,"value":1254}," req",{"type":26,"tag":158,"props":1256,"children":1257},{"style":1251},[1258],{"type":39,"value":1259}," acme/sample-plugin\n",{"type":26,"tag":1261,"props":1262,"children":1264},"v-alert",{"type":1263},"error",[1265],{"type":26,"tag":35,"props":1266,"children":1267},{},[1268],{"type":39,"value":1269},"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":26,"tag":1271,"props":1272,"children":1273},"br",{},[],{"type":26,"tag":35,"props":1275,"children":1276},{},[1277,1279,1285],{"type":39,"value":1278},"Ja... das ist der Nachteil. Wir müssen ",{"type":26,"tag":76,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":39,"value":1284},"dev-master",{"type":39,"value":1286}," als Version verwenden",{"type":26,"tag":142,"props":1288,"children":1290},{"className":1234,"code":1289,"language":1236,"meta":7,"style":7},"composer req acme/sample-plugin:dev-master\n",[1291],{"type":26,"tag":76,"props":1292,"children":1293},{"__ignoreMap":7},[1294],{"type":26,"tag":158,"props":1295,"children":1296},{"class":160,"line":161},[1297,1301,1305],{"type":26,"tag":158,"props":1298,"children":1299},{"style":1246},[1300],{"type":39,"value":138},{"type":26,"tag":158,"props":1302,"children":1303},{"style":1251},[1304],{"type":39,"value":1254},{"type":26,"tag":158,"props":1306,"children":1307},{"style":1251},[1308],{"type":39,"value":1309}," acme/sample-plugin:dev-master\n",{"type":26,"tag":142,"props":1311,"children":1315},{"className":1312,"code":1313,"language":1314,"meta":7,"style":7},"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",[1316],{"type":26,"tag":76,"props":1317,"children":1318},{"__ignoreMap":7},[1319,1327,1335,1343,1351,1359,1367,1375,1383,1391,1399,1407,1415,1424,1432,1439],{"type":26,"tag":158,"props":1320,"children":1321},{"class":160,"line":161},[1322],{"type":26,"tag":158,"props":1323,"children":1324},{},[1325],{"type":39,"value":1326},"./composer.json has been updated\n",{"type":26,"tag":158,"props":1328,"children":1329},{"class":160,"line":171},[1330],{"type":26,"tag":158,"props":1331,"children":1332},{},[1333],{"type":39,"value":1334},"Running composer update acme/sample-plugin\n",{"type":26,"tag":158,"props":1336,"children":1337},{"class":160,"line":197},[1338],{"type":26,"tag":158,"props":1339,"children":1340},{},[1341],{"type":39,"value":1342},"Loading composer repositories with package information                                                                \n",{"type":26,"tag":158,"props":1344,"children":1345},{"class":160,"line":219},[1346],{"type":26,"tag":158,"props":1347,"children":1348},{},[1349],{"type":39,"value":1350},"Updating dependencies                                 \n",{"type":26,"tag":158,"props":1352,"children":1353},{"class":160,"line":241},[1354],{"type":26,"tag":158,"props":1355,"children":1356},{},[1357],{"type":39,"value":1358},"Lock file operations: 1 install, 0 updates, 0 removals\n",{"type":26,"tag":158,"props":1360,"children":1361},{"class":160,"line":255},[1362],{"type":26,"tag":158,"props":1363,"children":1364},{},[1365],{"type":39,"value":1366},"  - Locking acme/sample-plugin (dev-master 294414d)\n",{"type":26,"tag":158,"props":1368,"children":1369},{"class":160,"line":277},[1370],{"type":26,"tag":158,"props":1371,"children":1372},{},[1373],{"type":39,"value":1374},"Writing lock file\n",{"type":26,"tag":158,"props":1376,"children":1377},{"class":160,"line":299},[1378],{"type":26,"tag":158,"props":1379,"children":1380},{},[1381],{"type":39,"value":1382},"Installing dependencies from lock file (including require-dev)\n",{"type":26,"tag":158,"props":1384,"children":1385},{"class":160,"line":321},[1386],{"type":26,"tag":158,"props":1387,"children":1388},{},[1389],{"type":39,"value":1390},"Package operations: 1 install, 0 updates, 0 removals\n",{"type":26,"tag":158,"props":1392,"children":1393},{"class":160,"line":343},[1394],{"type":26,"tag":158,"props":1395,"children":1396},{},[1397],{"type":39,"value":1398},"  - Syncing acme/sample-plugin (dev-master 294414d) into cache\n",{"type":26,"tag":158,"props":1400,"children":1401},{"class":160,"line":364},[1402],{"type":26,"tag":158,"props":1403,"children":1404},{},[1405],{"type":39,"value":1406},"  - Installing acme/sample-plugin (dev-master 294414d): Cloning 294414deb2 from cache\n",{"type":26,"tag":158,"props":1408,"children":1409},{"class":160,"line":385},[1410],{"type":26,"tag":158,"props":1411,"children":1412},{},[1413],{"type":39,"value":1414},"Generating optimized autoload files\n",{"type":26,"tag":158,"props":1416,"children":1417},{"class":160,"line":403},[1418],{"type":26,"tag":158,"props":1419,"children":1421},{"emptyLinePlaceholder":1420},true,[1422],{"type":39,"value":1423},"\n",{"type":26,"tag":158,"props":1425,"children":1426},{"class":160,"line":412},[1427],{"type":26,"tag":158,"props":1428,"children":1429},{},[1430],{"type":39,"value":1431},"Run composer recipes at any time to see the status of your Symfony recipes.\n",{"type":26,"tag":158,"props":1433,"children":1434},{"class":160,"line":426},[1435],{"type":26,"tag":158,"props":1436,"children":1437},{"emptyLinePlaceholder":1420},[1438],{"type":39,"value":1423},{"type":26,"tag":158,"props":1440,"children":1441},{"class":160,"line":435},[1442],{"type":26,"tag":158,"props":1443,"children":1444},{},[1445],{"type":39,"value":1446},"Executing script assets:install [OK]\n",{"type":26,"tag":35,"props":1448,"children":1449},{},[1450,1452,1458],{"type":39,"value":1451},"Composer wird ",{"type":26,"tag":76,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":39,"value":1457},"git",{"type":39,"value":1459}," verwenden, um unser Repository zu klonen, und den Standard-Branch sowie den Commit-Hash verwenden, um den Release zu verfolgen.",{"type":26,"tag":35,"props":1461,"children":1462},{},[1463],{"type":39,"value":1464},"Das funktioniert, aber wir können es besser machen.",{"type":26,"tag":122,"props":1466,"children":1468},{"id":1467},"git-tags",[1469],{"type":39,"value":1470},"Git Tags",{"type":26,"tag":35,"props":1472,"children":1473},{},[1474,1476,1482],{"type":39,"value":1475},"Wir taggen nun unser Plugin als ",{"type":26,"tag":76,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":39,"value":1481},"v1.0.0",{"type":39,"value":54},{"type":26,"tag":35,"props":1484,"children":1485},{},[1486,1488,1494,1496,1502],{"type":39,"value":1487},"Bitte beachten, dass Sie die ",{"type":26,"tag":76,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":39,"value":1493},"version",{"type":39,"value":1495}," in der ",{"type":26,"tag":76,"props":1497,"children":1499},{"className":1498},[],[1500],{"type":39,"value":1501},"composer.json",{"type":39,"value":1503}," gesetzt ist.",{"type":26,"tag":142,"props":1505,"children":1509},{"className":144,"code":1506,"filename":1507,"highlights":1508,"language":152,"meta":7,"style":7},"{\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",[241],[1510],{"type":26,"tag":76,"props":1511,"children":1512},{"__ignoreMap":7},[1513,1520,1541,1561,1582,1604,1624,1636,1653,1660,1672,1702,1714,1735,1752,1760,1767,1779,1791,1815,1822,1829,1841,1852,1885,1892,1899],{"type":26,"tag":158,"props":1514,"children":1515},{"class":160,"line":161},[1516],{"type":26,"tag":158,"props":1517,"children":1518},{"style":165},[1519],{"type":39,"value":168},{"type":26,"tag":158,"props":1521,"children":1522},{"class":160,"line":171},[1523,1528,1532,1537],{"type":26,"tag":158,"props":1524,"children":1525},{"style":175},[1526],{"type":39,"value":1527},"    \"name\"",{"type":26,"tag":158,"props":1529,"children":1530},{"style":165},[1531],{"type":39,"value":183},{"type":26,"tag":158,"props":1533,"children":1534},{"style":186},[1535],{"type":39,"value":1536},"\"acme/sample-plugin\"",{"type":26,"tag":158,"props":1538,"children":1539},{"style":165},[1540],{"type":39,"value":194},{"type":26,"tag":158,"props":1542,"children":1543},{"class":160,"line":197},[1544,1549,1553,1557],{"type":26,"tag":158,"props":1545,"children":1546},{"style":175},[1547],{"type":39,"value":1548},"    \"description\"",{"type":26,"tag":158,"props":1550,"children":1551},{"style":165},[1552],{"type":39,"value":183},{"type":26,"tag":158,"props":1554,"children":1555},{"style":186},[1556],{"type":39,"value":1536},{"type":26,"tag":158,"props":1558,"children":1559},{"style":165},[1560],{"type":39,"value":194},{"type":26,"tag":158,"props":1562,"children":1563},{"class":160,"line":219},[1564,1569,1573,1578],{"type":26,"tag":158,"props":1565,"children":1566},{"style":175},[1567],{"type":39,"value":1568},"    \"type\"",{"type":26,"tag":158,"props":1570,"children":1571},{"style":165},[1572],{"type":39,"value":183},{"type":26,"tag":158,"props":1574,"children":1575},{"style":186},[1576],{"type":39,"value":1577},"\"shopware-platform-plugin\"",{"type":26,"tag":158,"props":1579,"children":1580},{"style":165},[1581],{"type":39,"value":194},{"type":26,"tag":158,"props":1583,"children":1585},{"class":1584,"line":241},[160,716],[1586,1591,1595,1600],{"type":26,"tag":158,"props":1587,"children":1588},{"style":175},[1589],{"type":39,"value":1590},"    \"version\"",{"type":26,"tag":158,"props":1592,"children":1593},{"style":165},[1594],{"type":39,"value":183},{"type":26,"tag":158,"props":1596,"children":1597},{"style":186},[1598],{"type":39,"value":1599},"\"1.0.0\"",{"type":26,"tag":158,"props":1601,"children":1602},{"style":165},[1603],{"type":39,"value":194},{"type":26,"tag":158,"props":1605,"children":1606},{"class":160,"line":255},[1607,1612,1616,1620],{"type":26,"tag":158,"props":1608,"children":1609},{"style":175},[1610],{"type":39,"value":1611},"    \"license\"",{"type":26,"tag":158,"props":1613,"children":1614},{"style":165},[1615],{"type":39,"value":183},{"type":26,"tag":158,"props":1617,"children":1618},{"style":186},[1619],{"type":39,"value":212},{"type":26,"tag":158,"props":1621,"children":1622},{"style":165},[1623],{"type":39,"value":194},{"type":26,"tag":158,"props":1625,"children":1626},{"class":160,"line":277},[1627,1632],{"type":26,"tag":158,"props":1628,"children":1629},{"style":175},[1630],{"type":39,"value":1631},"    \"require\"",{"type":26,"tag":158,"props":1633,"children":1634},{"style":165},[1635],{"type":39,"value":252},{"type":26,"tag":158,"props":1637,"children":1638},{"class":160,"line":299},[1639,1644,1648],{"type":26,"tag":158,"props":1640,"children":1641},{"style":175},[1642],{"type":39,"value":1643},"        \"shopware/core\"",{"type":26,"tag":158,"props":1645,"children":1646},{"style":165},[1647],{"type":39,"value":183},{"type":26,"tag":158,"props":1649,"children":1650},{"style":186},[1651],{"type":39,"value":1652},"\"~6.6.0\"\n",{"type":26,"tag":158,"props":1654,"children":1655},{"class":160,"line":321},[1656],{"type":26,"tag":158,"props":1657,"children":1658},{"style":165},[1659],{"type":39,"value":526},{"type":26,"tag":158,"props":1661,"children":1662},{"class":160,"line":343},[1663,1668],{"type":26,"tag":158,"props":1664,"children":1665},{"style":175},[1666],{"type":39,"value":1667},"    \"extra\"",{"type":26,"tag":158,"props":1669,"children":1670},{"style":165},[1671],{"type":39,"value":252},{"type":26,"tag":158,"props":1673,"children":1674},{"class":160,"line":364},[1675,1680,1684,1689,1693,1698],{"type":26,"tag":158,"props":1676,"children":1677},{"style":175},[1678],{"type":39,"value":1679},"        \"shopware-plugin-class\"",{"type":26,"tag":158,"props":1681,"children":1682},{"style":165},[1683],{"type":39,"value":183},{"type":26,"tag":158,"props":1685,"children":1686},{"style":186},[1687],{"type":39,"value":1688},"\"Acme",{"type":26,"tag":158,"props":1690,"children":1691},{"style":505},[1692],{"type":39,"value":818},{"type":26,"tag":158,"props":1694,"children":1695},{"style":186},[1696],{"type":39,"value":1697},"SamplePlugin\"",{"type":26,"tag":158,"props":1699,"children":1700},{"style":165},[1701],{"type":39,"value":194},{"type":26,"tag":158,"props":1703,"children":1704},{"class":160,"line":385},[1705,1710],{"type":26,"tag":158,"props":1706,"children":1707},{"style":175},[1708],{"type":39,"value":1709},"        \"label\"",{"type":26,"tag":158,"props":1711,"children":1712},{"style":165},[1713],{"type":39,"value":252},{"type":26,"tag":158,"props":1715,"children":1716},{"class":160,"line":403},[1717,1722,1726,1731],{"type":26,"tag":158,"props":1718,"children":1719},{"style":175},[1720],{"type":39,"value":1721},"            \"de-DE\"",{"type":26,"tag":158,"props":1723,"children":1724},{"style":165},[1725],{"type":39,"value":183},{"type":26,"tag":158,"props":1727,"children":1728},{"style":186},[1729],{"type":39,"value":1730},"\"Skeleton plugin\"",{"type":26,"tag":158,"props":1732,"children":1733},{"style":165},[1734],{"type":39,"value":194},{"type":26,"tag":158,"props":1736,"children":1737},{"class":160,"line":412},[1738,1743,1747],{"type":26,"tag":158,"props":1739,"children":1740},{"style":175},[1741],{"type":39,"value":1742},"            \"en-GB\"",{"type":26,"tag":158,"props":1744,"children":1745},{"style":165},[1746],{"type":39,"value":183},{"type":26,"tag":158,"props":1748,"children":1749},{"style":186},[1750],{"type":39,"value":1751},"\"Skeleton plugin\"\n",{"type":26,"tag":158,"props":1753,"children":1754},{"class":160,"line":426},[1755],{"type":26,"tag":158,"props":1756,"children":1757},{"style":165},[1758],{"type":39,"value":1759},"        }\n",{"type":26,"tag":158,"props":1761,"children":1762},{"class":160,"line":435},[1763],{"type":26,"tag":158,"props":1764,"children":1765},{"style":165},[1766],{"type":39,"value":526},{"type":26,"tag":158,"props":1768,"children":1769},{"class":160,"line":457},[1770,1775],{"type":26,"tag":158,"props":1771,"children":1772},{"style":175},[1773],{"type":39,"value":1774},"    \"autoload\"",{"type":26,"tag":158,"props":1776,"children":1777},{"style":165},[1778],{"type":39,"value":252},{"type":26,"tag":158,"props":1780,"children":1781},{"class":160,"line":479},[1782,1787],{"type":26,"tag":158,"props":1783,"children":1784},{"style":175},[1785],{"type":39,"value":1786},"        \"psr-4\"",{"type":26,"tag":158,"props":1788,"children":1789},{"style":165},[1790],{"type":39,"value":252},{"type":26,"tag":158,"props":1792,"children":1793},{"class":160,"line":492},[1794,1799,1803,1807,1811],{"type":26,"tag":158,"props":1795,"children":1796},{"style":175},[1797],{"type":39,"value":1798},"            \"Acme",{"type":26,"tag":158,"props":1800,"children":1801},{"style":815},[1802],{"type":39,"value":818},{"type":26,"tag":158,"props":1804,"children":1805},{"style":175},[1806],{"type":39,"value":823},{"type":26,"tag":158,"props":1808,"children":1809},{"style":165},[1810],{"type":39,"value":183},{"type":26,"tag":158,"props":1812,"children":1813},{"style":186},[1814],{"type":39,"value":832},{"type":26,"tag":158,"props":1816,"children":1817},{"class":160,"line":511},[1818],{"type":26,"tag":158,"props":1819,"children":1820},{"style":165},[1821],{"type":39,"value":1759},{"type":26,"tag":158,"props":1823,"children":1824},{"class":160,"line":520},[1825],{"type":26,"tag":158,"props":1826,"children":1827},{"style":165},[1828],{"type":39,"value":526},{"type":26,"tag":158,"props":1830,"children":1831},{"class":160,"line":529},[1832,1837],{"type":26,"tag":158,"props":1833,"children":1834},{"style":175},[1835],{"type":39,"value":1836},"    \"autoload-dev\"",{"type":26,"tag":158,"props":1838,"children":1839},{"style":165},[1840],{"type":39,"value":252},{"type":26,"tag":158,"props":1842,"children":1843},{"class":160,"line":537},[1844,1848],{"type":26,"tag":158,"props":1845,"children":1846},{"style":175},[1847],{"type":39,"value":1786},{"type":26,"tag":158,"props":1849,"children":1850},{"style":165},[1851],{"type":39,"value":252},{"type":26,"tag":158,"props":1853,"children":1854},{"class":160,"line":557},[1855,1859,1863,1868,1872,1876,1880],{"type":26,"tag":158,"props":1856,"children":1857},{"style":175},[1858],{"type":39,"value":1798},{"type":26,"tag":158,"props":1860,"children":1861},{"style":815},[1862],{"type":39,"value":818},{"type":26,"tag":158,"props":1864,"children":1865},{"style":175},[1866],{"type":39,"value":1867},"Tests",{"type":26,"tag":158,"props":1869,"children":1870},{"style":815},[1871],{"type":39,"value":818},{"type":26,"tag":158,"props":1873,"children":1874},{"style":175},[1875],{"type":39,"value":823},{"type":26,"tag":158,"props":1877,"children":1878},{"style":165},[1879],{"type":39,"value":183},{"type":26,"tag":158,"props":1881,"children":1882},{"style":186},[1883],{"type":39,"value":1884},"\"tests/\"\n",{"type":26,"tag":158,"props":1886,"children":1887},{"class":160,"line":578},[1888],{"type":26,"tag":158,"props":1889,"children":1890},{"style":165},[1891],{"type":39,"value":1759},{"type":26,"tag":158,"props":1893,"children":1894},{"class":160,"line":590},[1895],{"type":26,"tag":158,"props":1896,"children":1897},{"style":165},[1898],{"type":39,"value":768},{"type":26,"tag":158,"props":1900,"children":1901},{"class":160,"line":606},[1902],{"type":26,"tag":158,"props":1903,"children":1904},{"style":165},[1905],{"type":39,"value":1226},{"type":26,"tag":142,"props":1907,"children":1909},{"className":1234,"code":1908,"language":1236,"meta":7,"style":7},"git tag v1.0.0\ngit push --tags\n",[1910],{"type":26,"tag":76,"props":1911,"children":1912},{"__ignoreMap":7},[1913,1930],{"type":26,"tag":158,"props":1914,"children":1915},{"class":160,"line":161},[1916,1920,1925],{"type":26,"tag":158,"props":1917,"children":1918},{"style":1246},[1919],{"type":39,"value":1457},{"type":26,"tag":158,"props":1921,"children":1922},{"style":1251},[1923],{"type":39,"value":1924}," tag",{"type":26,"tag":158,"props":1926,"children":1927},{"style":1251},[1928],{"type":39,"value":1929}," v1.0.0\n",{"type":26,"tag":158,"props":1931,"children":1932},{"class":160,"line":171},[1933,1937,1942],{"type":26,"tag":158,"props":1934,"children":1935},{"style":1246},[1936],{"type":39,"value":1457},{"type":26,"tag":158,"props":1938,"children":1939},{"style":1251},[1940],{"type":39,"value":1941}," push",{"type":26,"tag":158,"props":1943,"children":1944},{"style":505},[1945],{"type":39,"value":1946}," --tags\n",{"type":26,"tag":35,"props":1948,"children":1949},{},[1950],{"type":39,"value":1951},"Nun wird dies funktionieren:",{"type":26,"tag":142,"props":1953,"children":1954},{"className":1234,"code":1235,"language":1236,"meta":7,"style":7},[1955],{"type":26,"tag":76,"props":1956,"children":1957},{"__ignoreMap":7},[1958],{"type":26,"tag":158,"props":1959,"children":1960},{"class":160,"line":161},[1961,1965,1969],{"type":26,"tag":158,"props":1962,"children":1963},{"style":1246},[1964],{"type":39,"value":138},{"type":26,"tag":158,"props":1966,"children":1967},{"style":1251},[1968],{"type":39,"value":1254},{"type":26,"tag":158,"props":1970,"children":1971},{"style":1251},[1972],{"type":39,"value":1259},{"type":26,"tag":142,"props":1974,"children":1978},{"className":1975,"code":1976,"language":1977,"meta":7,"style":7},"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",[1979],{"type":26,"tag":76,"props":1980,"children":1981},{"__ignoreMap":7},[1982,1990,1997,2005,2013,2020,2028,2035,2042,2049,2057,2065,2072,2079,2086,2093,2100,2107],{"type":26,"tag":158,"props":1983,"children":1984},{"class":160,"line":161},[1985],{"type":26,"tag":158,"props":1986,"children":1987},{},[1988],{"type":39,"value":1989},"./composer.json has been updated                                                                                                            \n",{"type":26,"tag":158,"props":1991,"children":1992},{"class":160,"line":171},[1993],{"type":26,"tag":158,"props":1994,"children":1995},{},[1996],{"type":39,"value":1334},{"type":26,"tag":158,"props":1998,"children":1999},{"class":160,"line":197},[2000],{"type":26,"tag":158,"props":2001,"children":2002},{},[2003],{"type":39,"value":2004},"Loading composer repositories with package information\n",{"type":26,"tag":158,"props":2006,"children":2007},{"class":160,"line":219},[2008],{"type":26,"tag":158,"props":2009,"children":2010},{},[2011],{"type":39,"value":2012},"Updating dependencies\n",{"type":26,"tag":158,"props":2014,"children":2015},{"class":160,"line":241},[2016],{"type":26,"tag":158,"props":2017,"children":2018},{},[2019],{"type":39,"value":1358},{"type":26,"tag":158,"props":2021,"children":2022},{"class":160,"line":255},[2023],{"type":26,"tag":158,"props":2024,"children":2025},{},[2026],{"type":39,"value":2027},"  - Locking acme/sample-plugin (1.0.0)\n",{"type":26,"tag":158,"props":2029,"children":2030},{"class":160,"line":277},[2031],{"type":26,"tag":158,"props":2032,"children":2033},{},[2034],{"type":39,"value":1374},{"type":26,"tag":158,"props":2036,"children":2037},{"class":160,"line":299},[2038],{"type":26,"tag":158,"props":2039,"children":2040},{},[2041],{"type":39,"value":1382},{"type":26,"tag":158,"props":2043,"children":2044},{"class":160,"line":321},[2045],{"type":26,"tag":158,"props":2046,"children":2047},{},[2048],{"type":39,"value":1390},{"type":26,"tag":158,"props":2050,"children":2051},{"class":160,"line":343},[2052],{"type":26,"tag":158,"props":2053,"children":2054},{},[2055],{"type":39,"value":2056},"  - Syncing acme/sample-plugin (1.0.0) into cache\n",{"type":26,"tag":158,"props":2058,"children":2059},{"class":160,"line":364},[2060],{"type":26,"tag":158,"props":2061,"children":2062},{},[2063],{"type":39,"value":2064},"  - Installing acme/sample-plugin (1.0.0): Cloning 294414deb2 from cache\n",{"type":26,"tag":158,"props":2066,"children":2067},{"class":160,"line":385},[2068],{"type":26,"tag":158,"props":2069,"children":2070},{},[2071],{"type":39,"value":1414},{"type":26,"tag":158,"props":2073,"children":2074},{"class":160,"line":403},[2075],{"type":26,"tag":158,"props":2076,"children":2077},{"emptyLinePlaceholder":1420},[2078],{"type":39,"value":1423},{"type":26,"tag":158,"props":2080,"children":2081},{"class":160,"line":412},[2082],{"type":26,"tag":158,"props":2083,"children":2084},{},[2085],{"type":39,"value":1431},{"type":26,"tag":158,"props":2087,"children":2088},{"class":160,"line":426},[2089],{"type":26,"tag":158,"props":2090,"children":2091},{"emptyLinePlaceholder":1420},[2092],{"type":39,"value":1423},{"type":26,"tag":158,"props":2094,"children":2095},{"class":160,"line":435},[2096],{"type":26,"tag":158,"props":2097,"children":2098},{},[2099],{"type":39,"value":1446},{"type":26,"tag":158,"props":2101,"children":2102},{"class":160,"line":457},[2103],{"type":26,"tag":158,"props":2104,"children":2105},{"emptyLinePlaceholder":1420},[2106],{"type":39,"value":1423},{"type":26,"tag":158,"props":2108,"children":2109},{"class":160,"line":479},[2110],{"type":26,"tag":158,"props":2111,"children":2112},{},[2113],{"type":39,"value":2114},"Using version ^1.0 for acme/sample-plugin\n",{"type":26,"tag":35,"props":2116,"children":2117},{},[2118,2120,2125],{"type":39,"value":2119},"Das ist besser, aber wir verwenden immer noch ",{"type":26,"tag":76,"props":2121,"children":2123},{"className":2122},[],[2124],{"type":39,"value":1457},{"type":39,"value":2126},", um das Plugin abzurufen. Wir können es noch besser machen.",{"type":26,"tag":122,"props":2128,"children":2130},{"id":2129},"gitlab-package-registry",[2131],{"type":39,"value":2132},"GitLab Package Registry",{"type":26,"tag":35,"props":2134,"children":2135},{},[2136,2138,2143],{"type":39,"value":2137},"Hier beginnt der GitLab-Teil. Weitere Details sind in der ",{"type":26,"tag":47,"props":2139,"children":2141},{"href":2140},"https://docs.gitlab.com/18.3/user/packages/composer_repository/",[2142],{"type":39,"value":52},{"type":39,"value":2144}," zu finden.",{"type":26,"tag":35,"props":2146,"children":2147},{},[2148],{"type":39,"value":2149},"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":26,"tag":35,"props":2151,"children":2152},{},[2153,2155,2160],{"type":39,"value":2154},"Wir veröffentlichen unseren ",{"type":26,"tag":76,"props":2156,"children":2158},{"className":2157},[],[2159],{"type":39,"value":1481},{"type":39,"value":2161},"-Tag als Composer-Paket.",{"type":26,"tag":142,"props":2163,"children":2165},{"className":1234,"code":2164,"language":1236,"meta":7,"style":7},"curl --fail-with-body --data tag=v1.0.0 \"https://__token__:\u003Cpersonal-access-token>@\u003CDOMAIN-NAME>/api/v4/projects/\u003Cproject_id>/packages/composer\"\n",[2166],{"type":26,"tag":76,"props":2167,"children":2168},{"__ignoreMap":7},[2169],{"type":26,"tag":158,"props":2170,"children":2171},{"class":160,"line":161},[2172,2177,2182,2187,2192],{"type":26,"tag":158,"props":2173,"children":2174},{"style":1246},[2175],{"type":39,"value":2176},"curl",{"type":26,"tag":158,"props":2178,"children":2179},{"style":505},[2180],{"type":39,"value":2181}," --fail-with-body",{"type":26,"tag":158,"props":2183,"children":2184},{"style":505},[2185],{"type":39,"value":2186}," --data",{"type":26,"tag":158,"props":2188,"children":2189},{"style":1251},[2190],{"type":39,"value":2191}," tag=v1.0.0",{"type":26,"tag":158,"props":2193,"children":2194},{"style":1251},[2195],{"type":39,"value":2196}," \"https://__token__:\u003Cpersonal-access-token>@\u003CDOMAIN-NAME>/api/v4/projects/\u003Cproject_id>/packages/composer\"\n",{"type":26,"tag":35,"props":2198,"children":2199},{},[2200],{"type":39,"value":2201},"Nun müssen wir die Repository-Informationen aktualisieren:",{"type":26,"tag":142,"props":2203,"children":2206},{"className":144,"code":2204,"filename":146,"highlights":2205,"language":152,"meta":7,"style":7},"{\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",[148,149,150,151],[2207],{"type":26,"tag":76,"props":2208,"children":2209},{"__ignoreMap":7},[2210,2217,2236,2255,2274,2285,2304,2323,2342,2361,2380,2399,2414,2421,2432,2439,2458,2477,2488,2503,2510,2517,2524,2543,2562,2573,2588,2595,2602,2609,2628,2647,2658,2673,2680,2687,2695,2716,2733,2741,2748,2759,2770,2793,2800,2807,2826,2837,2848,2867,2882,2889,2908,2923,2930,2941,2952,2967,2974,2985,2992,2999,3010,3017,3024,3031,3042,3053,3072,3083,3094,3101,3108,3115,3122],{"type":26,"tag":158,"props":2211,"children":2212},{"class":160,"line":161},[2213],{"type":26,"tag":158,"props":2214,"children":2215},{"style":165},[2216],{"type":39,"value":168},{"type":26,"tag":158,"props":2218,"children":2219},{"class":160,"line":171},[2220,2224,2228,2232],{"type":26,"tag":158,"props":2221,"children":2222},{"style":175},[2223],{"type":39,"value":178},{"type":26,"tag":158,"props":2225,"children":2226},{"style":165},[2227],{"type":39,"value":183},{"type":26,"tag":158,"props":2229,"children":2230},{"style":186},[2231],{"type":39,"value":189},{"type":26,"tag":158,"props":2233,"children":2234},{"style":165},[2235],{"type":39,"value":194},{"type":26,"tag":158,"props":2237,"children":2238},{"class":160,"line":197},[2239,2243,2247,2251],{"type":26,"tag":158,"props":2240,"children":2241},{"style":175},[2242],{"type":39,"value":203},{"type":26,"tag":158,"props":2244,"children":2245},{"style":165},[2246],{"type":39,"value":183},{"type":26,"tag":158,"props":2248,"children":2249},{"style":186},[2250],{"type":39,"value":212},{"type":26,"tag":158,"props":2252,"children":2253},{"style":165},[2254],{"type":39,"value":194},{"type":26,"tag":158,"props":2256,"children":2257},{"class":160,"line":219},[2258,2262,2266,2270],{"type":26,"tag":158,"props":2259,"children":2260},{"style":175},[2261],{"type":39,"value":225},{"type":26,"tag":158,"props":2263,"children":2264},{"style":165},[2265],{"type":39,"value":183},{"type":26,"tag":158,"props":2267,"children":2268},{"style":186},[2269],{"type":39,"value":234},{"type":26,"tag":158,"props":2271,"children":2272},{"style":165},[2273],{"type":39,"value":194},{"type":26,"tag":158,"props":2275,"children":2276},{"class":160,"line":241},[2277,2281],{"type":26,"tag":158,"props":2278,"children":2279},{"style":175},[2280],{"type":39,"value":247},{"type":26,"tag":158,"props":2282,"children":2283},{"style":165},[2284],{"type":39,"value":252},{"type":26,"tag":158,"props":2286,"children":2287},{"class":160,"line":255},[2288,2292,2296,2300],{"type":26,"tag":158,"props":2289,"children":2290},{"style":175},[2291],{"type":39,"value":261},{"type":26,"tag":158,"props":2293,"children":2294},{"style":165},[2295],{"type":39,"value":183},{"type":26,"tag":158,"props":2297,"children":2298},{"style":186},[2299],{"type":39,"value":270},{"type":26,"tag":158,"props":2301,"children":2302},{"style":165},[2303],{"type":39,"value":194},{"type":26,"tag":158,"props":2305,"children":2306},{"class":160,"line":277},[2307,2311,2315,2319],{"type":26,"tag":158,"props":2308,"children":2309},{"style":175},[2310],{"type":39,"value":283},{"type":26,"tag":158,"props":2312,"children":2313},{"style":165},[2314],{"type":39,"value":183},{"type":26,"tag":158,"props":2316,"children":2317},{"style":186},[2318],{"type":39,"value":292},{"type":26,"tag":158,"props":2320,"children":2321},{"style":165},[2322],{"type":39,"value":194},{"type":26,"tag":158,"props":2324,"children":2325},{"class":160,"line":299},[2326,2330,2334,2338],{"type":26,"tag":158,"props":2327,"children":2328},{"style":175},[2329],{"type":39,"value":305},{"type":26,"tag":158,"props":2331,"children":2332},{"style":165},[2333],{"type":39,"value":183},{"type":26,"tag":158,"props":2335,"children":2336},{"style":186},[2337],{"type":39,"value":314},{"type":26,"tag":158,"props":2339,"children":2340},{"style":165},[2341],{"type":39,"value":194},{"type":26,"tag":158,"props":2343,"children":2344},{"class":160,"line":321},[2345,2349,2353,2357],{"type":26,"tag":158,"props":2346,"children":2347},{"style":175},[2348],{"type":39,"value":327},{"type":26,"tag":158,"props":2350,"children":2351},{"style":165},[2352],{"type":39,"value":183},{"type":26,"tag":158,"props":2354,"children":2355},{"style":186},[2356],{"type":39,"value":336},{"type":26,"tag":158,"props":2358,"children":2359},{"style":165},[2360],{"type":39,"value":194},{"type":26,"tag":158,"props":2362,"children":2363},{"class":160,"line":343},[2364,2368,2372,2376],{"type":26,"tag":158,"props":2365,"children":2366},{"style":175},[2367],{"type":39,"value":349},{"type":26,"tag":158,"props":2369,"children":2370},{"style":165},[2371],{"type":39,"value":183},{"type":26,"tag":158,"props":2373,"children":2374},{"style":186},[2375],{"type":39,"value":314},{"type":26,"tag":158,"props":2377,"children":2378},{"style":165},[2379],{"type":39,"value":194},{"type":26,"tag":158,"props":2381,"children":2382},{"class":160,"line":364},[2383,2387,2391,2395],{"type":26,"tag":158,"props":2384,"children":2385},{"style":175},[2386],{"type":39,"value":370},{"type":26,"tag":158,"props":2388,"children":2389},{"style":165},[2390],{"type":39,"value":183},{"type":26,"tag":158,"props":2392,"children":2393},{"style":186},[2394],{"type":39,"value":314},{"type":26,"tag":158,"props":2396,"children":2397},{"style":165},[2398],{"type":39,"value":194},{"type":26,"tag":158,"props":2400,"children":2401},{"class":160,"line":385},[2402,2406,2410],{"type":26,"tag":158,"props":2403,"children":2404},{"style":175},[2405],{"type":39,"value":391},{"type":26,"tag":158,"props":2407,"children":2408},{"style":165},[2409],{"type":39,"value":183},{"type":26,"tag":158,"props":2411,"children":2412},{"style":186},[2413],{"type":39,"value":400},{"type":26,"tag":158,"props":2415,"children":2416},{"class":160,"line":403},[2417],{"type":26,"tag":158,"props":2418,"children":2419},{"style":165},[2420],{"type":39,"value":409},{"type":26,"tag":158,"props":2422,"children":2423},{"class":160,"line":412},[2424,2428],{"type":26,"tag":158,"props":2425,"children":2426},{"style":175},[2427],{"type":39,"value":418},{"type":26,"tag":158,"props":2429,"children":2430},{"style":165},[2431],{"type":39,"value":423},{"type":26,"tag":158,"props":2433,"children":2434},{"class":160,"line":426},[2435],{"type":26,"tag":158,"props":2436,"children":2437},{"style":165},[2438],{"type":39,"value":432},{"type":26,"tag":158,"props":2440,"children":2441},{"class":160,"line":435},[2442,2446,2450,2454],{"type":26,"tag":158,"props":2443,"children":2444},{"style":175},[2445],{"type":39,"value":441},{"type":26,"tag":158,"props":2447,"children":2448},{"style":165},[2449],{"type":39,"value":183},{"type":26,"tag":158,"props":2451,"children":2452},{"style":186},[2453],{"type":39,"value":450},{"type":26,"tag":158,"props":2455,"children":2456},{"style":165},[2457],{"type":39,"value":194},{"type":26,"tag":158,"props":2459,"children":2460},{"class":160,"line":457},[2461,2465,2469,2473],{"type":26,"tag":158,"props":2462,"children":2463},{"style":175},[2464],{"type":39,"value":463},{"type":26,"tag":158,"props":2466,"children":2467},{"style":165},[2468],{"type":39,"value":183},{"type":26,"tag":158,"props":2470,"children":2471},{"style":186},[2472],{"type":39,"value":472},{"type":26,"tag":158,"props":2474,"children":2475},{"style":165},[2476],{"type":39,"value":194},{"type":26,"tag":158,"props":2478,"children":2479},{"class":160,"line":479},[2480,2484],{"type":26,"tag":158,"props":2481,"children":2482},{"style":175},[2483],{"type":39,"value":485},{"type":26,"tag":158,"props":2485,"children":2486},{"style":165},[2487],{"type":39,"value":252},{"type":26,"tag":158,"props":2489,"children":2490},{"class":160,"line":492},[2491,2495,2499],{"type":26,"tag":158,"props":2492,"children":2493},{"style":175},[2494],{"type":39,"value":498},{"type":26,"tag":158,"props":2496,"children":2497},{"style":165},[2498],{"type":39,"value":183},{"type":26,"tag":158,"props":2500,"children":2501},{"style":505},[2502],{"type":39,"value":508},{"type":26,"tag":158,"props":2504,"children":2505},{"class":160,"line":511},[2506],{"type":26,"tag":158,"props":2507,"children":2508},{"style":165},[2509],{"type":39,"value":517},{"type":26,"tag":158,"props":2511,"children":2512},{"class":160,"line":520},[2513],{"type":26,"tag":158,"props":2514,"children":2515},{"style":165},[2516],{"type":39,"value":526},{"type":26,"tag":158,"props":2518,"children":2519},{"class":160,"line":529},[2520],{"type":26,"tag":158,"props":2521,"children":2522},{"style":165},[2523],{"type":39,"value":432},{"type":26,"tag":158,"props":2525,"children":2526},{"class":160,"line":537},[2527,2531,2535,2539],{"type":26,"tag":158,"props":2528,"children":2529},{"style":175},[2530],{"type":39,"value":441},{"type":26,"tag":158,"props":2532,"children":2533},{"style":165},[2534],{"type":39,"value":183},{"type":26,"tag":158,"props":2536,"children":2537},{"style":186},[2538],{"type":39,"value":450},{"type":26,"tag":158,"props":2540,"children":2541},{"style":165},[2542],{"type":39,"value":194},{"type":26,"tag":158,"props":2544,"children":2545},{"class":160,"line":557},[2546,2550,2554,2558],{"type":26,"tag":158,"props":2547,"children":2548},{"style":175},[2549],{"type":39,"value":463},{"type":26,"tag":158,"props":2551,"children":2552},{"style":165},[2553],{"type":39,"value":183},{"type":26,"tag":158,"props":2555,"children":2556},{"style":186},[2557],{"type":39,"value":571},{"type":26,"tag":158,"props":2559,"children":2560},{"style":165},[2561],{"type":39,"value":194},{"type":26,"tag":158,"props":2563,"children":2564},{"class":160,"line":578},[2565,2569],{"type":26,"tag":158,"props":2566,"children":2567},{"style":175},[2568],{"type":39,"value":485},{"type":26,"tag":158,"props":2570,"children":2571},{"style":165},[2572],{"type":39,"value":252},{"type":26,"tag":158,"props":2574,"children":2575},{"class":160,"line":590},[2576,2580,2584],{"type":26,"tag":158,"props":2577,"children":2578},{"style":175},[2579],{"type":39,"value":498},{"type":26,"tag":158,"props":2581,"children":2582},{"style":165},[2583],{"type":39,"value":183},{"type":26,"tag":158,"props":2585,"children":2586},{"style":505},[2587],{"type":39,"value":508},{"type":26,"tag":158,"props":2589,"children":2590},{"class":160,"line":606},[2591],{"type":26,"tag":158,"props":2592,"children":2593},{"style":165},[2594],{"type":39,"value":517},{"type":26,"tag":158,"props":2596,"children":2597},{"class":160,"line":614},[2598],{"type":26,"tag":158,"props":2599,"children":2600},{"style":165},[2601],{"type":39,"value":526},{"type":26,"tag":158,"props":2603,"children":2604},{"class":160,"line":622},[2605],{"type":26,"tag":158,"props":2606,"children":2607},{"style":165},[2608],{"type":39,"value":432},{"type":26,"tag":158,"props":2610,"children":2611},{"class":160,"line":630},[2612,2616,2620,2624],{"type":26,"tag":158,"props":2613,"children":2614},{"style":175},[2615],{"type":39,"value":441},{"type":26,"tag":158,"props":2617,"children":2618},{"style":165},[2619],{"type":39,"value":183},{"type":26,"tag":158,"props":2621,"children":2622},{"style":186},[2623],{"type":39,"value":450},{"type":26,"tag":158,"props":2625,"children":2626},{"style":165},[2627],{"type":39,"value":194},{"type":26,"tag":158,"props":2629,"children":2630},{"class":160,"line":650},[2631,2635,2639,2643],{"type":26,"tag":158,"props":2632,"children":2633},{"style":175},[2634],{"type":39,"value":463},{"type":26,"tag":158,"props":2636,"children":2637},{"style":165},[2638],{"type":39,"value":183},{"type":26,"tag":158,"props":2640,"children":2641},{"style":186},[2642],{"type":39,"value":664},{"type":26,"tag":158,"props":2644,"children":2645},{"style":165},[2646],{"type":39,"value":194},{"type":26,"tag":158,"props":2648,"children":2649},{"class":160,"line":671},[2650,2654],{"type":26,"tag":158,"props":2651,"children":2652},{"style":175},[2653],{"type":39,"value":485},{"type":26,"tag":158,"props":2655,"children":2656},{"style":165},[2657],{"type":39,"value":252},{"type":26,"tag":158,"props":2659,"children":2660},{"class":160,"line":683},[2661,2665,2669],{"type":26,"tag":158,"props":2662,"children":2663},{"style":175},[2664],{"type":39,"value":498},{"type":26,"tag":158,"props":2666,"children":2667},{"style":165},[2668],{"type":39,"value":183},{"type":26,"tag":158,"props":2670,"children":2671},{"style":505},[2672],{"type":39,"value":508},{"type":26,"tag":158,"props":2674,"children":2675},{"class":160,"line":699},[2676],{"type":26,"tag":158,"props":2677,"children":2678},{"style":165},[2679],{"type":39,"value":517},{"type":26,"tag":158,"props":2681,"children":2682},{"class":160,"line":707},[2683],{"type":26,"tag":158,"props":2684,"children":2685},{"style":165},[2686],{"type":39,"value":526},{"type":26,"tag":158,"props":2688,"children":2690},{"class":2689,"line":148},[160,716],[2691],{"type":26,"tag":158,"props":2692,"children":2693},{"style":165},[2694],{"type":39,"value":432},{"type":26,"tag":158,"props":2696,"children":2698},{"class":2697,"line":149},[160,716],[2699,2703,2707,2712],{"type":26,"tag":158,"props":2700,"children":2701},{"style":175},[2702],{"type":39,"value":441},{"type":26,"tag":158,"props":2704,"children":2705},{"style":165},[2706],{"type":39,"value":183},{"type":26,"tag":158,"props":2708,"children":2709},{"style":186},[2710],{"type":39,"value":2711},"\"composer\"",{"type":26,"tag":158,"props":2713,"children":2714},{"style":165},[2715],{"type":39,"value":194},{"type":26,"tag":158,"props":2717,"children":2719},{"class":2718,"line":150},[160,716],[2720,2724,2728],{"type":26,"tag":158,"props":2721,"children":2722},{"style":175},[2723],{"type":39,"value":463},{"type":26,"tag":158,"props":2725,"children":2726},{"style":165},[2727],{"type":39,"value":183},{"type":26,"tag":158,"props":2729,"children":2730},{"style":186},[2731],{"type":39,"value":2732},"\"https://\u003CDOMAIN-NAME>/api/v4/api/v4/group/\u003Cgroup_id>/-/packages/composer/packages.json\"\n",{"type":26,"tag":158,"props":2734,"children":2736},{"class":2735,"line":151},[160,716],[2737],{"type":26,"tag":158,"props":2738,"children":2739},{"style":165},[2740],{"type":39,"value":768},{"type":26,"tag":158,"props":2742,"children":2743},{"class":160,"line":771},[2744],{"type":26,"tag":158,"props":2745,"children":2746},{"style":165},[2747],{"type":39,"value":777},{"type":26,"tag":158,"props":2749,"children":2750},{"class":160,"line":780},[2751,2755],{"type":26,"tag":158,"props":2752,"children":2753},{"style":175},[2754],{"type":39,"value":786},{"type":26,"tag":158,"props":2756,"children":2757},{"style":165},[2758],{"type":39,"value":252},{"type":26,"tag":158,"props":2760,"children":2761},{"class":160,"line":793},[2762,2766],{"type":26,"tag":158,"props":2763,"children":2764},{"style":175},[2765],{"type":39,"value":799},{"type":26,"tag":158,"props":2767,"children":2768},{"style":165},[2769],{"type":39,"value":252},{"type":26,"tag":158,"props":2771,"children":2772},{"class":160,"line":806},[2773,2777,2781,2785,2789],{"type":26,"tag":158,"props":2774,"children":2775},{"style":175},[2776],{"type":39,"value":812},{"type":26,"tag":158,"props":2778,"children":2779},{"style":815},[2780],{"type":39,"value":818},{"type":26,"tag":158,"props":2782,"children":2783},{"style":175},[2784],{"type":39,"value":823},{"type":26,"tag":158,"props":2786,"children":2787},{"style":165},[2788],{"type":39,"value":183},{"type":26,"tag":158,"props":2790,"children":2791},{"style":186},[2792],{"type":39,"value":832},{"type":26,"tag":158,"props":2794,"children":2795},{"class":160,"line":835},[2796],{"type":26,"tag":158,"props":2797,"children":2798},{"style":165},[2799],{"type":39,"value":768},{"type":26,"tag":158,"props":2801,"children":2802},{"class":160,"line":843},[2803],{"type":26,"tag":158,"props":2804,"children":2805},{"style":165},[2806],{"type":39,"value":409},{"type":26,"tag":158,"props":2808,"children":2809},{"class":160,"line":851},[2810,2814,2818,2822],{"type":26,"tag":158,"props":2811,"children":2812},{"style":175},[2813],{"type":39,"value":857},{"type":26,"tag":158,"props":2815,"children":2816},{"style":165},[2817],{"type":39,"value":183},{"type":26,"tag":158,"props":2819,"children":2820},{"style":505},[2821],{"type":39,"value":866},{"type":26,"tag":158,"props":2823,"children":2824},{"style":165},[2825],{"type":39,"value":194},{"type":26,"tag":158,"props":2827,"children":2828},{"class":160,"line":873},[2829,2833],{"type":26,"tag":158,"props":2830,"children":2831},{"style":175},[2832],{"type":39,"value":879},{"type":26,"tag":158,"props":2834,"children":2835},{"style":165},[2836],{"type":39,"value":252},{"type":26,"tag":158,"props":2838,"children":2839},{"class":160,"line":886},[2840,2844],{"type":26,"tag":158,"props":2841,"children":2842},{"style":175},[2843],{"type":39,"value":892},{"type":26,"tag":158,"props":2845,"children":2846},{"style":165},[2847],{"type":39,"value":252},{"type":26,"tag":158,"props":2849,"children":2850},{"class":160,"line":899},[2851,2855,2859,2863],{"type":26,"tag":158,"props":2852,"children":2853},{"style":175},[2854],{"type":39,"value":905},{"type":26,"tag":158,"props":2856,"children":2857},{"style":165},[2858],{"type":39,"value":183},{"type":26,"tag":158,"props":2860,"children":2861},{"style":505},[2862],{"type":39,"value":866},{"type":26,"tag":158,"props":2864,"children":2865},{"style":165},[2866],{"type":39,"value":194},{"type":26,"tag":158,"props":2868,"children":2869},{"class":160,"line":920},[2870,2874,2878],{"type":26,"tag":158,"props":2871,"children":2872},{"style":175},[2873],{"type":39,"value":926},{"type":26,"tag":158,"props":2875,"children":2876},{"style":165},[2877],{"type":39,"value":183},{"type":26,"tag":158,"props":2879,"children":2880},{"style":505},[2881],{"type":39,"value":508},{"type":26,"tag":158,"props":2883,"children":2884},{"class":160,"line":937},[2885],{"type":26,"tag":158,"props":2886,"children":2887},{"style":165},[2888],{"type":39,"value":526},{"type":26,"tag":158,"props":2890,"children":2891},{"class":160,"line":945},[2892,2896,2900,2904],{"type":26,"tag":158,"props":2893,"children":2894},{"style":175},[2895],{"type":39,"value":951},{"type":26,"tag":158,"props":2897,"children":2898},{"style":165},[2899],{"type":39,"value":183},{"type":26,"tag":158,"props":2901,"children":2902},{"style":505},[2903],{"type":39,"value":866},{"type":26,"tag":158,"props":2905,"children":2906},{"style":165},[2907],{"type":39,"value":194},{"type":26,"tag":158,"props":2909,"children":2910},{"class":160,"line":966},[2911,2915,2919],{"type":26,"tag":158,"props":2912,"children":2913},{"style":175},[2914],{"type":39,"value":972},{"type":26,"tag":158,"props":2916,"children":2917},{"style":165},[2918],{"type":39,"value":183},{"type":26,"tag":158,"props":2920,"children":2921},{"style":505},[2922],{"type":39,"value":508},{"type":26,"tag":158,"props":2924,"children":2925},{"class":160,"line":983},[2926],{"type":26,"tag":158,"props":2927,"children":2928},{"style":165},[2929],{"type":39,"value":409},{"type":26,"tag":158,"props":2931,"children":2932},{"class":160,"line":991},[2933,2937],{"type":26,"tag":158,"props":2934,"children":2935},{"style":175},[2936],{"type":39,"value":997},{"type":26,"tag":158,"props":2938,"children":2939},{"style":165},[2940],{"type":39,"value":252},{"type":26,"tag":158,"props":2942,"children":2943},{"class":160,"line":1004},[2944,2948],{"type":26,"tag":158,"props":2945,"children":2946},{"style":175},[2947],{"type":39,"value":1010},{"type":26,"tag":158,"props":2949,"children":2950},{"style":165},[2951],{"type":39,"value":252},{"type":26,"tag":158,"props":2953,"children":2954},{"class":160,"line":1017},[2955,2959,2963],{"type":26,"tag":158,"props":2956,"children":2957},{"style":175},[2958],{"type":39,"value":1023},{"type":26,"tag":158,"props":2960,"children":2961},{"style":165},[2962],{"type":39,"value":183},{"type":26,"tag":158,"props":2964,"children":2965},{"style":186},[2966],{"type":39,"value":1032},{"type":26,"tag":158,"props":2968,"children":2969},{"class":160,"line":1035},[2970],{"type":26,"tag":158,"props":2971,"children":2972},{"style":165},[2973],{"type":39,"value":526},{"type":26,"tag":158,"props":2975,"children":2976},{"class":160,"line":1043},[2977,2981],{"type":26,"tag":158,"props":2978,"children":2979},{"style":175},[2980],{"type":39,"value":1049},{"type":26,"tag":158,"props":2982,"children":2983},{"style":165},[2984],{"type":39,"value":423},{"type":26,"tag":158,"props":2986,"children":2987},{"class":160,"line":1056},[2988],{"type":26,"tag":158,"props":2989,"children":2990},{"style":186},[2991],{"type":39,"value":1062},{"type":26,"tag":158,"props":2993,"children":2994},{"class":160,"line":1065},[2995],{"type":26,"tag":158,"props":2996,"children":2997},{"style":165},[2998],{"type":39,"value":1071},{"type":26,"tag":158,"props":3000,"children":3001},{"class":160,"line":1074},[3002,3006],{"type":26,"tag":158,"props":3003,"children":3004},{"style":175},[3005],{"type":39,"value":1080},{"type":26,"tag":158,"props":3007,"children":3008},{"style":165},[3009],{"type":39,"value":423},{"type":26,"tag":158,"props":3011,"children":3012},{"class":160,"line":1087},[3013],{"type":26,"tag":158,"props":3014,"children":3015},{"style":186},[3016],{"type":39,"value":1062},{"type":26,"tag":158,"props":3018,"children":3019},{"class":160,"line":1095},[3020],{"type":26,"tag":158,"props":3021,"children":3022},{"style":165},[3023],{"type":39,"value":1101},{"type":26,"tag":158,"props":3025,"children":3026},{"class":160,"line":1104},[3027],{"type":26,"tag":158,"props":3028,"children":3029},{"style":165},[3030],{"type":39,"value":409},{"type":26,"tag":158,"props":3032,"children":3033},{"class":160,"line":1112},[3034,3038],{"type":26,"tag":158,"props":3035,"children":3036},{"style":175},[3037],{"type":39,"value":1118},{"type":26,"tag":158,"props":3039,"children":3040},{"style":165},[3041],{"type":39,"value":252},{"type":26,"tag":158,"props":3043,"children":3044},{"class":160,"line":1125},[3045,3049],{"type":26,"tag":158,"props":3046,"children":3047},{"style":175},[3048],{"type":39,"value":1131},{"type":26,"tag":158,"props":3050,"children":3051},{"style":165},[3052],{"type":39,"value":252},{"type":26,"tag":158,"props":3054,"children":3055},{"class":160,"line":1138},[3056,3060,3064,3068],{"type":26,"tag":158,"props":3057,"children":3058},{"style":175},[3059],{"type":39,"value":1144},{"type":26,"tag":158,"props":3061,"children":3062},{"style":165},[3063],{"type":39,"value":183},{"type":26,"tag":158,"props":3065,"children":3066},{"style":505},[3067],{"type":39,"value":866},{"type":26,"tag":158,"props":3069,"children":3070},{"style":165},[3071],{"type":39,"value":194},{"type":26,"tag":158,"props":3073,"children":3074},{"class":160,"line":1159},[3075,3079],{"type":26,"tag":158,"props":3076,"children":3077},{"style":175},[3078],{"type":39,"value":1165},{"type":26,"tag":158,"props":3080,"children":3081},{"style":165},[3082],{"type":39,"value":423},{"type":26,"tag":158,"props":3084,"children":3085},{"class":160,"line":1172},[3086,3090],{"type":26,"tag":158,"props":3087,"children":3088},{"style":186},[3089],{"type":39,"value":1178},{"type":26,"tag":158,"props":3091,"children":3092},{"style":165},[3093],{"type":39,"value":194},{"type":26,"tag":158,"props":3095,"children":3096},{"class":160,"line":1185},[3097],{"type":26,"tag":158,"props":3098,"children":3099},{"style":186},[3100],{"type":39,"value":1191},{"type":26,"tag":158,"props":3102,"children":3103},{"class":160,"line":1194},[3104],{"type":26,"tag":158,"props":3105,"children":3106},{"style":165},[3107],{"type":39,"value":1200},{"type":26,"tag":158,"props":3109,"children":3110},{"class":160,"line":1203},[3111],{"type":26,"tag":158,"props":3112,"children":3113},{"style":165},[3114],{"type":39,"value":768},{"type":26,"tag":158,"props":3116,"children":3117},{"class":160,"line":1211},[3118],{"type":26,"tag":158,"props":3119,"children":3120},{"style":165},[3121],{"type":39,"value":1217},{"type":26,"tag":158,"props":3123,"children":3124},{"class":160,"line":1220},[3125],{"type":26,"tag":158,"props":3126,"children":3127},{"style":165},[3128],{"type":39,"value":1226},{"type":26,"tag":35,"props":3130,"children":3131},{},[3132],{"type":39,"value":3133},"oder über das CLI:",{"type":26,"tag":142,"props":3135,"children":3137},{"className":1234,"code":3136,"language":1236,"meta":7,"style":7},"composer config repositories.\u003Cgroup_id> composer https://\u003CDOMAIN-NAME>/api/v4/group/\u003Cgroup_id>/-/packages/composer/packages.json\n",[3138],{"type":26,"tag":76,"props":3139,"children":3140},{"__ignoreMap":7},[3141],{"type":26,"tag":158,"props":3142,"children":3143},{"class":160,"line":161},[3144,3148,3153,3158,3164,3169,3174,3179,3184,3189,3193,3198,3203,3207,3212,3216,3220,3224,3228],{"type":26,"tag":158,"props":3145,"children":3146},{"style":1246},[3147],{"type":39,"value":138},{"type":26,"tag":158,"props":3149,"children":3150},{"style":1251},[3151],{"type":39,"value":3152}," config",{"type":26,"tag":158,"props":3154,"children":3155},{"style":1251},[3156],{"type":39,"value":3157}," repositories.",{"type":26,"tag":158,"props":3159,"children":3161},{"style":3160},"--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672",[3162],{"type":39,"value":3163},"\u003C",{"type":26,"tag":158,"props":3165,"children":3166},{"style":1251},[3167],{"type":39,"value":3168},"group_i",{"type":26,"tag":158,"props":3170,"children":3171},{"style":165},[3172],{"type":39,"value":3173},"d",{"type":26,"tag":158,"props":3175,"children":3176},{"style":3160},[3177],{"type":39,"value":3178},">",{"type":26,"tag":158,"props":3180,"children":3181},{"style":1251},[3182],{"type":39,"value":3183}," composer",{"type":26,"tag":158,"props":3185,"children":3186},{"style":1251},[3187],{"type":39,"value":3188}," https://",{"type":26,"tag":158,"props":3190,"children":3191},{"style":3160},[3192],{"type":39,"value":3163},{"type":26,"tag":158,"props":3194,"children":3195},{"style":1251},[3196],{"type":39,"value":3197},"DOMAIN-NAM",{"type":26,"tag":158,"props":3199,"children":3200},{"style":165},[3201],{"type":39,"value":3202},"E",{"type":26,"tag":158,"props":3204,"children":3205},{"style":3160},[3206],{"type":39,"value":3178},{"type":26,"tag":158,"props":3208,"children":3209},{"style":1251},[3210],{"type":39,"value":3211},"/api/v4/group/",{"type":26,"tag":158,"props":3213,"children":3214},{"style":3160},[3215],{"type":39,"value":3163},{"type":26,"tag":158,"props":3217,"children":3218},{"style":1251},[3219],{"type":39,"value":3168},{"type":26,"tag":158,"props":3221,"children":3222},{"style":165},[3223],{"type":39,"value":3173},{"type":26,"tag":158,"props":3225,"children":3226},{"style":3160},[3227],{"type":39,"value":3178},{"type":26,"tag":158,"props":3229,"children":3230},{"style":1251},[3231],{"type":39,"value":3232},"/-/packages/composer/packages.json\n",{"type":26,"tag":35,"props":3234,"children":3235},{},[3236],{"type":39,"value":3237},"Und die GitLab-Anmeldeinformationen einrichten:",{"type":26,"tag":142,"props":3239,"children":3241},{"className":1234,"code":3240,"language":1236,"meta":7,"style":7},"composer config gitlab-token.\u003CDOMAIN-NAME> \u003Cpersonal_access_token>\n",[3242],{"type":26,"tag":76,"props":3243,"children":3244},{"__ignoreMap":7},[3245],{"type":26,"tag":158,"props":3246,"children":3247},{"class":160,"line":161},[3248,3252,3256,3261,3265,3269,3273,3277,3282,3287,3292],{"type":26,"tag":158,"props":3249,"children":3250},{"style":1246},[3251],{"type":39,"value":138},{"type":26,"tag":158,"props":3253,"children":3254},{"style":1251},[3255],{"type":39,"value":3152},{"type":26,"tag":158,"props":3257,"children":3258},{"style":1251},[3259],{"type":39,"value":3260}," gitlab-token.",{"type":26,"tag":158,"props":3262,"children":3263},{"style":3160},[3264],{"type":39,"value":3163},{"type":26,"tag":158,"props":3266,"children":3267},{"style":1251},[3268],{"type":39,"value":3197},{"type":26,"tag":158,"props":3270,"children":3271},{"style":165},[3272],{"type":39,"value":3202},{"type":26,"tag":158,"props":3274,"children":3275},{"style":3160},[3276],{"type":39,"value":3178},{"type":26,"tag":158,"props":3278,"children":3279},{"style":3160},[3280],{"type":39,"value":3281}," \u003C",{"type":26,"tag":158,"props":3283,"children":3284},{"style":1251},[3285],{"type":39,"value":3286},"personal_access_toke",{"type":26,"tag":158,"props":3288,"children":3289},{"style":165},[3290],{"type":39,"value":3291},"n",{"type":26,"tag":158,"props":3293,"children":3294},{"style":3160},[3295],{"type":39,"value":3296},">\n",{"type":26,"tag":35,"props":3298,"children":3299},{},[3300,3302,3307],{"type":39,"value":3301},"Mehr über diesen Prozess in der ",{"type":26,"tag":47,"props":3303,"children":3305},{"href":3304},"https://docs.gitlab.com/user/packages/composer_repository/#install-a-composer-package",[3306],{"type":39,"value":52},{"type":39,"value":2144},{"type":26,"tag":35,"props":3309,"children":3310},{},[3311],{"type":39,"value":3312},"Jetzt installieren wir unser Paket wie gewohnt:",{"type":26,"tag":142,"props":3314,"children":3315},{"className":1234,"code":1235,"language":1236,"meta":7,"style":7},[3316],{"type":26,"tag":76,"props":3317,"children":3318},{"__ignoreMap":7},[3319],{"type":26,"tag":158,"props":3320,"children":3321},{"class":160,"line":161},[3322,3326,3330],{"type":26,"tag":158,"props":3323,"children":3324},{"style":1246},[3325],{"type":39,"value":138},{"type":26,"tag":158,"props":3327,"children":3328},{"style":1251},[3329],{"type":39,"value":1254},{"type":26,"tag":158,"props":3331,"children":3332},{"style":1251},[3333],{"type":39,"value":1259},{"type":26,"tag":142,"props":3335,"children":3337},{"className":1975,"code":3336,"language":1977,"meta":7,"style":7},"./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",[3338],{"type":26,"tag":76,"props":3339,"children":3340},{"__ignoreMap":7},[3341,3348,3355,3362,3369,3376,3383,3390,3397,3404,3412,3420,3427,3434,3441,3448,3455,3462],{"type":26,"tag":158,"props":3342,"children":3343},{"class":160,"line":161},[3344],{"type":26,"tag":158,"props":3345,"children":3346},{},[3347],{"type":39,"value":1326},{"type":26,"tag":158,"props":3349,"children":3350},{"class":160,"line":171},[3351],{"type":26,"tag":158,"props":3352,"children":3353},{},[3354],{"type":39,"value":1334},{"type":26,"tag":158,"props":3356,"children":3357},{"class":160,"line":197},[3358],{"type":26,"tag":158,"props":3359,"children":3360},{},[3361],{"type":39,"value":2004},{"type":26,"tag":158,"props":3363,"children":3364},{"class":160,"line":219},[3365],{"type":26,"tag":158,"props":3366,"children":3367},{},[3368],{"type":39,"value":2012},{"type":26,"tag":158,"props":3370,"children":3371},{"class":160,"line":241},[3372],{"type":26,"tag":158,"props":3373,"children":3374},{},[3375],{"type":39,"value":1358},{"type":26,"tag":158,"props":3377,"children":3378},{"class":160,"line":255},[3379],{"type":26,"tag":158,"props":3380,"children":3381},{},[3382],{"type":39,"value":2027},{"type":26,"tag":158,"props":3384,"children":3385},{"class":160,"line":277},[3386],{"type":26,"tag":158,"props":3387,"children":3388},{},[3389],{"type":39,"value":1374},{"type":26,"tag":158,"props":3391,"children":3392},{"class":160,"line":299},[3393],{"type":26,"tag":158,"props":3394,"children":3395},{},[3396],{"type":39,"value":1382},{"type":26,"tag":158,"props":3398,"children":3399},{"class":160,"line":321},[3400],{"type":26,"tag":158,"props":3401,"children":3402},{},[3403],{"type":39,"value":1390},{"type":26,"tag":158,"props":3405,"children":3406},{"class":160,"line":343},[3407],{"type":26,"tag":158,"props":3408,"children":3409},{},[3410],{"type":39,"value":3411},"  - Downloading acme/sample-plugin (1.0.0)\n",{"type":26,"tag":158,"props":3413,"children":3414},{"class":160,"line":364},[3415],{"type":26,"tag":158,"props":3416,"children":3417},{},[3418],{"type":39,"value":3419},"  - Installing acme/sample-plugin (1.0.0): Extracting archive\n",{"type":26,"tag":158,"props":3421,"children":3422},{"class":160,"line":385},[3423],{"type":26,"tag":158,"props":3424,"children":3425},{},[3426],{"type":39,"value":1414},{"type":26,"tag":158,"props":3428,"children":3429},{"class":160,"line":403},[3430],{"type":26,"tag":158,"props":3431,"children":3432},{"emptyLinePlaceholder":1420},[3433],{"type":39,"value":1423},{"type":26,"tag":158,"props":3435,"children":3436},{"class":160,"line":412},[3437],{"type":26,"tag":158,"props":3438,"children":3439},{},[3440],{"type":39,"value":1431},{"type":26,"tag":158,"props":3442,"children":3443},{"class":160,"line":426},[3444],{"type":26,"tag":158,"props":3445,"children":3446},{"emptyLinePlaceholder":1420},[3447],{"type":39,"value":1423},{"type":26,"tag":158,"props":3449,"children":3450},{"class":160,"line":435},[3451],{"type":26,"tag":158,"props":3452,"children":3453},{},[3454],{"type":39,"value":1446},{"type":26,"tag":158,"props":3456,"children":3457},{"class":160,"line":457},[3458],{"type":26,"tag":158,"props":3459,"children":3460},{"emptyLinePlaceholder":1420},[3461],{"type":39,"value":1423},{"type":26,"tag":158,"props":3463,"children":3464},{"class":160,"line":479},[3465],{"type":26,"tag":158,"props":3466,"children":3467},{},[3468],{"type":39,"value":2114},{"type":26,"tag":35,"props":3470,"children":3471},{},[3472],{"type":26,"tag":158,"props":3473,"children":3476},{"className":3474},[3475],"text-h2",[3477],{"type":39,"value":3478},"Großartig. Direkter Paket-Download!",{"type":26,"tag":122,"props":3480,"children":3482},{"id":3481},"warum-die-mühe",[3483],{"type":39,"value":3484},"Warum die Mühe?",{"type":26,"tag":35,"props":3486,"children":3487},{},[3488,3490,3496,3498,3504],{"type":39,"value":3489},"Das ist eine sehr gute Frage. Der Hauptgrund ist das Paket-Caching. Bei der Ausführung in einer ",{"type":26,"tag":76,"props":3491,"children":3493},{"className":3492},[],[3494],{"type":39,"value":3495},"CI/CD",{"type":39,"value":3497},"-Umgebung oder einem ",{"type":26,"tag":76,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":39,"value":3503},"docker build",{"type":39,"value":3505}," kann das Caching von Paketen einen massiven Leistungsschub bewirken.",{"type":26,"tag":1271,"props":3507,"children":3508},{},[],{"type":26,"tag":3510,"props":3511,"children":3512},"hr",{},[],{"type":26,"tag":110,"props":3514,"children":3516},{"id":3515},"release-pipeline",[3517],{"type":39,"value":3518},"Release-Pipeline",{"type":26,"tag":122,"props":3520,"children":3522},{"id":3521},"mit-manuellem-tagging",[3523],{"type":39,"value":3524},"Mit manuellem Tagging",{"type":26,"tag":35,"props":3526,"children":3527},{},[3528],{"type":39,"value":3529},"Dies ist eine einfache Pipeline, in der ein Git-Tag manuell erstellt und pushen wird.",{"type":26,"tag":35,"props":3531,"children":3532},{},[3533,3535,3540,3541,3546],{"type":39,"value":3534},"Bitte sicherstellen, dass Sie die ",{"type":26,"tag":76,"props":3536,"children":3538},{"className":3537},[],[3539],{"type":39,"value":1493},{"type":39,"value":1495},{"type":26,"tag":76,"props":3542,"children":3544},{"className":3543},[],[3545],{"type":39,"value":1501},{"type":39,"value":3547}," immer aktualisiert wird.",{"type":26,"tag":142,"props":3549,"children":3551},{"className":1234,"code":3550,"language":1236,"meta":7,"style":7},"git tag \u003Cversion>\ngit push --tags\n",[3552],{"type":26,"tag":76,"props":3553,"children":3554},{"__ignoreMap":7},[3555,3583],{"type":26,"tag":158,"props":3556,"children":3557},{"class":160,"line":161},[3558,3562,3566,3570,3575,3579],{"type":26,"tag":158,"props":3559,"children":3560},{"style":1246},[3561],{"type":39,"value":1457},{"type":26,"tag":158,"props":3563,"children":3564},{"style":1251},[3565],{"type":39,"value":1924},{"type":26,"tag":158,"props":3567,"children":3568},{"style":3160},[3569],{"type":39,"value":3281},{"type":26,"tag":158,"props":3571,"children":3572},{"style":1251},[3573],{"type":39,"value":3574},"versio",{"type":26,"tag":158,"props":3576,"children":3577},{"style":165},[3578],{"type":39,"value":3291},{"type":26,"tag":158,"props":3580,"children":3581},{"style":3160},[3582],{"type":39,"value":3296},{"type":26,"tag":158,"props":3584,"children":3585},{"class":160,"line":171},[3586,3590,3594],{"type":26,"tag":158,"props":3587,"children":3588},{"style":1246},[3589],{"type":39,"value":1457},{"type":26,"tag":158,"props":3591,"children":3592},{"style":1251},[3593],{"type":39,"value":1941},{"type":26,"tag":158,"props":3595,"children":3596},{"style":505},[3597],{"type":39,"value":1946},{"type":26,"tag":142,"props":3599,"children":3604},{"className":3600,"code":3601,"filename":3602,"language":3603,"meta":7,"style":7},"language-yaml shiki shiki-themes github-dark github-dark monokai","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","yaml",[3605],{"type":26,"tag":76,"props":3606,"children":3607},{"__ignoreMap":7},[3608,3622,3635,3642,3654,3671,3687,3699,3712,3729,3741],{"type":26,"tag":158,"props":3609,"children":3610},{"class":160,"line":161},[3611,3617],{"type":26,"tag":158,"props":3612,"children":3614},{"style":3613},"--shiki-default:#85E89D;--shiki-dark:#85E89D;--shiki-sepia:#F92672",[3615],{"type":39,"value":3616},"stages",{"type":26,"tag":158,"props":3618,"children":3619},{"style":165},[3620],{"type":39,"value":3621},":\n",{"type":26,"tag":158,"props":3623,"children":3624},{"class":160,"line":171},[3625,3630],{"type":26,"tag":158,"props":3626,"children":3627},{"style":165},[3628],{"type":39,"value":3629},"  - ",{"type":26,"tag":158,"props":3631,"children":3632},{"style":1251},[3633],{"type":39,"value":3634},"release\n",{"type":26,"tag":158,"props":3636,"children":3637},{"class":160,"line":197},[3638],{"type":26,"tag":158,"props":3639,"children":3640},{"emptyLinePlaceholder":1420},[3641],{"type":39,"value":1423},{"type":26,"tag":158,"props":3643,"children":3644},{"class":160,"line":219},[3645,3650],{"type":26,"tag":158,"props":3646,"children":3647},{"style":3613},[3648],{"type":39,"value":3649},"deploy",{"type":26,"tag":158,"props":3651,"children":3652},{"style":165},[3653],{"type":39,"value":3621},{"type":26,"tag":158,"props":3655,"children":3656},{"class":160,"line":241},[3657,3662,3666],{"type":26,"tag":158,"props":3658,"children":3659},{"style":3613},[3660],{"type":39,"value":3661},"  image",{"type":26,"tag":158,"props":3663,"children":3664},{"style":165},[3665],{"type":39,"value":183},{"type":26,"tag":158,"props":3667,"children":3668},{"style":1251},[3669],{"type":39,"value":3670},"alpine/curl\n",{"type":26,"tag":158,"props":3672,"children":3673},{"class":160,"line":255},[3674,3679,3683],{"type":26,"tag":158,"props":3675,"children":3676},{"style":3613},[3677],{"type":39,"value":3678},"  stage",{"type":26,"tag":158,"props":3680,"children":3681},{"style":165},[3682],{"type":39,"value":183},{"type":26,"tag":158,"props":3684,"children":3685},{"style":1251},[3686],{"type":39,"value":3634},{"type":26,"tag":158,"props":3688,"children":3689},{"class":160,"line":277},[3690,3695],{"type":26,"tag":158,"props":3691,"children":3692},{"style":3613},[3693],{"type":39,"value":3694},"  script",{"type":26,"tag":158,"props":3696,"children":3697},{"style":165},[3698],{"type":39,"value":3621},{"type":26,"tag":158,"props":3700,"children":3701},{"class":160,"line":299},[3702,3707],{"type":26,"tag":158,"props":3703,"children":3704},{"style":165},[3705],{"type":39,"value":3706},"    - ",{"type":26,"tag":158,"props":3708,"children":3709},{"style":1251},[3710],{"type":39,"value":3711},"'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":26,"tag":158,"props":3713,"children":3714},{"class":160,"line":321},[3715,3720,3724],{"type":26,"tag":158,"props":3716,"children":3717},{"style":3613},[3718],{"type":39,"value":3719},"  environment",{"type":26,"tag":158,"props":3721,"children":3722},{"style":165},[3723],{"type":39,"value":183},{"type":26,"tag":158,"props":3725,"children":3726},{"style":1251},[3727],{"type":39,"value":3728},"production\n",{"type":26,"tag":158,"props":3730,"children":3731},{"class":160,"line":343},[3732,3737],{"type":26,"tag":158,"props":3733,"children":3734},{"style":3613},[3735],{"type":39,"value":3736},"  rules",{"type":26,"tag":158,"props":3738,"children":3739},{"style":165},[3740],{"type":39,"value":3621},{"type":26,"tag":158,"props":3742,"children":3743},{"class":160,"line":364},[3744,3749,3753],{"type":26,"tag":158,"props":3745,"children":3746},{"style":3613},[3747],{"type":39,"value":3748},"    if",{"type":26,"tag":158,"props":3750,"children":3751},{"style":165},[3752],{"type":39,"value":183},{"type":26,"tag":158,"props":3754,"children":3755},{"style":1251},[3756],{"type":39,"value":3757},"$CI_COMMIT_TAG\n",{"type":26,"tag":122,"props":3759,"children":3761},{"id":3760},"mit-semantic-release",[3762],{"type":39,"value":3763},"Mit semantic-release",{"type":26,"tag":35,"props":3765,"children":3766},{},[3767],{"type":39,"value":3768},"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":26,"tag":35,"props":3770,"children":3771},{},[3772,3778],{"type":26,"tag":47,"props":3773,"children":3775},{"href":3774},"https://github.com/semantic-release/semantic-release",[3776],{"type":39,"value":3777},"semantic-release",{"type":39,"value":3779}," automatisiert den gesamten Workflow für Paket-Releases.",{"type":26,"tag":35,"props":3781,"children":3782},{},[3783,3785,3791],{"type":39,"value":3784},"Bitte befolgen Sie der ",{"type":26,"tag":47,"props":3786,"children":3788},{"href":3787},"https://github.com/semantic-release/gitlab?tab=readme-ov-file#gitlab-authentication",[3789],{"type":39,"value":3790},"Anleitung zur GitLab-Authentifizierung",{"type":39,"value":3792},", bevor Sie weiterlesen.",{"type":26,"tag":142,"props":3794,"children":3797},{"className":3600,"code":3795,"filename":3796,"language":3603,"meta":7,"style":7},"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","\u003Cplugin-root>/.gitlab-ci.yml",[3798],{"type":26,"tag":76,"props":3799,"children":3800},{"__ignoreMap":7},[3801,3812,3823,3830,3842,3857,3868,3885,3908,3924,3935,3947,3958,3979,3996],{"type":26,"tag":158,"props":3802,"children":3803},{"class":160,"line":161},[3804,3808],{"type":26,"tag":158,"props":3805,"children":3806},{"style":3613},[3807],{"type":39,"value":3616},{"type":26,"tag":158,"props":3809,"children":3810},{"style":165},[3811],{"type":39,"value":3621},{"type":26,"tag":158,"props":3813,"children":3814},{"class":160,"line":171},[3815,3819],{"type":26,"tag":158,"props":3816,"children":3817},{"style":165},[3818],{"type":39,"value":3629},{"type":26,"tag":158,"props":3820,"children":3821},{"style":1251},[3822],{"type":39,"value":3634},{"type":26,"tag":158,"props":3824,"children":3825},{"class":160,"line":197},[3826],{"type":26,"tag":158,"props":3827,"children":3828},{"emptyLinePlaceholder":1420},[3829],{"type":39,"value":1423},{"type":26,"tag":158,"props":3831,"children":3832},{"class":160,"line":219},[3833,3838],{"type":26,"tag":158,"props":3834,"children":3835},{"style":3613},[3836],{"type":39,"value":3837},"release",{"type":26,"tag":158,"props":3839,"children":3840},{"style":165},[3841],{"type":39,"value":3621},{"type":26,"tag":158,"props":3843,"children":3844},{"class":160,"line":241},[3845,3849,3853],{"type":26,"tag":158,"props":3846,"children":3847},{"style":3613},[3848],{"type":39,"value":3678},{"type":26,"tag":158,"props":3850,"children":3851},{"style":165},[3852],{"type":39,"value":183},{"type":26,"tag":158,"props":3854,"children":3855},{"style":1251},[3856],{"type":39,"value":3634},{"type":26,"tag":158,"props":3858,"children":3859},{"class":160,"line":255},[3860,3864],{"type":26,"tag":158,"props":3861,"children":3862},{"style":3613},[3863],{"type":39,"value":3661},{"type":26,"tag":158,"props":3865,"children":3866},{"style":165},[3867],{"type":39,"value":3621},{"type":26,"tag":158,"props":3869,"children":3870},{"class":160,"line":277},[3871,3876,3880],{"type":26,"tag":158,"props":3872,"children":3873},{"style":3613},[3874],{"type":39,"value":3875},"    name",{"type":26,"tag":158,"props":3877,"children":3878},{"style":165},[3879],{"type":39,"value":183},{"type":26,"tag":158,"props":3881,"children":3882},{"style":1251},[3883],{"type":39,"value":3884},"ghcr.io/voxpupuli/semantic-release:25.0.0-latest\n",{"type":26,"tag":158,"props":3886,"children":3887},{"class":160,"line":299},[3888,3893,3898,3903],{"type":26,"tag":158,"props":3889,"children":3890},{"style":3613},[3891],{"type":39,"value":3892},"    entrypoint",{"type":26,"tag":158,"props":3894,"children":3895},{"style":165},[3896],{"type":39,"value":3897},": [",{"type":26,"tag":158,"props":3899,"children":3900},{"style":1251},[3901],{"type":39,"value":3902},"\"\"",{"type":26,"tag":158,"props":3904,"children":3905},{"style":165},[3906],{"type":39,"value":3907},"]\n",{"type":26,"tag":158,"props":3909,"children":3910},{"class":160,"line":321},[3911,3916,3920],{"type":26,"tag":158,"props":3912,"children":3913},{"style":3613},[3914],{"type":39,"value":3915},"  interruptible",{"type":26,"tag":158,"props":3917,"children":3918},{"style":165},[3919],{"type":39,"value":183},{"type":26,"tag":158,"props":3921,"children":3922},{"style":505},[3923],{"type":39,"value":508},{"type":26,"tag":158,"props":3925,"children":3926},{"class":160,"line":343},[3927,3931],{"type":26,"tag":158,"props":3928,"children":3929},{"style":3613},[3930],{"type":39,"value":3694},{"type":26,"tag":158,"props":3932,"children":3933},{"style":165},[3934],{"type":39,"value":3621},{"type":26,"tag":158,"props":3936,"children":3937},{"class":160,"line":364},[3938,3942],{"type":26,"tag":158,"props":3939,"children":3940},{"style":165},[3941],{"type":39,"value":3706},{"type":26,"tag":158,"props":3943,"children":3944},{"style":1251},[3945],{"type":39,"value":3946},"/container-entrypoint.sh\n",{"type":26,"tag":158,"props":3948,"children":3949},{"class":160,"line":385},[3950,3954],{"type":26,"tag":158,"props":3951,"children":3952},{"style":3613},[3953],{"type":39,"value":3736},{"type":26,"tag":158,"props":3955,"children":3956},{"style":165},[3957],{"type":39,"value":3621},{"type":26,"tag":158,"props":3959,"children":3960},{"class":160,"line":403},[3961,3965,3970,3974],{"type":26,"tag":158,"props":3962,"children":3963},{"style":165},[3964],{"type":39,"value":3706},{"type":26,"tag":158,"props":3966,"children":3967},{"style":3613},[3968],{"type":39,"value":3969},"if",{"type":26,"tag":158,"props":3971,"children":3972},{"style":165},[3973],{"type":39,"value":183},{"type":26,"tag":158,"props":3975,"children":3976},{"style":1251},[3977],{"type":39,"value":3978},"$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH\n",{"type":26,"tag":158,"props":3980,"children":3981},{"class":160,"line":412},[3982,3987,3991],{"type":26,"tag":158,"props":3983,"children":3984},{"style":3613},[3985],{"type":39,"value":3986},"      when",{"type":26,"tag":158,"props":3988,"children":3989},{"style":165},[3990],{"type":39,"value":183},{"type":26,"tag":158,"props":3992,"children":3993},{"style":1251},[3994],{"type":39,"value":3995},"never\n",{"type":26,"tag":158,"props":3997,"children":3998},{"class":160,"line":426},[3999,4003,4007,4011],{"type":26,"tag":158,"props":4000,"children":4001},{"style":165},[4002],{"type":39,"value":3706},{"type":26,"tag":158,"props":4004,"children":4005},{"style":3613},[4006],{"type":39,"value":3969},{"type":26,"tag":158,"props":4008,"children":4009},{"style":165},[4010],{"type":39,"value":183},{"type":26,"tag":158,"props":4012,"children":4013},{"style":1251},[4014],{"type":39,"value":4015},"$CI_COMMIT_BRANCH\n",{"type":26,"tag":142,"props":4017,"children":4020},{"className":144,"code":4018,"filename":4019,"language":152,"meta":7,"style":7},"{\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",[4021],{"type":26,"tag":76,"props":4022,"children":4023},{"__ignoreMap":7},[4024,4031,4043,4055,4063,4075,4083,4095,4103,4125,4172,4214,4222,4230,4237,4244,4251,4263,4270,4290,4317,4324,4331,4338,4350,4357,4392,4399,4406,4414],{"type":26,"tag":158,"props":4025,"children":4026},{"class":160,"line":161},[4027],{"type":26,"tag":158,"props":4028,"children":4029},{"style":165},[4030],{"type":39,"value":168},{"type":26,"tag":158,"props":4032,"children":4033},{"class":160,"line":171},[4034,4039],{"type":26,"tag":158,"props":4035,"children":4036},{"style":175},[4037],{"type":39,"value":4038},"  \"plugins\"",{"type":26,"tag":158,"props":4040,"children":4041},{"style":165},[4042],{"type":39,"value":423},{"type":26,"tag":158,"props":4044,"children":4045},{"class":160,"line":197},[4046,4051],{"type":26,"tag":158,"props":4047,"children":4048},{"style":186},[4049],{"type":39,"value":4050},"    \"@semantic-release/commit-analyzer\"",{"type":26,"tag":158,"props":4052,"children":4053},{"style":165},[4054],{"type":39,"value":194},{"type":26,"tag":158,"props":4056,"children":4057},{"class":160,"line":219},[4058],{"type":26,"tag":158,"props":4059,"children":4060},{"style":165},[4061],{"type":39,"value":4062},"    [\n",{"type":26,"tag":158,"props":4064,"children":4065},{"class":160,"line":241},[4066,4071],{"type":26,"tag":158,"props":4067,"children":4068},{"style":186},[4069],{"type":39,"value":4070},"      \"semantic-release-replace-plugin\"",{"type":26,"tag":158,"props":4072,"children":4073},{"style":165},[4074],{"type":39,"value":194},{"type":26,"tag":158,"props":4076,"children":4077},{"class":160,"line":255},[4078],{"type":26,"tag":158,"props":4079,"children":4080},{"style":165},[4081],{"type":39,"value":4082},"      {\n",{"type":26,"tag":158,"props":4084,"children":4085},{"class":160,"line":277},[4086,4091],{"type":26,"tag":158,"props":4087,"children":4088},{"style":175},[4089],{"type":39,"value":4090},"        \"replacements\"",{"type":26,"tag":158,"props":4092,"children":4093},{"style":165},[4094],{"type":39,"value":423},{"type":26,"tag":158,"props":4096,"children":4097},{"class":160,"line":299},[4098],{"type":26,"tag":158,"props":4099,"children":4100},{"style":165},[4101],{"type":39,"value":4102},"          {\n",{"type":26,"tag":158,"props":4104,"children":4105},{"class":160,"line":321},[4106,4111,4115,4120],{"type":26,"tag":158,"props":4107,"children":4108},{"style":175},[4109],{"type":39,"value":4110},"            \"files\"",{"type":26,"tag":158,"props":4112,"children":4113},{"style":165},[4114],{"type":39,"value":3897},{"type":26,"tag":158,"props":4116,"children":4117},{"style":186},[4118],{"type":39,"value":4119},"\"composer.json\"",{"type":26,"tag":158,"props":4121,"children":4122},{"style":165},[4123],{"type":39,"value":4124},"],\n",{"type":26,"tag":158,"props":4126,"children":4127},{"class":160,"line":343},[4128,4133,4137,4142,4147,4151,4155,4160,4164,4168],{"type":26,"tag":158,"props":4129,"children":4130},{"style":175},[4131],{"type":39,"value":4132},"            \"from\"",{"type":26,"tag":158,"props":4134,"children":4135},{"style":165},[4136],{"type":39,"value":183},{"type":26,"tag":158,"props":4138,"children":4139},{"style":186},[4140],{"type":39,"value":4141},"\"version",{"type":26,"tag":158,"props":4143,"children":4144},{"style":505},[4145],{"type":39,"value":4146},"\\\"",{"type":26,"tag":158,"props":4148,"children":4149},{"style":186},[4150],{"type":39,"value":183},{"type":26,"tag":158,"props":4152,"children":4153},{"style":505},[4154],{"type":39,"value":4146},{"type":26,"tag":158,"props":4156,"children":4157},{"style":186},[4158],{"type":39,"value":4159},".*",{"type":26,"tag":158,"props":4161,"children":4162},{"style":505},[4163],{"type":39,"value":4146},{"type":26,"tag":158,"props":4165,"children":4166},{"style":186},[4167],{"type":39,"value":823},{"type":26,"tag":158,"props":4169,"children":4170},{"style":165},[4171],{"type":39,"value":194},{"type":26,"tag":158,"props":4173,"children":4174},{"class":160,"line":364},[4175,4180,4184,4188,4192,4196,4200,4205,4209],{"type":26,"tag":158,"props":4176,"children":4177},{"style":175},[4178],{"type":39,"value":4179},"            \"to\"",{"type":26,"tag":158,"props":4181,"children":4182},{"style":165},[4183],{"type":39,"value":183},{"type":26,"tag":158,"props":4185,"children":4186},{"style":186},[4187],{"type":39,"value":4141},{"type":26,"tag":158,"props":4189,"children":4190},{"style":505},[4191],{"type":39,"value":4146},{"type":26,"tag":158,"props":4193,"children":4194},{"style":186},[4195],{"type":39,"value":183},{"type":26,"tag":158,"props":4197,"children":4198},{"style":505},[4199],{"type":39,"value":4146},{"type":26,"tag":158,"props":4201,"children":4202},{"style":186},[4203],{"type":39,"value":4204},"${nextRelease.version}",{"type":26,"tag":158,"props":4206,"children":4207},{"style":505},[4208],{"type":39,"value":4146},{"type":26,"tag":158,"props":4210,"children":4211},{"style":186},[4212],{"type":39,"value":4213},"\"\n",{"type":26,"tag":158,"props":4215,"children":4216},{"class":160,"line":385},[4217],{"type":26,"tag":158,"props":4218,"children":4219},{"style":165},[4220],{"type":39,"value":4221},"          }\n",{"type":26,"tag":158,"props":4223,"children":4224},{"class":160,"line":403},[4225],{"type":26,"tag":158,"props":4226,"children":4227},{"style":165},[4228],{"type":39,"value":4229},"        ]\n",{"type":26,"tag":158,"props":4231,"children":4232},{"class":160,"line":412},[4233],{"type":26,"tag":158,"props":4234,"children":4235},{"style":165},[4236],{"type":39,"value":517},{"type":26,"tag":158,"props":4238,"children":4239},{"class":160,"line":426},[4240],{"type":26,"tag":158,"props":4241,"children":4242},{"style":165},[4243],{"type":39,"value":1071},{"type":26,"tag":158,"props":4245,"children":4246},{"class":160,"line":435},[4247],{"type":26,"tag":158,"props":4248,"children":4249},{"style":165},[4250],{"type":39,"value":4062},{"type":26,"tag":158,"props":4252,"children":4253},{"class":160,"line":457},[4254,4259],{"type":26,"tag":158,"props":4255,"children":4256},{"style":186},[4257],{"type":39,"value":4258},"      \"@semantic-release/git\"",{"type":26,"tag":158,"props":4260,"children":4261},{"style":165},[4262],{"type":39,"value":194},{"type":26,"tag":158,"props":4264,"children":4265},{"class":160,"line":479},[4266],{"type":26,"tag":158,"props":4267,"children":4268},{"style":165},[4269],{"type":39,"value":4082},{"type":26,"tag":158,"props":4271,"children":4272},{"class":160,"line":492},[4273,4278,4282,4286],{"type":26,"tag":158,"props":4274,"children":4275},{"style":175},[4276],{"type":39,"value":4277},"        \"assets\"",{"type":26,"tag":158,"props":4279,"children":4280},{"style":165},[4281],{"type":39,"value":3897},{"type":26,"tag":158,"props":4283,"children":4284},{"style":186},[4285],{"type":39,"value":4119},{"type":26,"tag":158,"props":4287,"children":4288},{"style":165},[4289],{"type":39,"value":4124},{"type":26,"tag":158,"props":4291,"children":4292},{"class":160,"line":511},[4293,4298,4302,4307,4312],{"type":26,"tag":158,"props":4294,"children":4295},{"style":175},[4296],{"type":39,"value":4297},"        \"message\"",{"type":26,"tag":158,"props":4299,"children":4300},{"style":165},[4301],{"type":39,"value":183},{"type":26,"tag":158,"props":4303,"children":4304},{"style":186},[4305],{"type":39,"value":4306},"\"chore(release): ${nextRelease.version} [skip ci]",{"type":26,"tag":158,"props":4308,"children":4309},{"style":505},[4310],{"type":39,"value":4311},"\\n\\n",{"type":26,"tag":158,"props":4313,"children":4314},{"style":186},[4315],{"type":39,"value":4316},"${nextRelease.notes}\"\n",{"type":26,"tag":158,"props":4318,"children":4319},{"class":160,"line":520},[4320],{"type":26,"tag":158,"props":4321,"children":4322},{"style":165},[4323],{"type":39,"value":517},{"type":26,"tag":158,"props":4325,"children":4326},{"class":160,"line":529},[4327],{"type":26,"tag":158,"props":4328,"children":4329},{"style":165},[4330],{"type":39,"value":1071},{"type":26,"tag":158,"props":4332,"children":4333},{"class":160,"line":537},[4334],{"type":26,"tag":158,"props":4335,"children":4336},{"style":165},[4337],{"type":39,"value":4062},{"type":26,"tag":158,"props":4339,"children":4340},{"class":160,"line":557},[4341,4346],{"type":26,"tag":158,"props":4342,"children":4343},{"style":186},[4344],{"type":39,"value":4345},"      \"@semantic-release/exec\"",{"type":26,"tag":158,"props":4347,"children":4348},{"style":165},[4349],{"type":39,"value":194},{"type":26,"tag":158,"props":4351,"children":4352},{"class":160,"line":578},[4353],{"type":26,"tag":158,"props":4354,"children":4355},{"style":165},[4356],{"type":39,"value":4082},{"type":26,"tag":158,"props":4358,"children":4359},{"class":160,"line":590},[4360,4365,4369,4374,4378,4383,4387],{"type":26,"tag":158,"props":4361,"children":4362},{"style":175},[4363],{"type":39,"value":4364},"        \"publishCmd\"",{"type":26,"tag":158,"props":4366,"children":4367},{"style":165},[4368],{"type":39,"value":183},{"type":26,"tag":158,"props":4370,"children":4371},{"style":186},[4372],{"type":39,"value":4373},"\"curl --fail-with-body --header ",{"type":26,"tag":158,"props":4375,"children":4376},{"style":505},[4377],{"type":39,"value":4146},{"type":26,"tag":158,"props":4379,"children":4380},{"style":186},[4381],{"type":39,"value":4382},"Job-Token: ${process.env.CI_JOB_TOKEN}",{"type":26,"tag":158,"props":4384,"children":4385},{"style":505},[4386],{"type":39,"value":4146},{"type":26,"tag":158,"props":4388,"children":4389},{"style":186},[4390],{"type":39,"value":4391}," --data tag=${nextRelease.gitTag} ${process.env.CI_API_V4_URL}/projects/${process.env.CI_PROJECT_ID}/packages/composer\"\n",{"type":26,"tag":158,"props":4393,"children":4394},{"class":160,"line":606},[4395],{"type":26,"tag":158,"props":4396,"children":4397},{"style":165},[4398],{"type":39,"value":517},{"type":26,"tag":158,"props":4400,"children":4401},{"class":160,"line":614},[4402],{"type":26,"tag":158,"props":4403,"children":4404},{"style":165},[4405],{"type":39,"value":1101},{"type":26,"tag":158,"props":4407,"children":4408},{"class":160,"line":622},[4409],{"type":26,"tag":158,"props":4410,"children":4411},{"style":165},[4412],{"type":39,"value":4413},"  ]\n",{"type":26,"tag":158,"props":4415,"children":4416},{"class":160,"line":630},[4417],{"type":26,"tag":158,"props":4418,"children":4419},{"style":165},[4420],{"type":39,"value":1226},{"type":26,"tag":35,"props":4422,"children":4423},{},[4424],{"type":39,"value":4425},"Dies wird:",{"type":26,"tag":66,"props":4427,"children":4428},{},[4429,4434,4446,4458,4463],{"type":26,"tag":70,"props":4430,"children":4431},{},[4432],{"type":39,"value":4433},"Die Commits seit dem letzten Release analysieren, um zu entscheiden, ob eine neue Version veröffentlicht werden soll",{"type":26,"tag":70,"props":4435,"children":4436},{},[4437,4439,4444],{"type":39,"value":4438},"Die Version in der ",{"type":26,"tag":76,"props":4440,"children":4442},{"className":4441},[],[4443],{"type":39,"value":1501},{"type":39,"value":4445}," aktualisieren",{"type":26,"tag":70,"props":4447,"children":4448},{},[4449,4451,4456],{"type":39,"value":4450},"Die ",{"type":26,"tag":76,"props":4452,"children":4454},{"className":4453},[],[4455],{"type":39,"value":1501},{"type":39,"value":4457}," zurück in das Repository committen",{"type":26,"tag":70,"props":4459,"children":4460},{},[4461],{"type":39,"value":4462},"Einen Tag erstellen",{"type":26,"tag":70,"props":4464,"children":4465},{},[4466],{"type":39,"value":4467},"Ein Composer-Paket von diesem Tag releasen",{"type":26,"tag":4469,"props":4470,"children":4471},"style",{},[4472],{"type":39,"value":4473},"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":7,"searchDepth":171,"depth":171,"links":4475},[4476,4482],{"id":112,"depth":171,"text":115,"children":4477},[4478,4479,4480,4481],{"id":124,"depth":197,"text":127},{"id":1467,"depth":197,"text":1470},{"id":2129,"depth":197,"text":2132},{"id":3481,"depth":197,"text":3484},{"id":3515,"depth":171,"text":3518,"children":4483},[4484,4485],{"id":3521,"depth":197,"text":3524},{"id":3760,"depth":197,"text":3763},"markdown","common:blog:18.shopware-plugin-gitlab-pipeline-release.md","common","blog/18.shopware-plugin-gitlab-pipeline-release.md","blog/18.shopware-plugin-gitlab-pipeline-release","md",{"_path":4493,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4494,"description":4495,"author":10,"image":11,"releaseDate":4496,"blogCategories":4497,"articleTags":4498,"tags":4499,"_type":4486,"_id":4500,"_source":4488,"_file":4501,"_stem":4502,"_extension":4491},"/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",[14,15],[15,17],[21],"common:blog:17.gitops-docker-renovate.md","blog/17.gitops-docker-renovate.md","blog/17.gitops-docker-renovate",{"_path":4504,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4505,"description":4506,"author":10,"image":11,"releaseDate":4507,"blogCategories":4508,"articleTags":4509,"tags":4510,"_type":4486,"_id":4511,"_source":4488,"_file":4512,"_stem":4513,"_extension":4491},"/blog/traefik-magic","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.","2026-03-13",[14,15],[15],[21],"common:blog:21.traefik-magic.md","blog/21.traefik-magic.md","blog/21.traefik-magic",{"_path":4},{"_path":4516},"/en/blog/shopware-plugin-gitlab-pipeline-release",{"_path":4518,"_dir":4519,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":4520,"primaryTeam":4522,"firstName":4523,"lastName":4524,"prefixTitle":7,"suffixTitle":4525,"education":4526,"role":4531,"workingSince":4536,"inTheCompanySince":4537,"techSkills":4538,"skills":4577,"projects":4594,"contactDetails":4604,"_image":4608,"image":4609,"_id":4610,"_type":152,"title":4611,"_source":4519,"_file":4612,"_stem":4613,"_extension":152},"/employees/robert-juzak","employees",[4521,4522],"appDev","devOps","Robert","Juzak","B.Sc.",[4527],[4528,4529,4530],"Bachelor of Computer Science","Technische Universität Breslau","2016",[4532,4533,4534,4535],"softwareDeveloper","fullstackDeveloper","admin","consultant","2015","2018",[4539,4543,4545,4548,4551,4554,4556,4559,4562,4566,4569,4571,4574],{"name":4540,"level":4541,"icon":4542},"Docker","expert","/images/Docker.svg",{"name":4544,"level":4541},"GitLab",{"name":4546,"level":4541,"icon":4547},"Kubernetes","/images/Kubernetes.svg",{"name":4549,"level":4541,"icon":4550},"PHPUnit","/images/PHP-Unit.svg",{"name":4552,"level":4541,"icon":4553},"Portainer","/images/Portainer.svg",{"name":4555,"level":4541},"Sentry",{"name":4557,"level":4541,"icon":4558},"Sonarqube","/images/Sonarqube.svg",{"name":4560,"level":4541,"icon":4561},"Linux","/images/linux_os-mono.svg",{"name":4563,"level":4564,"icon":4565},"CSS","advanced","/images/css.svg",{"name":4567,"level":4564,"icon":4568},"HTML","/images/html.svg",{"name":4570,"level":4564},"PHP",{"name":4572,"level":4564,"icon":4573},"SQL","/images/SQL.svg",{"name":4575,"level":4564,"icon":4576},"VueJS","/images/vuejs.svg",[4578,4579,4581,4582,4584,4586,4588,4590,4592],{"name":3495,"level":4541},{"name":4580,"level":4541},"qualityAssurance",{"name":4522,"level":4541},{"name":4583,"level":4541},"testDrivenBugfix",{"name":4585,"level":4541},"testDrivenDevelopment",{"name":4587,"level":4564},"accessibility",{"name":4589,"level":4564},"databases",{"name":4591,"level":4564},"linuxServerAdministration",{"name":4593,"level":4564},"softwareArchitect",[4595,4600,4602],{"project":4596,"position":4597},"Herole",[4598,4599],"Dev-Ops","Frontend Developer",{"project":4601,"position":4599},"Huawei-Calibration-aaS",{"project":4603,"position":4599},"Huawei-Inspect-3D",{"eMail":4605,"phone":4606,"visibility":4607},"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","Robert Juzak","employees/6.robert-juzak.json","employees/6.robert-juzak",{"_path":4493,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4494,"description":4495,"author":10,"image":11,"releaseDate":4496,"blogCategories":4615,"articleTags":4616,"tags":4617,"body":4618,"_type":4486,"_id":4500,"_source":4488,"_file":4501,"_stem":4502,"_extension":4491},[14,15],[15,17],[21],{"type":23,"children":4619,"toc":6089},[4620,4625,4630,4635,4640,4645,4664,4669,4711,4717,4730,4743,4748,4754,4765,4778,4787,4793,4798,4911,5436,5471,5484,5487,5492,5654,5667,5673,5678,5748,5753,5759,5764,5777,5790,5824,5851,5863,5882,5895,5898,5903,5916,5936,5941,5946,6066,6085],{"type":26,"tag":35,"props":4621,"children":4622},{},[4623],{"type":39,"value":4624},"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":26,"tag":35,"props":4626,"children":4627},{},[4628],{"type":39,"value":4629},"Außerdem sollte die Software auf dem neuesten Stand sein, um mögliche Sicherheitsrisiken zu minimieren.",{"type":26,"tag":35,"props":4631,"children":4632},{},[4633],{"type":39,"value":4634},"Es gibt viele Möglichkeiten, damit umzugehen, wie etwa Ansible, Chef usw.",{"type":26,"tag":35,"props":4636,"children":4637},{},[4638],{"type":39,"value":4639},"Unser Ziel war eine einfach zu bedienende, automatisierte und kostenlose Lösung.",{"type":26,"tag":35,"props":4641,"children":4642},{},[4643],{"type":39,"value":4644},"Hier sind die Ziele:",{"type":26,"tag":4646,"props":4647,"children":4648},"ul",{},[4649,4654,4659],{"type":26,"tag":70,"props":4650,"children":4651},{},[4652],{"type":39,"value":4653},"den GitOps-Ansatz nutzen, um die Konfiguration zu speichern und per Versionskontrolle nachvollziehbar zu machen",{"type":26,"tag":70,"props":4655,"children":4656},{},[4657],{"type":39,"value":4658},"Container verwenden, um die Software auszuführen",{"type":26,"tag":70,"props":4660,"children":4661},{},[4662],{"type":39,"value":4663},"Sicherheitsupdates automatisch ausspielen und Minor-/Major-Updates per Opt-in steuern",{"type":26,"tag":35,"props":4665,"children":4666},{},[4667],{"type":39,"value":4668},"Wir haben uns am Ende für den folgenden Stack entschieden:",{"type":26,"tag":4646,"props":4670,"children":4671},{},[4672,4690,4700],{"type":26,"tag":70,"props":4673,"children":4674},{},[4675,4680,4682,4688],{"type":26,"tag":47,"props":4676,"children":4678},{"href":4677},"https://www.docker.com/",[4679],{"type":39,"value":4540},{"type":39,"value":4681}," und ",{"type":26,"tag":47,"props":4683,"children":4685},{"href":4684},"https://docs.docker.com/compose/",[4686],{"type":39,"value":4687},"Docker Compose",{"type":39,"value":4689}," zum Verwalten der Software",{"type":26,"tag":70,"props":4691,"children":4692},{},[4693,4698],{"type":26,"tag":47,"props":4694,"children":4696},{"href":4695},"https://about.gitlab.com/",[4697],{"type":39,"value":4544},{"type":39,"value":4699}," zum Speichern aller Compose-Dateien",{"type":26,"tag":70,"props":4701,"children":4702},{},[4703,4709],{"type":26,"tag":47,"props":4704,"children":4706},{"href":4705},"https://docs.renovatebot.com",[4707],{"type":39,"value":4708},"Renovate Bot",{"type":39,"value":4710},", um die Software aktuell zu halten",{"type":26,"tag":110,"props":4712,"children":4714},{"id":4713},"über-den-stack",[4715],{"type":39,"value":4716},"Über den Stack",{"type":26,"tag":35,"props":4718,"children":4719},{},[4720,4722,4728],{"type":39,"value":4721},"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":26,"tag":76,"props":4723,"children":4725},{"className":4724},[],[4726],{"type":39,"value":4727},"scp",{"type":39,"value":4729}," in eine Pipeline.",{"type":26,"tag":35,"props":4731,"children":4732},{},[4733,4735,4741],{"type":39,"value":4734},"GitLab ist unser primäres Tool für die Versionskontrolle. Zusätzlich kümmert sich ein ",{"type":26,"tag":47,"props":4736,"children":4738},{"href":4737},"https://docs.gitlab.com/runner/",[4739],{"type":39,"value":4740},"GitLab Runner",{"type":39,"value":4742}," um das Ausführen der Pipelines.",{"type":26,"tag":35,"props":4744,"children":4745},{},[4746],{"type":39,"value":4747},"Renovate automatisiert Abhängigkeitsupdates. PHP, Go, Python, Docker – um nur ein paar zu nennen. Wir nutzen es bereits in verschiedenen Projekten.",{"type":26,"tag":110,"props":4749,"children":4751},{"id":4750},"container-mit-docker-und-docker-compose",[4752],{"type":39,"value":4753},"Container mit Docker und Docker Compose",{"type":26,"tag":35,"props":4755,"children":4756},{},[4757,4759,4764],{"type":39,"value":4758},"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":26,"tag":47,"props":4760,"children":4762},{"href":4761},"https://docs.docker.com/reference/cli/docker/#host",[4763],{"type":39,"value":52},{"type":39,"value":54},{"type":26,"tag":35,"props":4766,"children":4767},{},[4768,4770,4776],{"type":39,"value":4769},"Wir verwenden ",{"type":26,"tag":76,"props":4771,"children":4773},{"className":4772},[],[4774],{"type":39,"value":4775},"ssh",{"type":39,"value":4777},", um auf unseren Zielserver zuzugreifen.",{"type":26,"tag":35,"props":4779,"children":4780},{},[4781],{"type":26,"tag":76,"props":4782,"children":4784},{"className":4783},[],[4785],{"type":39,"value":4786},"DOCKER_HOST=ssh://[username@]\u003CIP or host>[:port] docker compose up --wait",{"type":26,"tag":110,"props":4788,"children":4790},{"id":4789},"gitops-mit-gitlab",[4791],{"type":39,"value":4792},"GitOps mit GitLab",{"type":26,"tag":35,"props":4794,"children":4795},{},[4796],{"type":39,"value":4797},"Die Idee hinter GitOps ist, ein Git-Repository zur Ablage der Konfiguration zu verwenden. Hier ein Beispiel:",{"type":26,"tag":142,"props":4799,"children":4801},{"className":1234,"code":4800,"language":1236,"meta":7,"style":7},".\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",[4802],{"type":26,"tag":76,"props":4803,"children":4804},{"__ignoreMap":7},[4805,4814,4828,4846,4858,4881,4894],{"type":26,"tag":158,"props":4806,"children":4807},{"class":160,"line":161},[4808],{"type":26,"tag":158,"props":4809,"children":4811},{"style":4810},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF",[4812],{"type":39,"value":4813},".\n",{"type":26,"tag":158,"props":4815,"children":4816},{"class":160,"line":171},[4817,4822],{"type":26,"tag":158,"props":4818,"children":4819},{"style":1246},[4820],{"type":39,"value":4821},"├──.gitlab-ci.yml",{"type":26,"tag":158,"props":4823,"children":4825},{"style":4824},"--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F",[4826],{"type":39,"value":4827},"             # Pipeline-Definition\n",{"type":26,"tag":158,"props":4829,"children":4830},{"class":160,"line":197},[4831,4836,4841],{"type":26,"tag":158,"props":4832,"children":4833},{"style":1246},[4834],{"type":39,"value":4835},"├──",{"type":26,"tag":158,"props":4837,"children":4838},{"style":1251},[4839],{"type":39,"value":4840}," renovate.json",{"type":26,"tag":158,"props":4842,"children":4843},{"style":4824},[4844],{"type":39,"value":4845},"             # Renovate-Konfiguration\n",{"type":26,"tag":158,"props":4847,"children":4848},{"class":160,"line":219},[4849,4853],{"type":26,"tag":158,"props":4850,"children":4851},{"style":1246},[4852],{"type":39,"value":4835},{"type":26,"tag":158,"props":4854,"children":4855},{"style":1251},[4856],{"type":39,"value":4857}," nextcloud\n",{"type":26,"tag":158,"props":4859,"children":4860},{"class":160,"line":241},[4861,4866,4871,4876],{"type":26,"tag":158,"props":4862,"children":4863},{"style":1246},[4864],{"type":39,"value":4865},"│",{"type":26,"tag":158,"props":4867,"children":4868},{"style":1251},[4869],{"type":39,"value":4870},"   ├──",{"type":26,"tag":158,"props":4872,"children":4873},{"style":1251},[4874],{"type":39,"value":4875}," docker-compose.yml",{"type":26,"tag":158,"props":4877,"children":4878},{"style":4824},[4879],{"type":39,"value":4880},"   # Nextcloud Datei-Hosting und Zusammenarbeit\n",{"type":26,"tag":158,"props":4882,"children":4883},{"class":160,"line":255},[4884,4889],{"type":26,"tag":158,"props":4885,"children":4886},{"style":1246},[4887],{"type":39,"value":4888},"└──",{"type":26,"tag":158,"props":4890,"children":4891},{"style":1251},[4892],{"type":39,"value":4893}," traefik\n",{"type":26,"tag":158,"props":4895,"children":4896},{"class":160,"line":277},[4897,4902,4906],{"type":26,"tag":158,"props":4898,"children":4899},{"style":1246},[4900],{"type":39,"value":4901},"    └──",{"type":26,"tag":158,"props":4903,"children":4904},{"style":1251},[4905],{"type":39,"value":4875},{"type":26,"tag":158,"props":4907,"children":4908},{"style":4824},[4909],{"type":39,"value":4910},"   # Traefik Reverse-Proxy-Konfiguration\n",{"type":26,"tag":142,"props":4912,"children":4915},{"className":3600,"code":4913,"filename":4914,"language":3603,"meta":7,"style":7},"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",[4916],{"type":26,"tag":76,"props":4917,"children":4918},{"__ignoreMap":7},[4919,4931,4943,4955,4962,4974,4985,5002,5019,5031,5044,5056,5068,5080,5092,5104,5116,5128,5140,5152,5164,5213,5230,5247,5264,5271,5282,5298,5313,5325,5337,5354,5365,5377,5388,5400,5412,5424],{"type":26,"tag":158,"props":4920,"children":4921},{"class":160,"line":161},[4922,4927],{"type":26,"tag":158,"props":4923,"children":4924},{"style":3613},[4925],{"type":39,"value":4926},"volumes",{"type":26,"tag":158,"props":4928,"children":4929},{"style":165},[4930],{"type":39,"value":3621},{"type":26,"tag":158,"props":4932,"children":4933},{"class":160,"line":171},[4934,4939],{"type":26,"tag":158,"props":4935,"children":4936},{"style":3613},[4937],{"type":39,"value":4938},"  nextcloud",{"type":26,"tag":158,"props":4940,"children":4941},{"style":165},[4942],{"type":39,"value":3621},{"type":26,"tag":158,"props":4944,"children":4945},{"class":160,"line":197},[4946,4951],{"type":26,"tag":158,"props":4947,"children":4948},{"style":3613},[4949],{"type":39,"value":4950},"  db",{"type":26,"tag":158,"props":4952,"children":4953},{"style":165},[4954],{"type":39,"value":3621},{"type":26,"tag":158,"props":4956,"children":4957},{"class":160,"line":219},[4958],{"type":26,"tag":158,"props":4959,"children":4960},{"emptyLinePlaceholder":1420},[4961],{"type":39,"value":1423},{"type":26,"tag":158,"props":4963,"children":4964},{"class":160,"line":241},[4965,4970],{"type":26,"tag":158,"props":4966,"children":4967},{"style":3613},[4968],{"type":39,"value":4969},"services",{"type":26,"tag":158,"props":4971,"children":4972},{"style":165},[4973],{"type":39,"value":3621},{"type":26,"tag":158,"props":4975,"children":4976},{"class":160,"line":255},[4977,4981],{"type":26,"tag":158,"props":4978,"children":4979},{"style":3613},[4980],{"type":39,"value":4950},{"type":26,"tag":158,"props":4982,"children":4983},{"style":165},[4984],{"type":39,"value":3621},{"type":26,"tag":158,"props":4986,"children":4987},{"class":160,"line":277},[4988,4993,4997],{"type":26,"tag":158,"props":4989,"children":4990},{"style":3613},[4991],{"type":39,"value":4992},"    image",{"type":26,"tag":158,"props":4994,"children":4995},{"style":165},[4996],{"type":39,"value":183},{"type":26,"tag":158,"props":4998,"children":4999},{"style":1251},[5000],{"type":39,"value":5001},"mariadb:11.8\n",{"type":26,"tag":158,"props":5003,"children":5004},{"class":160,"line":299},[5005,5010,5014],{"type":26,"tag":158,"props":5006,"children":5007},{"style":3613},[5008],{"type":39,"value":5009},"    restart",{"type":26,"tag":158,"props":5011,"children":5012},{"style":165},[5013],{"type":39,"value":183},{"type":26,"tag":158,"props":5015,"children":5016},{"style":1251},[5017],{"type":39,"value":5018},"unless-stopped\n",{"type":26,"tag":158,"props":5020,"children":5021},{"class":160,"line":321},[5022,5027],{"type":26,"tag":158,"props":5023,"children":5024},{"style":3613},[5025],{"type":39,"value":5026},"    volumes",{"type":26,"tag":158,"props":5028,"children":5029},{"style":165},[5030],{"type":39,"value":3621},{"type":26,"tag":158,"props":5032,"children":5033},{"class":160,"line":343},[5034,5039],{"type":26,"tag":158,"props":5035,"children":5036},{"style":165},[5037],{"type":39,"value":5038},"      - ",{"type":26,"tag":158,"props":5040,"children":5041},{"style":1251},[5042],{"type":39,"value":5043},"db:/var/lib/mysql\n",{"type":26,"tag":158,"props":5045,"children":5046},{"class":160,"line":364},[5047,5052],{"type":26,"tag":158,"props":5048,"children":5049},{"style":3613},[5050],{"type":39,"value":5051},"    environment",{"type":26,"tag":158,"props":5053,"children":5054},{"style":165},[5055],{"type":39,"value":3621},{"type":26,"tag":158,"props":5057,"children":5058},{"class":160,"line":385},[5059,5063],{"type":26,"tag":158,"props":5060,"children":5061},{"style":165},[5062],{"type":39,"value":5038},{"type":26,"tag":158,"props":5064,"children":5065},{"style":1251},[5066],{"type":39,"value":5067},"MARIADB_ROOT_PASSWORD=${NEXTCLOUD_MARIADB_ROOT_PASSWORD:?error}\n",{"type":26,"tag":158,"props":5069,"children":5070},{"class":160,"line":403},[5071,5075],{"type":26,"tag":158,"props":5072,"children":5073},{"style":165},[5074],{"type":39,"value":5038},{"type":26,"tag":158,"props":5076,"children":5077},{"style":1251},[5078],{"type":39,"value":5079},"MARIADB_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":26,"tag":158,"props":5081,"children":5082},{"class":160,"line":412},[5083,5087],{"type":26,"tag":158,"props":5084,"children":5085},{"style":165},[5086],{"type":39,"value":5038},{"type":26,"tag":158,"props":5088,"children":5089},{"style":1251},[5090],{"type":39,"value":5091},"MARIADB_DATABASE=nextcloud\n",{"type":26,"tag":158,"props":5093,"children":5094},{"class":160,"line":426},[5095,5099],{"type":26,"tag":158,"props":5096,"children":5097},{"style":165},[5098],{"type":39,"value":5038},{"type":26,"tag":158,"props":5100,"children":5101},{"style":1251},[5102],{"type":39,"value":5103},"MARIADB_USER=nextcloud\n",{"type":26,"tag":158,"props":5105,"children":5106},{"class":160,"line":435},[5107,5112],{"type":26,"tag":158,"props":5108,"children":5109},{"style":3613},[5110],{"type":39,"value":5111},"    command",{"type":26,"tag":158,"props":5113,"children":5114},{"style":165},[5115],{"type":39,"value":3621},{"type":26,"tag":158,"props":5117,"children":5118},{"class":160,"line":457},[5119,5123],{"type":26,"tag":158,"props":5120,"children":5121},{"style":165},[5122],{"type":39,"value":5038},{"type":26,"tag":158,"props":5124,"children":5125},{"style":1251},[5126],{"type":39,"value":5127},"--transaction-isolation=READ-COMMITTED\n",{"type":26,"tag":158,"props":5129,"children":5130},{"class":160,"line":479},[5131,5135],{"type":26,"tag":158,"props":5132,"children":5133},{"style":165},[5134],{"type":39,"value":5038},{"type":26,"tag":158,"props":5136,"children":5137},{"style":1251},[5138],{"type":39,"value":5139},"--log-bin=binlog\n",{"type":26,"tag":158,"props":5141,"children":5142},{"class":160,"line":492},[5143,5147],{"type":26,"tag":158,"props":5144,"children":5145},{"style":165},[5146],{"type":39,"value":5038},{"type":26,"tag":158,"props":5148,"children":5149},{"style":1251},[5150],{"type":39,"value":5151},"--binlog-format=ROW\n",{"type":26,"tag":158,"props":5153,"children":5154},{"class":160,"line":511},[5155,5160],{"type":26,"tag":158,"props":5156,"children":5157},{"style":3613},[5158],{"type":39,"value":5159},"    healthcheck",{"type":26,"tag":158,"props":5161,"children":5162},{"style":165},[5163],{"type":39,"value":3621},{"type":26,"tag":158,"props":5165,"children":5166},{"class":160,"line":520},[5167,5172,5176,5181,5186,5191,5195,5200,5204,5209],{"type":26,"tag":158,"props":5168,"children":5169},{"style":3613},[5170],{"type":39,"value":5171},"      test",{"type":26,"tag":158,"props":5173,"children":5174},{"style":165},[5175],{"type":39,"value":3897},{"type":26,"tag":158,"props":5177,"children":5178},{"style":1251},[5179],{"type":39,"value":5180},"\"CMD\"",{"type":26,"tag":158,"props":5182,"children":5183},{"style":165},[5184],{"type":39,"value":5185},", ",{"type":26,"tag":158,"props":5187,"children":5188},{"style":1251},[5189],{"type":39,"value":5190},"\"healthcheck.sh\"",{"type":26,"tag":158,"props":5192,"children":5193},{"style":165},[5194],{"type":39,"value":5185},{"type":26,"tag":158,"props":5196,"children":5197},{"style":1251},[5198],{"type":39,"value":5199},"\"--connect\"",{"type":26,"tag":158,"props":5201,"children":5202},{"style":165},[5203],{"type":39,"value":5185},{"type":26,"tag":158,"props":5205,"children":5206},{"style":1251},[5207],{"type":39,"value":5208},"\"--innodb_initialized\"",{"type":26,"tag":158,"props":5210,"children":5211},{"style":165},[5212],{"type":39,"value":3907},{"type":26,"tag":158,"props":5214,"children":5215},{"class":160,"line":529},[5216,5221,5225],{"type":26,"tag":158,"props":5217,"children":5218},{"style":3613},[5219],{"type":39,"value":5220},"      interval",{"type":26,"tag":158,"props":5222,"children":5223},{"style":165},[5224],{"type":39,"value":183},{"type":26,"tag":158,"props":5226,"children":5227},{"style":1251},[5228],{"type":39,"value":5229},"15s\n",{"type":26,"tag":158,"props":5231,"children":5232},{"class":160,"line":537},[5233,5238,5242],{"type":26,"tag":158,"props":5234,"children":5235},{"style":3613},[5236],{"type":39,"value":5237},"      timeout",{"type":26,"tag":158,"props":5239,"children":5240},{"style":165},[5241],{"type":39,"value":183},{"type":26,"tag":158,"props":5243,"children":5244},{"style":1251},[5245],{"type":39,"value":5246},"5s\n",{"type":26,"tag":158,"props":5248,"children":5249},{"class":160,"line":557},[5250,5255,5259],{"type":26,"tag":158,"props":5251,"children":5252},{"style":3613},[5253],{"type":39,"value":5254},"      retries",{"type":26,"tag":158,"props":5256,"children":5257},{"style":165},[5258],{"type":39,"value":183},{"type":26,"tag":158,"props":5260,"children":5261},{"style":505},[5262],{"type":39,"value":5263},"6\n",{"type":26,"tag":158,"props":5265,"children":5266},{"class":160,"line":578},[5267],{"type":26,"tag":158,"props":5268,"children":5269},{"emptyLinePlaceholder":1420},[5270],{"type":39,"value":1423},{"type":26,"tag":158,"props":5272,"children":5273},{"class":160,"line":590},[5274,5278],{"type":26,"tag":158,"props":5275,"children":5276},{"style":3613},[5277],{"type":39,"value":4938},{"type":26,"tag":158,"props":5279,"children":5280},{"style":165},[5281],{"type":39,"value":3621},{"type":26,"tag":158,"props":5283,"children":5284},{"class":160,"line":606},[5285,5289,5293],{"type":26,"tag":158,"props":5286,"children":5287},{"style":3613},[5288],{"type":39,"value":4992},{"type":26,"tag":158,"props":5290,"children":5291},{"style":165},[5292],{"type":39,"value":183},{"type":26,"tag":158,"props":5294,"children":5295},{"style":1251},[5296],{"type":39,"value":5297},"nextcloud:32.0.0\n",{"type":26,"tag":158,"props":5299,"children":5300},{"class":160,"line":614},[5301,5305,5309],{"type":26,"tag":158,"props":5302,"children":5303},{"style":3613},[5304],{"type":39,"value":5009},{"type":26,"tag":158,"props":5306,"children":5307},{"style":165},[5308],{"type":39,"value":183},{"type":26,"tag":158,"props":5310,"children":5311},{"style":1251},[5312],{"type":39,"value":5018},{"type":26,"tag":158,"props":5314,"children":5315},{"class":160,"line":622},[5316,5321],{"type":26,"tag":158,"props":5317,"children":5318},{"style":3613},[5319],{"type":39,"value":5320},"    depends_on",{"type":26,"tag":158,"props":5322,"children":5323},{"style":165},[5324],{"type":39,"value":3621},{"type":26,"tag":158,"props":5326,"children":5327},{"class":160,"line":630},[5328,5333],{"type":26,"tag":158,"props":5329,"children":5330},{"style":3613},[5331],{"type":39,"value":5332},"      db",{"type":26,"tag":158,"props":5334,"children":5335},{"style":165},[5336],{"type":39,"value":3621},{"type":26,"tag":158,"props":5338,"children":5339},{"class":160,"line":650},[5340,5345,5349],{"type":26,"tag":158,"props":5341,"children":5342},{"style":3613},[5343],{"type":39,"value":5344},"        condition",{"type":26,"tag":158,"props":5346,"children":5347},{"style":165},[5348],{"type":39,"value":183},{"type":26,"tag":158,"props":5350,"children":5351},{"style":1251},[5352],{"type":39,"value":5353},"service_healthy\n",{"type":26,"tag":158,"props":5355,"children":5356},{"class":160,"line":671},[5357,5361],{"type":26,"tag":158,"props":5358,"children":5359},{"style":3613},[5360],{"type":39,"value":5026},{"type":26,"tag":158,"props":5362,"children":5363},{"style":165},[5364],{"type":39,"value":3621},{"type":26,"tag":158,"props":5366,"children":5367},{"class":160,"line":683},[5368,5372],{"type":26,"tag":158,"props":5369,"children":5370},{"style":165},[5371],{"type":39,"value":5038},{"type":26,"tag":158,"props":5373,"children":5374},{"style":1251},[5375],{"type":39,"value":5376},"nextcloud:/var/www/html\n",{"type":26,"tag":158,"props":5378,"children":5379},{"class":160,"line":699},[5380,5384],{"type":26,"tag":158,"props":5381,"children":5382},{"style":3613},[5383],{"type":39,"value":5051},{"type":26,"tag":158,"props":5385,"children":5386},{"style":165},[5387],{"type":39,"value":3621},{"type":26,"tag":158,"props":5389,"children":5390},{"class":160,"line":707},[5391,5395],{"type":26,"tag":158,"props":5392,"children":5393},{"style":165},[5394],{"type":39,"value":5038},{"type":26,"tag":158,"props":5396,"children":5397},{"style":1251},[5398],{"type":39,"value":5399},"MYSQL_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":26,"tag":158,"props":5401,"children":5402},{"class":160,"line":148},[5403,5407],{"type":26,"tag":158,"props":5404,"children":5405},{"style":165},[5406],{"type":39,"value":5038},{"type":26,"tag":158,"props":5408,"children":5409},{"style":1251},[5410],{"type":39,"value":5411},"MYSQL_DATABASE=nextcloud\n",{"type":26,"tag":158,"props":5413,"children":5414},{"class":160,"line":149},[5415,5419],{"type":26,"tag":158,"props":5416,"children":5417},{"style":165},[5418],{"type":39,"value":5038},{"type":26,"tag":158,"props":5420,"children":5421},{"style":1251},[5422],{"type":39,"value":5423},"MYSQL_USER=nextcloud\n",{"type":26,"tag":158,"props":5425,"children":5426},{"class":160,"line":150},[5427,5431],{"type":26,"tag":158,"props":5428,"children":5429},{"style":165},[5430],{"type":39,"value":5038},{"type":26,"tag":158,"props":5432,"children":5433},{"style":1251},[5434],{"type":39,"value":5435},"MYSQL_HOST=db\n",{"type":26,"tag":142,"props":5437,"children":5441},{"className":5438,"code":5439,"language":5440,"meta":7,"style":7},"language-dotenv shiki shiki-themes github-dark github-dark monokai","NEXTCLOUD_MARIADB_ROOT_PASSWORD=\nNEXTCLOUD_MARIADB_PASSWORD=\n","dotenv",[5442],{"type":26,"tag":76,"props":5443,"children":5444},{"__ignoreMap":7},[5445,5459],{"type":26,"tag":158,"props":5446,"children":5447},{"class":160,"line":161},[5448,5454],{"type":26,"tag":158,"props":5449,"children":5451},{"style":5450},"--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2",[5452],{"type":39,"value":5453},"NEXTCLOUD_MARIADB_ROOT_PASSWORD",{"type":26,"tag":158,"props":5455,"children":5456},{"style":3160},[5457],{"type":39,"value":5458},"=\n",{"type":26,"tag":158,"props":5460,"children":5461},{"class":160,"line":171},[5462,5467],{"type":26,"tag":158,"props":5463,"children":5464},{"style":5450},[5465],{"type":39,"value":5466},"NEXTCLOUD_MARIADB_PASSWORD",{"type":26,"tag":158,"props":5468,"children":5469},{"style":3160},[5470],{"type":39,"value":5458},{"type":26,"tag":35,"props":5472,"children":5473},{},[5474,5476,5482],{"type":39,"value":5475},"Werden als ",{"type":26,"tag":47,"props":5477,"children":5479},{"href":5478},"https://docs.gitlab.com/ci/variables/",[5480],{"type":39,"value":5481},"CI/CD-Variablen",{"type":39,"value":5483}," gespeichert.",{"type":26,"tag":3510,"props":5485,"children":5486},{},[],{"type":26,"tag":35,"props":5488,"children":5489},{},[5490],{"type":39,"value":5491},"Um den Stack zu deployen, haben wir folgende Pipeline:",{"type":26,"tag":142,"props":5493,"children":5495},{"className":3600,"code":5494,"filename":3602,"language":3603,"meta":7,"style":7},"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",[5496],{"type":26,"tag":76,"props":5497,"children":5498},{"__ignoreMap":7},[5499,5510,5522,5529,5540,5555,5571,5583,5600,5611,5623,5634],{"type":26,"tag":158,"props":5500,"children":5501},{"class":160,"line":161},[5502,5506],{"type":26,"tag":158,"props":5503,"children":5504},{"style":3613},[5505],{"type":39,"value":3616},{"type":26,"tag":158,"props":5507,"children":5508},{"style":165},[5509],{"type":39,"value":3621},{"type":26,"tag":158,"props":5511,"children":5512},{"class":160,"line":171},[5513,5517],{"type":26,"tag":158,"props":5514,"children":5515},{"style":165},[5516],{"type":39,"value":3629},{"type":26,"tag":158,"props":5518,"children":5519},{"style":1251},[5520],{"type":39,"value":5521},"deploy\n",{"type":26,"tag":158,"props":5523,"children":5524},{"class":160,"line":197},[5525],{"type":26,"tag":158,"props":5526,"children":5527},{"emptyLinePlaceholder":1420},[5528],{"type":39,"value":1423},{"type":26,"tag":158,"props":5530,"children":5531},{"class":160,"line":219},[5532,5536],{"type":26,"tag":158,"props":5533,"children":5534},{"style":3613},[5535],{"type":39,"value":3649},{"type":26,"tag":158,"props":5537,"children":5538},{"style":165},[5539],{"type":39,"value":3621},{"type":26,"tag":158,"props":5541,"children":5542},{"class":160,"line":241},[5543,5547,5551],{"type":26,"tag":158,"props":5544,"children":5545},{"style":3613},[5546],{"type":39,"value":3678},{"type":26,"tag":158,"props":5548,"children":5549},{"style":165},[5550],{"type":39,"value":183},{"type":26,"tag":158,"props":5552,"children":5553},{"style":1251},[5554],{"type":39,"value":5521},{"type":26,"tag":158,"props":5556,"children":5557},{"class":160,"line":255},[5558,5562,5566],{"type":26,"tag":158,"props":5559,"children":5560},{"style":3613},[5561],{"type":39,"value":3661},{"type":26,"tag":158,"props":5563,"children":5564},{"style":165},[5565],{"type":39,"value":183},{"type":26,"tag":158,"props":5567,"children":5568},{"style":1251},[5569],{"type":39,"value":5570},"docker:28\n",{"type":26,"tag":158,"props":5572,"children":5573},{"class":160,"line":277},[5574,5579],{"type":26,"tag":158,"props":5575,"children":5576},{"style":3613},[5577],{"type":39,"value":5578},"  variables",{"type":26,"tag":158,"props":5580,"children":5581},{"style":165},[5582],{"type":39,"value":3621},{"type":26,"tag":158,"props":5584,"children":5585},{"class":160,"line":299},[5586,5591,5595],{"type":26,"tag":158,"props":5587,"children":5588},{"style":3613},[5589],{"type":39,"value":5590},"    DOCKER_HOST",{"type":26,"tag":158,"props":5592,"children":5593},{"style":165},[5594],{"type":39,"value":183},{"type":26,"tag":158,"props":5596,"children":5597},{"style":1251},[5598],{"type":39,"value":5599},"ssh://[username@]\u003CIP or host>[:port]\n",{"type":26,"tag":158,"props":5601,"children":5602},{"class":160,"line":321},[5603,5607],{"type":26,"tag":158,"props":5604,"children":5605},{"style":3613},[5606],{"type":39,"value":3694},{"type":26,"tag":158,"props":5608,"children":5609},{"style":165},[5610],{"type":39,"value":3621},{"type":26,"tag":158,"props":5612,"children":5613},{"class":160,"line":343},[5614,5618],{"type":26,"tag":158,"props":5615,"children":5616},{"style":165},[5617],{"type":39,"value":3706},{"type":26,"tag":158,"props":5619,"children":5620},{"style":1251},[5621],{"type":39,"value":5622},"for file in $(find . -type f -name docker-compose.yml); do docker compose -f $file up --remove-orphans --wait; done\n",{"type":26,"tag":158,"props":5624,"children":5625},{"class":160,"line":364},[5626,5630],{"type":26,"tag":158,"props":5627,"children":5628},{"style":3613},[5629],{"type":39,"value":3736},{"type":26,"tag":158,"props":5631,"children":5632},{"style":165},[5633],{"type":39,"value":3621},{"type":26,"tag":158,"props":5635,"children":5636},{"class":160,"line":385},[5637,5641,5645,5649],{"type":26,"tag":158,"props":5638,"children":5639},{"style":165},[5640],{"type":39,"value":3706},{"type":26,"tag":158,"props":5642,"children":5643},{"style":3613},[5644],{"type":39,"value":3969},{"type":26,"tag":158,"props":5646,"children":5647},{"style":165},[5648],{"type":39,"value":183},{"type":26,"tag":158,"props":5650,"children":5651},{"style":1251},[5652],{"type":39,"value":5653},"$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n",{"type":26,"tag":35,"props":5655,"children":5656},{},[5657,5659,5665],{"type":39,"value":5658},"Die Pipeline läuft bei jedem Commit auf dem Standard-Branch, iteriert über alle ",{"type":26,"tag":76,"props":5660,"children":5662},{"className":5661},[],[5663],{"type":39,"value":5664},"docker-compose.yml",{"type":39,"value":5666},"-Dateien und deployt sie.",{"type":26,"tag":110,"props":5668,"children":5670},{"id":5669},"halte-deine-software-aktuell-mit-renovate-bot",[5671],{"type":39,"value":5672},"Halte deine Software aktuell mit Renovate-Bot",{"type":26,"tag":35,"props":5674,"children":5675},{},[5676],{"type":39,"value":5677},"Hier kommt Renovate ins Spiel.",{"type":26,"tag":142,"props":5679,"children":5682},{"className":144,"code":5680,"filename":5681,"language":152,"meta":7,"style":7},"{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:best-practices\"\n  ]\n}\n","renovate.json",[5683],{"type":26,"tag":76,"props":5684,"children":5685},{"__ignoreMap":7},[5686,5693,5714,5726,5734,5741],{"type":26,"tag":158,"props":5687,"children":5688},{"class":160,"line":161},[5689],{"type":26,"tag":158,"props":5690,"children":5691},{"style":165},[5692],{"type":39,"value":168},{"type":26,"tag":158,"props":5694,"children":5695},{"class":160,"line":171},[5696,5701,5705,5710],{"type":26,"tag":158,"props":5697,"children":5698},{"style":175},[5699],{"type":39,"value":5700},"  \"$schema\"",{"type":26,"tag":158,"props":5702,"children":5703},{"style":165},[5704],{"type":39,"value":183},{"type":26,"tag":158,"props":5706,"children":5707},{"style":186},[5708],{"type":39,"value":5709},"\"https://docs.renovatebot.com/renovate-schema.json\"",{"type":26,"tag":158,"props":5711,"children":5712},{"style":165},[5713],{"type":39,"value":194},{"type":26,"tag":158,"props":5715,"children":5716},{"class":160,"line":197},[5717,5722],{"type":26,"tag":158,"props":5718,"children":5719},{"style":175},[5720],{"type":39,"value":5721},"  \"extends\"",{"type":26,"tag":158,"props":5723,"children":5724},{"style":165},[5725],{"type":39,"value":423},{"type":26,"tag":158,"props":5727,"children":5728},{"class":160,"line":219},[5729],{"type":26,"tag":158,"props":5730,"children":5731},{"style":186},[5732],{"type":39,"value":5733},"    \"config:best-practices\"\n",{"type":26,"tag":158,"props":5735,"children":5736},{"class":160,"line":241},[5737],{"type":26,"tag":158,"props":5738,"children":5739},{"style":165},[5740],{"type":39,"value":4413},{"type":26,"tag":158,"props":5742,"children":5743},{"class":160,"line":255},[5744],{"type":26,"tag":158,"props":5745,"children":5746},{"style":165},[5747],{"type":39,"value":1226},{"type":26,"tag":35,"props":5749,"children":5750},{},[5751],{"type":39,"value":5752},"Renovate erstellt für jedes Update einen Merge-Request. Super!",{"type":26,"tag":110,"props":5754,"children":5756},{"id":5755},"automatisierte-sicherheitsupdates-und-opt-in-für-minor-major-versionen",[5757],{"type":39,"value":5758},"Automatisierte Sicherheitsupdates und Opt-in für Minor-/Major-Versionen",{"type":26,"tag":35,"props":5760,"children":5761},{},[5762],{"type":39,"value":5763},"Die aktuelle Konfiguration erstellt für jedes Update einen Merge-Request, aber wir möchten, dass Sicherheitsupdates ohne Benutzerinteraktion erfolgen.",{"type":26,"tag":35,"props":5765,"children":5766},{},[5767,5769,5775],{"type":39,"value":5768},"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":26,"tag":47,"props":5770,"children":5772},{"href":5771},"https://hub.docker.com/_/mariadb",[5773],{"type":39,"value":5774},"MariaDB",{"type":39,"value":5776}," als Beispiel.",{"type":26,"tag":35,"props":5778,"children":5779},{},[5780,5782,5788],{"type":39,"value":5781},"Es gibt ",{"type":26,"tag":76,"props":5783,"children":5785},{"className":5784},[],[5786],{"type":39,"value":5787},"11.8.3-noble, 11.8-noble, 11-noble, lts-noble, 11.8.3, 11.8, 11, lts",{"type":39,"value":5789},", die alle auf dasselbe Image verweisen.",{"type":26,"tag":35,"props":5791,"children":5792},{},[5793,5799,5801,5807,5809,5815,5816,5822],{"type":26,"tag":76,"props":5794,"children":5796},{"className":5795},[],[5797],{"type":39,"value":5798},"11.8.3-noble",{"type":39,"value":5800}," bedeutet, dass wir MariaDB in Version ",{"type":26,"tag":76,"props":5802,"children":5804},{"className":5803},[],[5805],{"type":39,"value":5806},"11.8.3",{"type":39,"value":5808}," auf Basis von Ubuntu Noble erhalten.\n",{"type":26,"tag":76,"props":5810,"children":5812},{"className":5811},[],[5813],{"type":39,"value":5814},"11.8-noble",{"type":39,"value":5800},{"type":26,"tag":76,"props":5817,"children":5819},{"className":5818},[],[5820],{"type":39,"value":5821},"11.8.\u003Clatest_patch>",{"type":39,"value":5823}," auf Basis von Ubuntu Noble erhalten.",{"type":26,"tag":35,"props":5825,"children":5826},{},[5827,5829,5835,5837,5842,5844,5849],{"type":39,"value":5828},"Wenn eine neue Version von MariaDB veröffentlicht wird, z. B. ",{"type":26,"tag":76,"props":5830,"children":5832},{"className":5831},[],[5833],{"type":39,"value":5834},"11.8.4-noble",{"type":39,"value":5836},", wird ein neuer Tag ",{"type":26,"tag":76,"props":5838,"children":5840},{"className":5839},[],[5841],{"type":39,"value":5834},{"type":39,"value":5843}," veröffentlicht, aber der Tag ",{"type":26,"tag":76,"props":5845,"children":5847},{"className":5846},[],[5848],{"type":39,"value":5814},{"type":39,"value":5850}," wird aktualisiert.",{"type":26,"tag":35,"props":5852,"children":5853},{},[5854,5856,5861],{"type":39,"value":5855},"Gleiches gilt für das Ubuntu-Update. Der Tag ",{"type":26,"tag":76,"props":5857,"children":5859},{"className":5858},[],[5860],{"type":39,"value":5798},{"type":39,"value":5862}," kann aktualisiert werden, wenn das Image mit dem neuesten Ubuntu-Image erneut gebaut wird.",{"type":26,"tag":35,"props":5864,"children":5865},{},[5866,5872,5874,5880],{"type":26,"tag":76,"props":5867,"children":5869},{"className":5868},[],[5870],{"type":39,"value":5871},"docker compose up",{"type":39,"value":5873}," mit ",{"type":26,"tag":76,"props":5875,"children":5877},{"className":5876},[],[5878],{"type":39,"value":5879},"mariadb:11.8-noble",{"type":39,"value":5881}," wird nichts bewirken, weil Docker sich dieser Änderung nicht bewusst ist.",{"type":26,"tag":35,"props":5883,"children":5884},{},[5885,5887,5893],{"type":39,"value":5886},"Im Beispiel oben verweisen wir auf ",{"type":26,"tag":76,"props":5888,"children":5890},{"className":5889},[],[5891],{"type":39,"value":5892},"mariadb:11.8",{"type":39,"value":5894},", weil wir die neueste Patch-Version auf Basis des neuesten Betriebssystems verwenden möchten.",{"type":26,"tag":3510,"props":5896,"children":5897},{},[],{"type":26,"tag":35,"props":5899,"children":5900},{},[5901],{"type":39,"value":5902},"Wie soll Docker mitgeteilt werden, dass es eine neue Version gibt?",{"type":26,"tag":35,"props":5904,"children":5905},{},[5906,5908,5914],{"type":39,"value":5907},"Die Hauptidee ist, das Docker-Image zusätzlich mit einem ",{"type":26,"tag":47,"props":5909,"children":5911},{"href":5910},"https://docs.docker.com/dhi/core-concepts/digests/",[5912],{"type":39,"value":5913},"Digest",{"type":39,"value":5915}," anzugeben.",{"type":26,"tag":35,"props":5917,"children":5918},{},[5919,5921,5926,5928,5934],{"type":39,"value":5920},"Wenn Renovate das erste Mal läuft, findet es den Verweis auf ",{"type":26,"tag":76,"props":5922,"children":5924},{"className":5923},[],[5925],{"type":39,"value":5892},{"type":39,"value":5927}," und erstellt einen Merge-Request, um den Digest auf so etwas wie ",{"type":26,"tag":76,"props":5929,"children":5931},{"className":5930},[],[5932],{"type":39,"value":5933},"mariadb:11.8@sha256:ae6119716edac6998ae85508431b3d2e666530ddf4e94c61a10710caec9b0f71",{"type":39,"value":5935}," festzulegen.",{"type":26,"tag":35,"props":5937,"children":5938},{},[5939],{"type":39,"value":5940},"Es überwacht das auch, sodass bei jedem Update des Images der Digest wechselt und Renovate einen Merge-Request erstellt.",{"type":26,"tag":35,"props":5942,"children":5943},{},[5944],{"type":39,"value":5945},"Damit diese Updates automatisch gemergt werden, müssen wir ein paar Anpassungen vornehmen.",{"type":26,"tag":142,"props":5947,"children":5950},{"className":144,"code":5948,"filename":5681,"highlights":5949,"language":152,"meta":7,"style":7},"{\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",[241,255,277,299],[5951],{"type":26,"tag":76,"props":5952,"children":5953},{"__ignoreMap":7},[5954,5961,5980,5991,6003,6012,6020,6042,6059],{"type":26,"tag":158,"props":5955,"children":5956},{"class":160,"line":161},[5957],{"type":26,"tag":158,"props":5958,"children":5959},{"style":165},[5960],{"type":39,"value":168},{"type":26,"tag":158,"props":5962,"children":5963},{"class":160,"line":171},[5964,5968,5972,5976],{"type":26,"tag":158,"props":5965,"children":5966},{"style":175},[5967],{"type":39,"value":5700},{"type":26,"tag":158,"props":5969,"children":5970},{"style":165},[5971],{"type":39,"value":183},{"type":26,"tag":158,"props":5973,"children":5974},{"style":186},[5975],{"type":39,"value":5709},{"type":26,"tag":158,"props":5977,"children":5978},{"style":165},[5979],{"type":39,"value":194},{"type":26,"tag":158,"props":5981,"children":5982},{"class":160,"line":197},[5983,5987],{"type":26,"tag":158,"props":5984,"children":5985},{"style":175},[5986],{"type":39,"value":5721},{"type":26,"tag":158,"props":5988,"children":5989},{"style":165},[5990],{"type":39,"value":423},{"type":26,"tag":158,"props":5992,"children":5993},{"class":160,"line":219},[5994,5999],{"type":26,"tag":158,"props":5995,"children":5996},{"style":186},[5997],{"type":39,"value":5998},"    \"config:best-practices\"",{"type":26,"tag":158,"props":6000,"children":6001},{"style":165},[6002],{"type":39,"value":194},{"type":26,"tag":158,"props":6004,"children":6006},{"class":6005,"line":241},[160,716],[6007],{"type":26,"tag":158,"props":6008,"children":6009},{"style":186},[6010],{"type":39,"value":6011},"    \"default:automergeDigest\"\n",{"type":26,"tag":158,"props":6013,"children":6015},{"class":6014,"line":255},[160,716],[6016],{"type":26,"tag":158,"props":6017,"children":6018},{"style":165},[6019],{"type":39,"value":777},{"type":26,"tag":158,"props":6021,"children":6023},{"class":6022,"line":277},[160,716],[6024,6029,6033,6038],{"type":26,"tag":158,"props":6025,"children":6026},{"style":175},[6027],{"type":39,"value":6028},"  \"automergeType\"",{"type":26,"tag":158,"props":6030,"children":6031},{"style":165},[6032],{"type":39,"value":183},{"type":26,"tag":158,"props":6034,"children":6035},{"style":186},[6036],{"type":39,"value":6037},"\"branch\"",{"type":26,"tag":158,"props":6039,"children":6040},{"style":165},[6041],{"type":39,"value":194},{"type":26,"tag":158,"props":6043,"children":6045},{"class":6044,"line":299},[160,716],[6046,6051,6055],{"type":26,"tag":158,"props":6047,"children":6048},{"style":175},[6049],{"type":39,"value":6050},"  \"ignoreTests\"",{"type":26,"tag":158,"props":6052,"children":6053},{"style":165},[6054],{"type":39,"value":183},{"type":26,"tag":158,"props":6056,"children":6057},{"style":505},[6058],{"type":39,"value":508},{"type":26,"tag":158,"props":6060,"children":6061},{"class":160,"line":321},[6062],{"type":26,"tag":158,"props":6063,"children":6064},{"style":165},[6065],{"type":39,"value":1226},{"type":26,"tag":35,"props":6067,"children":6068},{},[6069,6071,6077,6078,6084],{"type":39,"value":6070},"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":26,"tag":47,"props":6072,"children":6074},{"href":6073},"https://docs.renovatebot.com/key-concepts/automerge/#branch-vs-pr-automerging",[6075],{"type":39,"value":6076},"automergeType",{"type":39,"value":4681},{"type":26,"tag":47,"props":6079,"children":6081},{"href":6080},"https://docs.renovatebot.com/key-concepts/automerge/#absence-of-tests",[6082],{"type":39,"value":6083},"ignoreTests",{"type":39,"value":54},{"type":26,"tag":4469,"props":6086,"children":6087},{},[6088],{"type":39,"value":4473},{"title":7,"searchDepth":171,"depth":171,"links":6090},[6091,6092,6093,6094,6095],{"id":4713,"depth":171,"text":4716},{"id":4750,"depth":171,"text":4753},{"id":4789,"depth":171,"text":4792},{"id":5669,"depth":171,"text":5672},{"id":5755,"depth":171,"text":5758},{"_path":4504,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4505,"description":4506,"author":10,"image":11,"releaseDate":4507,"blogCategories":6097,"articleTags":6098,"tags":6099,"body":6100,"_type":4486,"_id":4511,"_source":4488,"_file":4512,"_stem":4513,"_extension":4491},[14,15],[15],[21],{"type":23,"children":6101,"toc":7247},[6102,6113,6118,6243,6248,6321,6327,6352,6357,6385,6398,6416,6422,6439,6540,6545,6550,6575,6621,6624,6629,6969,6974,7010,7016,7024,7077,7080,7087,7115,7121,7126,7132,7137,7149,7157,7163,7175,7243],{"type":26,"tag":35,"props":6103,"children":6104},{},[6105,6111],{"type":26,"tag":47,"props":6106,"children":6108},{"href":6107},"https://doc.traefik.io/traefik/",[6109],{"type":39,"value":6110},"Traefik",{"type":39,"value":6112}," ist ein Reverse Proxy mit exzellenter Docker-Integration. Er verwendet Labels, die an Containern angebracht sind, um den Datenverkehr zu ihnen zu leiten.",{"type":26,"tag":35,"props":6114,"children":6115},{},[6116],{"type":39,"value":6117},"Ein typisches Set an Labels sieht ungefähr so aus:",{"type":26,"tag":142,"props":6119,"children":6123},{"code":6120,"filename":6121,"highlights":6122,"language":3603,"meta":7,"className":3600,"style":7},"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",[241,255,277,299,321],[6124],{"type":26,"tag":76,"props":6125,"children":6126},{"__ignoreMap":7},[6127,6138,6150,6166,6178,6191,6204,6217,6230],{"type":26,"tag":158,"props":6128,"children":6129},{"class":160,"line":161},[6130,6134],{"type":26,"tag":158,"props":6131,"children":6132},{"style":3613},[6133],{"type":39,"value":4969},{"type":26,"tag":158,"props":6135,"children":6136},{"style":165},[6137],{"type":39,"value":3621},{"type":26,"tag":158,"props":6139,"children":6140},{"class":160,"line":171},[6141,6146],{"type":26,"tag":158,"props":6142,"children":6143},{"style":3613},[6144],{"type":39,"value":6145},"  whoami",{"type":26,"tag":158,"props":6147,"children":6148},{"style":165},[6149],{"type":39,"value":3621},{"type":26,"tag":158,"props":6151,"children":6152},{"class":160,"line":197},[6153,6157,6161],{"type":26,"tag":158,"props":6154,"children":6155},{"style":3613},[6156],{"type":39,"value":4992},{"type":26,"tag":158,"props":6158,"children":6159},{"style":165},[6160],{"type":39,"value":183},{"type":26,"tag":158,"props":6162,"children":6163},{"style":1251},[6164],{"type":39,"value":6165},"traefik/whoami\n",{"type":26,"tag":158,"props":6167,"children":6168},{"class":160,"line":219},[6169,6174],{"type":26,"tag":158,"props":6170,"children":6171},{"style":3613},[6172],{"type":39,"value":6173},"    labels",{"type":26,"tag":158,"props":6175,"children":6176},{"style":165},[6177],{"type":39,"value":3621},{"type":26,"tag":158,"props":6179,"children":6181},{"class":6180,"line":241},[160,716],[6182,6186],{"type":26,"tag":158,"props":6183,"children":6184},{"style":165},[6185],{"type":39,"value":5038},{"type":26,"tag":158,"props":6187,"children":6188},{"style":1251},[6189],{"type":39,"value":6190},"\"traefik.enable=true\"\n",{"type":26,"tag":158,"props":6192,"children":6194},{"class":6193,"line":255},[160,716],[6195,6199],{"type":26,"tag":158,"props":6196,"children":6197},{"style":165},[6198],{"type":39,"value":5038},{"type":26,"tag":158,"props":6200,"children":6201},{"style":1251},[6202],{"type":39,"value":6203},"\"traefik.http.routers.whoami.rule=Host(`whoami.example.com`)\"\n",{"type":26,"tag":158,"props":6205,"children":6207},{"class":6206,"line":277},[160,716],[6208,6212],{"type":26,"tag":158,"props":6209,"children":6210},{"style":165},[6211],{"type":39,"value":5038},{"type":26,"tag":158,"props":6213,"children":6214},{"style":1251},[6215],{"type":39,"value":6216},"\"traefik.http.routers.whoami.entrypoints=websecure\"\n",{"type":26,"tag":158,"props":6218,"children":6220},{"class":6219,"line":299},[160,716],[6221,6225],{"type":26,"tag":158,"props":6222,"children":6223},{"style":165},[6224],{"type":39,"value":5038},{"type":26,"tag":158,"props":6226,"children":6227},{"style":1251},[6228],{"type":39,"value":6229},"\"traefik.http.routers.whoami.tls=true\"\n",{"type":26,"tag":158,"props":6231,"children":6233},{"class":6232,"line":321},[160,716],[6234,6238],{"type":26,"tag":158,"props":6235,"children":6236},{"style":165},[6237],{"type":39,"value":5038},{"type":26,"tag":158,"props":6239,"children":6240},{"style":1251},[6241],{"type":39,"value":6242},"\"traefik.http.routers.whoami.tls.certresolver=letsencrypt\"\n",{"type":26,"tag":35,"props":6244,"children":6245},{},[6246],{"type":39,"value":6247},"In diesem Beispiel:",{"type":26,"tag":4646,"props":6249,"children":6250},{},[6251,6262,6278,6283,6295,6300],{"type":26,"tag":70,"props":6252,"children":6253},{},[6254,6260],{"type":26,"tag":76,"props":6255,"children":6257},{"className":6256},[],[6258],{"type":39,"value":6259},"whoami",{"type":39,"value":6261}," ist der Name des \"Haupt\"-Dienstes (2)",{"type":26,"tag":70,"props":6263,"children":6264},{},[6265,6270,6272],{"type":26,"tag":76,"props":6266,"children":6268},{"className":6267},[],[6269],{"type":39,"value":6259},{"type":39,"value":6271}," ist auch der Standard-",{"type":26,"tag":47,"props":6273,"children":6275},{"href":6274},"https://docs.docker.com/compose/how-tos/project-name/",[6276],{"type":39,"value":6277},"Name des Compose-Projekts",{"type":26,"tag":70,"props":6279,"children":6280},{},[6281],{"type":39,"value":6282},"Traefik wird aktiviert (5)",{"type":26,"tag":70,"props":6284,"children":6285},{},[6286,6288,6293],{"type":39,"value":6287},"Der Dienst wird unter der Subdomain ",{"type":26,"tag":76,"props":6289,"children":6291},{"className":6290},[],[6292],{"type":39,"value":6259},{"type":39,"value":6294}," bereitgestellt (6)",{"type":26,"tag":70,"props":6296,"children":6297},{},[6298],{"type":39,"value":6299},"Die Auslieferung erfolgt über HTTPS (7)",{"type":26,"tag":70,"props":6301,"children":6302},{},[6303,6305,6311,6313,6319],{"type":39,"value":6304},"Ein vorkonfigurierter Certresolver namens ",{"type":26,"tag":76,"props":6306,"children":6308},{"className":6307},[],[6309],{"type":39,"value":6310},"letsencrypt",{"type":39,"value":6312}," wird für ",{"type":26,"tag":76,"props":6314,"children":6316},{"className":6315},[],[6317],{"type":39,"value":6318},"tls",{"type":39,"value":6320}," verwendet (8-9)",{"type":26,"tag":110,"props":6322,"children":6324},{"id":6323},"das-problem",[6325],{"type":39,"value":6326},"Das Problem",{"type":26,"tag":35,"props":6328,"children":6329},{},[6330,6332,6337,6339,6344,6346,6350],{"type":39,"value":6331},"In meinem ",{"type":26,"tag":47,"props":6333,"children":6334},{"href":4493},[6335],{"type":39,"value":6336},"anderen Beitrag über GitOps mit Docker",{"type":39,"value":6338}," habe ich das Konzept eingeführt,\n",{"type":26,"tag":76,"props":6340,"children":6342},{"className":6341},[],[6343],{"type":39,"value":1457},{"type":39,"value":6345}," als „Source of Truth“ für Docker-Deployments mittels ",{"type":26,"tag":47,"props":6347,"children":6348},{"href":4684},[6349],{"type":39,"value":4687},{"type":39,"value":6351}," zu nutzen.",{"type":26,"tag":35,"props":6353,"children":6354},{},[6355],{"type":39,"value":6356},"Dabei gibt es einige Anforderungen:",{"type":26,"tag":4646,"props":6358,"children":6359},{},[6360,6373],{"type":26,"tag":70,"props":6361,"children":6362},{},[6363,6365,6371],{"type":39,"value":6364},"Jeder Stack ist unter ",{"type":26,"tag":76,"props":6366,"children":6368},{"className":6367},[],[6369],{"type":39,"value":6370},"\u003Cstack_name>.\u003Cyour_domain>",{"type":39,"value":6372}," erreichbar",{"type":26,"tag":70,"props":6374,"children":6375},{},[6376,6378,6383],{"type":39,"value":6377},"Jeder Stack ist mit ",{"type":26,"tag":76,"props":6379,"children":6381},{"className":6380},[],[6382],{"type":39,"value":6318},{"type":39,"value":6384}," geschützt",{"type":26,"tag":35,"props":6386,"children":6387},{},[6388,6390,6396],{"type":39,"value":6389},"Wir könnten zwar in jeder ",{"type":26,"tag":76,"props":6391,"children":6393},{"className":6392},[],[6394],{"type":39,"value":6395},"docker-compose.yaml",{"type":39,"value":6397}," die Labels manuell hinzufügen, doch dabei zeigt sich schnell,\ndass wir die Konfiguration redundant wiederholen.",{"type":26,"tag":66,"props":6399,"children":6400},{},[6401,6406,6411],{"type":26,"tag":70,"props":6402,"children":6403},{},[6404],{"type":39,"value":6405},"Traefik aktivieren",{"type":26,"tag":70,"props":6407,"children":6408},{},[6409],{"type":39,"value":6410},"Eine Subdomain zuweisen",{"type":26,"tag":70,"props":6412,"children":6413},{},[6414],{"type":39,"value":6415},"HTTPS aktivieren",{"type":26,"tag":110,"props":6417,"children":6419},{"id":6418},"die-lösung",[6420],{"type":39,"value":6421},"Die Lösung",{"type":26,"tag":35,"props":6423,"children":6424},{},[6425,6427,6437],{"type":39,"value":6426},"Mit hilfe der ",{"type":26,"tag":47,"props":6428,"children":6430},{"href":6429},"https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_project_name",[6431],{"type":26,"tag":76,"props":6432,"children":6434},{"className":6433},[],[6435],{"type":39,"value":6436},"$COMPOSE_PROJECT_NAME",{"type":39,"value":6438},"\nVariable können wir ein generisches Template für eine solche Konfiguration erstellen.\nDadurch stellen wir sicher, dass die Traefik-Regeln einheitlich sind.",{"type":26,"tag":142,"props":6440,"children":6443},{"code":6441,"filename":6442,"language":3603,"meta":7,"className":3600,"style":7},"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",[6444],{"type":26,"tag":76,"props":6445,"children":6446},{"__ignoreMap":7},[6447,6458,6470,6481,6492,6504,6516,6528],{"type":26,"tag":158,"props":6448,"children":6449},{"class":160,"line":161},[6450,6454],{"type":26,"tag":158,"props":6451,"children":6452},{"style":3613},[6453],{"type":39,"value":4969},{"type":26,"tag":158,"props":6455,"children":6456},{"style":165},[6457],{"type":39,"value":3621},{"type":26,"tag":158,"props":6459,"children":6460},{"class":160,"line":171},[6461,6466],{"type":26,"tag":158,"props":6462,"children":6463},{"style":3613},[6464],{"type":39,"value":6465},"  \u003Cmain_service>",{"type":26,"tag":158,"props":6467,"children":6468},{"style":165},[6469],{"type":39,"value":3621},{"type":26,"tag":158,"props":6471,"children":6472},{"class":160,"line":197},[6473,6477],{"type":26,"tag":158,"props":6474,"children":6475},{"style":3613},[6476],{"type":39,"value":6173},{"type":26,"tag":158,"props":6478,"children":6479},{"style":165},[6480],{"type":39,"value":3621},{"type":26,"tag":158,"props":6482,"children":6483},{"class":160,"line":219},[6484,6488],{"type":26,"tag":158,"props":6485,"children":6486},{"style":165},[6487],{"type":39,"value":5038},{"type":26,"tag":158,"props":6489,"children":6490},{"style":1251},[6491],{"type":39,"value":6190},{"type":26,"tag":158,"props":6493,"children":6494},{"class":160,"line":241},[6495,6499],{"type":26,"tag":158,"props":6496,"children":6497},{"style":165},[6498],{"type":39,"value":5038},{"type":26,"tag":158,"props":6500,"children":6501},{"style":1251},[6502],{"type":39,"value":6503},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.rule=Host(`\u003Cstack_name>.example.com`)\"\n",{"type":26,"tag":158,"props":6505,"children":6506},{"class":160,"line":255},[6507,6511],{"type":26,"tag":158,"props":6508,"children":6509},{"style":165},[6510],{"type":39,"value":5038},{"type":26,"tag":158,"props":6512,"children":6513},{"style":1251},[6514],{"type":39,"value":6515},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.entrypoints=websecure\"\n",{"type":26,"tag":158,"props":6517,"children":6518},{"class":160,"line":277},[6519,6523],{"type":26,"tag":158,"props":6520,"children":6521},{"style":165},[6522],{"type":39,"value":5038},{"type":26,"tag":158,"props":6524,"children":6525},{"style":1251},[6526],{"type":39,"value":6527},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls=true\"\n",{"type":26,"tag":158,"props":6529,"children":6530},{"class":160,"line":299},[6531,6535],{"type":26,"tag":158,"props":6532,"children":6533},{"style":165},[6534],{"type":39,"value":5038},{"type":26,"tag":158,"props":6536,"children":6537},{"style":1251},[6538],{"type":39,"value":6539},"\"traefik.http.routers.$COMPOSE_PROJECT_NAME.tls.certresolver=letsencrypt\"\n",{"type":26,"tag":35,"props":6541,"children":6542},{},[6543],{"type":39,"value":6544},"Die gute Nachricht ist, dass Traefik es uns ermöglicht, einige Standardwerte zu konfigurieren, die den oben genannten Boilerplate-Code abdecken!",{"type":26,"tag":35,"props":6546,"children":6547},{},[6548],{"type":39,"value":6549},"Führen wir zwei einfache Konventionen ein:",{"type":26,"tag":66,"props":6551,"children":6552},{},[6553,6564],{"type":26,"tag":70,"props":6554,"children":6555},{},[6556,6562],{"type":26,"tag":76,"props":6557,"children":6559},{"className":6558},[],[6560],{"type":39,"value":6561},"app",{"type":39,"value":6563}," als Name des \"Hauptcontainers\", damit Traefik den Datenverkehr dorthin leitet",{"type":26,"tag":70,"props":6565,"children":6566},{},[6567,6573],{"type":26,"tag":76,"props":6568,"children":6570},{"className":6569},[],[6571],{"type":39,"value":6572},"\u003Cstack_name>",{"type":39,"value":6574}," (der Name des Compose-Projekts) in der Subdomain",{"type":26,"tag":142,"props":6576,"children":6579},{"code":6577,"filename":6578,"language":3603,"meta":7,"className":3600,"style":7},"services:\n  app:\n    image: traefik/whoami\n","(1) whoami/docker-compose.yaml",[6580],{"type":26,"tag":76,"props":6581,"children":6582},{"__ignoreMap":7},[6583,6594,6606],{"type":26,"tag":158,"props":6584,"children":6585},{"class":160,"line":161},[6586,6590],{"type":26,"tag":158,"props":6587,"children":6588},{"style":3613},[6589],{"type":39,"value":4969},{"type":26,"tag":158,"props":6591,"children":6592},{"style":165},[6593],{"type":39,"value":3621},{"type":26,"tag":158,"props":6595,"children":6596},{"class":160,"line":171},[6597,6602],{"type":26,"tag":158,"props":6598,"children":6599},{"style":3613},[6600],{"type":39,"value":6601},"  app",{"type":26,"tag":158,"props":6603,"children":6604},{"style":165},[6605],{"type":39,"value":3621},{"type":26,"tag":158,"props":6607,"children":6608},{"class":160,"line":197},[6609,6613,6617],{"type":26,"tag":158,"props":6610,"children":6611},{"style":3613},[6612],{"type":39,"value":4992},{"type":26,"tag":158,"props":6614,"children":6615},{"style":165},[6616],{"type":39,"value":183},{"type":26,"tag":158,"props":6618,"children":6619},{"style":1251},[6620],{"type":39,"value":6165},{"type":26,"tag":3510,"props":6622,"children":6623},{},[],{"type":26,"tag":35,"props":6625,"children":6626},{},[6627],{"type":39,"value":6628},"Nun konfigurieren wir Traefik, um \"die Magie\" wirken zu lassen:",{"type":26,"tag":142,"props":6630,"children":6633},{"code":6631,"filename":6632,"language":3603,"meta":7,"className":3600,"style":7},"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",[6634],{"type":26,"tag":76,"props":6635,"children":6636},{"__ignoreMap":7},[6637,6648,6660,6668,6679,6691,6708,6724,6740,6757,6768,6780,6792,6804,6816,6823,6835,6847,6855,6867,6879,6891,6898,6910,6922,6934,6945,6957],{"type":26,"tag":158,"props":6638,"children":6639},{"class":160,"line":161},[6640,6644],{"type":26,"tag":158,"props":6641,"children":6642},{"style":3613},[6643],{"type":39,"value":4926},{"type":26,"tag":158,"props":6645,"children":6646},{"style":165},[6647],{"type":39,"value":3621},{"type":26,"tag":158,"props":6649,"children":6650},{"class":160,"line":171},[6651,6656],{"type":26,"tag":158,"props":6652,"children":6653},{"style":3613},[6654],{"type":39,"value":6655},"  letsencrypt",{"type":26,"tag":158,"props":6657,"children":6658},{"style":165},[6659],{"type":39,"value":3621},{"type":26,"tag":158,"props":6661,"children":6662},{"class":160,"line":197},[6663],{"type":26,"tag":158,"props":6664,"children":6665},{"style":165},[6666],{"type":39,"value":6667},"    \n",{"type":26,"tag":158,"props":6669,"children":6670},{"class":160,"line":219},[6671,6675],{"type":26,"tag":158,"props":6672,"children":6673},{"style":3613},[6674],{"type":39,"value":4969},{"type":26,"tag":158,"props":6676,"children":6677},{"style":165},[6678],{"type":39,"value":3621},{"type":26,"tag":158,"props":6680,"children":6681},{"class":160,"line":241},[6682,6687],{"type":26,"tag":158,"props":6683,"children":6684},{"style":3613},[6685],{"type":39,"value":6686},"  traefik",{"type":26,"tag":158,"props":6688,"children":6689},{"style":165},[6690],{"type":39,"value":3621},{"type":26,"tag":158,"props":6692,"children":6693},{"class":160,"line":255},[6694,6699,6703],{"type":26,"tag":158,"props":6695,"children":6696},{"style":3613},[6697],{"type":39,"value":6698},"    container_name",{"type":26,"tag":158,"props":6700,"children":6701},{"style":165},[6702],{"type":39,"value":183},{"type":26,"tag":158,"props":6704,"children":6705},{"style":1251},[6706],{"type":39,"value":6707},"traefik\n",{"type":26,"tag":158,"props":6709,"children":6710},{"class":160,"line":277},[6711,6715,6719],{"type":26,"tag":158,"props":6712,"children":6713},{"style":3613},[6714],{"type":39,"value":5009},{"type":26,"tag":158,"props":6716,"children":6717},{"style":165},[6718],{"type":39,"value":183},{"type":26,"tag":158,"props":6720,"children":6721},{"style":1251},[6722],{"type":39,"value":6723},"always\n",{"type":26,"tag":158,"props":6725,"children":6726},{"class":160,"line":299},[6727,6731,6735],{"type":26,"tag":158,"props":6728,"children":6729},{"style":3613},[6730],{"type":39,"value":4992},{"type":26,"tag":158,"props":6732,"children":6733},{"style":165},[6734],{"type":39,"value":183},{"type":26,"tag":158,"props":6736,"children":6737},{"style":1251},[6738],{"type":39,"value":6739},"traefik:3\n",{"type":26,"tag":158,"props":6741,"children":6742},{"class":160,"line":321},[6743,6748,6752],{"type":26,"tag":158,"props":6744,"children":6745},{"style":3613},[6746],{"type":39,"value":6747},"    network_mode",{"type":26,"tag":158,"props":6749,"children":6750},{"style":165},[6751],{"type":39,"value":183},{"type":26,"tag":158,"props":6753,"children":6754},{"style":1251},[6755],{"type":39,"value":6756},"host\n",{"type":26,"tag":158,"props":6758,"children":6759},{"class":160,"line":343},[6760,6764],{"type":26,"tag":158,"props":6761,"children":6762},{"style":3613},[6763],{"type":39,"value":5111},{"type":26,"tag":158,"props":6765,"children":6766},{"style":165},[6767],{"type":39,"value":3621},{"type":26,"tag":158,"props":6769,"children":6770},{"class":160,"line":364},[6771,6775],{"type":26,"tag":158,"props":6772,"children":6773},{"style":165},[6774],{"type":39,"value":5038},{"type":26,"tag":158,"props":6776,"children":6777},{"style":1251},[6778],{"type":39,"value":6779},"--certificatesresolvers.letsencrypt.acme.httpchallenge=true\n",{"type":26,"tag":158,"props":6781,"children":6782},{"class":160,"line":385},[6783,6787],{"type":26,"tag":158,"props":6784,"children":6785},{"style":165},[6786],{"type":39,"value":5038},{"type":26,"tag":158,"props":6788,"children":6789},{"style":1251},[6790],{"type":39,"value":6791},"--certificatesresolvers.letsencrypt.acme.email=\u003Cyour_email_here>\n",{"type":26,"tag":158,"props":6793,"children":6794},{"class":160,"line":403},[6795,6799],{"type":26,"tag":158,"props":6796,"children":6797},{"style":165},[6798],{"type":39,"value":5038},{"type":26,"tag":158,"props":6800,"children":6801},{"style":1251},[6802],{"type":39,"value":6803},"--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json\n",{"type":26,"tag":158,"props":6805,"children":6806},{"class":160,"line":412},[6807,6811],{"type":26,"tag":158,"props":6808,"children":6809},{"style":165},[6810],{"type":39,"value":5038},{"type":26,"tag":158,"props":6812,"children":6813},{"style":1251},[6814],{"type":39,"value":6815},"--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web\n",{"type":26,"tag":158,"props":6817,"children":6818},{"class":160,"line":426},[6819],{"type":26,"tag":158,"props":6820,"children":6821},{"emptyLinePlaceholder":1420},[6822],{"type":39,"value":1423},{"type":26,"tag":158,"props":6824,"children":6825},{"class":160,"line":435},[6826,6830],{"type":26,"tag":158,"props":6827,"children":6828},{"style":165},[6829],{"type":39,"value":5038},{"type":26,"tag":158,"props":6831,"children":6832},{"style":1251},[6833],{"type":39,"value":6834},"--entrypoints.web.address=:80\n",{"type":26,"tag":158,"props":6836,"children":6837},{"class":160,"line":457},[6838,6842],{"type":26,"tag":158,"props":6839,"children":6840},{"style":165},[6841],{"type":39,"value":5038},{"type":26,"tag":158,"props":6843,"children":6844},{"style":1251},[6845],{"type":39,"value":6846},"--entrypoints.websecure.address=:443\n",{"type":26,"tag":158,"props":6848,"children":6849},{"class":160,"line":479},[6850],{"type":26,"tag":158,"props":6851,"children":6852},{"style":165},[6853],{"type":39,"value":6854},"      \n",{"type":26,"tag":158,"props":6856,"children":6857},{"class":160,"line":492},[6858,6862],{"type":26,"tag":158,"props":6859,"children":6860},{"style":165},[6861],{"type":39,"value":5038},{"type":26,"tag":158,"props":6863,"children":6864},{"style":1251},[6865],{"type":39,"value":6866},"--entrypoints.web.http.redirections.entrypoint.to=websecure\n",{"type":26,"tag":158,"props":6868,"children":6869},{"class":160,"line":511},[6870,6874],{"type":26,"tag":158,"props":6871,"children":6872},{"style":165},[6873],{"type":39,"value":5038},{"type":26,"tag":158,"props":6875,"children":6876},{"style":1251},[6877],{"type":39,"value":6878},"--entrypoints.web.http.redirections.entrypoint.scheme=https\n",{"type":26,"tag":158,"props":6880,"children":6881},{"class":160,"line":520},[6882,6886],{"type":26,"tag":158,"props":6883,"children":6884},{"style":165},[6885],{"type":39,"value":5038},{"type":26,"tag":158,"props":6887,"children":6888},{"style":1251},[6889],{"type":39,"value":6890},"--entrypoints.websecure.http.tls.certresolver=letsencrypt\n",{"type":26,"tag":158,"props":6892,"children":6893},{"class":160,"line":529},[6894],{"type":26,"tag":158,"props":6895,"children":6896},{"emptyLinePlaceholder":1420},[6897],{"type":39,"value":1423},{"type":26,"tag":158,"props":6899,"children":6900},{"class":160,"line":537},[6901,6905],{"type":26,"tag":158,"props":6902,"children":6903},{"style":165},[6904],{"type":39,"value":5038},{"type":26,"tag":158,"props":6906,"children":6907},{"style":1251},[6908],{"type":39,"value":6909},"--providers.docker\n",{"type":26,"tag":158,"props":6911,"children":6912},{"class":160,"line":557},[6913,6917],{"type":26,"tag":158,"props":6914,"children":6915},{"style":165},[6916],{"type":39,"value":5038},{"type":26,"tag":158,"props":6918,"children":6919},{"style":1251},[6920],{"type":39,"value":6921},"--providers.docker.defaultrule=Host(`{{ trimPrefix `app-` .Name }}.example.com`)\n",{"type":26,"tag":158,"props":6923,"children":6924},{"class":160,"line":578},[6925,6929],{"type":26,"tag":158,"props":6926,"children":6927},{"style":165},[6928],{"type":39,"value":5038},{"type":26,"tag":158,"props":6930,"children":6931},{"style":1251},[6932],{"type":39,"value":6933},"--providers.docker.constraints=Label(`com.docker.compose.service`,`app`)\n",{"type":26,"tag":158,"props":6935,"children":6936},{"class":160,"line":590},[6937,6941],{"type":26,"tag":158,"props":6938,"children":6939},{"style":3613},[6940],{"type":39,"value":5026},{"type":26,"tag":158,"props":6942,"children":6943},{"style":165},[6944],{"type":39,"value":3621},{"type":26,"tag":158,"props":6946,"children":6947},{"class":160,"line":606},[6948,6952],{"type":26,"tag":158,"props":6949,"children":6950},{"style":165},[6951],{"type":39,"value":5038},{"type":26,"tag":158,"props":6953,"children":6954},{"style":1251},[6955],{"type":39,"value":6956},"/var/run/docker.sock:/var/run/docker.sock:ro\n",{"type":26,"tag":158,"props":6958,"children":6959},{"class":160,"line":614},[6960,6964],{"type":26,"tag":158,"props":6961,"children":6962},{"style":165},[6963],{"type":39,"value":5038},{"type":26,"tag":158,"props":6965,"children":6966},{"style":1251},[6967],{"type":39,"value":6968},"/letsencrypt:/letsencrypt\n",{"type":26,"tag":35,"props":6970,"children":6971},{},[6972],{"type":39,"value":6973},"Erklären wir das ein wenig:",{"type":26,"tag":66,"props":6975,"children":6976},{},[6977,6990,6995,7000,7005],{"type":26,"tag":70,"props":6978,"children":6979},{},[6980,6982,6988],{"type":39,"value":6981},"Wir konfigurieren einen ",{"type":26,"tag":47,"props":6983,"children":6985},{"href":6984},"https://letsencrypt.org/",[6986],{"type":39,"value":6987},"Let's Encrypt",{"type":39,"value":6989}," Certificates Resolver (11-14)",{"type":26,"tag":70,"props":6991,"children":6992},{},[6993],{"type":39,"value":6994},"Wir hören auf Port 80 und 443 (16-17)",{"type":26,"tag":70,"props":6996,"children":6997},{},[6998],{"type":39,"value":6999},"Wir leiten den gesamten HTTP-Verkehr auf HTTPS um (19-20)",{"type":26,"tag":70,"props":7001,"children":7002},{},[7003],{"type":39,"value":7004},"Und binden den konfigurierten Certificates Resolver daran (21)",{"type":26,"tag":70,"props":7006,"children":7007},{},[7008],{"type":39,"value":7009},"Wir richten den Docker-Provider ein (23-25)",{"type":26,"tag":122,"props":7011,"children":7013},{"id":7012},"erklärung-für-die-zeilen-24-25",[7014],{"type":39,"value":7015},"Erklärung für die Zeilen 24-25",{"type":26,"tag":142,"props":7017,"children":7019},{"code":7018},"--providers.docker.defaultrule=Host(`{{ trimPrefix 'app-'.Name }}.example.com`)\n",[7020],{"type":26,"tag":76,"props":7021,"children":7022},{"__ignoreMap":7},[7023],{"type":39,"value":7018},{"type":26,"tag":4646,"props":7025,"children":7026},{},[7027,7060],{"type":26,"tag":70,"props":7028,"children":7029},{},[7030,7036,7038,7044,7046,7051,7053,7059],{"type":26,"tag":76,"props":7031,"children":7033},{"className":7032},[],[7034],{"type":39,"value":7035},".Name",{"type":39,"value":7037}," wird automatisch als ",{"type":26,"tag":76,"props":7039,"children":7041},{"className":7040},[],[7042],{"type":39,"value":7043},"\u003Cservice-name>-\u003Cstack_name>",{"type":39,"value":7045}," generiert. Für dein ",{"type":26,"tag":76,"props":7047,"children":7049},{"className":7048},[],[7050],{"type":39,"value":6259},{"type":39,"value":7052},"-Beispiel wäre das also ",{"type":26,"tag":76,"props":7054,"children":7056},{"className":7055},[],[7057],{"type":39,"value":7058},"app-whoami",{"type":39,"value":54},{"type":26,"tag":70,"props":7061,"children":7062},{},[7063,7069,7071,7076],{"type":26,"tag":76,"props":7064,"children":7066},{"className":7065},[],[7067],{"type":39,"value":7068},"trimPrefix 'app-'.Name",{"type":39,"value":7070}," ergibt ",{"type":26,"tag":76,"props":7072,"children":7074},{"className":7073},[],[7075],{"type":39,"value":6259},{"type":39,"value":54},{"type":26,"tag":1271,"props":7078,"children":7079},{},[],{"type":26,"tag":142,"props":7081,"children":7082},{"code":6933},[7083],{"type":26,"tag":76,"props":7084,"children":7085},{"__ignoreMap":7},[7086],{"type":39,"value":6933},{"type":26,"tag":35,"props":7088,"children":7089},{},[7090,7092,7097,7099,7105,7107,7113],{"type":39,"value":7091},"Alle Dienste sollten standardmäßig verfügbar sein, aber sie sollten gefiltert werden, sodass nur ",{"type":26,"tag":76,"props":7093,"children":7095},{"className":7094},[],[7096],{"type":39,"value":6561},{"type":39,"value":7098},"-Dienste berücksichtigt werden. Das Label ",{"type":26,"tag":76,"props":7100,"children":7102},{"className":7101},[],[7103],{"type":39,"value":7104},"com.docker.compose.service",{"type":39,"value":7106}," wird von ",{"type":26,"tag":76,"props":7108,"children":7110},{"className":7109},[],[7111],{"type":39,"value":7112},"docker-compose",{"type":39,"value":7114}," automatisch zu allen Containern hinzugefügt.",{"type":26,"tag":110,"props":7116,"children":7118},{"id":7117},"bonus-konfiguration",[7119],{"type":39,"value":7120},"Bonus-Konfiguration",{"type":26,"tag":35,"props":7122,"children":7123},{},[7124],{"type":39,"value":7125},"Wir können diese Konfiguration noch weiter verfeinern.",{"type":26,"tag":122,"props":7127,"children":7129},{"id":7128},"andere-dienste-im-stack-verfügbar-machen",[7130],{"type":39,"value":7131},"Andere Dienste im Stack verfügbar machen",{"type":26,"tag":35,"props":7133,"children":7134},{},[7135],{"type":39,"value":7136},"Manchmal möchte man mehr als nur den App-Container nach außen hin öffnen.",{"type":26,"tag":35,"props":7138,"children":7139},{},[7140,7142,7147],{"type":39,"value":7141},"Die aktuelle Konfiguration leitet den Datenverkehr nur an unsere ",{"type":26,"tag":76,"props":7143,"children":7145},{"className":7144},[],[7146],{"type":39,"value":6561},{"type":39,"value":7148},"-Dienste weiter.\nUm weiterhin die Standard-Konfigurationsmethode nutzen zu können, müssen wir diese wieder aktivieren:",{"type":26,"tag":142,"props":7150,"children":7152},{"code":7151},"--providers.docker.constraints=Label(`com.docker.compose.service`,`app`) || Label(`traefik.enable`, `true`)\n",[7153],{"type":26,"tag":76,"props":7154,"children":7155},{"__ignoreMap":7},[7156],{"type":39,"value":7151},{"type":26,"tag":122,"props":7158,"children":7160},{"id":7159},"stack-name-weicht-vom-verzeichnisnamen-ab",[7161],{"type":39,"value":7162},"Stack-Name weicht vom Verzeichnisnamen ab",{"type":26,"tag":35,"props":7164,"children":7165},{},[7166,7168,7173],{"type":39,"value":7167},"Beim Deployment der Stacks wird der Name basierend auf dem Verzeichnisnamen generiert, in dem sich die ",{"type":26,"tag":76,"props":7169,"children":7171},{"className":7170},[],[7172],{"type":39,"value":6395},{"type":39,"value":7174}," Datei befindet.\nWir können den Namen auf verschiedene Arten ändern, aber hier ist die einfachste:",{"type":26,"tag":142,"props":7176,"children":7180},{"code":7177,"filename":7178,"highlights":7179,"language":3603,"meta":7,"className":3600,"style":7},"name: whoami # Projektname manuell setzen\nservices:\n  app:\n    image: traefik/whoami\n","whoami-example/docker-compose.yaml",[161],[7181],{"type":26,"tag":76,"props":7182,"children":7183},{"__ignoreMap":7},[7184,7206,7217,7228],{"type":26,"tag":158,"props":7185,"children":7187},{"class":7186,"line":161},[160,716],[7188,7193,7197,7201],{"type":26,"tag":158,"props":7189,"children":7190},{"style":3613},[7191],{"type":39,"value":7192},"name",{"type":26,"tag":158,"props":7194,"children":7195},{"style":165},[7196],{"type":39,"value":183},{"type":26,"tag":158,"props":7198,"children":7199},{"style":1251},[7200],{"type":39,"value":6259},{"type":26,"tag":158,"props":7202,"children":7203},{"style":4824},[7204],{"type":39,"value":7205}," # Projektname manuell setzen\n",{"type":26,"tag":158,"props":7207,"children":7208},{"class":160,"line":171},[7209,7213],{"type":26,"tag":158,"props":7210,"children":7211},{"style":3613},[7212],{"type":39,"value":4969},{"type":26,"tag":158,"props":7214,"children":7215},{"style":165},[7216],{"type":39,"value":3621},{"type":26,"tag":158,"props":7218,"children":7219},{"class":160,"line":197},[7220,7224],{"type":26,"tag":158,"props":7221,"children":7222},{"style":3613},[7223],{"type":39,"value":6601},{"type":26,"tag":158,"props":7225,"children":7226},{"style":165},[7227],{"type":39,"value":3621},{"type":26,"tag":158,"props":7229,"children":7230},{"class":160,"line":219},[7231,7235,7239],{"type":26,"tag":158,"props":7232,"children":7233},{"style":3613},[7234],{"type":39,"value":4992},{"type":26,"tag":158,"props":7236,"children":7237},{"style":165},[7238],{"type":39,"value":183},{"type":26,"tag":158,"props":7240,"children":7241},{"style":1251},[7242],{"type":39,"value":6165},{"type":26,"tag":4469,"props":7244,"children":7245},{},[7246],{"type":39,"value":4473},{"title":7,"searchDepth":171,"depth":171,"links":7248},[7249,7250,7253],{"id":6323,"depth":171,"text":6326},{"id":6418,"depth":171,"text":6421,"children":7251},[7252],{"id":7012,"depth":197,"text":7015},{"id":7117,"depth":171,"text":7120,"children":7254},[7255,7256],{"id":7128,"depth":197,"text":7131},{"id":7159,"depth":197,"text":7162},{"_path":4518,"_dir":4519,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":7258,"primaryTeam":4522,"firstName":4523,"lastName":4524,"prefixTitle":7,"suffixTitle":4525,"education":7259,"role":7261,"workingSince":4536,"inTheCompanySince":4537,"techSkills":7262,"skills":7276,"projects":7286,"contactDetails":7291,"_image":4608,"image":4609,"_id":4610,"_type":152,"title":4611,"_source":4519,"_file":4612,"_stem":4613,"_extension":152},[4521,4522],[7260],[4528,4529,4530],[4532,4533,4534,4535],[7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275],{"name":4540,"level":4541,"icon":4542},{"name":4544,"level":4541},{"name":4546,"level":4541,"icon":4547},{"name":4549,"level":4541,"icon":4550},{"name":4552,"level":4541,"icon":4553},{"name":4555,"level":4541},{"name":4557,"level":4541,"icon":4558},{"name":4560,"level":4541,"icon":4561},{"name":4563,"level":4564,"icon":4565},{"name":4567,"level":4564,"icon":4568},{"name":4570,"level":4564},{"name":4572,"level":4564,"icon":4573},{"name":4575,"level":4564,"icon":4576},[7277,7278,7279,7280,7281,7282,7283,7284,7285],{"name":3495,"level":4541},{"name":4580,"level":4541},{"name":4522,"level":4541},{"name":4583,"level":4541},{"name":4585,"level":4541},{"name":4587,"level":4564},{"name":4589,"level":4564},{"name":4591,"level":4564},{"name":4593,"level":4564},[7287,7289,7290],{"project":4596,"position":7288},[4598,4599],{"project":4601,"position":4599},{"project":4603,"position":4599},{"eMail":4605,"phone":4606,"visibility":4607},[7293,7307,7319,7331],{"_path":7294,"_dir":7295,"_draft":6,"_partial":1420,"_locale":7,"name":7296,"slug":7295,"text":7297,"hoverText":7298,"image":7299,"customer":7300,"tags":7301,"_id":7303,"_type":3603,"title":7304,"_source":4488,"_file":7305,"_stem":7306,"_extension":3603},"/portfolio/bitburger/_teaser","bitburger","Bitburger B2B- und Marken-Shops","Launch des B2B Shops und Migration der Markenshops auf eine neue Plattform","Die Bitburger Braugruppe modernisierte ihr digitales Angebot. Nach dem Start des B2B Shops wurden fünf Markenshops auf eine gemeinsame Plattform migriert und weiterentwickelt.","/images/portfolio/bitburger/Bitburger_HuW_Glaeser.jpg","Bitburger Braugruppe",[20,7302],"e-commerce","common:portfolio:900.bitburger:_teaser.yaml","Teaser","portfolio/900.bitburger/_teaser.yaml","portfolio/900.bitburger/_teaser",{"_path":7308,"_dir":7309,"_draft":6,"_partial":1420,"_locale":7,"name":7310,"slug":7309,"text":7311,"hoverText":7312,"image":7313,"customer":7314,"tags":7315,"_id":7316,"_type":3603,"title":7304,"_source":4488,"_file":7317,"_stem":7318,"_extension":3603},"/portfolio/purize/_teaser","purize","Purize Filters","E-Commerce für hochwertige Aktivkohlefilter","Wir unterstützen PURIZE® Filters mit einem vollständigen E-Commerce-Service inklusive Fulfillment-Lösung und Anbindung an Versanddienstleister. Unsere Expertise im Online-Handel ermöglicht dem Hersteller qualitativ hochwertiger Aktivkohlefilter \"Made in Germany\" eine reibungslose Abwicklung ihrer Bestellprozesse.","/images/portfolio/barcode-machine-verdandijpg.jpg","PURIZE® Filters",[20,7302],"common:portfolio:9000.purize:_teaser.yaml","portfolio/9000.purize/_teaser.yaml","portfolio/9000.purize/_teaser",{"_path":7320,"_dir":7321,"_draft":6,"_partial":1420,"_locale":7,"name":7322,"slug":7321,"text":7323,"hoverText":7324,"image":7325,"customer":7322,"tags":7326,"_id":7328,"_type":3603,"title":7304,"_source":4488,"_file":7329,"_stem":7330,"_extension":3603},"/portfolio/pixelx/_teaser","pixelx","PixelX","IT-Sicherheit mit Augenmaß und Sachverstand","Für PixelX haben wir eine gezielte Sicherheitsanalyse durchgeführt, bei der wir dank unseres tiefen technischen Verständnisses eine kritische Schwachstelle identifizieren konnten. Mit minimalem Zeitaufwand erzielten wir maximalen Sicherheitsgewinn.","/images/portfolio/pixelx/pixelx_secured.png",[7327,21],"security","common:portfolio:9010.pixelx:_teaser.yaml","portfolio/9010.pixelx/_teaser.yaml","portfolio/9010.pixelx/_teaser",{"_path":7332,"_dir":7333,"_draft":6,"_partial":1420,"_locale":7,"name":7334,"slug":7333,"text":7335,"hoverText":7336,"image":7337,"customer":7334,"tags":7338,"_id":7339,"_type":3603,"title":7304,"_source":4488,"_file":7340,"_stem":7341,"_extension":3603},"/portfolio/slimspots/_teaser","slimspots","SlimSpots","Große Datenmengen in Echtzeit verarbeiten","Für SlimSpots, einen weltweit agierenden Anbieter von Ad-Marketing-Lösungen, haben wir eine hochskalierbare Infrastruktur entwickelt, die die Verarbeitung von Billionen Datensätzen in Echtzeit ermöglicht.","/images/portfolio/slimspots/slim_spots_prtfolio.png",[4589,21],"common:portfolio:9020.slimspots:_teaser.yaml","portfolio/9020.slimspots/_teaser.yaml","portfolio/9020.slimspots/_teaser",1782284044841]