[{"data":1,"prerenderedAt":3924},["ShallowReactive",2],{"blog-current-shopware-renovate-bot-en":3,"blog-previous-shopware-renovate-bot-en":613,"blog-next-shopware-renovate-bot-en":629,"blog-alt-de-shopware-renovate-bot-en":640,"blog-alt-en-shopware-renovate-bot-en":642,"employee-robert-juzak":643,"content-query-9RJBkyXCE2":741,"content-query-TPh1lFGN9c":2250,"content-query-vhr2h3d1hs":3767,"content-query-KtO3wftRle":3839,"related-refs-shopware_devops--en":3874},{"_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":18,"body":21,"_type":607,"_id":608,"_source":609,"_file":610,"_stem":611,"_extension":612},"/en/blog/shopware-renovate-bot","blog",false,"","Configuring Renovate to properly handle Shopware packages","Shopware is using a custom versioning schema. To allow Renovate to automatically create PR's, we need to adjust the Renovate config","robert-juzak","/images/dev-ops-dark.svg","2025-09-08",[14,15],"What moves us","DevOps",[15,17],"Open Source",[19,20],"shopware","devops",{"type":22,"children":23,"toc":603},"root",[24,33,47,54,67,76,109,115,143,148,177,525,530,597],{"type":25,"tag":26,"props":27,"children":32},"element","img",{"alt":7,"aspect-ratio":28,"height":29,"object-fit":30,"src":31},"1.78",300,"fill","/blog/shopware-renovate.png",[],{"type":25,"tag":34,"props":35,"children":36},"p",{},[37,45],{"type":25,"tag":38,"props":39,"children":41},"a",{"href":40},"https://docs.renovatebot.com/",[42],{"type":43,"value":44},"text","Renovate",{"type":43,"value":46}," is a tool to track your project dependencies and create merge/pull request for them. It works perfectly for most common packages managers, but...",{"type":25,"tag":48,"props":49,"children":51},"h2",{"id":50},"shopware-versioning-scheme",[52],{"type":43,"value":53},"Shopware versioning scheme",{"type":25,"tag":34,"props":55,"children":56},{},[57,59,65],{"type":43,"value":58},"Shopware is using a custom versioning scheme. You can read the ",{"type":25,"tag":38,"props":60,"children":62},{"href":61},"https://www.shopware.com/en/news/shopware-6-versioning-strategy/",[63],{"type":43,"value":64},"official article",{"type":43,"value":66},", but in short:",{"type":25,"tag":68,"props":69,"children":70},"blockquote",{},[71],{"type":25,"tag":34,"props":72,"children":73},{},[74],{"type":43,"value":75},"Shopware implemented SemVer as  \"SemVer with benefits\".",{"type":25,"tag":68,"props":77,"children":78},{},[79,84,104],{"type":25,"tag":34,"props":80,"children":81},{},[82],{"type":43,"value":83},"A SemVer compliant version has three numbers: Major, Minor, and Patch. They are incremented following this ruleset:",{"type":25,"tag":85,"props":86,"children":87},"ul",{},[88,94,99],{"type":25,"tag":89,"props":90,"children":91},"li",{},[92],{"type":43,"value":93},"MAJOR: Incompatible API changes are made",{"type":25,"tag":89,"props":95,"children":96},{},[97],{"type":43,"value":98},"MINOR: Functionality is added in a backward-compatible manner",{"type":25,"tag":89,"props":100,"children":101},{},[102],{"type":43,"value":103},"PATCH: Backward-compatible bug fixes are made",{"type":25,"tag":34,"props":105,"children":106},{},[107],{"type":43,"value":108},"The \"with benefits\" part is: We keep the big marketing number. So Shopware 6 still is the product, but there's a Shopware 6.3.0.0. With 3.0.0 being the SemVer part.",{"type":25,"tag":48,"props":110,"children":112},{"id":111},"renovate-configuration",[113],{"type":43,"value":114},"Renovate configuration",{"type":25,"tag":34,"props":116,"children":117},{},[118,120,127,129,135,137],{"type":43,"value":119},"The ",{"type":25,"tag":121,"props":122,"children":124},"code",{"className":123},[],[125],{"type":43,"value":126},"\"big marketing number\"",{"type":43,"value":128}," or ",{"type":25,"tag":121,"props":130,"children":132},{"className":131},[],[133],{"type":43,"value":134},"\"generation\"",{"type":43,"value":136}," is reflected in Renovate as ",{"type":25,"tag":121,"props":138,"children":140},{"className":139},[],[141],{"type":43,"value":142},"compatibility",{"type":25,"tag":34,"props":144,"children":145},{},[146],{"type":43,"value":147},"The following configuration will:",{"type":25,"tag":149,"props":150,"children":151},"ol",{},[152,157,167,172],{"type":25,"tag":89,"props":153,"children":154},{},[155],{"type":43,"value":156},"Group all shopware specific updates",{"type":25,"tag":89,"props":158,"children":159},{},[160,162],{"type":43,"value":161},"Group the updates as ",{"type":25,"tag":121,"props":163,"children":165},{"className":164},[],[166],{"type":43,"value":19},{"type":25,"tag":89,"props":168,"children":169},{},[170],{"type":43,"value":171},"Tell Renovate how to extract the version",{"type":25,"tag":89,"props":173,"children":174},{},[175],{"type":43,"value":176},"Tell Renovate where to find changelog information",{"type":25,"tag":178,"props":179,"children":184},"pre",{"className":180,"code":181,"filename":182,"language":183,"meta":7,"style":7},"language-json shiki shiki-themes github-dark github-dark monokai","{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"packageRules\": [\n    {\n      \"description\": \"Follow Shopware version schema\",\n      \"matchDatasources\": [\n        \"packagist\"\n      ],\n      \"matchPackageNames\": [\n        \"shopware/core\",\n        \"shopware/administration\",\n        \"shopware/elasticsearch\",\n        \"shopware/storefront\"\n      ],\n      \"groupName\": \"shopware\",\n      \"versioning\": \"regex:(?\u003Ccompatibility>\\\\d+)\\\\.(?\u003Cmajor>\\\\d+)(\\\\.(?\u003Cminor>\\\\d+))?(\\\\.(?\u003Cpatch>\\\\d+))?$\",\n      \"sourceUrl\": \"https://github.com/shopware/shopware\"\n    }\n  ]\n}\n","renovate.json","json",[185],{"type":25,"tag":121,"props":186,"children":187},{"__ignoreMap":7},[188,200,226,240,249,271,284,293,302,315,328,341,354,363,371,393,480,498,507,516],{"type":25,"tag":189,"props":190,"children":193},"span",{"class":191,"line":192},"line",1,[194],{"type":25,"tag":189,"props":195,"children":197},{"style":196},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2",[198],{"type":43,"value":199},"{\n",{"type":25,"tag":189,"props":201,"children":203},{"class":191,"line":202},2,[204,210,215,221],{"type":25,"tag":189,"props":205,"children":207},{"style":206},"--shiki-default:#79B8FF;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic",[208],{"type":43,"value":209},"  \"$schema\"",{"type":25,"tag":189,"props":211,"children":212},{"style":196},[213],{"type":43,"value":214},": ",{"type":25,"tag":189,"props":216,"children":218},{"style":217},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2",[219],{"type":43,"value":220},"\"https://docs.renovatebot.com/renovate-schema.json\"",{"type":25,"tag":189,"props":222,"children":223},{"style":196},[224],{"type":43,"value":225},",\n",{"type":25,"tag":189,"props":227,"children":229},{"class":191,"line":228},3,[230,235],{"type":25,"tag":189,"props":231,"children":232},{"style":206},[233],{"type":43,"value":234},"  \"packageRules\"",{"type":25,"tag":189,"props":236,"children":237},{"style":196},[238],{"type":43,"value":239},": [\n",{"type":25,"tag":189,"props":241,"children":243},{"class":191,"line":242},4,[244],{"type":25,"tag":189,"props":245,"children":246},{"style":196},[247],{"type":43,"value":248},"    {\n",{"type":25,"tag":189,"props":250,"children":252},{"class":191,"line":251},5,[253,258,262,267],{"type":25,"tag":189,"props":254,"children":255},{"style":206},[256],{"type":43,"value":257},"      \"description\"",{"type":25,"tag":189,"props":259,"children":260},{"style":196},[261],{"type":43,"value":214},{"type":25,"tag":189,"props":263,"children":264},{"style":217},[265],{"type":43,"value":266},"\"Follow Shopware version schema\"",{"type":25,"tag":189,"props":268,"children":269},{"style":196},[270],{"type":43,"value":225},{"type":25,"tag":189,"props":272,"children":274},{"class":191,"line":273},6,[275,280],{"type":25,"tag":189,"props":276,"children":277},{"style":206},[278],{"type":43,"value":279},"      \"matchDatasources\"",{"type":25,"tag":189,"props":281,"children":282},{"style":196},[283],{"type":43,"value":239},{"type":25,"tag":189,"props":285,"children":287},{"class":191,"line":286},7,[288],{"type":25,"tag":189,"props":289,"children":290},{"style":217},[291],{"type":43,"value":292},"        \"packagist\"\n",{"type":25,"tag":189,"props":294,"children":296},{"class":191,"line":295},8,[297],{"type":25,"tag":189,"props":298,"children":299},{"style":196},[300],{"type":43,"value":301},"      ],\n",{"type":25,"tag":189,"props":303,"children":305},{"class":191,"line":304},9,[306,311],{"type":25,"tag":189,"props":307,"children":308},{"style":206},[309],{"type":43,"value":310},"      \"matchPackageNames\"",{"type":25,"tag":189,"props":312,"children":313},{"style":196},[314],{"type":43,"value":239},{"type":25,"tag":189,"props":316,"children":318},{"class":191,"line":317},10,[319,324],{"type":25,"tag":189,"props":320,"children":321},{"style":217},[322],{"type":43,"value":323},"        \"shopware/core\"",{"type":25,"tag":189,"props":325,"children":326},{"style":196},[327],{"type":43,"value":225},{"type":25,"tag":189,"props":329,"children":331},{"class":191,"line":330},11,[332,337],{"type":25,"tag":189,"props":333,"children":334},{"style":217},[335],{"type":43,"value":336},"        \"shopware/administration\"",{"type":25,"tag":189,"props":338,"children":339},{"style":196},[340],{"type":43,"value":225},{"type":25,"tag":189,"props":342,"children":344},{"class":191,"line":343},12,[345,350],{"type":25,"tag":189,"props":346,"children":347},{"style":217},[348],{"type":43,"value":349},"        \"shopware/elasticsearch\"",{"type":25,"tag":189,"props":351,"children":352},{"style":196},[353],{"type":43,"value":225},{"type":25,"tag":189,"props":355,"children":357},{"class":191,"line":356},13,[358],{"type":25,"tag":189,"props":359,"children":360},{"style":217},[361],{"type":43,"value":362},"        \"shopware/storefront\"\n",{"type":25,"tag":189,"props":364,"children":366},{"class":191,"line":365},14,[367],{"type":25,"tag":189,"props":368,"children":369},{"style":196},[370],{"type":43,"value":301},{"type":25,"tag":189,"props":372,"children":374},{"class":191,"line":373},15,[375,380,384,389],{"type":25,"tag":189,"props":376,"children":377},{"style":206},[378],{"type":43,"value":379},"      \"groupName\"",{"type":25,"tag":189,"props":381,"children":382},{"style":196},[383],{"type":43,"value":214},{"type":25,"tag":189,"props":385,"children":386},{"style":217},[387],{"type":43,"value":388},"\"shopware\"",{"type":25,"tag":189,"props":390,"children":391},{"style":196},[392],{"type":43,"value":225},{"type":25,"tag":189,"props":394,"children":396},{"class":191,"line":395},16,[397,402,406,411,417,422,426,431,435,440,444,449,453,458,462,467,471,476],{"type":25,"tag":189,"props":398,"children":399},{"style":206},[400],{"type":43,"value":401},"      \"versioning\"",{"type":25,"tag":189,"props":403,"children":404},{"style":196},[405],{"type":43,"value":214},{"type":25,"tag":189,"props":407,"children":408},{"style":217},[409],{"type":43,"value":410},"\"regex:(?\u003Ccompatibility>",{"type":25,"tag":189,"props":412,"children":414},{"style":413},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF",[415],{"type":43,"value":416},"\\\\",{"type":25,"tag":189,"props":418,"children":419},{"style":217},[420],{"type":43,"value":421},"d+)",{"type":25,"tag":189,"props":423,"children":424},{"style":413},[425],{"type":43,"value":416},{"type":25,"tag":189,"props":427,"children":428},{"style":217},[429],{"type":43,"value":430},".(?\u003Cmajor>",{"type":25,"tag":189,"props":432,"children":433},{"style":413},[434],{"type":43,"value":416},{"type":25,"tag":189,"props":436,"children":437},{"style":217},[438],{"type":43,"value":439},"d+)(",{"type":25,"tag":189,"props":441,"children":442},{"style":413},[443],{"type":43,"value":416},{"type":25,"tag":189,"props":445,"children":446},{"style":217},[447],{"type":43,"value":448},".(?\u003Cminor>",{"type":25,"tag":189,"props":450,"children":451},{"style":413},[452],{"type":43,"value":416},{"type":25,"tag":189,"props":454,"children":455},{"style":217},[456],{"type":43,"value":457},"d+))?(",{"type":25,"tag":189,"props":459,"children":460},{"style":413},[461],{"type":43,"value":416},{"type":25,"tag":189,"props":463,"children":464},{"style":217},[465],{"type":43,"value":466},".(?\u003Cpatch>",{"type":25,"tag":189,"props":468,"children":469},{"style":413},[470],{"type":43,"value":416},{"type":25,"tag":189,"props":472,"children":473},{"style":217},[474],{"type":43,"value":475},"d+))?$\"",{"type":25,"tag":189,"props":477,"children":478},{"style":196},[479],{"type":43,"value":225},{"type":25,"tag":189,"props":481,"children":483},{"class":191,"line":482},17,[484,489,493],{"type":25,"tag":189,"props":485,"children":486},{"style":206},[487],{"type":43,"value":488},"      \"sourceUrl\"",{"type":25,"tag":189,"props":490,"children":491},{"style":196},[492],{"type":43,"value":214},{"type":25,"tag":189,"props":494,"children":495},{"style":217},[496],{"type":43,"value":497},"\"https://github.com/shopware/shopware\"\n",{"type":25,"tag":189,"props":499,"children":501},{"class":191,"line":500},18,[502],{"type":25,"tag":189,"props":503,"children":504},{"style":196},[505],{"type":43,"value":506},"    }\n",{"type":25,"tag":189,"props":508,"children":510},{"class":191,"line":509},19,[511],{"type":25,"tag":189,"props":512,"children":513},{"style":196},[514],{"type":43,"value":515},"  ]\n",{"type":25,"tag":189,"props":517,"children":519},{"class":191,"line":518},20,[520],{"type":25,"tag":189,"props":521,"children":522},{"style":196},[523],{"type":43,"value":524},"}\n",{"type":25,"tag":34,"props":526,"children":527},{},[528],{"type":43,"value":529},"This should result in creation of following merge/pull requests",{"type":25,"tag":85,"props":531,"children":532},{},[533,568],{"type":25,"tag":89,"props":534,"children":535},{},[536,538,544,546,552,553,559,560,566],{"type":43,"value":537},"fix(deps): update shopware (",{"type":25,"tag":121,"props":539,"children":541},{"className":540},[],[542],{"type":43,"value":543},"shopware/administration",{"type":43,"value":545},", ",{"type":25,"tag":121,"props":547,"children":549},{"className":548},[],[550],{"type":43,"value":551},"shopware/core",{"type":43,"value":545},{"type":25,"tag":121,"props":554,"children":556},{"className":555},[],[557],{"type":43,"value":558},"shopware/elasticsearch",{"type":43,"value":545},{"type":25,"tag":121,"props":561,"children":563},{"className":562},[],[564],{"type":43,"value":565},"shopware/storefront",{"type":43,"value":567},")`",{"type":25,"tag":89,"props":569,"children":570},{},[571,573,578,579,584,585,590,591,596],{"type":43,"value":572},"fix(deps): update shopware to v7 (major) (",{"type":25,"tag":121,"props":574,"children":576},{"className":575},[],[577],{"type":43,"value":543},{"type":43,"value":545},{"type":25,"tag":121,"props":580,"children":582},{"className":581},[],[583],{"type":43,"value":551},{"type":43,"value":545},{"type":25,"tag":121,"props":586,"children":588},{"className":587},[],[589],{"type":43,"value":558},{"type":43,"value":545},{"type":25,"tag":121,"props":592,"children":594},{"className":593},[],[595],{"type":43,"value":565},{"type":43,"value":567},{"type":25,"tag":598,"props":599,"children":600},"style",{},[601],{"type":43,"value":602},"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":202,"depth":202,"links":604},[605,606],{"id":50,"depth":202,"text":53},{"id":111,"depth":202,"text":114},"markdown","common:en:blog:16.shopware-renovate-bot.md","common","en/blog/16.shopware-renovate-bot.md","en/blog/16.shopware-renovate-bot","md",{"_path":614,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":615,"description":616,"author":617,"image":618,"releaseDate":619,"blogCategories":620,"articleTags":622,"tags":624,"_type":607,"_id":626,"_source":609,"_file":627,"_stem":628,"_extension":612},"/en/blog/accessibility-legal-statement-template","Accessibility Statement (AS) – How to Implement the German Accessibility Strengthening Act and Avoid Potential Warnings","Accessibility Statement according to German BFSG: Template and guide for accessibility declarations. Protect yourself from warnings with our template for an individual Accessibility Strengthening Act. The provisions of the German Accessibility Strengthening Act must be implemented to avoid penalties. You can protect yourself from regulatory enforcement procedures by providing a detailed accessibility statement. You can find a commented template for this in this blog post.","jens-bornschein","/images/Accessibility.png","2025-09-05",[621],"What Moves Us",[623],"Accessibility",[625],"frontend","common:en:blog:15.accessibility-legal-statement-template.md","en/blog/15.accessibility-legal-statement-template.md","en/blog/15.accessibility-legal-statement-template",{"_path":630,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":631,"description":632,"author":10,"image":11,"releaseDate":633,"blogCategories":634,"articleTags":635,"tags":636,"_type":607,"_id":637,"_source":609,"_file":638,"_stem":639,"_extension":612},"/en/blog/gitops-docker-renovate","Software management with GitLab, Renovate Bot and Docker","Managing software on a server is not easy. Is it?","2025-10-30",[14,15],[15,17],[20],"common:en:blog:17.gitops-docker-renovate.md","en/blog/17.gitops-docker-renovate.md","en/blog/17.gitops-docker-renovate",{"_path":641},"/blog/shopware-renovate-bot",{"_path":4},{"_path":644,"_dir":645,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":646,"primaryTeam":648,"firstName":649,"lastName":650,"prefixTitle":7,"suffixTitle":651,"education":652,"role":657,"workingSince":662,"inTheCompanySince":663,"techSkills":664,"skills":703,"projects":721,"contactDetails":731,"_image":735,"image":736,"_id":737,"_type":183,"title":738,"_source":645,"_file":739,"_stem":740,"_extension":183},"/employees/robert-juzak","employees",[647,648],"appDev","devOps","Robert","Juzak","B.Sc.",[653],[654,655,656],"Bachelor of Computer Science","Technische Universität Breslau","2016",[658,659,660,661],"softwareDeveloper","fullstackDeveloper","admin","consultant","2015","2018",[665,669,671,674,677,680,682,685,688,692,695,697,700],{"name":666,"level":667,"icon":668},"Docker","expert","/images/Docker.svg",{"name":670,"level":667},"GitLab",{"name":672,"level":667,"icon":673},"Kubernetes","/images/Kubernetes.svg",{"name":675,"level":667,"icon":676},"PHPUnit","/images/PHP-Unit.svg",{"name":678,"level":667,"icon":679},"Portainer","/images/Portainer.svg",{"name":681,"level":667},"Sentry",{"name":683,"level":667,"icon":684},"Sonarqube","/images/Sonarqube.svg",{"name":686,"level":667,"icon":687},"Linux","/images/linux_os-mono.svg",{"name":689,"level":690,"icon":691},"CSS","advanced","/images/css.svg",{"name":693,"level":690,"icon":694},"HTML","/images/html.svg",{"name":696,"level":690},"PHP",{"name":698,"level":690,"icon":699},"SQL","/images/SQL.svg",{"name":701,"level":690,"icon":702},"VueJS","/images/vuejs.svg",[704,706,708,709,711,713,715,717,719],{"name":705,"level":667},"CI/CD",{"name":707,"level":667},"qualityAssurance",{"name":648,"level":667},{"name":710,"level":667},"testDrivenBugfix",{"name":712,"level":667},"testDrivenDevelopment",{"name":714,"level":690},"accessibility",{"name":716,"level":690},"databases",{"name":718,"level":690},"linuxServerAdministration",{"name":720,"level":690},"softwareArchitect",[722,727,729],{"project":723,"position":724},"Herole",[725,726],"Dev-Ops","Frontend Developer",{"project":728,"position":726},"Huawei-Calibration-aaS",{"project":730,"position":726},"Huawei-Inspect-3D",{"eMail":732,"phone":733,"visibility":734},"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":614,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":615,"description":616,"author":617,"image":618,"releaseDate":619,"blogCategories":742,"articleTags":743,"tags":744,"body":745,"_type":607,"_id":626,"_source":609,"_file":627,"_stem":628,"_extension":612},[621],[623],[625],{"type":22,"children":746,"toc":2237},[747,753,759,781,789,844,858,862,866,872,909,925,953,963,978,984,1034,1050,1130,1142,1151,1378,1390,1399,1512,1548,1570,1685,1696,1734,1764,1770,1788,1793,1874,1880,2097,2103,2119,2142,2157,2163,2173,2178,2185,2226,2232],{"type":25,"tag":26,"props":748,"children":752},{"alt":749,"aspect-ratio":750,"height":29,"object-fit":30,"src":751},"Fictional draft of a warning letter from the market surveillance authority with the description \"Non-compliance with accessibility requirements.\"","1.7","/blog/Abmahnung-Barrierefreiheitsstaerkungsgesetz.png",[],{"type":25,"tag":48,"props":754,"children":756},{"id":755},"accessibility-becomes-mandatory-what-the-german-accessibility-strengthening-act-means-for-digital-services-from-2025",[757],{"type":43,"value":758},"Accessibility Becomes Mandatory: What the German Accessibility Strengthening Act Means for Digital Services from 2025",{"type":25,"tag":34,"props":760,"children":761},{},[762,768,770,779],{"type":25,"tag":763,"props":764,"children":765},"strong",{},[766],{"type":43,"value":767},"Accessibility has been mandatory for many digital products and services since mid-2025.",{"type":43,"value":769},"\nWe already explained this in our article \"Accessibility Will Be a Recommendation – and a Requirement.\"\nBeyond technical implementation, it's important to note that an\n",{"type":25,"tag":38,"props":771,"children":773},{"href":772},"https://helmundwalter.de/blog/accessibility-will-be-recommended?utm_source=chatgpt.com",[774],{"type":25,"tag":763,"props":775,"children":776},{},[777],{"type":43,"value":778},"Accessibility Statement (AS)",{"type":43,"value":780},"\nis legally required, and incorrect formulation can lead to warnings or regulatory pressure.",{"type":25,"tag":34,"props":782,"children":783},{},[784],{"type":25,"tag":763,"props":785,"children":786},{},[787],{"type":43,"value":788},"Contents of this blog post:",{"type":25,"tag":85,"props":790,"children":791},{},[792,804,809,819,829,839],{"type":25,"tag":89,"props":793,"children":794},{},[795,797,802],{"type":43,"value":796},"Why an ",{"type":25,"tag":763,"props":798,"children":799},{},[800],{"type":43,"value":801},"Accessibility Statement according to BFSG",{"type":43,"value":803}," is legally required",{"type":25,"tag":89,"props":805,"children":806},{},[807],{"type":43,"value":808},"What this statement must contain",{"type":25,"tag":89,"props":810,"children":811},{},[812,817],{"type":25,"tag":763,"props":813,"children":814},{},[815],{"type":43,"value":816},"A proposal for a possible accessibility statement",{"type":43,"value":818}," / AS",{"type":25,"tag":89,"props":820,"children":821},{},[822,824],{"type":43,"value":823},"Brief explanation of where you should ",{"type":25,"tag":763,"props":825,"children":826},{},[827],{"type":43,"value":828},"customize the statement individually and truthfully to your service",{"type":25,"tag":89,"props":830,"children":831},{},[832,837],{"type":25,"tag":763,"props":833,"children":834},{},[835],{"type":43,"value":836},"Our experience with legal consultation",{"type":43,"value":838}," on formulation",{"type":25,"tag":89,"props":840,"children":841},{},[842],{"type":43,"value":843},"What consequences non-compliance may have",{"type":25,"tag":189,"props":845,"children":848},{"className":846},[847],"text-right",[849],{"type":25,"tag":34,"props":850,"children":851},{},[852],{"type":25,"tag":853,"props":854,"children":855},"em",{},[856],{"type":43,"value":857},"Reading time: approx. 15 minutes",{"type":25,"tag":859,"props":860,"children":861},"br",{},[],{"type":25,"tag":863,"props":864,"children":865},"hr",{},[],{"type":25,"tag":48,"props":867,"children":869},{"id":868},"what-is-the-bfsg-and-accessibility-statement-about",[870],{"type":43,"value":871},"What is the BFSG and Accessibility Statement About?",{"type":25,"tag":34,"props":873,"children":874},{},[875,876,882,884,893,895,900,902,907],{"type":43,"value":119},{"type":25,"tag":38,"props":877,"children":879},{"href":878},"https://bfsg-gesetz.de",[880],{"type":43,"value":881},"German Accessibility Strengthening Act (BFSG)",{"type":43,"value":883}," requires digital offerings such as online shops, banking apps, or booking portals to be accessibly designed since June 28, 2025.\nThis follows the EU-wide ",{"type":25,"tag":38,"props":885,"children":887},{"href":886},"https://commission.europa.eu/strategy-and-policy/policies/justice-and-fundamental-rights/disability/union-equality-strategy-rights-persons-disabilities-2021-2030/european-accessibility-act_en",[888],{"type":25,"tag":763,"props":889,"children":890},{},[891],{"type":43,"value":892},"European Accessibility Act (EAA)",{"type":43,"value":894}," and the ",{"type":25,"tag":763,"props":896,"children":897},{},[898],{"type":43,"value":899},"EN 301 549 standard",{"type":43,"value":901},", which usually defines ",{"type":25,"tag":763,"props":903,"children":904},{},[905],{"type":43,"value":906},"WCAG 2.1 AA",{"type":43,"value":908}," as the technical target. Micro-enterprises with fewer than 10 employees and less than\n2 million € annual turnover are exempt.",{"type":25,"tag":34,"props":910,"children":911},{},[912,914,923],{"type":43,"value":913},"According to ",{"type":25,"tag":38,"props":915,"children":917},{"href":916},"https://bfsg-gesetz.de/anlage-3/",[918],{"type":25,"tag":763,"props":919,"children":920},{},[921],{"type":43,"value":922},"§ 14 BFSG and Annex 3",{"type":43,"value":924},", providers must publish an accessibility statement that contains the following points:",{"type":25,"tag":85,"props":926,"children":927},{},[928,933,938,943,948],{"type":25,"tag":89,"props":929,"children":930},{},[931],{"type":43,"value":932},"General description of the digital service",{"type":25,"tag":89,"props":934,"children":935},{},[936],{"type":43,"value":937},"Compliance status of accessibility requirements (e.g., WCAG, EN 301 549)",{"type":25,"tag":89,"props":939,"children":940},{},[941],{"type":43,"value":942},"Contact options of the service provider for feedback on barriers",{"type":25,"tag":89,"props":944,"children":945},{},[946],{"type":43,"value":947},"Market surveillance authority as the responsible control body",{"type":25,"tag":89,"props":949,"children":950},{},[951],{"type":43,"value":952},"Optional information: Date of last review, review methodology, feedback mechanism",{"type":25,"tag":34,"props":954,"children":955},{},[956,961],{"type":25,"tag":763,"props":957,"children":958},{},[959],{"type":43,"value":960},"There is no official template for the accessibility statement.",{"type":43,"value":962},"\nTo our current knowledge, none is planned either.",{"type":25,"tag":34,"props":964,"children":965},{},[966],{"type":25,"tag":763,"props":967,"children":968},{},[969,971,976],{"type":43,"value":970},"Therefore, we will discuss below what such an\n",{"type":25,"tag":853,"props":972,"children":973},{},[974],{"type":43,"value":975},"Accessibility Statement",{"type":43,"value":977}," could look like.",{"type":25,"tag":48,"props":979,"children":981},{"id":980},"our-template-for-your-as",[982],{"type":43,"value":983},"Our Template for Your AS",{"type":25,"tag":985,"props":986,"children":990},"div",{"className":987},[988,989],"doc-sheet","doc-sheet__border-top",[991],{"type":25,"tag":985,"props":992,"children":995},{"className":993},[994],"doc-sheet__section",[996,1003,1028],{"type":25,"tag":997,"props":998,"children":1000},"h1",{"id":999},"accessibility-information",[1001],{"type":43,"value":1002},"Accessibility Information",{"type":25,"tag":34,"props":1004,"children":1005},{},[1006,1008,1012,1014,1019,1021,1026],{"type":43,"value":1007},"We commit to implementing the requirements of the ",{"type":25,"tag":763,"props":1009,"children":1010},{},[1011],{"type":43,"value":881},{"type":43,"value":1013}," as well as the underlying ",{"type":25,"tag":763,"props":1015,"children":1016},{},[1017],{"type":43,"value":1018},"EU Directive (EU) 2019/882 on accessibility requirements for products and services",{"type":43,"value":1020},". Our goal is to design our digital offerings – especially web applications and online services – so that they are ",{"type":25,"tag":763,"props":1022,"children":1023},{},[1024],{"type":43,"value":1025},"accessibly available",{"type":43,"value":1027}," to all people, regardless of individual abilities or technical assistive devices.",{"type":25,"tag":48,"props":1029,"children":1031},{"id":1030},"service-description",[1032],{"type":43,"value":1033},"Service Description",{"type":25,"tag":985,"props":1035,"children":1044},{"className":1036},[1037,1038,1039,1040,1041,1042,1043],"mt-8","mb-5","pl-0","pr-0","pt-5","pb-5","pa-sm-5",[1045],{"type":25,"tag":34,"props":1046,"children":1047},{},[1048],{"type":43,"value":1049},"You must individually adapt this part to your digital service.\nWe have provided an example for a classic online shop at this point.",{"type":25,"tag":985,"props":1051,"children":1054},{"className":1052},[988,1053],"doc-sheet__border-sides",[1055],{"type":25,"tag":985,"props":1056,"children":1058},{"className":1057},[994],[1059,1071,1111],{"type":25,"tag":34,"props":1060,"children":1061},{},[1062,1064,1069],{"type":43,"value":1063},"Our online shop enables users to\n",{"type":25,"tag":763,"props":1065,"children":1066},{},[1067],{"type":43,"value":1068},"obtain information about products, digitally select and purchase products",{"type":43,"value":1070},".\nThe goods are each offered on their own product page with description, price, and\npossibly available variants such as size or color.",{"type":25,"tag":34,"props":1072,"children":1073},{},[1074,1076,1081,1083,1088,1090,1095,1097,1102,1104,1109],{"type":43,"value":1075},"The desired products can be added to a ",{"type":25,"tag":763,"props":1077,"children":1078},{},[1079],{"type":43,"value":1080},"virtual shopping cart",{"type":43,"value":1082},".\nAfter selecting all items, the ordering process leads through the ",{"type":25,"tag":763,"props":1084,"children":1085},{},[1086],{"type":43,"value":1087},"checkout area",{"type":43,"value":1089},",\nwhere a ",{"type":25,"tag":763,"props":1091,"children":1092},{},[1093],{"type":43,"value":1094},"delivery address",{"type":43,"value":1096}," and possibly different ",{"type":25,"tag":763,"props":1098,"children":1099},{},[1100],{"type":43,"value":1101},"billing address",{"type":43,"value":1103},"\nmust be entered, and a ",{"type":25,"tag":763,"props":1105,"children":1106},{},[1107],{"type":43,"value":1108},"payment method",{"type":43,"value":1110}," must be selected.",{"type":25,"tag":34,"props":1112,"children":1113},{},[1114,1116,1121,1123,1128],{"type":43,"value":1115},"After successful ordering,\n",{"type":25,"tag":763,"props":1117,"children":1118},{},[1119],{"type":43,"value":1120},"order confirmation and shipping confirmations are sent via email",{"type":43,"value":1122}," to the email address\nprovided during ordering.\n",{"type":25,"tag":763,"props":1124,"children":1125},{},[1126],{"type":43,"value":1127},"Redirection to third-party services",{"type":43,"value":1129}," for processing payments may occur.\nWe have limited influence on the design and technical execution of these services.",{"type":25,"tag":189,"props":1131,"children":1133},{"className":1132},[847],[1134],{"type":25,"tag":34,"props":1135,"children":1136},{},[1137],{"type":25,"tag":853,"props":1138,"children":1139},{},[1140],{"type":43,"value":1141},"Adapt to individual service",{"type":25,"tag":985,"props":1143,"children":1145},{"className":1144},[1037,1038,1039,1040,1041,1042,1043],[1146],{"type":25,"tag":34,"props":1147,"children":1148},{},[1149],{"type":43,"value":1150},"You don't necessarily need to provide the following part.\nHowever, it clarifies your previous efforts and measures, as well as your commitment\nin the area of accessibility, and offers a point of contact beyond the\nmarket surveillance authority.",{"type":25,"tag":985,"props":1152,"children":1154},{"className":1153},[988,1053],[1155],{"type":25,"tag":985,"props":1156,"children":1158},{"className":1157},[994],[1159,1165,1177,1189,1228,1240,1247,1286,1292,1304,1312,1352],{"type":25,"tag":48,"props":1160,"children":1162},{"id":1161},"accessibility-status",[1163],{"type":43,"value":1164},"Accessibility Status",{"type":25,"tag":34,"props":1166,"children":1167},{},[1168,1170,1175],{"type":43,"value":1169},"Our website and digital services are continuously adapted to applicable\n",{"type":25,"tag":763,"props":1171,"children":1172},{},[1173],{"type":43,"value":1174},"accessibility standards (e.g., WCAG 2.1 AA and EN 301 549)",{"type":43,"value":1176},".\nWe actively pursue the goal of identifying, reducing, and ultimately completely eliminating existing barriers.",{"type":25,"tag":34,"props":1178,"children":1179},{},[1180,1182,1187],{"type":43,"value":1181},"Despite all care, ",{"type":25,"tag":763,"props":1183,"children":1184},{},[1185],{"type":43,"value":1186},"temporary or partial barriers",{"type":43,"value":1188}," may occur in individual cases.\nThis can particularly happen:",{"type":25,"tag":85,"props":1190,"children":1191},{},[1192,1204,1216],{"type":25,"tag":89,"props":1193,"children":1194},{},[1195,1197,1202],{"type":43,"value":1196},"due to ongoing ",{"type":25,"tag":763,"props":1198,"children":1199},{},[1200],{"type":43,"value":1201},"editorial or technical revisions",{"type":43,"value":1203}," of individual content and pages,",{"type":25,"tag":89,"props":1205,"children":1206},{},[1207,1209,1214],{"type":43,"value":1208},"due to ",{"type":25,"tag":763,"props":1210,"children":1211},{},[1212],{"type":43,"value":1213},"different interpretations",{"type":43,"value":1215}," of technical accessibility requirements,",{"type":25,"tag":89,"props":1217,"children":1218},{},[1219,1221,1226],{"type":43,"value":1220},"or with ",{"type":25,"tag":763,"props":1222,"children":1223},{},[1224],{"type":43,"value":1225},"complex functionalities",{"type":43,"value":1227}," for which no completely accessible solution is yet available.",{"type":25,"tag":34,"props":1229,"children":1230},{},[1231,1233,1238],{"type":43,"value":1232},"We continuously work to identify such deviations and\ndevelop solutions to enable all users ",{"type":25,"tag":763,"props":1234,"children":1235},{},[1236],{"type":43,"value":1237},"low-threshold and equivalent access",{"type":43,"value":1239},".",{"type":25,"tag":1241,"props":1242,"children":1244},"h3",{"id":1243},"last-review",[1245],{"type":43,"value":1246},"Last Review",{"type":25,"tag":34,"props":1248,"children":1249},{},[1250,1252,1257,1259,1264,1266,1271,1273,1277,1279,1284],{"type":43,"value":1251},"The last exemplary accessibility review took place on ",{"type":25,"tag":853,"props":1253,"children":1254},{},[1255],{"type":43,"value":1256},"[Date of last review]",{"type":43,"value":1258},"\nby ",{"type":25,"tag":853,"props":1260,"children":1261},{},[1262],{"type":43,"value":1263},"[Enter company – an external company is better here]",{"type":43,"value":1265},".\nA ",{"type":25,"tag":763,"props":1267,"children":1268},{},[1269],{"type":43,"value":1270},"selection of representative pages and functions",{"type":43,"value":1272}," was examined for compliance\nwith the requirements of ",{"type":25,"tag":763,"props":1274,"children":1275},{},[1276],{"type":43,"value":906},{"type":43,"value":1278}," and ",{"type":25,"tag":763,"props":1280,"children":1281},{},[1282],{"type":43,"value":1283},"EN 301 549",{"type":43,"value":1285},".\nNot all content or pages were individually tested.\nThe selection was based on usage frequency and central functionalities\nof our online offering.",{"type":25,"tag":48,"props":1287,"children":1289},{"id":1288},"feedback-and-contact",[1290],{"type":43,"value":1291},"Feedback and Contact",{"type":25,"tag":34,"props":1293,"children":1294},{},[1295,1297,1302],{"type":43,"value":1296},"Should you notice ",{"type":25,"tag":763,"props":1298,"children":1299},{},[1300],{"type":43,"value":1301},"barriers",{"type":43,"value":1303}," when visiting our digital offerings,\nwe ask you to inform us.\nEvery hint helps us better understand existing weaknesses and improve them in a targeted manner.",{"type":25,"tag":34,"props":1305,"children":1306},{},[1307],{"type":25,"tag":763,"props":1308,"children":1309},{},[1310],{"type":43,"value":1311},"Contact for accessibility feedback:",{"type":25,"tag":34,"props":1313,"children":1314},{},[1315,1320,1323,1328,1331,1336,1339,1344,1347],{"type":25,"tag":853,"props":1316,"children":1317},{},[1318],{"type":43,"value":1319},"[Name or department]",{"type":25,"tag":859,"props":1321,"children":1322},{},[],{"type":25,"tag":853,"props":1324,"children":1325},{},[1326],{"type":43,"value":1327},"[Company]",{"type":25,"tag":859,"props":1329,"children":1330},{},[],{"type":25,"tag":853,"props":1332,"children":1333},{},[1334],{"type":43,"value":1335},"[Address, optional]",{"type":25,"tag":859,"props":1337,"children":1338},{},[],{"type":25,"tag":853,"props":1340,"children":1341},{},[1342],{"type":43,"value":1343},"[Email address]",{"type":25,"tag":859,"props":1345,"children":1346},{},[],{"type":25,"tag":853,"props":1348,"children":1349},{},[1350],{"type":43,"value":1351},"[Phone number, optional]",{"type":25,"tag":34,"props":1353,"children":1354},{},[1355,1357,1362,1364,1369,1371,1376],{"type":43,"value":1356},"We assure you that we will ",{"type":25,"tag":763,"props":1358,"children":1359},{},[1360],{"type":43,"value":1361},"editorially and technically review",{"type":43,"value":1363}," incoming feedback as quickly as possible and, if possible, ",{"type":25,"tag":763,"props":1365,"children":1366},{},[1367],{"type":43,"value":1368},"remedy",{"type":43,"value":1370}," it within a reasonable timeframe.\nShould a short-term technical solution not be possible, we will work with you to find ",{"type":25,"tag":763,"props":1372,"children":1373},{},[1374],{"type":43,"value":1375},"alternative access routes or supporting measures",{"type":43,"value":1377}," to still enable you to use the service.",{"type":25,"tag":189,"props":1379,"children":1381},{"className":1380},[847],[1382],{"type":25,"tag":34,"props":1383,"children":1384},{},[1385],{"type":25,"tag":853,"props":1386,"children":1387},{},[1388],{"type":43,"value":1389},"optional",{"type":25,"tag":985,"props":1391,"children":1393},{"className":1392},[1037,1038,1039,1040,1041,1042,1043],[1394],{"type":25,"tag":34,"props":1395,"children":1396},{},[1397],{"type":43,"value":1398},"The following part is important again, as the market surveillance authority must be named here\nand you should refer to the currently valid Terms and Conditions, which may close possible gaps in the\ndescription of the service or product.",{"type":25,"tag":985,"props":1400,"children":1402},{"className":1401},[988,1053],[1403],{"type":25,"tag":985,"props":1404,"children":1406},{"className":1405},[994],[1407,1413,1430,1449,1454,1465,1471,1476],{"type":25,"tag":48,"props":1408,"children":1410},{"id":1409},"additional-information",[1411],{"type":43,"value":1412},"Additional Information",{"type":25,"tag":34,"props":1414,"children":1415},{},[1416,1418,1423,1425],{"type":43,"value":1417},"Please note that the use of our digital services and all associated\nfunctions is additionally subject to our ",{"type":25,"tag":763,"props":1419,"children":1420},{},[1421],{"type":43,"value":1422},"General Terms and Conditions (GTC)",{"type":43,"value":1424},".\nThese GTC regulate, among other things, contract conclusion, payment processing, and\ndelivery. In case of contradictions or deviations, the GTC in their\ncurrent version apply, insofar as they do not restrict or override accessibility requirements.\nAn accessible version of our GTC is available here: ",{"type":25,"tag":853,"props":1426,"children":1427},{},[1428],{"type":43,"value":1429},"[Link to GTC]",{"type":25,"tag":34,"props":1431,"children":1432},{},[1433,1435,1440,1442,1447],{"type":43,"value":1434},"We understand accessibility not as a one-time measure, but as an\n",{"type":25,"tag":763,"props":1436,"children":1437},{},[1438],{"type":43,"value":1439},"ongoing process",{"type":43,"value":1441},". Therefore, our content and systems are regularly reviewed\nand revised. In individual cases, this may temporarily lead to\n",{"type":25,"tag":763,"props":1443,"children":1444},{},[1445],{"type":43,"value":1446},"limitations in accessibility",{"type":43,"value":1448},". We ask for your understanding.",{"type":25,"tag":34,"props":1450,"children":1451},{},[1452],{"type":43,"value":1453},"For further information on the German Accessibility Strengthening Act, we refer to\nthe responsible national enforcement agency:",{"type":25,"tag":34,"props":1455,"children":1456},{},[1457,1463],{"type":25,"tag":38,"props":1458,"children":1460},{"href":1459},"https://www.bundesfachstelle-barrierefreiheit.de",[1461],{"type":43,"value":1462},"German Federal Agency for Accessibility",{"type":43,"value":1464}," (Operated by: Knappschaft-Bahn-See)",{"type":25,"tag":1241,"props":1466,"children":1468},{"id":1467},"responsible-market-surveillance-authority",[1469],{"type":43,"value":1470},"Responsible Market Surveillance Authority",{"type":25,"tag":34,"props":1472,"children":1473},{},[1474],{"type":43,"value":1475},"Market Surveillance Authority of the States for Accessibility of Products and\nServices (MLBF) in Magdeburg, Saxony-Anhalt.",{"type":25,"tag":34,"props":1477,"children":1478},{},[1479,1484,1487,1489,1492,1494,1497,1499,1502,1505,1507,1510],{"type":25,"tag":763,"props":1480,"children":1481},{},[1482],{"type":43,"value":1483},"MLBF (under establishment)",{"type":25,"tag":859,"props":1485,"children":1486},{},[],{"type":43,"value":1488},"\nc/o Ministry of Labor, Social Affairs, Health and Equal Opportunities Saxony-Anhalt",{"type":25,"tag":859,"props":1490,"children":1491},{},[],{"type":43,"value":1493},"\nP.O. Box 39 11 55",{"type":25,"tag":859,"props":1495,"children":1496},{},[],{"type":43,"value":1498},"\n39135 Magdeburg",{"type":25,"tag":859,"props":1500,"children":1501},{},[],{"type":25,"tag":859,"props":1503,"children":1504},{},[],{"type":43,"value":1506},"\nPhone: 0391 567 6970",{"type":25,"tag":859,"props":1508,"children":1509},{},[],{"type":43,"value":1511},"\nEmail: MLBF(at)ms.sachsen-anhalt.de.",{"type":25,"tag":985,"props":1513,"children":1518},{"className":1514},[1515,1516,1517],"hint","hint--warning","mt-5",[1519],{"type":25,"tag":34,"props":1520,"children":1521},{},[1522,1527,1530,1532,1539,1541,1546],{"type":25,"tag":763,"props":1523,"children":1524},{},[1525],{"type":43,"value":1526},"Note:",{"type":25,"tag":859,"props":1528,"children":1529},{},[],{"type":43,"value":1531},"\nAccording to ",{"type":25,"tag":853,"props":1533,"children":1534},{},[1535],{"type":25,"tag":38,"props":1536,"children":1537},{"href":916},[1538],{"type":43,"value":916},{"type":43,"value":1540}," §1 c,\n\"",{"type":25,"tag":853,"props":1542,"children":1543},{},[1544],{"type":43,"value":1545},"a description of how the service fulfills the relevant accessibility requirements\nlisted in the regulation to be issued pursuant to §3 paragraph 2;",{"type":43,"value":1547},"\"\nshould be included – i.e., a precise description of how the service was designed to be accessible.",{"type":25,"tag":985,"props":1549,"children":1553},{"className":1550},[1551,1038,1039,1040,1041,1042,1043,1552],"mt-0","pt-0",[1554,1560,1565],{"type":25,"tag":1241,"props":1555,"children":1557},{"id":1556},"example-of-a-description-of-concrete-measures",[1558],{"type":43,"value":1559},"Example of a Description of Concrete Measures",{"type":25,"tag":34,"props":1561,"children":1562},{},[1563],{"type":43,"value":1564},"Below is an example of concrete measures as we typically provide and implement\nas an agency for our clients in projects.",{"type":25,"tag":34,"props":1566,"children":1567},{},[1568],{"type":43,"value":1569},"These measures would need to be truthfully and individually adapted to your measures.",{"type":25,"tag":985,"props":1571,"children":1574},{"className":1572},[988,1573],"doc-sheet__border-bottom",[1575],{"type":25,"tag":985,"props":1576,"children":1578},{"className":1577},[994],[1579,1585,1590,1596,1601,1607,1612,1618,1623,1629,1634,1640,1645,1651,1656,1662,1680],{"type":25,"tag":48,"props":1580,"children":1582},{"id":1581},"concrete-implementation-of-accessibility-requirements",[1583],{"type":43,"value":1584},"Concrete Implementation of Accessibility Requirements",{"type":25,"tag":34,"props":1586,"children":1587},{},[1588],{"type":43,"value":1589},"To fulfill legal accessibility requirements, the following technical\nand design measures have been implemented:",{"type":25,"tag":1241,"props":1591,"children":1593},{"id":1592},"technical-structure-and-semantics",[1594],{"type":43,"value":1595},"Technical Structure and Semantics",{"type":25,"tag":34,"props":1597,"children":1598},{},[1599],{"type":43,"value":1600},"The HTML structures of our website correspond to the semantic purpose of the respective\ncontent and interaction elements. Additionally, ARIA markups were used to make complex\nfunctionalities and their status accessible to assistive technologies.",{"type":25,"tag":1241,"props":1602,"children":1604},{"id":1603},"content-design-and-editorial-measures",[1605],{"type":43,"value":1606},"Content Design and Editorial Measures",{"type":25,"tag":34,"props":1608,"children":1609},{},[1610],{"type":43,"value":1611},"Editorially responsible persons have been trained in the correct use of text structures\nand hierarchical heading levels. When creating content, attention is paid to\nclear, understandable language. Complex matters are presented in a structured manner\nand organized with subheadings. Link texts are meaningfully formulated and clearly\ndescribe the destination of the link. Lists and other structuring HTML elements are\nstrategically used to clarify content structure. Tables are provided with appropriate\nheadings and descriptions to make their content and structure understandable.",{"type":25,"tag":1241,"props":1613,"children":1615},{"id":1614},"visual-design-and-responsive-design",[1616],{"type":43,"value":1617},"Visual Design and Responsive Design",{"type":25,"tag":34,"props":1619,"children":1620},{},[1621],{"type":43,"value":1622},"In color design, attention was paid to high-contrast presentation according to\nWCAG Level AA. Information is not conveyed exclusively through visual\nproperties such as color, shape, or position, but supplemented by additional\ntextual or structural hints. The website is responsively designed\nand usable on various output devices. Text size can be adjusted using browser zoom\nto at least 200% without loss of functionality. Navigation and\ncontrol elements are consistently designed and positioned in comparable locations.",{"type":25,"tag":1241,"props":1624,"children":1626},{"id":1625},"text-alternatives-media-and-time-based-content",[1627],{"type":43,"value":1628},"Text Alternatives, Media and Time-based Content",{"type":25,"tag":34,"props":1630,"children":1631},{},[1632],{"type":43,"value":1633},"Provisions have been made for all images and graphics so that users can\ncreate meaningful alternative texts when creating content or mark pure\ndecorative graphics with empty alternative texts.\nVideo content, insofar as it is under our control, is provided with subtitles.\nTime-controlled displays or automatic notifications have been avoided.\nIf such elements are necessary for functional reasons, they can be paused and\ncontrolled by users.\nContent that might require attention does not blink or flash.",{"type":25,"tag":1241,"props":1635,"children":1637},{"id":1636},"navigation-and-operation",[1638],{"type":43,"value":1639},"Navigation and Operation",{"type":25,"tag":34,"props":1641,"children":1642},{},[1643],{"type":43,"value":1644},"The website is fully keyboard operable. The keyboard focus is always clearly\nvisible and follows a logical order corresponding to the page structure.\nUnnecessary focus movement within a page as well as unintended\nreset when reloading pages are avoided to prevent context and\norientation loss.",{"type":25,"tag":1241,"props":1646,"children":1648},{"id":1647},"forms-and-input",[1649],{"type":43,"value":1650},"Forms and Input",{"type":25,"tag":34,"props":1652,"children":1653},{},[1654],{"type":43,"value":1655},"In all forms, clear label assignments to the corresponding form and\ncontrol elements are provided.\nError and status messages are presented clearly and accessibly\nto facilitate operation and understanding of inputs.",{"type":25,"tag":1241,"props":1657,"children":1659},{"id":1658},"additional-measures",[1660],{"type":43,"value":1661},"Additional Measures",{"type":25,"tag":85,"props":1663,"children":1664},{},[1665,1670,1675],{"type":25,"tag":89,"props":1666,"children":1667},{},[1668],{"type":43,"value":1669},"Automatic page redirections without user interaction have been avoided.",{"type":25,"tag":89,"props":1671,"children":1672},{},[1673],{"type":43,"value":1674},"Click and touch targets have sufficient minimum size for easy operation.",{"type":25,"tag":89,"props":1676,"children":1677},{},[1678],{"type":43,"value":1679},"In linear navigation through assistive technologies, content follows a meaningful and understandable order.",{"type":25,"tag":34,"props":1681,"children":1682},{},[1683],{"type":43,"value":1684},"These measures ensure a high degree of compatibility with common assistive\ntechnologies and enable equivalent use of our digital services for\npeople with different abilities.",{"type":25,"tag":189,"props":1686,"children":1688},{"className":1687},[847],[1689],{"type":25,"tag":34,"props":1690,"children":1691},{},[1692],{"type":25,"tag":853,"props":1693,"children":1694},{},[1695],{"type":43,"value":1141},{"type":25,"tag":985,"props":1697,"children":1700},{"className":1698},[1515,1699],"hint--info",[1701,1707,1718],{"type":25,"tag":48,"props":1702,"children":1704},{"id":1703},"possible-short-version",[1705],{"type":43,"value":1706},"Possible Short Version:",{"type":25,"tag":34,"props":1708,"children":1709},{},[1710,1712,1716],{"type":43,"value":1711},"We design our digital offerings according to the\n",{"type":25,"tag":763,"props":1713,"children":1714},{},[1715],{"type":43,"value":881},{"type":43,"value":1717}," and applicable standards\n(e.g., WCAG 2.1 AA) to be accessible and continuously expand this accessibility.",{"type":25,"tag":34,"props":1719,"children":1720},{},[1721,1722,1727,1729],{"type":43,"value":1181},{"type":25,"tag":763,"props":1723,"children":1724},{},[1725],{"type":43,"value":1726},"temporary or technical limitations",{"type":43,"value":1728}," may occasionally occur.\nWe welcome feedback on barriers and strive for quick\nsolutions. ",{"type":25,"tag":853,"props":1730,"children":1731},{},[1732],{"type":43,"value":1733},"[Here's the link to complete accessibility information](LINK)",{"type":25,"tag":985,"props":1735,"children":1737},{"className":1736},[1515,1516],[1738,1750],{"type":25,"tag":34,"props":1739,"children":1740},{},[1741,1745,1748],{"type":25,"tag":763,"props":1742,"children":1743},{},[1744],{"type":43,"value":1526},{"type":25,"tag":859,"props":1746,"children":1747},{},[],{"type":43,"value":1749},"\nDo not incorporate the AS/IBE into the GTC, as this might influence other\n\"legal transactions.\"\nInstead, place an individual \"Accessibility\" link in the footer\nthat refers to the \"Accessibility Information\" as a standalone page.",{"type":25,"tag":68,"props":1751,"children":1752},{},[1753],{"type":25,"tag":34,"props":1754,"children":1755},{},[1756,1758,1763],{"type":43,"value":1757},"\"",{"type":25,"tag":853,"props":1759,"children":1760},{},[1761],{"type":43,"value":1762},"The service provider indicates in relation to their service within the meaning of\n§ 1 paragraph 3 in their General Terms and Conditions or in another\nclearly perceptible way how they fulfill the accessibility requirements of\nthe regulation to be issued pursuant to § 3 paragraph 2.",{"type":43,"value":1757},{"type":25,"tag":48,"props":1765,"children":1767},{"id":1766},"our-experience-with-legal-consultation-on-this-topic",[1768],{"type":43,"value":1769},"Our Experience with Legal Consultation on This Topic",{"type":25,"tag":34,"props":1771,"children":1772},{},[1773,1775,1780,1781,1786],{"type":43,"value":1774},"It should be noted that among the legal advisors we have had contact with over time on this topic, there has been some discourse regarding the implementation of the measures described in the law. The distinction between a ",{"type":25,"tag":853,"props":1776,"children":1777},{},[1778],{"type":43,"value":1779},"narrow",{"type":43,"value":1278},{"type":25,"tag":853,"props":1782,"children":1783},{},[1784],{"type":43,"value":1785},"broad",{"type":43,"value":1787}," interpretation of accessibility requirements is primarily the starting point for the required level of detail and depth of described measures.",{"type":25,"tag":34,"props":1789,"children":1790},{},[1791],{"type":43,"value":1792},"Many law firms dealing with digital accessibility recommend:",{"type":25,"tag":85,"props":1794,"children":1795},{},[1796,1820,1831,1854,1864],{"type":25,"tag":89,"props":1797,"children":1798},{},[1799,1804,1806,1811,1813,1818],{"type":25,"tag":763,"props":1800,"children":1801},{},[1802],{"type":43,"value":1803},"Not integrating",{"type":43,"value":1805}," the AS ",{"type":25,"tag":763,"props":1807,"children":1808},{},[1809],{"type":43,"value":1810},"into the GTC",{"type":43,"value":1812},", but maintaining it as a ",{"type":25,"tag":763,"props":1814,"children":1815},{},[1816],{"type":43,"value":1817},"standalone, easily findable page",{"type":43,"value":1819}," – such as under /accessibility and then linking it in the website footer.",{"type":25,"tag":89,"props":1821,"children":1822},{},[1823,1824,1829],{"type":43,"value":119},{"type":25,"tag":763,"props":1825,"children":1826},{},[1827],{"type":43,"value":1828},"AS must explicitly refer to the GTC",{"type":43,"value":1830}," (e.g., to close explanatory gaps in business activities, etc.)",{"type":25,"tag":89,"props":1832,"children":1833},{},[1834,1839,1841,1846,1847,1852],{"type":25,"tag":763,"props":1835,"children":1836},{},[1837],{"type":43,"value":1838},"Avoid legally binding assurances",{"type":43,"value":1840}," (",{"type":25,"tag":853,"props":1842,"children":1843},{},[1844],{"type":43,"value":1845},"\"complete accessibility\"",{"type":43,"value":545},{"type":25,"tag":853,"props":1848,"children":1849},{},[1850],{"type":43,"value":1851},"\"guaranteed conformity\"",{"type":43,"value":1853},") if these cannot be fulfilled 100%",{"type":25,"tag":89,"props":1855,"children":1856},{},[1857,1862],{"type":25,"tag":763,"props":1858,"children":1859},{},[1860],{"type":43,"value":1861},"Name a contact person for feedback",{"type":43,"value":1863}," – preferably with email address and optionally phone number",{"type":25,"tag":89,"props":1865,"children":1866},{},[1867,1872],{"type":25,"tag":763,"props":1868,"children":1869},{},[1870],{"type":43,"value":1871},"Specifically:",{"type":43,"value":1873}," To avoid being caught in warning campaigns, the corresponding legal text should be adopted almost verbatim. This reduces the risk of being targeted for omissions in the statement during (semi-)automatic reviews (copy or cite BFSG Annex 3)",{"type":25,"tag":1241,"props":1875,"children":1877},{"id":1876},"a-possible-additional-formulation-for-improved-defense-against-warnings",[1878],{"type":43,"value":1879},"A Possible Additional Formulation for Improved Defense Against Warnings",{"type":25,"tag":985,"props":1881,"children":1884},{"className":1882},[988,1883],"doc-sheet__border-all",[1885],{"type":25,"tag":985,"props":1886,"children":1888},{"className":1887},[994],[1889,1895,1900,1943,1949,1954,1992,2031,2037,2042,2048,2053,2086],{"type":25,"tag":48,"props":1890,"children":1892},{"id":1891},"service-design-for-accessible-access",[1893],{"type":43,"value":1894},"Service Design for Accessible Access",{"type":25,"tag":34,"props":1896,"children":1897},{},[1898],{"type":43,"value":1899},"Our digital service has been designed to enable people with\nvarious limitations equivalent use.\nWe base this on the following principles:",{"type":25,"tag":85,"props":1901,"children":1902},{},[1903,1908,1913,1918,1923,1928,1933,1938],{"type":25,"tag":89,"props":1904,"children":1905},{},[1906],{"type":43,"value":1907},"High-contrast user interface design",{"type":25,"tag":89,"props":1909,"children":1910},{},[1911],{"type":43,"value":1912},"Providing information on multiple perception levels (text-based, auditory, visual)",{"type":25,"tag":89,"props":1914,"children":1915},{},[1916],{"type":43,"value":1917},"Alternative content for visual or auditory media",{"type":25,"tag":89,"props":1919,"children":1920},{},[1921],{"type":43,"value":1922},"Operation of all functions via keyboard",{"type":25,"tag":89,"props":1924,"children":1925},{},[1926],{"type":43,"value":1927},"Support for screen readers and comparable assistive technologies",{"type":25,"tag":89,"props":1929,"children":1930},{},[1931],{"type":43,"value":1932},"Avoiding time-critical interactions without accessible alternatives",{"type":25,"tag":89,"props":1934,"children":1935},{},[1936],{"type":43,"value":1937},"Using simple language and understandable content",{"type":25,"tag":89,"props":1939,"children":1940},{},[1941],{"type":43,"value":1942},"Intuitive navigation and logically structured content",{"type":25,"tag":1241,"props":1944,"children":1946},{"id":1945},"general-accessible-information-provision",[1947],{"type":43,"value":1948},"General Accessible Information Provision",{"type":25,"tag":34,"props":1950,"children":1951},{},[1952],{"type":43,"value":1953},"Information about our services is conveyed to users so that they:",{"type":25,"tag":85,"props":1955,"children":1956},{},[1957,1962,1967,1972,1977,1982,1987],{"type":25,"tag":89,"props":1958,"children":1959},{},[1960],{"type":43,"value":1961},"can be perceived through multiple user senses (e.g., visually and/or auditorily),",{"type":25,"tag":89,"props":1963,"children":1964},{},[1965],{"type":43,"value":1966},"are provided in an easily findable way for users,",{"type":25,"tag":89,"props":1968,"children":1969},{},[1970],{"type":43,"value":1971},"are written in an understandable manner,",{"type":25,"tag":89,"props":1973,"children":1974},{},[1975],{"type":43,"value":1976},"are available in a universal text format (font, size, contrasts, spacing) to enable conversions to assistive output forms,",{"type":25,"tag":89,"props":1978,"children":1979},{},[1980],{"type":43,"value":1981},"are designed with easily readable font size, appropriate typography, and sufficient contrast and spacing,",{"type":25,"tag":89,"props":1983,"children":1984},{},[1985],{"type":43,"value":1986},"provide alternative textual descriptions for non-text content,",{"type":25,"tag":89,"props":1988,"children":1989},{},[1990],{"type":43,"value":1991},"are digitally designed to function consistently, accessibly, intuitively, and stably.",{"type":25,"tag":34,"props":1993,"children":1994},{},[1995,1997,2002,2003,2008,2009,2014,2016,2021,2023,2029],{"type":43,"value":1996},"Both our web offerings, digital services, and mobile applications\nfollow these principles.\nThe design consistently follows the principles of\n",{"type":25,"tag":763,"props":1998,"children":1999},{},[2000],{"type":43,"value":2001},"Perceivability",{"type":43,"value":545},{"type":25,"tag":763,"props":2004,"children":2005},{},[2006],{"type":43,"value":2007},"Operability",{"type":43,"value":545},{"type":25,"tag":763,"props":2010,"children":2011},{},[2012],{"type":43,"value":2013},"Understandability",{"type":43,"value":2015},", and ",{"type":25,"tag":763,"props":2017,"children":2018},{},[2019],{"type":43,"value":2020},"Robustness",{"type":43,"value":2022},"\n(according to ",{"type":25,"tag":38,"props":2024,"children":2026},{"href":2025},"https://www.barrierefreiheit-dienstekonsolidierung.bund.de/Webs/PB/DE/gesetze-und-richtlinien/wcag/wcag-artikel.html",[2027],{"type":43,"value":2028},"WCAG criteria",{"type":43,"value":2030},").",{"type":25,"tag":1241,"props":2032,"children":2034},{"id":2033},"accessibility-of-supporting-services",[2035],{"type":43,"value":2036},"Accessibility of Supporting Services",{"type":25,"tag":34,"props":2038,"children":2039},{},[2040],{"type":43,"value":2041},"When additional support services such as support hotlines, training offerings, or\ntechnical consulting are provided, we ensure that these services also\nmake accessibility information and compatibility accessible through accessible means.",{"type":25,"tag":1241,"props":2043,"children":2045},{"id":2044},"functional-requirements-for-special-limitations",[2046],{"type":43,"value":2047},"Functional Requirements for Special Limitations",{"type":25,"tag":34,"props":2049,"children":2050},{},[2051],{"type":43,"value":2052},"Our services consider the following accessible interaction forms\nfor users:",{"type":25,"tag":85,"props":2054,"children":2055},{},[2056,2061,2066,2071,2076,2081],{"type":25,"tag":89,"props":2057,"children":2058},{},[2059],{"type":43,"value":2060},"For visual limitations: at least one option without visual elements and one that functions independently of color distinction.",{"type":25,"tag":89,"props":2062,"children":2063},{},[2064],{"type":43,"value":2065},"For people with hearing limitations: at least one usage option without sound and one with adjustable audio functions.",{"type":25,"tag":89,"props":2067,"children":2068},{},[2069],{"type":43,"value":2070},"For vocally limited users: at least one operating variant without voice input.",{"type":25,"tag":89,"props":2072,"children":2073},{},[2074],{"type":43,"value":2075},"For motor-limited users: at least one operating form without complex movement sequences or muscle strength, as well as an option for limited reach.",{"type":25,"tag":89,"props":2077,"children":2078},{},[2079],{"type":43,"value":2080},"For people with cognitive limitations: user-friendly structures, reduced complexity where possible, and supportive hints.",{"type":25,"tag":89,"props":2082,"children":2083},{},[2084],{"type":43,"value":2085},"For all accessibility functions: User privacy is maintained.",{"type":25,"tag":34,"props":2087,"children":2088},{},[2089,2091,2095],{"type":43,"value":2090},"These measures are oriented toward the requirements of the\n",{"type":25,"tag":763,"props":2092,"children":2093},{},[2094],{"type":43,"value":881},{"type":43,"value":2096}," and have been integrated into our technical and\ndesign processes to ensure the most comprehensive accessibility possible.",{"type":25,"tag":48,"props":2098,"children":2100},{"id":2099},"what-are-the-consequences-without-an-as",[2101],{"type":43,"value":2102},"What Are the Consequences Without an AS?",{"type":25,"tag":34,"props":2104,"children":2105},{},[2106,2108,2117],{"type":43,"value":2107},"Without a valid and verifiable statement, according to ",{"type":25,"tag":38,"props":2109,"children":2111},{"href":2110},"https://bfsg-gesetz.de/37-bfsg/",[2112],{"type":25,"tag":763,"props":2113,"children":2114},{},[2115],{"type":43,"value":2116},"§ 37 BFSG",{"type":43,"value":2118},", the following can happen:",{"type":25,"tag":85,"props":2120,"children":2121},{},[2122,2127,2132,2137],{"type":25,"tag":89,"props":2123,"children":2124},{},[2125],{"type":43,"value":2126},"Operating or distribution ban (of the respective services or products)",{"type":25,"tag":89,"props":2128,"children":2129},{},[2130],{"type":43,"value":2131},"Fines up to 100,000 euros (depending on the violation)",{"type":25,"tag":89,"props":2133,"children":2134},{},[2135],{"type":43,"value":2136},"Formal objection by market surveillance",{"type":25,"tag":89,"props":2138,"children":2139},{},[2140],{"type":43,"value":2141},"Warnings from competitors or consumer organizations",{"type":25,"tag":34,"props":2143,"children":2144},{},[2145,2147,2155],{"type":43,"value":2146},"This is particularly relevant\n",{"type":25,"tag":763,"props":2148,"children":2149},{},[2150],{"type":25,"tag":853,"props":2151,"children":2152},{},[2153],{"type":43,"value":2154},"because any institution, company, or natural person can alert inspection bodies to a violation of the BFSG",{"type":43,"value":2156},". Thus, it can be assumed\nthat at least your competition will pay close attention to this!",{"type":25,"tag":48,"props":2158,"children":2160},{"id":2159},"conclusion-clarity-protects-against-warnings",[2161],{"type":43,"value":2162},"Conclusion - Clarity Protects Against Warnings",{"type":25,"tag":34,"props":2164,"children":2165},{},[2166,2167,2171],{"type":43,"value":119},{"type":25,"tag":763,"props":2168,"children":2169},{},[2170],{"type":43,"value":975},{"type":43,"value":2172}," is only a small part of your digital service but with great impact.\nThose who take it seriously and individually tailor it to their own service show not only legal compliance,\nbut also respect toward all users. It also protects against legal pitfalls and economic damage.",{"type":25,"tag":34,"props":2174,"children":2175},{},[2176],{"type":43,"value":2177},"If you need support in creating or formulating one, please contact us.\nWe help create accessible web applications and show how you can meaningfully\nimplement legal requirements.",{"type":25,"tag":2179,"props":2180,"children":2182},"h4",{"id":2181},"legal-notice",[2183],{"type":43,"value":2184},"Legal Notice",{"type":25,"tag":34,"props":2186,"children":2187},{},[2188,2190,2198,2199,2204,2206,2211,2212,2217,2219,2224],{"type":43,"value":2189},"This blog post ",{"type":25,"tag":763,"props":2191,"children":2192},{},[2193],{"type":25,"tag":853,"props":2194,"children":2195},{},[2196],{"type":43,"value":2197},"does not constitute legal advice",{"type":43,"value":1278},{"type":25,"tag":763,"props":2200,"children":2201},{},[2202],{"type":43,"value":2203},"does not replace legal review of your accessibility statement",{"type":43,"value":2205},". The contained formulations and hints have been carefully researched, but make ",{"type":25,"tag":763,"props":2207,"children":2208},{},[2209],{"type":43,"value":2210},"no claim to completeness",{"type":43,"value":128},{"type":25,"tag":763,"props":2213,"children":2214},{},[2215],{"type":43,"value":2216},"legal binding",{"type":43,"value":2218},". For actual implementation according to ",{"type":25,"tag":763,"props":2220,"children":2221},{},[2222],{"type":43,"value":2223},"BFSG",{"type":43,"value":2225}," and applicable regulations, legal review in individual cases is recommended.",{"type":25,"tag":2179,"props":2227,"children":2229},{"id":2228},"note-on-creating-this-post",[2230],{"type":43,"value":2231},"Note on Creating This Post",{"type":25,"tag":34,"props":2233,"children":2234},{},[2235],{"type":43,"value":2236},"This post was also created and translated with the help of AI OpenAI GPT-4 (2024-06, Model: GPT-4o). The basis was editorial research, personal experiences, legal sources, and a company template. Final editing and professional approval were done by the article author and accessibility officer Dr.-Ing. Jens Bornschein.",{"title":7,"searchDepth":202,"depth":202,"links":2238},[2239,2240,2241,2244,2245,2248,2249],{"id":755,"depth":202,"text":758},{"id":868,"depth":202,"text":871},{"id":980,"depth":202,"text":983,"children":2242},[2243],{"id":1556,"depth":228,"text":1559},{"id":1703,"depth":202,"text":1706},{"id":1766,"depth":202,"text":1769,"children":2246},[2247],{"id":1876,"depth":228,"text":1879},{"id":2099,"depth":202,"text":2102},{"id":2159,"depth":202,"text":2162},{"_path":630,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":631,"description":632,"author":10,"image":11,"releaseDate":633,"blogCategories":2251,"articleTags":2252,"tags":2253,"body":2254,"_type":607,"_id":637,"_source":609,"_file":638,"_stem":639,"_extension":612},[14,15],[15,17],[20],{"type":22,"children":2255,"toc":3760},[2256,2261,2266,2271,2276,2281,2299,2304,2345,2351,2364,2377,2382,2388,2401,2414,2423,2429,2434,2551,3101,3137,3148,3151,3156,3328,3341,3347,3352,3419,3424,3430,3435,3446,3459,3493,3520,3532,3553,3566,3569,3574,3587,3605,3610,3615,3738,3756],{"type":25,"tag":34,"props":2257,"children":2258},{},[2259],{"type":43,"value":2260},"Managing a multiservice server can be tricky. Not every software is compatible with another, for example different requirements for database or PHP-versions.",{"type":25,"tag":34,"props":2262,"children":2263},{},[2264],{"type":43,"value":2265},"Additionally, all the software should be in the latest version, to mitigate possible security risks.",{"type":25,"tag":34,"props":2267,"children":2268},{},[2269],{"type":43,"value":2270},"There are many ways to handle this: Ansible, Chef etc.",{"type":25,"tag":34,"props":2272,"children":2273},{},[2274],{"type":43,"value":2275},"Out goal was to have an easy to use, automated and free solution.",{"type":25,"tag":34,"props":2277,"children":2278},{},[2279],{"type":43,"value":2280},"Here are the goals:",{"type":25,"tag":85,"props":2282,"children":2283},{},[2284,2289,2294],{"type":25,"tag":89,"props":2285,"children":2286},{},[2287],{"type":43,"value":2288},"use the GitOps approach to store and version control the deployment",{"type":25,"tag":89,"props":2290,"children":2291},{},[2292],{"type":43,"value":2293},"use containers to run the software",{"type":25,"tag":89,"props":2295,"children":2296},{},[2297],{"type":43,"value":2298},"get automated security updates and opt in for minor/major version updates",{"type":25,"tag":34,"props":2300,"children":2301},{},[2302],{"type":43,"value":2303},"This is the stack we ended with:",{"type":25,"tag":85,"props":2305,"children":2306},{},[2307,2324,2334],{"type":25,"tag":89,"props":2308,"children":2309},{},[2310,2315,2316,2322],{"type":25,"tag":38,"props":2311,"children":2313},{"href":2312},"https://www.docker.com/",[2314],{"type":43,"value":666},{"type":43,"value":1278},{"type":25,"tag":38,"props":2317,"children":2319},{"href":2318},"https://docs.docker.com/compose/",[2320],{"type":43,"value":2321},"Docker Compose",{"type":43,"value":2323}," do manage the software",{"type":25,"tag":89,"props":2325,"children":2326},{},[2327,2332],{"type":25,"tag":38,"props":2328,"children":2330},{"href":2329},"https://about.gitlab.com/",[2331],{"type":43,"value":670},{"type":43,"value":2333}," to store all the compose files",{"type":25,"tag":89,"props":2335,"children":2336},{},[2337,2343],{"type":25,"tag":38,"props":2338,"children":2340},{"href":2339},"https://docs.renovatebot.com",[2341],{"type":43,"value":2342},"Renovate Bot",{"type":43,"value":2344}," to keep the software up to date",{"type":25,"tag":48,"props":2346,"children":2348},{"id":2347},"about-the-stack",[2349],{"type":43,"value":2350},"About the stack",{"type":25,"tag":34,"props":2352,"children":2353},{},[2354,2356,2362],{"type":43,"value":2355},"We have been using Docker in production for some time now. Depending on the situation, we create the compose file directly on the server, manage it over portainer or ",{"type":25,"tag":121,"props":2357,"children":2359},{"className":2358},[],[2360],{"type":43,"value":2361},"scp",{"type":43,"value":2363}," it from a pipeline.",{"type":25,"tag":34,"props":2365,"children":2366},{},[2367,2369,2375],{"type":43,"value":2368},"GitLab is out primary tool for version control. Additionally, a ",{"type":25,"tag":38,"props":2370,"children":2372},{"href":2371},"https://docs.gitlab.com/runner/",[2373],{"type":43,"value":2374},"GitLab Runner",{"type":43,"value":2376}," takes care of running pipelines.",{"type":25,"tag":34,"props":2378,"children":2379},{},[2380],{"type":43,"value":2381},"Renovate automates dependency updates. PHP, Go, Python, Docker - to name a couple. We already use it for various projects.",{"type":25,"tag":48,"props":2383,"children":2385},{"id":2384},"container-with-docker-and-docker-compose",[2386],{"type":43,"value":2387},"Container with Docker and Docker Compose",{"type":25,"tag":34,"props":2389,"children":2390},{},[2391,2393,2399],{"type":43,"value":2392},"The main reason why we chose Docker is the ability to access a remote Docker host and execute Docker commands.\nRefer to ",{"type":25,"tag":38,"props":2394,"children":2396},{"href":2395},"https://docs.docker.com/reference/cli/docker/#host",[2397],{"type":43,"value":2398},"the official documentation",{"type":43,"value":2400}," for more information.",{"type":25,"tag":34,"props":2402,"children":2403},{},[2404,2406,2412],{"type":43,"value":2405},"We are using ",{"type":25,"tag":121,"props":2407,"children":2409},{"className":2408},[],[2410],{"type":43,"value":2411},"ssh",{"type":43,"value":2413}," to access our target server.",{"type":25,"tag":34,"props":2415,"children":2416},{},[2417],{"type":25,"tag":121,"props":2418,"children":2420},{"className":2419},[],[2421],{"type":43,"value":2422},"DOCKER_HOST=ssh://[username@]\u003CIP or host>[:port] docker compose up --wait",{"type":25,"tag":48,"props":2424,"children":2426},{"id":2425},"gitops-with-gitlab",[2427],{"type":43,"value":2428},"GitOps with GitLab",{"type":25,"tag":34,"props":2430,"children":2431},{},[2432],{"type":43,"value":2433},"The idea behind GitOps is to use a git repository to store the configuration. Here is an example:",{"type":25,"tag":178,"props":2435,"children":2439},{"className":2436,"code":2437,"language":2438,"meta":7,"style":7},"language-shell shiki shiki-themes github-dark github-dark monokai",".\n├──.gitlab-ci.yml             # pipeline definition\n├── renovate.json             # Renovate configuration\n├── nextcloud\n│   ├── docker-compose.yml   # Nextcloud file hosting and collaboration\n└── traefik\n    └── docker-compose.yml   # Traefik reverse proxy configuration\n\n","shell",[2440],{"type":25,"tag":121,"props":2441,"children":2442},{"__ignoreMap":7},[2443,2452,2467,2486,2498,2521,2534],{"type":25,"tag":189,"props":2444,"children":2445},{"class":191,"line":192},[2446],{"type":25,"tag":189,"props":2447,"children":2449},{"style":2448},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF",[2450],{"type":43,"value":2451},".\n",{"type":25,"tag":189,"props":2453,"children":2454},{"class":191,"line":202},[2455,2461],{"type":25,"tag":189,"props":2456,"children":2458},{"style":2457},"--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E",[2459],{"type":43,"value":2460},"├──.gitlab-ci.yml",{"type":25,"tag":189,"props":2462,"children":2464},{"style":2463},"--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F",[2465],{"type":43,"value":2466},"             # pipeline definition\n",{"type":25,"tag":189,"props":2468,"children":2469},{"class":191,"line":228},[2470,2475,2481],{"type":25,"tag":189,"props":2471,"children":2472},{"style":2457},[2473],{"type":43,"value":2474},"├──",{"type":25,"tag":189,"props":2476,"children":2478},{"style":2477},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74",[2479],{"type":43,"value":2480}," renovate.json",{"type":25,"tag":189,"props":2482,"children":2483},{"style":2463},[2484],{"type":43,"value":2485},"             # Renovate configuration\n",{"type":25,"tag":189,"props":2487,"children":2488},{"class":191,"line":242},[2489,2493],{"type":25,"tag":189,"props":2490,"children":2491},{"style":2457},[2492],{"type":43,"value":2474},{"type":25,"tag":189,"props":2494,"children":2495},{"style":2477},[2496],{"type":43,"value":2497}," nextcloud\n",{"type":25,"tag":189,"props":2499,"children":2500},{"class":191,"line":251},[2501,2506,2511,2516],{"type":25,"tag":189,"props":2502,"children":2503},{"style":2457},[2504],{"type":43,"value":2505},"│",{"type":25,"tag":189,"props":2507,"children":2508},{"style":2477},[2509],{"type":43,"value":2510},"   ├──",{"type":25,"tag":189,"props":2512,"children":2513},{"style":2477},[2514],{"type":43,"value":2515}," docker-compose.yml",{"type":25,"tag":189,"props":2517,"children":2518},{"style":2463},[2519],{"type":43,"value":2520},"   # Nextcloud file hosting and collaboration\n",{"type":25,"tag":189,"props":2522,"children":2523},{"class":191,"line":273},[2524,2529],{"type":25,"tag":189,"props":2525,"children":2526},{"style":2457},[2527],{"type":43,"value":2528},"└──",{"type":25,"tag":189,"props":2530,"children":2531},{"style":2477},[2532],{"type":43,"value":2533}," traefik\n",{"type":25,"tag":189,"props":2535,"children":2536},{"class":191,"line":286},[2537,2542,2546],{"type":25,"tag":189,"props":2538,"children":2539},{"style":2457},[2540],{"type":43,"value":2541},"    └──",{"type":25,"tag":189,"props":2543,"children":2544},{"style":2477},[2545],{"type":43,"value":2515},{"type":25,"tag":189,"props":2547,"children":2548},{"style":2463},[2549],{"type":43,"value":2550},"   # Traefik reverse proxy configuration\n",{"type":25,"tag":178,"props":2552,"children":2557},{"className":2553,"code":2554,"filename":2555,"language":2556,"meta":7,"style":7},"language-yaml shiki shiki-themes github-dark github-dark monokai","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","yaml",[2558],{"type":25,"tag":121,"props":2559,"children":2560},{"__ignoreMap":7},[2561,2575,2587,2599,2608,2620,2631,2648,2665,2677,2690,2702,2714,2726,2738,2750,2762,2774,2786,2798,2810,2861,2879,2897,2915,2923,2935,2952,2968,2981,2994,3012,3024,3037,3049,3062,3075,3088],{"type":25,"tag":189,"props":2562,"children":2563},{"class":191,"line":192},[2564,2570],{"type":25,"tag":189,"props":2565,"children":2567},{"style":2566},"--shiki-default:#85E89D;--shiki-dark:#85E89D;--shiki-sepia:#F92672",[2568],{"type":43,"value":2569},"volumes",{"type":25,"tag":189,"props":2571,"children":2572},{"style":196},[2573],{"type":43,"value":2574},":\n",{"type":25,"tag":189,"props":2576,"children":2577},{"class":191,"line":202},[2578,2583],{"type":25,"tag":189,"props":2579,"children":2580},{"style":2566},[2581],{"type":43,"value":2582},"  nextcloud",{"type":25,"tag":189,"props":2584,"children":2585},{"style":196},[2586],{"type":43,"value":2574},{"type":25,"tag":189,"props":2588,"children":2589},{"class":191,"line":228},[2590,2595],{"type":25,"tag":189,"props":2591,"children":2592},{"style":2566},[2593],{"type":43,"value":2594},"  db",{"type":25,"tag":189,"props":2596,"children":2597},{"style":196},[2598],{"type":43,"value":2574},{"type":25,"tag":189,"props":2600,"children":2601},{"class":191,"line":242},[2602],{"type":25,"tag":189,"props":2603,"children":2605},{"emptyLinePlaceholder":2604},true,[2606],{"type":43,"value":2607},"\n",{"type":25,"tag":189,"props":2609,"children":2610},{"class":191,"line":251},[2611,2616],{"type":25,"tag":189,"props":2612,"children":2613},{"style":2566},[2614],{"type":43,"value":2615},"services",{"type":25,"tag":189,"props":2617,"children":2618},{"style":196},[2619],{"type":43,"value":2574},{"type":25,"tag":189,"props":2621,"children":2622},{"class":191,"line":273},[2623,2627],{"type":25,"tag":189,"props":2624,"children":2625},{"style":2566},[2626],{"type":43,"value":2594},{"type":25,"tag":189,"props":2628,"children":2629},{"style":196},[2630],{"type":43,"value":2574},{"type":25,"tag":189,"props":2632,"children":2633},{"class":191,"line":286},[2634,2639,2643],{"type":25,"tag":189,"props":2635,"children":2636},{"style":2566},[2637],{"type":43,"value":2638},"    image",{"type":25,"tag":189,"props":2640,"children":2641},{"style":196},[2642],{"type":43,"value":214},{"type":25,"tag":189,"props":2644,"children":2645},{"style":2477},[2646],{"type":43,"value":2647},"mariadb:11.8\n",{"type":25,"tag":189,"props":2649,"children":2650},{"class":191,"line":295},[2651,2656,2660],{"type":25,"tag":189,"props":2652,"children":2653},{"style":2566},[2654],{"type":43,"value":2655},"    restart",{"type":25,"tag":189,"props":2657,"children":2658},{"style":196},[2659],{"type":43,"value":214},{"type":25,"tag":189,"props":2661,"children":2662},{"style":2477},[2663],{"type":43,"value":2664},"unless-stopped\n",{"type":25,"tag":189,"props":2666,"children":2667},{"class":191,"line":304},[2668,2673],{"type":25,"tag":189,"props":2669,"children":2670},{"style":2566},[2671],{"type":43,"value":2672},"    volumes",{"type":25,"tag":189,"props":2674,"children":2675},{"style":196},[2676],{"type":43,"value":2574},{"type":25,"tag":189,"props":2678,"children":2679},{"class":191,"line":317},[2680,2685],{"type":25,"tag":189,"props":2681,"children":2682},{"style":196},[2683],{"type":43,"value":2684},"      - ",{"type":25,"tag":189,"props":2686,"children":2687},{"style":2477},[2688],{"type":43,"value":2689},"db:/var/lib/mysql\n",{"type":25,"tag":189,"props":2691,"children":2692},{"class":191,"line":330},[2693,2698],{"type":25,"tag":189,"props":2694,"children":2695},{"style":2566},[2696],{"type":43,"value":2697},"    environment",{"type":25,"tag":189,"props":2699,"children":2700},{"style":196},[2701],{"type":43,"value":2574},{"type":25,"tag":189,"props":2703,"children":2704},{"class":191,"line":343},[2705,2709],{"type":25,"tag":189,"props":2706,"children":2707},{"style":196},[2708],{"type":43,"value":2684},{"type":25,"tag":189,"props":2710,"children":2711},{"style":2477},[2712],{"type":43,"value":2713},"MARIADB_ROOT_PASSWORD=${NEXTCLOUD_MARIADB_ROOT_PASSWORD:?error}\n",{"type":25,"tag":189,"props":2715,"children":2716},{"class":191,"line":356},[2717,2721],{"type":25,"tag":189,"props":2718,"children":2719},{"style":196},[2720],{"type":43,"value":2684},{"type":25,"tag":189,"props":2722,"children":2723},{"style":2477},[2724],{"type":43,"value":2725},"MARIADB_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":25,"tag":189,"props":2727,"children":2728},{"class":191,"line":365},[2729,2733],{"type":25,"tag":189,"props":2730,"children":2731},{"style":196},[2732],{"type":43,"value":2684},{"type":25,"tag":189,"props":2734,"children":2735},{"style":2477},[2736],{"type":43,"value":2737},"MARIADB_DATABASE=nextcloud\n",{"type":25,"tag":189,"props":2739,"children":2740},{"class":191,"line":373},[2741,2745],{"type":25,"tag":189,"props":2742,"children":2743},{"style":196},[2744],{"type":43,"value":2684},{"type":25,"tag":189,"props":2746,"children":2747},{"style":2477},[2748],{"type":43,"value":2749},"MARIADB_USER=nextcloud\n",{"type":25,"tag":189,"props":2751,"children":2752},{"class":191,"line":395},[2753,2758],{"type":25,"tag":189,"props":2754,"children":2755},{"style":2566},[2756],{"type":43,"value":2757},"    command",{"type":25,"tag":189,"props":2759,"children":2760},{"style":196},[2761],{"type":43,"value":2574},{"type":25,"tag":189,"props":2763,"children":2764},{"class":191,"line":482},[2765,2769],{"type":25,"tag":189,"props":2766,"children":2767},{"style":196},[2768],{"type":43,"value":2684},{"type":25,"tag":189,"props":2770,"children":2771},{"style":2477},[2772],{"type":43,"value":2773},"--transaction-isolation=READ-COMMITTED\n",{"type":25,"tag":189,"props":2775,"children":2776},{"class":191,"line":500},[2777,2781],{"type":25,"tag":189,"props":2778,"children":2779},{"style":196},[2780],{"type":43,"value":2684},{"type":25,"tag":189,"props":2782,"children":2783},{"style":2477},[2784],{"type":43,"value":2785},"--log-bin=binlog\n",{"type":25,"tag":189,"props":2787,"children":2788},{"class":191,"line":509},[2789,2793],{"type":25,"tag":189,"props":2790,"children":2791},{"style":196},[2792],{"type":43,"value":2684},{"type":25,"tag":189,"props":2794,"children":2795},{"style":2477},[2796],{"type":43,"value":2797},"--binlog-format=ROW\n",{"type":25,"tag":189,"props":2799,"children":2800},{"class":191,"line":518},[2801,2806],{"type":25,"tag":189,"props":2802,"children":2803},{"style":2566},[2804],{"type":43,"value":2805},"    healthcheck",{"type":25,"tag":189,"props":2807,"children":2808},{"style":196},[2809],{"type":43,"value":2574},{"type":25,"tag":189,"props":2811,"children":2813},{"class":191,"line":2812},21,[2814,2819,2824,2829,2833,2838,2842,2847,2851,2856],{"type":25,"tag":189,"props":2815,"children":2816},{"style":2566},[2817],{"type":43,"value":2818},"      test",{"type":25,"tag":189,"props":2820,"children":2821},{"style":196},[2822],{"type":43,"value":2823},": [",{"type":25,"tag":189,"props":2825,"children":2826},{"style":2477},[2827],{"type":43,"value":2828},"\"CMD\"",{"type":25,"tag":189,"props":2830,"children":2831},{"style":196},[2832],{"type":43,"value":545},{"type":25,"tag":189,"props":2834,"children":2835},{"style":2477},[2836],{"type":43,"value":2837},"\"healthcheck.sh\"",{"type":25,"tag":189,"props":2839,"children":2840},{"style":196},[2841],{"type":43,"value":545},{"type":25,"tag":189,"props":2843,"children":2844},{"style":2477},[2845],{"type":43,"value":2846},"\"--connect\"",{"type":25,"tag":189,"props":2848,"children":2849},{"style":196},[2850],{"type":43,"value":545},{"type":25,"tag":189,"props":2852,"children":2853},{"style":2477},[2854],{"type":43,"value":2855},"\"--innodb_initialized\"",{"type":25,"tag":189,"props":2857,"children":2858},{"style":196},[2859],{"type":43,"value":2860},"]\n",{"type":25,"tag":189,"props":2862,"children":2864},{"class":191,"line":2863},22,[2865,2870,2874],{"type":25,"tag":189,"props":2866,"children":2867},{"style":2566},[2868],{"type":43,"value":2869},"      interval",{"type":25,"tag":189,"props":2871,"children":2872},{"style":196},[2873],{"type":43,"value":214},{"type":25,"tag":189,"props":2875,"children":2876},{"style":2477},[2877],{"type":43,"value":2878},"15s\n",{"type":25,"tag":189,"props":2880,"children":2882},{"class":191,"line":2881},23,[2883,2888,2892],{"type":25,"tag":189,"props":2884,"children":2885},{"style":2566},[2886],{"type":43,"value":2887},"      timeout",{"type":25,"tag":189,"props":2889,"children":2890},{"style":196},[2891],{"type":43,"value":214},{"type":25,"tag":189,"props":2893,"children":2894},{"style":2477},[2895],{"type":43,"value":2896},"5s\n",{"type":25,"tag":189,"props":2898,"children":2900},{"class":191,"line":2899},24,[2901,2906,2910],{"type":25,"tag":189,"props":2902,"children":2903},{"style":2566},[2904],{"type":43,"value":2905},"      retries",{"type":25,"tag":189,"props":2907,"children":2908},{"style":196},[2909],{"type":43,"value":214},{"type":25,"tag":189,"props":2911,"children":2912},{"style":413},[2913],{"type":43,"value":2914},"6\n",{"type":25,"tag":189,"props":2916,"children":2918},{"class":191,"line":2917},25,[2919],{"type":25,"tag":189,"props":2920,"children":2921},{"emptyLinePlaceholder":2604},[2922],{"type":43,"value":2607},{"type":25,"tag":189,"props":2924,"children":2926},{"class":191,"line":2925},26,[2927,2931],{"type":25,"tag":189,"props":2928,"children":2929},{"style":2566},[2930],{"type":43,"value":2582},{"type":25,"tag":189,"props":2932,"children":2933},{"style":196},[2934],{"type":43,"value":2574},{"type":25,"tag":189,"props":2936,"children":2938},{"class":191,"line":2937},27,[2939,2943,2947],{"type":25,"tag":189,"props":2940,"children":2941},{"style":2566},[2942],{"type":43,"value":2638},{"type":25,"tag":189,"props":2944,"children":2945},{"style":196},[2946],{"type":43,"value":214},{"type":25,"tag":189,"props":2948,"children":2949},{"style":2477},[2950],{"type":43,"value":2951},"nextcloud:32.0.0\n",{"type":25,"tag":189,"props":2953,"children":2955},{"class":191,"line":2954},28,[2956,2960,2964],{"type":25,"tag":189,"props":2957,"children":2958},{"style":2566},[2959],{"type":43,"value":2655},{"type":25,"tag":189,"props":2961,"children":2962},{"style":196},[2963],{"type":43,"value":214},{"type":25,"tag":189,"props":2965,"children":2966},{"style":2477},[2967],{"type":43,"value":2664},{"type":25,"tag":189,"props":2969,"children":2971},{"class":191,"line":2970},29,[2972,2977],{"type":25,"tag":189,"props":2973,"children":2974},{"style":2566},[2975],{"type":43,"value":2976},"    depends_on",{"type":25,"tag":189,"props":2978,"children":2979},{"style":196},[2980],{"type":43,"value":2574},{"type":25,"tag":189,"props":2982,"children":2984},{"class":191,"line":2983},30,[2985,2990],{"type":25,"tag":189,"props":2986,"children":2987},{"style":2566},[2988],{"type":43,"value":2989},"      db",{"type":25,"tag":189,"props":2991,"children":2992},{"style":196},[2993],{"type":43,"value":2574},{"type":25,"tag":189,"props":2995,"children":2997},{"class":191,"line":2996},31,[2998,3003,3007],{"type":25,"tag":189,"props":2999,"children":3000},{"style":2566},[3001],{"type":43,"value":3002},"        condition",{"type":25,"tag":189,"props":3004,"children":3005},{"style":196},[3006],{"type":43,"value":214},{"type":25,"tag":189,"props":3008,"children":3009},{"style":2477},[3010],{"type":43,"value":3011},"service_healthy\n",{"type":25,"tag":189,"props":3013,"children":3015},{"class":191,"line":3014},32,[3016,3020],{"type":25,"tag":189,"props":3017,"children":3018},{"style":2566},[3019],{"type":43,"value":2672},{"type":25,"tag":189,"props":3021,"children":3022},{"style":196},[3023],{"type":43,"value":2574},{"type":25,"tag":189,"props":3025,"children":3027},{"class":191,"line":3026},33,[3028,3032],{"type":25,"tag":189,"props":3029,"children":3030},{"style":196},[3031],{"type":43,"value":2684},{"type":25,"tag":189,"props":3033,"children":3034},{"style":2477},[3035],{"type":43,"value":3036},"nextcloud:/var/www/html\n",{"type":25,"tag":189,"props":3038,"children":3040},{"class":191,"line":3039},34,[3041,3045],{"type":25,"tag":189,"props":3042,"children":3043},{"style":2566},[3044],{"type":43,"value":2697},{"type":25,"tag":189,"props":3046,"children":3047},{"style":196},[3048],{"type":43,"value":2574},{"type":25,"tag":189,"props":3050,"children":3052},{"class":191,"line":3051},35,[3053,3057],{"type":25,"tag":189,"props":3054,"children":3055},{"style":196},[3056],{"type":43,"value":2684},{"type":25,"tag":189,"props":3058,"children":3059},{"style":2477},[3060],{"type":43,"value":3061},"MYSQL_PASSWORD=${NEXTCLOUD_MARIADB_PASSWORD:?error}\n",{"type":25,"tag":189,"props":3063,"children":3065},{"class":191,"line":3064},36,[3066,3070],{"type":25,"tag":189,"props":3067,"children":3068},{"style":196},[3069],{"type":43,"value":2684},{"type":25,"tag":189,"props":3071,"children":3072},{"style":2477},[3073],{"type":43,"value":3074},"MYSQL_DATABASE=nextcloud\n",{"type":25,"tag":189,"props":3076,"children":3078},{"class":191,"line":3077},37,[3079,3083],{"type":25,"tag":189,"props":3080,"children":3081},{"style":196},[3082],{"type":43,"value":2684},{"type":25,"tag":189,"props":3084,"children":3085},{"style":2477},[3086],{"type":43,"value":3087},"MYSQL_USER=nextcloud\n",{"type":25,"tag":189,"props":3089,"children":3091},{"class":191,"line":3090},38,[3092,3096],{"type":25,"tag":189,"props":3093,"children":3094},{"style":196},[3095],{"type":43,"value":2684},{"type":25,"tag":189,"props":3097,"children":3098},{"style":2477},[3099],{"type":43,"value":3100},"MYSQL_HOST=db\n",{"type":25,"tag":178,"props":3102,"children":3106},{"className":3103,"code":3104,"language":3105,"meta":7,"style":7},"language-dotenv shiki shiki-themes github-dark github-dark monokai","NEXTCLOUD_MARIADB_ROOT_PASSWORD=\nNEXTCLOUD_MARIADB_PASSWORD=\n","dotenv",[3107],{"type":25,"tag":121,"props":3108,"children":3109},{"__ignoreMap":7},[3110,3125],{"type":25,"tag":189,"props":3111,"children":3112},{"class":191,"line":192},[3113,3119],{"type":25,"tag":189,"props":3114,"children":3116},{"style":3115},"--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2",[3117],{"type":43,"value":3118},"NEXTCLOUD_MARIADB_ROOT_PASSWORD",{"type":25,"tag":189,"props":3120,"children":3122},{"style":3121},"--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672",[3123],{"type":43,"value":3124},"=\n",{"type":25,"tag":189,"props":3126,"children":3127},{"class":191,"line":202},[3128,3133],{"type":25,"tag":189,"props":3129,"children":3130},{"style":3115},[3131],{"type":43,"value":3132},"NEXTCLOUD_MARIADB_PASSWORD",{"type":25,"tag":189,"props":3134,"children":3135},{"style":3121},[3136],{"type":43,"value":3124},{"type":25,"tag":34,"props":3138,"children":3139},{},[3140,3142],{"type":43,"value":3141},"are stored as ",{"type":25,"tag":38,"props":3143,"children":3145},{"href":3144},"https://docs.gitlab.com/ci/variables/",[3146],{"type":43,"value":3147},"CI/CD Variables",{"type":25,"tag":863,"props":3149,"children":3150},{},[],{"type":25,"tag":34,"props":3152,"children":3153},{},[3154],{"type":43,"value":3155},"To deploy the stack, we have a pipeline:",{"type":25,"tag":178,"props":3157,"children":3160},{"className":2553,"code":3158,"filename":3159,"language":2556,"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",".gitlab-ci.yml",[3161],{"type":25,"tag":121,"props":3162,"children":3163},{"__ignoreMap":7},[3164,3176,3189,3196,3208,3224,3241,3253,3270,3282,3295,3307],{"type":25,"tag":189,"props":3165,"children":3166},{"class":191,"line":192},[3167,3172],{"type":25,"tag":189,"props":3168,"children":3169},{"style":2566},[3170],{"type":43,"value":3171},"stages",{"type":25,"tag":189,"props":3173,"children":3174},{"style":196},[3175],{"type":43,"value":2574},{"type":25,"tag":189,"props":3177,"children":3178},{"class":191,"line":202},[3179,3184],{"type":25,"tag":189,"props":3180,"children":3181},{"style":196},[3182],{"type":43,"value":3183},"  - ",{"type":25,"tag":189,"props":3185,"children":3186},{"style":2477},[3187],{"type":43,"value":3188},"deploy\n",{"type":25,"tag":189,"props":3190,"children":3191},{"class":191,"line":228},[3192],{"type":25,"tag":189,"props":3193,"children":3194},{"emptyLinePlaceholder":2604},[3195],{"type":43,"value":2607},{"type":25,"tag":189,"props":3197,"children":3198},{"class":191,"line":242},[3199,3204],{"type":25,"tag":189,"props":3200,"children":3201},{"style":2566},[3202],{"type":43,"value":3203},"deploy",{"type":25,"tag":189,"props":3205,"children":3206},{"style":196},[3207],{"type":43,"value":2574},{"type":25,"tag":189,"props":3209,"children":3210},{"class":191,"line":251},[3211,3216,3220],{"type":25,"tag":189,"props":3212,"children":3213},{"style":2566},[3214],{"type":43,"value":3215},"  stage",{"type":25,"tag":189,"props":3217,"children":3218},{"style":196},[3219],{"type":43,"value":214},{"type":25,"tag":189,"props":3221,"children":3222},{"style":2477},[3223],{"type":43,"value":3188},{"type":25,"tag":189,"props":3225,"children":3226},{"class":191,"line":273},[3227,3232,3236],{"type":25,"tag":189,"props":3228,"children":3229},{"style":2566},[3230],{"type":43,"value":3231},"  image",{"type":25,"tag":189,"props":3233,"children":3234},{"style":196},[3235],{"type":43,"value":214},{"type":25,"tag":189,"props":3237,"children":3238},{"style":2477},[3239],{"type":43,"value":3240},"docker:28\n",{"type":25,"tag":189,"props":3242,"children":3243},{"class":191,"line":286},[3244,3249],{"type":25,"tag":189,"props":3245,"children":3246},{"style":2566},[3247],{"type":43,"value":3248},"  variables",{"type":25,"tag":189,"props":3250,"children":3251},{"style":196},[3252],{"type":43,"value":2574},{"type":25,"tag":189,"props":3254,"children":3255},{"class":191,"line":295},[3256,3261,3265],{"type":25,"tag":189,"props":3257,"children":3258},{"style":2566},[3259],{"type":43,"value":3260},"    DOCKER_HOST",{"type":25,"tag":189,"props":3262,"children":3263},{"style":196},[3264],{"type":43,"value":214},{"type":25,"tag":189,"props":3266,"children":3267},{"style":2477},[3268],{"type":43,"value":3269},"ssh://[username@]\u003CIP or host>[:port]\n",{"type":25,"tag":189,"props":3271,"children":3272},{"class":191,"line":304},[3273,3278],{"type":25,"tag":189,"props":3274,"children":3275},{"style":2566},[3276],{"type":43,"value":3277},"  script",{"type":25,"tag":189,"props":3279,"children":3280},{"style":196},[3281],{"type":43,"value":2574},{"type":25,"tag":189,"props":3283,"children":3284},{"class":191,"line":317},[3285,3290],{"type":25,"tag":189,"props":3286,"children":3287},{"style":196},[3288],{"type":43,"value":3289},"    - ",{"type":25,"tag":189,"props":3291,"children":3292},{"style":2477},[3293],{"type":43,"value":3294},"for file in $(find . -type f -name docker-compose.yml); do docker compose -f $file up --remove-orphans --wait; done\n",{"type":25,"tag":189,"props":3296,"children":3297},{"class":191,"line":330},[3298,3303],{"type":25,"tag":189,"props":3299,"children":3300},{"style":2566},[3301],{"type":43,"value":3302},"  rules",{"type":25,"tag":189,"props":3304,"children":3305},{"style":196},[3306],{"type":43,"value":2574},{"type":25,"tag":189,"props":3308,"children":3309},{"class":191,"line":343},[3310,3314,3319,3323],{"type":25,"tag":189,"props":3311,"children":3312},{"style":196},[3313],{"type":43,"value":3289},{"type":25,"tag":189,"props":3315,"children":3316},{"style":2566},[3317],{"type":43,"value":3318},"if",{"type":25,"tag":189,"props":3320,"children":3321},{"style":196},[3322],{"type":43,"value":214},{"type":25,"tag":189,"props":3324,"children":3325},{"style":2477},[3326],{"type":43,"value":3327},"$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n",{"type":25,"tag":34,"props":3329,"children":3330},{},[3331,3333,3339],{"type":43,"value":3332},"The pipeline runs with every commit on the default branch, iterates through all ",{"type":25,"tag":121,"props":3334,"children":3336},{"className":3335},[],[3337],{"type":43,"value":3338},"docker-compose.yml",{"type":43,"value":3340}," files, and deploys them.",{"type":25,"tag":48,"props":3342,"children":3344},{"id":3343},"keep-your-deployments-up-to-date-with-renovate-bot",[3345],{"type":43,"value":3346},"Keep your deployments up-to-date with Renovate Bot",{"type":25,"tag":34,"props":3348,"children":3349},{},[3350],{"type":43,"value":3351},"Here is where Renovate kicks in.",{"type":25,"tag":178,"props":3353,"children":3355},{"className":180,"code":3354,"filename":182,"language":183,"meta":7,"style":7},"{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:best-practices\"\n  ]\n}\n",[3356],{"type":25,"tag":121,"props":3357,"children":3358},{"__ignoreMap":7},[3359,3366,3385,3397,3405,3412],{"type":25,"tag":189,"props":3360,"children":3361},{"class":191,"line":192},[3362],{"type":25,"tag":189,"props":3363,"children":3364},{"style":196},[3365],{"type":43,"value":199},{"type":25,"tag":189,"props":3367,"children":3368},{"class":191,"line":202},[3369,3373,3377,3381],{"type":25,"tag":189,"props":3370,"children":3371},{"style":206},[3372],{"type":43,"value":209},{"type":25,"tag":189,"props":3374,"children":3375},{"style":196},[3376],{"type":43,"value":214},{"type":25,"tag":189,"props":3378,"children":3379},{"style":217},[3380],{"type":43,"value":220},{"type":25,"tag":189,"props":3382,"children":3383},{"style":196},[3384],{"type":43,"value":225},{"type":25,"tag":189,"props":3386,"children":3387},{"class":191,"line":228},[3388,3393],{"type":25,"tag":189,"props":3389,"children":3390},{"style":206},[3391],{"type":43,"value":3392},"  \"extends\"",{"type":25,"tag":189,"props":3394,"children":3395},{"style":196},[3396],{"type":43,"value":239},{"type":25,"tag":189,"props":3398,"children":3399},{"class":191,"line":242},[3400],{"type":25,"tag":189,"props":3401,"children":3402},{"style":217},[3403],{"type":43,"value":3404},"    \"config:best-practices\"\n",{"type":25,"tag":189,"props":3406,"children":3407},{"class":191,"line":251},[3408],{"type":25,"tag":189,"props":3409,"children":3410},{"style":196},[3411],{"type":43,"value":515},{"type":25,"tag":189,"props":3413,"children":3414},{"class":191,"line":273},[3415],{"type":25,"tag":189,"props":3416,"children":3417},{"style":196},[3418],{"type":43,"value":524},{"type":25,"tag":34,"props":3420,"children":3421},{},[3422],{"type":43,"value":3423},"Renovate will create Merge Requests for every update. Nice!",{"type":25,"tag":48,"props":3425,"children":3427},{"id":3426},"automated-security-updates-and-opt-in-for-minormajor-version-updates",[3428],{"type":43,"value":3429},"Automated security updates and opt-in for minor/major version updates",{"type":25,"tag":34,"props":3431,"children":3432},{},[3433],{"type":43,"value":3434},"The current configuration creates Merge Requests for every update, but we want security updates to happen without user interaction.",{"type":25,"tag":34,"props":3436,"children":3437},{},[3438,3440],{"type":43,"value":3439},"You need to understand how Docker images are versioned / tagged. It depends on the image, but let's take a look on the official ",{"type":25,"tag":38,"props":3441,"children":3443},{"href":3442},"https://hub.docker.com/_/mariadb",[3444],{"type":43,"value":3445},"MariaDB",{"type":25,"tag":34,"props":3447,"children":3448},{},[3449,3451,3457],{"type":43,"value":3450},"There are ",{"type":25,"tag":121,"props":3452,"children":3454},{"className":3453},[],[3455],{"type":43,"value":3456},"11.8.3-noble, 11.8-noble, 11-noble, lts-noble, 11.8.3, 11.8, 11, lts",{"type":43,"value":3458},", all of which refer to the same image.",{"type":25,"tag":34,"props":3460,"children":3461},{},[3462,3468,3470,3476,3478,3484,3485,3491],{"type":25,"tag":121,"props":3463,"children":3465},{"className":3464},[],[3466],{"type":43,"value":3467},"11.8.3-noble",{"type":43,"value":3469}," means that we get MariaDB in version ",{"type":25,"tag":121,"props":3471,"children":3473},{"className":3472},[],[3474],{"type":43,"value":3475},"11.8.3",{"type":43,"value":3477}," based on Ubuntu Noble.\n",{"type":25,"tag":121,"props":3479,"children":3481},{"className":3480},[],[3482],{"type":43,"value":3483},"11.8-noble",{"type":43,"value":3469},{"type":25,"tag":121,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":43,"value":3490},"11.8.\u003Clatest_path>",{"type":43,"value":3492}," based on Ubuntu Noble.",{"type":25,"tag":34,"props":3494,"children":3495},{},[3496,3498,3504,3506,3511,3513,3518],{"type":43,"value":3497},"When a neu version of MariaDB is released, e.g ",{"type":25,"tag":121,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":43,"value":3503},"11.8.4-noble",{"type":43,"value":3505},", a new ",{"type":25,"tag":121,"props":3507,"children":3509},{"className":3508},[],[3510],{"type":43,"value":3503},{"type":43,"value":3512}," tag will be pushed, but the ",{"type":25,"tag":121,"props":3514,"children":3516},{"className":3515},[],[3517],{"type":43,"value":3483},{"type":43,"value":3519}," will be updated.",{"type":25,"tag":34,"props":3521,"children":3522},{},[3523,3525,3530],{"type":43,"value":3524},"This same is true for the Ubuntu update. The ",{"type":25,"tag":121,"props":3526,"children":3528},{"className":3527},[],[3529],{"type":43,"value":3467},{"type":43,"value":3531}," tag can be updated, if the image is rebuild with the latest Ubuntu image.",{"type":25,"tag":34,"props":3533,"children":3534},{},[3535,3537,3543,3545,3551],{"type":43,"value":3536},"Running ",{"type":25,"tag":121,"props":3538,"children":3540},{"className":3539},[],[3541],{"type":43,"value":3542},"docker compose up",{"type":43,"value":3544}," on ",{"type":25,"tag":121,"props":3546,"children":3548},{"className":3547},[],[3549],{"type":43,"value":3550},"mariadb:11.8-noble",{"type":43,"value":3552}," will do nothing, because Docker is not aware of that change.",{"type":25,"tag":34,"props":3554,"children":3555},{},[3556,3558,3564],{"type":43,"value":3557},"In the example above we reference ",{"type":25,"tag":121,"props":3559,"children":3561},{"className":3560},[],[3562],{"type":43,"value":3563},"mariadb:11.8",{"type":43,"value":3565},", because we want to use the latest patch version based on the most current OS.",{"type":25,"tag":863,"props":3567,"children":3568},{},[],{"type":25,"tag":34,"props":3570,"children":3571},{},[3572],{"type":43,"value":3573},"How to tell Docker that there is a new version?",{"type":25,"tag":34,"props":3575,"children":3576},{},[3577,3579,3585],{"type":43,"value":3578},"The main idea is to attach a ",{"type":25,"tag":38,"props":3580,"children":3582},{"href":3581},"https://docs.docker.com/dhi/core-concepts/digests/",[3583],{"type":43,"value":3584},"digest",{"type":43,"value":3586}," to the Docker image.",{"type":25,"tag":34,"props":3588,"children":3589},{},[3590,3592,3597,3599],{"type":43,"value":3591},"When running Renovate for the first time, it will find the reference to ",{"type":25,"tag":121,"props":3593,"children":3595},{"className":3594},[],[3596],{"type":43,"value":3563},{"type":43,"value":3598}," and create a merge request to pin the Digest to something like ",{"type":25,"tag":121,"props":3600,"children":3602},{"className":3601},[],[3603],{"type":43,"value":3604},"mariadb:11.8@sha256:ae6119716edac6998ae85508431b3d2e666530ddf4e94c61a10710caec9b0f71",{"type":25,"tag":34,"props":3606,"children":3607},{},[3608],{"type":43,"value":3609},"Renovate will also monitor the upstream changes, so that every time the image get updated, the digest will change and Renovate will create a merge request.",{"type":25,"tag":34,"props":3611,"children":3612},{},[3613],{"type":43,"value":3614},"To merge these updates automatically, we need to do some adjustments.",{"type":25,"tag":178,"props":3616,"children":3619},{"className":180,"code":3617,"filename":182,"highlights":3618,"language":183,"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",[251,273,286,295],[3620],{"type":25,"tag":121,"props":3621,"children":3622},{"__ignoreMap":7},[3623,3630,3649,3660,3672,3682,3691,3713,3731],{"type":25,"tag":189,"props":3624,"children":3625},{"class":191,"line":192},[3626],{"type":25,"tag":189,"props":3627,"children":3628},{"style":196},[3629],{"type":43,"value":199},{"type":25,"tag":189,"props":3631,"children":3632},{"class":191,"line":202},[3633,3637,3641,3645],{"type":25,"tag":189,"props":3634,"children":3635},{"style":206},[3636],{"type":43,"value":209},{"type":25,"tag":189,"props":3638,"children":3639},{"style":196},[3640],{"type":43,"value":214},{"type":25,"tag":189,"props":3642,"children":3643},{"style":217},[3644],{"type":43,"value":220},{"type":25,"tag":189,"props":3646,"children":3647},{"style":196},[3648],{"type":43,"value":225},{"type":25,"tag":189,"props":3650,"children":3651},{"class":191,"line":228},[3652,3656],{"type":25,"tag":189,"props":3653,"children":3654},{"style":206},[3655],{"type":43,"value":3392},{"type":25,"tag":189,"props":3657,"children":3658},{"style":196},[3659],{"type":43,"value":239},{"type":25,"tag":189,"props":3661,"children":3662},{"class":191,"line":242},[3663,3668],{"type":25,"tag":189,"props":3664,"children":3665},{"style":217},[3666],{"type":43,"value":3667},"    \"config:best-practices\"",{"type":25,"tag":189,"props":3669,"children":3670},{"style":196},[3671],{"type":43,"value":225},{"type":25,"tag":189,"props":3673,"children":3676},{"class":3674,"line":251},[191,3675],"highlight",[3677],{"type":25,"tag":189,"props":3678,"children":3679},{"style":217},[3680],{"type":43,"value":3681},"    \"default:automergeDigest\"\n",{"type":25,"tag":189,"props":3683,"children":3685},{"class":3684,"line":273},[191,3675],[3686],{"type":25,"tag":189,"props":3687,"children":3688},{"style":196},[3689],{"type":43,"value":3690},"  ],\n",{"type":25,"tag":189,"props":3692,"children":3694},{"class":3693,"line":286},[191,3675],[3695,3700,3704,3709],{"type":25,"tag":189,"props":3696,"children":3697},{"style":206},[3698],{"type":43,"value":3699},"  \"automergeType\"",{"type":25,"tag":189,"props":3701,"children":3702},{"style":196},[3703],{"type":43,"value":214},{"type":25,"tag":189,"props":3705,"children":3706},{"style":217},[3707],{"type":43,"value":3708},"\"branch\"",{"type":25,"tag":189,"props":3710,"children":3711},{"style":196},[3712],{"type":43,"value":225},{"type":25,"tag":189,"props":3714,"children":3716},{"class":3715,"line":295},[191,3675],[3717,3722,3726],{"type":25,"tag":189,"props":3718,"children":3719},{"style":206},[3720],{"type":43,"value":3721},"  \"ignoreTests\"",{"type":25,"tag":189,"props":3723,"children":3724},{"style":196},[3725],{"type":43,"value":214},{"type":25,"tag":189,"props":3727,"children":3728},{"style":413},[3729],{"type":43,"value":3730},"true\n",{"type":25,"tag":189,"props":3732,"children":3733},{"class":191,"line":304},[3734],{"type":25,"tag":189,"props":3735,"children":3736},{"style":196},[3737],{"type":43,"value":524},{"type":25,"tag":34,"props":3739,"children":3740},{},[3741,3743,3749,3750],{"type":43,"value":3742},"This instructs Renovate to auto-merge the Digest updates without creating a merge request prior. This reduces noise since there is no merge request notification.\nYou can read more about ",{"type":25,"tag":38,"props":3744,"children":3746},{"href":3745},"https://docs.renovatebot.com/key-concepts/automerge/#branch-vs-pr-automerging",[3747],{"type":43,"value":3748},"automergeType",{"type":43,"value":1278},{"type":25,"tag":38,"props":3751,"children":3753},{"href":3752},"https://docs.renovatebot.com/key-concepts/automerge/#absence-of-tests",[3754],{"type":43,"value":3755},"ignoreTests",{"type":25,"tag":598,"props":3757,"children":3758},{},[3759],{"type":43,"value":602},{"title":7,"searchDepth":202,"depth":202,"links":3761},[3762,3763,3764,3765,3766],{"id":2347,"depth":202,"text":2350},{"id":2384,"depth":202,"text":2387},{"id":2425,"depth":202,"text":2428},{"id":3343,"depth":202,"text":3346},{"id":3426,"depth":202,"text":3429},{"_path":3768,"_dir":645,"_draft":6,"_partial":6,"_locale":7,"slug":617,"teams":3769,"primaryTeam":647,"firstName":3770,"lastName":3771,"prefixTitle":3772,"suffixTitle":7,"executiveRole":3773,"education":3774,"role":3782,"workingSince":3781,"inTheCompanySince":3778,"techSkills":3785,"skills":3807,"projects":3819,"contactDetails":3825,"certifications":3828,"image":3834,"_id":3835,"_type":183,"title":3836,"_source":645,"_file":3837,"_stem":3838,"_extension":183},"/employees/jens-bornschein",[647],"Jens","Bornschein","Dr. Ing.","Projektmanager | Consultant",[3775,3779],[3776,3777,3778],"Doktor-Ingenieur der Informatik","TU Dresden","2020",[3780,3777,3781],"Diplom-Medieninformatiker (TU)","2010",[3783,658,659,3784,714,661],"projectManager","UI/UX",[3786,3787,3790,3791,3792,3794,3796,3799,3802,3805],{"name":696,"level":667},{"name":3788,"level":667,"icon":3789},"C#","/images/csharp.svg",{"name":689,"level":690,"icon":691},{"name":693,"level":690,"icon":694},{"name":3793,"level":690,"icon":702},"Vue.js",{"name":3795,"level":690},"Java",{"name":3797,"level":667,"icon":3798},"Adobe Photoshop","/images/adobeps-logo.svg",{"name":3800,"level":667,"icon":3801},"Adobe Illustrator","/images/adobeai-logo.svg",{"name":3803,"level":690,"icon":3804},"Adobe XD","/images/adobexd-logo.svg",{"name":3806,"level":690},"Gitlab",[3808,3810,3811,3812,3814,3816,3817],{"name":3809,"level":667},"projectManagement",{"name":714,"level":667},{"name":3784,"level":667},{"name":3813,"level":690},"consulting",{"name":3815,"level":690},"scrum",{"name":720,"level":690},{"name":3818,"level":690},"training",[3820,3823],{"project":3821,"position":3822},"Montagespezis","project manager",{"project":3824,"position":3822},"Vipr",{"eMail":3826,"phone":3827,"visibility":734},"jens.bornschein@helmundwalter.de","+49 351 799 035 24",[3829],{"image":3830,"link":3831,"title":3832,"pdf":3833},"/images/certifications/KHZG_Badge.svg","https://www.bundesamtsozialesicherung.de/de/themen/innovationsfonds-und-krankenhausstrukturfonds/krankenhausstrukturfonds/","Berechtigung nach § 21 Absatz 5 Satz 1 KHSFV - Management für KHZG geförderte Vorhaben","/certificates/jb_KHSFV_Zertifikat.pdf","images/employees/Portraits/JensBornschein_MS.webp","employees:employees:5.jens-bornschein.json","Jens Bornschein","employees/5.jens-bornschein.json","employees/5.jens-bornschein",{"_path":644,"_dir":645,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":3840,"primaryTeam":648,"firstName":649,"lastName":650,"prefixTitle":7,"suffixTitle":651,"education":3841,"role":3843,"workingSince":662,"inTheCompanySince":663,"techSkills":3844,"skills":3858,"projects":3868,"contactDetails":3873,"_image":735,"image":736,"_id":737,"_type":183,"title":738,"_source":645,"_file":739,"_stem":740,"_extension":183},[647,648],[3842],[654,655,656],[658,659,660,661],[3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857],{"name":666,"level":667,"icon":668},{"name":670,"level":667},{"name":672,"level":667,"icon":673},{"name":675,"level":667,"icon":676},{"name":678,"level":667,"icon":679},{"name":681,"level":667},{"name":683,"level":667,"icon":684},{"name":686,"level":667,"icon":687},{"name":689,"level":690,"icon":691},{"name":693,"level":690,"icon":694},{"name":696,"level":690},{"name":698,"level":690,"icon":699},{"name":701,"level":690,"icon":702},[3859,3860,3861,3862,3863,3864,3865,3866,3867],{"name":705,"level":667},{"name":707,"level":667},{"name":648,"level":667},{"name":710,"level":667},{"name":712,"level":667},{"name":714,"level":690},{"name":716,"level":690},{"name":718,"level":690},{"name":720,"level":690},[3869,3871,3872],{"project":723,"position":3870},[725,726],{"project":728,"position":726},{"project":730,"position":726},{"eMail":732,"phone":733,"visibility":734},[3875,3889,3901,3913],{"_path":3876,"_dir":3877,"_draft":6,"_partial":2604,"_locale":7,"name":3878,"slug":3877,"text":3879,"hoverText":3880,"image":3881,"customer":3882,"tags":3883,"_id":3885,"_type":2556,"title":3886,"_source":609,"_file":3887,"_stem":3888,"_extension":2556},"/en/portfolio/bitburger/_teaser","bitburger","Bitburger B2B and Brand Shops","Relaunch of Bitburger Brewery Group online shops with new platform","Migration of all brand shops and B2B shop of Bitburger Brewery Group to a unified platform. Ongoing support for redesign initiatives and integration of additional subsystems.","/images/portfolio/bitburger/Bitburger_HuW_Glaeser.jpg","Bitburger",[19,3884],"e-commerce","common:en:portfolio:900.bitburger:_teaser.yaml","Teaser","en/portfolio/900.bitburger/_teaser.yaml","en/portfolio/900.bitburger/_teaser",{"_path":3890,"_dir":3891,"_draft":6,"_partial":2604,"_locale":7,"name":3892,"slug":3891,"text":3893,"hoverText":3894,"image":3895,"customer":3896,"tags":3897,"_id":3898,"_type":2556,"title":3886,"_source":609,"_file":3899,"_stem":3900,"_extension":2556},"/en/portfolio/purize/_teaser","purize","Purize Filters","E-Commerce for high-quality activated carbon filters","We support PURIZE® Filters with a complete e-commerce service including fulfillment solution and connection to shipping service providers. Our expertise in online retail enables the manufacturer of high-quality activated carbon filters \"Made in Germany\" to process their orders smoothly.","/images/portfolio/barcode-machine-verdandijpg.jpg","PURIZE® Filters",[19,3884],"common:en:portfolio:9000.purize:_teaser.yaml","en/portfolio/9000.purize/_teaser.yaml","en/portfolio/9000.purize/_teaser",{"_path":3902,"_dir":3903,"_draft":6,"_partial":2604,"_locale":7,"name":3904,"slug":3903,"text":3905,"hoverText":3906,"image":3907,"customer":3904,"tags":3908,"_id":3910,"_type":2556,"title":3886,"_source":609,"_file":3911,"_stem":3912,"_extension":2556},"/en/portfolio/pixelx/_teaser","pixelx","PixelX","IT Security with Precision and Expertise","For PixelX, we conducted a targeted security analysis where, thanks to our deep technical understanding, we were able to identify a critical SQL injection vulnerability. With minimal time investment, we achieved maximum security gain.","/images/portfolio/pixelx/pixelx_secured.png",[3909,20],"security","common:en:portfolio:9010.pixelx:_teaser.yaml","en/portfolio/9010.pixelx/_teaser.yaml","en/portfolio/9010.pixelx/_teaser",{"_path":3914,"_dir":3915,"_draft":6,"_partial":2604,"_locale":7,"name":3916,"slug":3915,"text":3917,"hoverText":3918,"image":3919,"customer":3916,"tags":3920,"_id":3921,"_type":2556,"title":3886,"_source":609,"_file":3922,"_stem":3923,"_extension":2556},"/en/portfolio/slimspots/_teaser","slimspots","SlimSpots","Processing large amounts of data in real-time","For SlimSpots, a global provider of ad marketing solutions, we developed a highly scalable infrastructure that enables the processing of trillions of data records in real-time.","/images/portfolio/slimspots/slim_spots_prtfolio.png",[716,20],"common:en:portfolio:9020.slimspots:_teaser.yaml","en/portfolio/9020.slimspots/_teaser.yaml","en/portfolio/9020.slimspots/_teaser",1782284057183]